修改后台权限
This commit is contained in:
1806
node_modules/@dotenvx/dotenvx/CHANGELOG.md
generated
vendored
Normal file
1806
node_modules/@dotenvx/dotenvx/CHANGELOG.md
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
28
node_modules/@dotenvx/dotenvx/LICENSE
generated
vendored
Normal file
28
node_modules/@dotenvx/dotenvx/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2024, Scott Motte
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
2800
node_modules/@dotenvx/dotenvx/README.md
generated
vendored
Normal file
2800
node_modules/@dotenvx/dotenvx/README.md
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
22
node_modules/@dotenvx/dotenvx/node_modules/commander/LICENSE
generated
vendored
Normal file
22
node_modules/@dotenvx/dotenvx/node_modules/commander/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
(The MIT License)
|
||||
|
||||
Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
1148
node_modules/@dotenvx/dotenvx/node_modules/commander/Readme.md
generated
vendored
Normal file
1148
node_modules/@dotenvx/dotenvx/node_modules/commander/Readme.md
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
16
node_modules/@dotenvx/dotenvx/node_modules/commander/esm.mjs
generated
vendored
Normal file
16
node_modules/@dotenvx/dotenvx/node_modules/commander/esm.mjs
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
import commander from './index.js';
|
||||
|
||||
// wrapper to provide named exports for ESM.
|
||||
export const {
|
||||
program,
|
||||
createCommand,
|
||||
createArgument,
|
||||
createOption,
|
||||
CommanderError,
|
||||
InvalidArgumentError,
|
||||
InvalidOptionArgumentError, // deprecated old name
|
||||
Command,
|
||||
Argument,
|
||||
Option,
|
||||
Help
|
||||
} = commander;
|
||||
26
node_modules/@dotenvx/dotenvx/node_modules/commander/index.js
generated
vendored
Normal file
26
node_modules/@dotenvx/dotenvx/node_modules/commander/index.js
generated
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
const { Argument } = require('./lib/argument.js');
|
||||
const { Command } = require('./lib/command.js');
|
||||
const { CommanderError, InvalidArgumentError } = require('./lib/error.js');
|
||||
const { Help } = require('./lib/help.js');
|
||||
const { Option } = require('./lib/option.js');
|
||||
|
||||
/**
|
||||
* Expose the root command.
|
||||
*/
|
||||
|
||||
exports = module.exports = new Command();
|
||||
exports.program = exports; // More explicit access to global command.
|
||||
// createArgument, createCommand, and createOption are implicitly available as they are methods on program.
|
||||
|
||||
/**
|
||||
* Expose classes
|
||||
*/
|
||||
|
||||
exports.Command = Command;
|
||||
exports.Option = Option;
|
||||
exports.Argument = Argument;
|
||||
exports.Help = Help;
|
||||
|
||||
exports.CommanderError = CommanderError;
|
||||
exports.InvalidArgumentError = InvalidArgumentError;
|
||||
exports.InvalidOptionArgumentError = InvalidArgumentError; // Deprecated
|
||||
145
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/argument.js
generated
vendored
Normal file
145
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/argument.js
generated
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
const { InvalidArgumentError } = require('./error.js');
|
||||
|
||||
class Argument {
|
||||
/**
|
||||
* Initialize a new command argument with the given name and description.
|
||||
* The default is that the argument is required, and you can explicitly
|
||||
* indicate this with <> around the name. Put [] around the name for an optional argument.
|
||||
*
|
||||
* @param {string} name
|
||||
* @param {string} [description]
|
||||
*/
|
||||
|
||||
constructor(name, description) {
|
||||
this.description = description || '';
|
||||
this.variadic = false;
|
||||
this.parseArg = undefined;
|
||||
this.defaultValue = undefined;
|
||||
this.defaultValueDescription = undefined;
|
||||
this.argChoices = undefined;
|
||||
|
||||
switch (name[0]) {
|
||||
case '<': // e.g. <required>
|
||||
this.required = true;
|
||||
this._name = name.slice(1, -1);
|
||||
break;
|
||||
case '[': // e.g. [optional]
|
||||
this.required = false;
|
||||
this._name = name.slice(1, -1);
|
||||
break;
|
||||
default:
|
||||
this.required = true;
|
||||
this._name = name;
|
||||
break;
|
||||
}
|
||||
|
||||
if (this._name.length > 3 && this._name.slice(-3) === '...') {
|
||||
this.variadic = true;
|
||||
this._name = this._name.slice(0, -3);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return argument name.
|
||||
*
|
||||
* @return {string}
|
||||
*/
|
||||
|
||||
name() {
|
||||
return this._name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @api private
|
||||
*/
|
||||
|
||||
_concatValue(value, previous) {
|
||||
if (previous === this.defaultValue || !Array.isArray(previous)) {
|
||||
return [value];
|
||||
}
|
||||
|
||||
return previous.concat(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the default value, and optionally supply the description to be displayed in the help.
|
||||
*
|
||||
* @param {*} value
|
||||
* @param {string} [description]
|
||||
* @return {Argument}
|
||||
*/
|
||||
|
||||
default(value, description) {
|
||||
this.defaultValue = value;
|
||||
this.defaultValueDescription = description;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the custom handler for processing CLI command arguments into argument values.
|
||||
*
|
||||
* @param {Function} [fn]
|
||||
* @return {Argument}
|
||||
*/
|
||||
|
||||
argParser(fn) {
|
||||
this.parseArg = fn;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only allow argument value to be one of choices.
|
||||
*
|
||||
* @param {string[]} values
|
||||
* @return {Argument}
|
||||
*/
|
||||
|
||||
choices(values) {
|
||||
this.argChoices = values.slice();
|
||||
this.parseArg = (arg, previous) => {
|
||||
if (!this.argChoices.includes(arg)) {
|
||||
throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`);
|
||||
}
|
||||
if (this.variadic) {
|
||||
return this._concatValue(arg, previous);
|
||||
}
|
||||
return arg;
|
||||
};
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make argument required.
|
||||
*/
|
||||
argRequired() {
|
||||
this.required = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make argument optional.
|
||||
*/
|
||||
argOptional() {
|
||||
this.required = false;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes an argument and returns its human readable equivalent for help usage.
|
||||
*
|
||||
* @param {Argument} arg
|
||||
* @return {string}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function humanReadableArgName(arg) {
|
||||
const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');
|
||||
|
||||
return arg.required
|
||||
? '<' + nameOutput + '>'
|
||||
: '[' + nameOutput + ']';
|
||||
}
|
||||
|
||||
exports.Argument = Argument;
|
||||
exports.humanReadableArgName = humanReadableArgName;
|
||||
2179
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/command.js
generated
vendored
Normal file
2179
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/command.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
43
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/error.js
generated
vendored
Normal file
43
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/error.js
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* CommanderError class
|
||||
* @class
|
||||
*/
|
||||
class CommanderError extends Error {
|
||||
/**
|
||||
* Constructs the CommanderError class
|
||||
* @param {number} exitCode suggested exit code which could be used with process.exit
|
||||
* @param {string} code an id string representing the error
|
||||
* @param {string} message human-readable description of the error
|
||||
* @constructor
|
||||
*/
|
||||
constructor(exitCode, code, message) {
|
||||
super(message);
|
||||
// properly capture stack trace in Node.js
|
||||
Error.captureStackTrace(this, this.constructor);
|
||||
this.name = this.constructor.name;
|
||||
this.code = code;
|
||||
this.exitCode = exitCode;
|
||||
this.nestedError = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* InvalidArgumentError class
|
||||
* @class
|
||||
*/
|
||||
class InvalidArgumentError extends CommanderError {
|
||||
/**
|
||||
* Constructs the InvalidArgumentError class
|
||||
* @param {string} [message] explanation of why argument is invalid
|
||||
* @constructor
|
||||
*/
|
||||
constructor(message) {
|
||||
super(1, 'commander.invalidArgument', message);
|
||||
// properly capture stack trace in Node.js
|
||||
Error.captureStackTrace(this, this.constructor);
|
||||
this.name = this.constructor.name;
|
||||
}
|
||||
}
|
||||
|
||||
exports.CommanderError = CommanderError;
|
||||
exports.InvalidArgumentError = InvalidArgumentError;
|
||||
462
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/help.js
generated
vendored
Normal file
462
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/help.js
generated
vendored
Normal file
@@ -0,0 +1,462 @@
|
||||
const { humanReadableArgName } = require('./argument.js');
|
||||
|
||||
/**
|
||||
* TypeScript import types for JSDoc, used by Visual Studio Code IntelliSense and `npm run typescript-checkJS`
|
||||
* https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#import-types
|
||||
* @typedef { import("./argument.js").Argument } Argument
|
||||
* @typedef { import("./command.js").Command } Command
|
||||
* @typedef { import("./option.js").Option } Option
|
||||
*/
|
||||
|
||||
// Although this is a class, methods are static in style to allow override using subclass or just functions.
|
||||
class Help {
|
||||
constructor() {
|
||||
this.helpWidth = undefined;
|
||||
this.sortSubcommands = false;
|
||||
this.sortOptions = false;
|
||||
this.showGlobalOptions = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @returns {Command[]}
|
||||
*/
|
||||
|
||||
visibleCommands(cmd) {
|
||||
const visibleCommands = cmd.commands.filter(cmd => !cmd._hidden);
|
||||
if (cmd._hasImplicitHelpCommand()) {
|
||||
// Create a command matching the implicit help command.
|
||||
const [, helpName, helpArgs] = cmd._helpCommandnameAndArgs.match(/([^ ]+) *(.*)/);
|
||||
const helpCommand = cmd.createCommand(helpName)
|
||||
.helpOption(false);
|
||||
helpCommand.description(cmd._helpCommandDescription);
|
||||
if (helpArgs) helpCommand.arguments(helpArgs);
|
||||
visibleCommands.push(helpCommand);
|
||||
}
|
||||
if (this.sortSubcommands) {
|
||||
visibleCommands.sort((a, b) => {
|
||||
// @ts-ignore: overloaded return type
|
||||
return a.name().localeCompare(b.name());
|
||||
});
|
||||
}
|
||||
return visibleCommands;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare options for sort.
|
||||
*
|
||||
* @param {Option} a
|
||||
* @param {Option} b
|
||||
* @returns number
|
||||
*/
|
||||
compareOptions(a, b) {
|
||||
const getSortKey = (option) => {
|
||||
// WYSIWYG for order displayed in help. Short used for comparison if present. No special handling for negated.
|
||||
return option.short ? option.short.replace(/^-/, '') : option.long.replace(/^--/, '');
|
||||
};
|
||||
return getSortKey(a).localeCompare(getSortKey(b));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @returns {Option[]}
|
||||
*/
|
||||
|
||||
visibleOptions(cmd) {
|
||||
const visibleOptions = cmd.options.filter((option) => !option.hidden);
|
||||
// Implicit help
|
||||
const showShortHelpFlag = cmd._hasHelpOption && cmd._helpShortFlag && !cmd._findOption(cmd._helpShortFlag);
|
||||
const showLongHelpFlag = cmd._hasHelpOption && !cmd._findOption(cmd._helpLongFlag);
|
||||
if (showShortHelpFlag || showLongHelpFlag) {
|
||||
let helpOption;
|
||||
if (!showShortHelpFlag) {
|
||||
helpOption = cmd.createOption(cmd._helpLongFlag, cmd._helpDescription);
|
||||
} else if (!showLongHelpFlag) {
|
||||
helpOption = cmd.createOption(cmd._helpShortFlag, cmd._helpDescription);
|
||||
} else {
|
||||
helpOption = cmd.createOption(cmd._helpFlags, cmd._helpDescription);
|
||||
}
|
||||
visibleOptions.push(helpOption);
|
||||
}
|
||||
if (this.sortOptions) {
|
||||
visibleOptions.sort(this.compareOptions);
|
||||
}
|
||||
return visibleOptions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of the visible global options. (Not including help.)
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @returns {Option[]}
|
||||
*/
|
||||
|
||||
visibleGlobalOptions(cmd) {
|
||||
if (!this.showGlobalOptions) return [];
|
||||
|
||||
const globalOptions = [];
|
||||
for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) {
|
||||
const visibleOptions = ancestorCmd.options.filter((option) => !option.hidden);
|
||||
globalOptions.push(...visibleOptions);
|
||||
}
|
||||
if (this.sortOptions) {
|
||||
globalOptions.sort(this.compareOptions);
|
||||
}
|
||||
return globalOptions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of the arguments if any have a description.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @returns {Argument[]}
|
||||
*/
|
||||
|
||||
visibleArguments(cmd) {
|
||||
// Side effect! Apply the legacy descriptions before the arguments are displayed.
|
||||
if (cmd._argsDescription) {
|
||||
cmd.registeredArguments.forEach(argument => {
|
||||
argument.description = argument.description || cmd._argsDescription[argument.name()] || '';
|
||||
});
|
||||
}
|
||||
|
||||
// If there are any arguments with a description then return all the arguments.
|
||||
if (cmd.registeredArguments.find(argument => argument.description)) {
|
||||
return cmd.registeredArguments;
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the command term to show in the list of subcommands.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
subcommandTerm(cmd) {
|
||||
// Legacy. Ignores custom usage string, and nested commands.
|
||||
const args = cmd.registeredArguments.map(arg => humanReadableArgName(arg)).join(' ');
|
||||
return cmd._name +
|
||||
(cmd._aliases[0] ? '|' + cmd._aliases[0] : '') +
|
||||
(cmd.options.length ? ' [options]' : '') + // simplistic check for non-help option
|
||||
(args ? ' ' + args : '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the option term to show in the list of options.
|
||||
*
|
||||
* @param {Option} option
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
optionTerm(option) {
|
||||
return option.flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the argument term to show in the list of arguments.
|
||||
*
|
||||
* @param {Argument} argument
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
argumentTerm(argument) {
|
||||
return argument.name();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the longest command term length.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @param {Help} helper
|
||||
* @returns {number}
|
||||
*/
|
||||
|
||||
longestSubcommandTermLength(cmd, helper) {
|
||||
return helper.visibleCommands(cmd).reduce((max, command) => {
|
||||
return Math.max(max, helper.subcommandTerm(command).length);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the longest option term length.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @param {Help} helper
|
||||
* @returns {number}
|
||||
*/
|
||||
|
||||
longestOptionTermLength(cmd, helper) {
|
||||
return helper.visibleOptions(cmd).reduce((max, option) => {
|
||||
return Math.max(max, helper.optionTerm(option).length);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the longest global option term length.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @param {Help} helper
|
||||
* @returns {number}
|
||||
*/
|
||||
|
||||
longestGlobalOptionTermLength(cmd, helper) {
|
||||
return helper.visibleGlobalOptions(cmd).reduce((max, option) => {
|
||||
return Math.max(max, helper.optionTerm(option).length);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the longest argument term length.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @param {Help} helper
|
||||
* @returns {number}
|
||||
*/
|
||||
|
||||
longestArgumentTermLength(cmd, helper) {
|
||||
return helper.visibleArguments(cmd).reduce((max, argument) => {
|
||||
return Math.max(max, helper.argumentTerm(argument).length);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the command usage to be displayed at the top of the built-in help.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
commandUsage(cmd) {
|
||||
// Usage
|
||||
let cmdName = cmd._name;
|
||||
if (cmd._aliases[0]) {
|
||||
cmdName = cmdName + '|' + cmd._aliases[0];
|
||||
}
|
||||
let ancestorCmdNames = '';
|
||||
for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) {
|
||||
ancestorCmdNames = ancestorCmd.name() + ' ' + ancestorCmdNames;
|
||||
}
|
||||
return ancestorCmdNames + cmdName + ' ' + cmd.usage();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the description for the command.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
commandDescription(cmd) {
|
||||
// @ts-ignore: overloaded return type
|
||||
return cmd.description();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the subcommand summary to show in the list of subcommands.
|
||||
* (Fallback to description for backwards compatibility.)
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
subcommandDescription(cmd) {
|
||||
// @ts-ignore: overloaded return type
|
||||
return cmd.summary() || cmd.description();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the option description to show in the list of options.
|
||||
*
|
||||
* @param {Option} option
|
||||
* @return {string}
|
||||
*/
|
||||
|
||||
optionDescription(option) {
|
||||
const extraInfo = [];
|
||||
|
||||
if (option.argChoices) {
|
||||
extraInfo.push(
|
||||
// use stringify to match the display of the default value
|
||||
`choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`);
|
||||
}
|
||||
if (option.defaultValue !== undefined) {
|
||||
// default for boolean and negated more for programmer than end user,
|
||||
// but show true/false for boolean option as may be for hand-rolled env or config processing.
|
||||
const showDefault = option.required || option.optional ||
|
||||
(option.isBoolean() && typeof option.defaultValue === 'boolean');
|
||||
if (showDefault) {
|
||||
extraInfo.push(`default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}`);
|
||||
}
|
||||
}
|
||||
// preset for boolean and negated are more for programmer than end user
|
||||
if (option.presetArg !== undefined && option.optional) {
|
||||
extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`);
|
||||
}
|
||||
if (option.envVar !== undefined) {
|
||||
extraInfo.push(`env: ${option.envVar}`);
|
||||
}
|
||||
if (extraInfo.length > 0) {
|
||||
return `${option.description} (${extraInfo.join(', ')})`;
|
||||
}
|
||||
|
||||
return option.description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the argument description to show in the list of arguments.
|
||||
*
|
||||
* @param {Argument} argument
|
||||
* @return {string}
|
||||
*/
|
||||
|
||||
argumentDescription(argument) {
|
||||
const extraInfo = [];
|
||||
if (argument.argChoices) {
|
||||
extraInfo.push(
|
||||
// use stringify to match the display of the default value
|
||||
`choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(', ')}`);
|
||||
}
|
||||
if (argument.defaultValue !== undefined) {
|
||||
extraInfo.push(`default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}`);
|
||||
}
|
||||
if (extraInfo.length > 0) {
|
||||
const extraDescripton = `(${extraInfo.join(', ')})`;
|
||||
if (argument.description) {
|
||||
return `${argument.description} ${extraDescripton}`;
|
||||
}
|
||||
return extraDescripton;
|
||||
}
|
||||
return argument.description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the built-in help text.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @param {Help} helper
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
formatHelp(cmd, helper) {
|
||||
const termWidth = helper.padWidth(cmd, helper);
|
||||
const helpWidth = helper.helpWidth || 80;
|
||||
const itemIndentWidth = 2;
|
||||
const itemSeparatorWidth = 2; // between term and description
|
||||
function formatItem(term, description) {
|
||||
if (description) {
|
||||
const fullText = `${term.padEnd(termWidth + itemSeparatorWidth)}${description}`;
|
||||
return helper.wrap(fullText, helpWidth - itemIndentWidth, termWidth + itemSeparatorWidth);
|
||||
}
|
||||
return term;
|
||||
}
|
||||
function formatList(textArray) {
|
||||
return textArray.join('\n').replace(/^/gm, ' '.repeat(itemIndentWidth));
|
||||
}
|
||||
|
||||
// Usage
|
||||
let output = [`Usage: ${helper.commandUsage(cmd)}`, ''];
|
||||
|
||||
// Description
|
||||
const commandDescription = helper.commandDescription(cmd);
|
||||
if (commandDescription.length > 0) {
|
||||
output = output.concat([helper.wrap(commandDescription, helpWidth, 0), '']);
|
||||
}
|
||||
|
||||
// Arguments
|
||||
const argumentList = helper.visibleArguments(cmd).map((argument) => {
|
||||
return formatItem(helper.argumentTerm(argument), helper.argumentDescription(argument));
|
||||
});
|
||||
if (argumentList.length > 0) {
|
||||
output = output.concat(['Arguments:', formatList(argumentList), '']);
|
||||
}
|
||||
|
||||
// Options
|
||||
const optionList = helper.visibleOptions(cmd).map((option) => {
|
||||
return formatItem(helper.optionTerm(option), helper.optionDescription(option));
|
||||
});
|
||||
if (optionList.length > 0) {
|
||||
output = output.concat(['Options:', formatList(optionList), '']);
|
||||
}
|
||||
|
||||
if (this.showGlobalOptions) {
|
||||
const globalOptionList = helper.visibleGlobalOptions(cmd).map((option) => {
|
||||
return formatItem(helper.optionTerm(option), helper.optionDescription(option));
|
||||
});
|
||||
if (globalOptionList.length > 0) {
|
||||
output = output.concat(['Global Options:', formatList(globalOptionList), '']);
|
||||
}
|
||||
}
|
||||
|
||||
// Commands
|
||||
const commandList = helper.visibleCommands(cmd).map((cmd) => {
|
||||
return formatItem(helper.subcommandTerm(cmd), helper.subcommandDescription(cmd));
|
||||
});
|
||||
if (commandList.length > 0) {
|
||||
output = output.concat(['Commands:', formatList(commandList), '']);
|
||||
}
|
||||
|
||||
return output.join('\n');
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the pad width from the maximum term length.
|
||||
*
|
||||
* @param {Command} cmd
|
||||
* @param {Help} helper
|
||||
* @returns {number}
|
||||
*/
|
||||
|
||||
padWidth(cmd, helper) {
|
||||
return Math.max(
|
||||
helper.longestOptionTermLength(cmd, helper),
|
||||
helper.longestGlobalOptionTermLength(cmd, helper),
|
||||
helper.longestSubcommandTermLength(cmd, helper),
|
||||
helper.longestArgumentTermLength(cmd, helper)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap the given string to width characters per line, with lines after the first indented.
|
||||
* Do not wrap if insufficient room for wrapping (minColumnWidth), or string is manually formatted.
|
||||
*
|
||||
* @param {string} str
|
||||
* @param {number} width
|
||||
* @param {number} indent
|
||||
* @param {number} [minColumnWidth=40]
|
||||
* @return {string}
|
||||
*
|
||||
*/
|
||||
|
||||
wrap(str, width, indent, minColumnWidth = 40) {
|
||||
// Full \s characters, minus the linefeeds.
|
||||
const indents = ' \\f\\t\\v\u00a0\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff';
|
||||
// Detect manually wrapped and indented strings by searching for line break followed by spaces.
|
||||
const manualIndent = new RegExp(`[\\n][${indents}]+`);
|
||||
if (str.match(manualIndent)) return str;
|
||||
// Do not wrap if not enough room for a wrapped column of text (as could end up with a word per line).
|
||||
const columnWidth = width - indent;
|
||||
if (columnWidth < minColumnWidth) return str;
|
||||
|
||||
const leadingStr = str.slice(0, indent);
|
||||
const columnText = str.slice(indent).replace('\r\n', '\n');
|
||||
const indentString = ' '.repeat(indent);
|
||||
const zeroWidthSpace = '\u200B';
|
||||
const breaks = `\\s${zeroWidthSpace}`;
|
||||
// Match line end (so empty lines don't collapse),
|
||||
// or as much text as will fit in column, or excess text up to first break.
|
||||
const regex = new RegExp(`\n|.{1,${columnWidth - 1}}([${breaks}]|$)|[^${breaks}]+?([${breaks}]|$)`, 'g');
|
||||
const lines = columnText.match(regex) || [];
|
||||
return leadingStr + lines.map((line, i) => {
|
||||
if (line === '\n') return ''; // preserve empty lines
|
||||
return ((i > 0) ? indentString : '') + line.trimEnd();
|
||||
}).join('\n');
|
||||
}
|
||||
}
|
||||
|
||||
exports.Help = Help;
|
||||
329
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/option.js
generated
vendored
Normal file
329
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/option.js
generated
vendored
Normal file
@@ -0,0 +1,329 @@
|
||||
const { InvalidArgumentError } = require('./error.js');
|
||||
|
||||
class Option {
|
||||
/**
|
||||
* Initialize a new `Option` with the given `flags` and `description`.
|
||||
*
|
||||
* @param {string} flags
|
||||
* @param {string} [description]
|
||||
*/
|
||||
|
||||
constructor(flags, description) {
|
||||
this.flags = flags;
|
||||
this.description = description || '';
|
||||
|
||||
this.required = flags.includes('<'); // A value must be supplied when the option is specified.
|
||||
this.optional = flags.includes('['); // A value is optional when the option is specified.
|
||||
// variadic test ignores <value,...> et al which might be used to describe custom splitting of single argument
|
||||
this.variadic = /\w\.\.\.[>\]]$/.test(flags); // The option can take multiple values.
|
||||
this.mandatory = false; // The option must have a value after parsing, which usually means it must be specified on command line.
|
||||
const optionFlags = splitOptionFlags(flags);
|
||||
this.short = optionFlags.shortFlag;
|
||||
this.long = optionFlags.longFlag;
|
||||
this.negate = false;
|
||||
if (this.long) {
|
||||
this.negate = this.long.startsWith('--no-');
|
||||
}
|
||||
this.defaultValue = undefined;
|
||||
this.defaultValueDescription = undefined;
|
||||
this.presetArg = undefined;
|
||||
this.envVar = undefined;
|
||||
this.parseArg = undefined;
|
||||
this.hidden = false;
|
||||
this.argChoices = undefined;
|
||||
this.conflictsWith = [];
|
||||
this.implied = undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the default value, and optionally supply the description to be displayed in the help.
|
||||
*
|
||||
* @param {*} value
|
||||
* @param {string} [description]
|
||||
* @return {Option}
|
||||
*/
|
||||
|
||||
default(value, description) {
|
||||
this.defaultValue = value;
|
||||
this.defaultValueDescription = description;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Preset to use when option used without option-argument, especially optional but also boolean and negated.
|
||||
* The custom processing (parseArg) is called.
|
||||
*
|
||||
* @example
|
||||
* new Option('--color').default('GREYSCALE').preset('RGB');
|
||||
* new Option('--donate [amount]').preset('20').argParser(parseFloat);
|
||||
*
|
||||
* @param {*} arg
|
||||
* @return {Option}
|
||||
*/
|
||||
|
||||
preset(arg) {
|
||||
this.presetArg = arg;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add option name(s) that conflict with this option.
|
||||
* An error will be displayed if conflicting options are found during parsing.
|
||||
*
|
||||
* @example
|
||||
* new Option('--rgb').conflicts('cmyk');
|
||||
* new Option('--js').conflicts(['ts', 'jsx']);
|
||||
*
|
||||
* @param {string | string[]} names
|
||||
* @return {Option}
|
||||
*/
|
||||
|
||||
conflicts(names) {
|
||||
this.conflictsWith = this.conflictsWith.concat(names);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify implied option values for when this option is set and the implied options are not.
|
||||
*
|
||||
* The custom processing (parseArg) is not called on the implied values.
|
||||
*
|
||||
* @example
|
||||
* program
|
||||
* .addOption(new Option('--log', 'write logging information to file'))
|
||||
* .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));
|
||||
*
|
||||
* @param {Object} impliedOptionValues
|
||||
* @return {Option}
|
||||
*/
|
||||
implies(impliedOptionValues) {
|
||||
let newImplied = impliedOptionValues;
|
||||
if (typeof impliedOptionValues === 'string') {
|
||||
// string is not documented, but easy mistake and we can do what user probably intended.
|
||||
newImplied = { [impliedOptionValues]: true };
|
||||
}
|
||||
this.implied = Object.assign(this.implied || {}, newImplied);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set environment variable to check for option value.
|
||||
*
|
||||
* An environment variable is only used if when processed the current option value is
|
||||
* undefined, or the source of the current value is 'default' or 'config' or 'env'.
|
||||
*
|
||||
* @param {string} name
|
||||
* @return {Option}
|
||||
*/
|
||||
|
||||
env(name) {
|
||||
this.envVar = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the custom handler for processing CLI option arguments into option values.
|
||||
*
|
||||
* @param {Function} [fn]
|
||||
* @return {Option}
|
||||
*/
|
||||
|
||||
argParser(fn) {
|
||||
this.parseArg = fn;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the option is mandatory and must have a value after parsing.
|
||||
*
|
||||
* @param {boolean} [mandatory=true]
|
||||
* @return {Option}
|
||||
*/
|
||||
|
||||
makeOptionMandatory(mandatory = true) {
|
||||
this.mandatory = !!mandatory;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hide option in help.
|
||||
*
|
||||
* @param {boolean} [hide=true]
|
||||
* @return {Option}
|
||||
*/
|
||||
|
||||
hideHelp(hide = true) {
|
||||
this.hidden = !!hide;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @api private
|
||||
*/
|
||||
|
||||
_concatValue(value, previous) {
|
||||
if (previous === this.defaultValue || !Array.isArray(previous)) {
|
||||
return [value];
|
||||
}
|
||||
|
||||
return previous.concat(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Only allow option value to be one of choices.
|
||||
*
|
||||
* @param {string[]} values
|
||||
* @return {Option}
|
||||
*/
|
||||
|
||||
choices(values) {
|
||||
this.argChoices = values.slice();
|
||||
this.parseArg = (arg, previous) => {
|
||||
if (!this.argChoices.includes(arg)) {
|
||||
throw new InvalidArgumentError(`Allowed choices are ${this.argChoices.join(', ')}.`);
|
||||
}
|
||||
if (this.variadic) {
|
||||
return this._concatValue(arg, previous);
|
||||
}
|
||||
return arg;
|
||||
};
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return option name.
|
||||
*
|
||||
* @return {string}
|
||||
*/
|
||||
|
||||
name() {
|
||||
if (this.long) {
|
||||
return this.long.replace(/^--/, '');
|
||||
}
|
||||
return this.short.replace(/^-/, '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Return option name, in a camelcase format that can be used
|
||||
* as a object attribute key.
|
||||
*
|
||||
* @return {string}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
attributeName() {
|
||||
return camelcase(this.name().replace(/^no-/, ''));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if `arg` matches the short or long flag.
|
||||
*
|
||||
* @param {string} arg
|
||||
* @return {boolean}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
is(arg) {
|
||||
return this.short === arg || this.long === arg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return whether a boolean option.
|
||||
*
|
||||
* Options are one of boolean, negated, required argument, or optional argument.
|
||||
*
|
||||
* @return {boolean}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
isBoolean() {
|
||||
return !this.required && !this.optional && !this.negate;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This class is to make it easier to work with dual options, without changing the existing
|
||||
* implementation. We support separate dual options for separate positive and negative options,
|
||||
* like `--build` and `--no-build`, which share a single option value. This works nicely for some
|
||||
* use cases, but is tricky for others where we want separate behaviours despite
|
||||
* the single shared option value.
|
||||
*/
|
||||
class DualOptions {
|
||||
/**
|
||||
* @param {Option[]} options
|
||||
*/
|
||||
constructor(options) {
|
||||
this.positiveOptions = new Map();
|
||||
this.negativeOptions = new Map();
|
||||
this.dualOptions = new Set();
|
||||
options.forEach(option => {
|
||||
if (option.negate) {
|
||||
this.negativeOptions.set(option.attributeName(), option);
|
||||
} else {
|
||||
this.positiveOptions.set(option.attributeName(), option);
|
||||
}
|
||||
});
|
||||
this.negativeOptions.forEach((value, key) => {
|
||||
if (this.positiveOptions.has(key)) {
|
||||
this.dualOptions.add(key);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Did the value come from the option, and not from possible matching dual option?
|
||||
*
|
||||
* @param {*} value
|
||||
* @param {Option} option
|
||||
* @returns {boolean}
|
||||
*/
|
||||
valueFromOption(value, option) {
|
||||
const optionKey = option.attributeName();
|
||||
if (!this.dualOptions.has(optionKey)) return true;
|
||||
|
||||
// Use the value to deduce if (probably) came from the option.
|
||||
const preset = this.negativeOptions.get(optionKey).presetArg;
|
||||
const negativeValue = (preset !== undefined) ? preset : false;
|
||||
return option.negate === (negativeValue === value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert string from kebab-case to camelCase.
|
||||
*
|
||||
* @param {string} str
|
||||
* @return {string}
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function camelcase(str) {
|
||||
return str.split('-').reduce((str, word) => {
|
||||
return str + word[0].toUpperCase() + word.slice(1);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Split the short and long flag out of something like '-m,--mixed <value>'
|
||||
*
|
||||
* @api private
|
||||
*/
|
||||
|
||||
function splitOptionFlags(flags) {
|
||||
let shortFlag;
|
||||
let longFlag;
|
||||
// Use original very loose parsing to maintain backwards compatibility for now,
|
||||
// which allowed for example unintended `-sw, --short-word` [sic].
|
||||
const flagParts = flags.split(/[ |,]+/);
|
||||
if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1])) shortFlag = flagParts.shift();
|
||||
longFlag = flagParts.shift();
|
||||
// Add support for lone short flag without significantly changing parsing!
|
||||
if (!shortFlag && /^-[^-]$/.test(longFlag)) {
|
||||
shortFlag = longFlag;
|
||||
longFlag = undefined;
|
||||
}
|
||||
return { shortFlag, longFlag };
|
||||
}
|
||||
|
||||
exports.Option = Option;
|
||||
exports.splitOptionFlags = splitOptionFlags;
|
||||
exports.DualOptions = DualOptions;
|
||||
100
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/suggestSimilar.js
generated
vendored
Normal file
100
node_modules/@dotenvx/dotenvx/node_modules/commander/lib/suggestSimilar.js
generated
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
const maxDistance = 3;
|
||||
|
||||
function editDistance(a, b) {
|
||||
// https://en.wikipedia.org/wiki/Damerau–Levenshtein_distance
|
||||
// Calculating optimal string alignment distance, no substring is edited more than once.
|
||||
// (Simple implementation.)
|
||||
|
||||
// Quick early exit, return worst case.
|
||||
if (Math.abs(a.length - b.length) > maxDistance) return Math.max(a.length, b.length);
|
||||
|
||||
// distance between prefix substrings of a and b
|
||||
const d = [];
|
||||
|
||||
// pure deletions turn a into empty string
|
||||
for (let i = 0; i <= a.length; i++) {
|
||||
d[i] = [i];
|
||||
}
|
||||
// pure insertions turn empty string into b
|
||||
for (let j = 0; j <= b.length; j++) {
|
||||
d[0][j] = j;
|
||||
}
|
||||
|
||||
// fill matrix
|
||||
for (let j = 1; j <= b.length; j++) {
|
||||
for (let i = 1; i <= a.length; i++) {
|
||||
let cost = 1;
|
||||
if (a[i - 1] === b[j - 1]) {
|
||||
cost = 0;
|
||||
} else {
|
||||
cost = 1;
|
||||
}
|
||||
d[i][j] = Math.min(
|
||||
d[i - 1][j] + 1, // deletion
|
||||
d[i][j - 1] + 1, // insertion
|
||||
d[i - 1][j - 1] + cost // substitution
|
||||
);
|
||||
// transposition
|
||||
if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) {
|
||||
d[i][j] = Math.min(d[i][j], d[i - 2][j - 2] + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return d[a.length][b.length];
|
||||
}
|
||||
|
||||
/**
|
||||
* Find close matches, restricted to same number of edits.
|
||||
*
|
||||
* @param {string} word
|
||||
* @param {string[]} candidates
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
function suggestSimilar(word, candidates) {
|
||||
if (!candidates || candidates.length === 0) return '';
|
||||
// remove possible duplicates
|
||||
candidates = Array.from(new Set(candidates));
|
||||
|
||||
const searchingOptions = word.startsWith('--');
|
||||
if (searchingOptions) {
|
||||
word = word.slice(2);
|
||||
candidates = candidates.map(candidate => candidate.slice(2));
|
||||
}
|
||||
|
||||
let similar = [];
|
||||
let bestDistance = maxDistance;
|
||||
const minSimilarity = 0.4;
|
||||
candidates.forEach((candidate) => {
|
||||
if (candidate.length <= 1) return; // no one character guesses
|
||||
|
||||
const distance = editDistance(word, candidate);
|
||||
const length = Math.max(word.length, candidate.length);
|
||||
const similarity = (length - distance) / length;
|
||||
if (similarity > minSimilarity) {
|
||||
if (distance < bestDistance) {
|
||||
// better edit distance, throw away previous worse matches
|
||||
bestDistance = distance;
|
||||
similar = [candidate];
|
||||
} else if (distance === bestDistance) {
|
||||
similar.push(candidate);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
similar.sort((a, b) => a.localeCompare(b));
|
||||
if (searchingOptions) {
|
||||
similar = similar.map(candidate => `--${candidate}`);
|
||||
}
|
||||
|
||||
if (similar.length > 1) {
|
||||
return `\n(Did you mean one of ${similar.join(', ')}?)`;
|
||||
}
|
||||
if (similar.length === 1) {
|
||||
return `\n(Did you mean ${similar[0]}?)`;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
exports.suggestSimilar = suggestSimilar;
|
||||
16
node_modules/@dotenvx/dotenvx/node_modules/commander/package-support.json
generated
vendored
Normal file
16
node_modules/@dotenvx/dotenvx/node_modules/commander/package-support.json
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "*",
|
||||
"target": {
|
||||
"node": "supported"
|
||||
},
|
||||
"response": {
|
||||
"type": "time-permitting"
|
||||
},
|
||||
"backing": {
|
||||
"npm-funding": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
80
node_modules/@dotenvx/dotenvx/node_modules/commander/package.json
generated
vendored
Normal file
80
node_modules/@dotenvx/dotenvx/node_modules/commander/package.json
generated
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"name": "commander",
|
||||
"version": "11.1.0",
|
||||
"description": "the complete solution for node.js command-line programs",
|
||||
"keywords": [
|
||||
"commander",
|
||||
"command",
|
||||
"option",
|
||||
"parser",
|
||||
"cli",
|
||||
"argument",
|
||||
"args",
|
||||
"argv"
|
||||
],
|
||||
"author": "TJ Holowaychuk <tj@vision-media.ca>",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tj/commander.js.git"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "npm run lint:javascript && npm run lint:typescript",
|
||||
"lint:javascript": "eslint index.js esm.mjs \"lib/*.js\" \"tests/**/*.js\"",
|
||||
"lint:typescript": "eslint typings/*.ts tests/*.ts",
|
||||
"test": "jest && npm run typecheck-ts",
|
||||
"test-esm": "node ./tests/esm-imports-test.mjs",
|
||||
"typecheck-ts": "tsd && tsc -p tsconfig.ts.json",
|
||||
"typecheck-js": "tsc -p tsconfig.js.json",
|
||||
"test-all": "npm run test && npm run lint && npm run typecheck-js && npm run test-esm"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"lib/*.js",
|
||||
"esm.mjs",
|
||||
"typings/index.d.ts",
|
||||
"typings/esm.d.mts",
|
||||
"package-support.json"
|
||||
],
|
||||
"type": "commonjs",
|
||||
"main": "./index.js",
|
||||
"exports": {
|
||||
".": {
|
||||
"require": {
|
||||
"types": "./typings/index.d.ts",
|
||||
"default": "./index.js"
|
||||
},
|
||||
"import": {
|
||||
"types": "./typings/esm.d.mts",
|
||||
"default": "./esm.mjs"
|
||||
},
|
||||
"default": "./index.js"
|
||||
},
|
||||
"./esm.mjs": {
|
||||
"types": "./typings/esm.d.mts",
|
||||
"import": "./esm.mjs"
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^29.2.4",
|
||||
"@types/node": "^20.2.5",
|
||||
"@typescript-eslint/eslint-plugin": "^5.47.1",
|
||||
"@typescript-eslint/parser": "^5.47.1",
|
||||
"eslint": "^8.30.0",
|
||||
"eslint-config-standard": "^17.0.0",
|
||||
"eslint-config-standard-with-typescript": "^33.0.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-jest": "^27.1.7",
|
||||
"eslint-plugin-n": "^15.6.0",
|
||||
"eslint-plugin-promise": "^6.1.1",
|
||||
"jest": "^29.3.1",
|
||||
"ts-jest": "^29.0.3",
|
||||
"tsd": "^0.28.1",
|
||||
"typescript": "^5.0.4"
|
||||
},
|
||||
"types": "typings/index.d.ts",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
},
|
||||
"support": true
|
||||
}
|
||||
3
node_modules/@dotenvx/dotenvx/node_modules/commander/typings/esm.d.mts
generated
vendored
Normal file
3
node_modules/@dotenvx/dotenvx/node_modules/commander/typings/esm.d.mts
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
// Just reexport the types from cjs
|
||||
// This is a bit indirect. There is not an index.js, but TypeScript will look for index.d.ts for types.
|
||||
export * from './index.js';
|
||||
884
node_modules/@dotenvx/dotenvx/node_modules/commander/typings/index.d.ts
generated
vendored
Normal file
884
node_modules/@dotenvx/dotenvx/node_modules/commander/typings/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,884 @@
|
||||
// Type definitions for commander
|
||||
// Original definitions by: Alan Agius <https://github.com/alan-agius4>, Marcelo Dezem <https://github.com/mdezem>, vvakame <https://github.com/vvakame>, Jules Randolph <https://github.com/sveinburne>
|
||||
|
||||
// Using method rather than property for method-signature-style, to document method overloads separately. Allow either.
|
||||
/* eslint-disable @typescript-eslint/method-signature-style */
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
|
||||
// This is a trick to encourage editor to suggest the known literals while still
|
||||
// allowing any BaseType value.
|
||||
// References:
|
||||
// - https://github.com/microsoft/TypeScript/issues/29729
|
||||
// - https://github.com/sindresorhus/type-fest/blob/main/source/literal-union.d.ts
|
||||
// - https://github.com/sindresorhus/type-fest/blob/main/source/primitive.d.ts
|
||||
type LiteralUnion<LiteralType, BaseType extends string | number> = LiteralType | (BaseType & Record<never, never>);
|
||||
|
||||
export class CommanderError extends Error {
|
||||
code: string;
|
||||
exitCode: number;
|
||||
message: string;
|
||||
nestedError?: string;
|
||||
|
||||
/**
|
||||
* Constructs the CommanderError class
|
||||
* @param exitCode - suggested exit code which could be used with process.exit
|
||||
* @param code - an id string representing the error
|
||||
* @param message - human-readable description of the error
|
||||
* @constructor
|
||||
*/
|
||||
constructor(exitCode: number, code: string, message: string);
|
||||
}
|
||||
|
||||
export class InvalidArgumentError extends CommanderError {
|
||||
/**
|
||||
* Constructs the InvalidArgumentError class
|
||||
* @param message - explanation of why argument is invalid
|
||||
* @constructor
|
||||
*/
|
||||
constructor(message: string);
|
||||
}
|
||||
export { InvalidArgumentError as InvalidOptionArgumentError }; // deprecated old name
|
||||
|
||||
export interface ErrorOptions { // optional parameter for error()
|
||||
/** an id string representing the error */
|
||||
code?: string;
|
||||
/** suggested exit code which could be used with process.exit */
|
||||
exitCode?: number;
|
||||
}
|
||||
|
||||
export class Argument {
|
||||
description: string;
|
||||
required: boolean;
|
||||
variadic: boolean;
|
||||
defaultValue?: any;
|
||||
defaultValueDescription?: string;
|
||||
argChoices?: string[];
|
||||
|
||||
/**
|
||||
* Initialize a new command argument with the given name and description.
|
||||
* The default is that the argument is required, and you can explicitly
|
||||
* indicate this with <> around the name. Put [] around the name for an optional argument.
|
||||
*/
|
||||
constructor(arg: string, description?: string);
|
||||
|
||||
/**
|
||||
* Return argument name.
|
||||
*/
|
||||
name(): string;
|
||||
|
||||
/**
|
||||
* Set the default value, and optionally supply the description to be displayed in the help.
|
||||
*/
|
||||
default(value: unknown, description?: string): this;
|
||||
|
||||
/**
|
||||
* Set the custom handler for processing CLI command arguments into argument values.
|
||||
*/
|
||||
argParser<T>(fn: (value: string, previous: T) => T): this;
|
||||
|
||||
/**
|
||||
* Only allow argument value to be one of choices.
|
||||
*/
|
||||
choices(values: readonly string[]): this;
|
||||
|
||||
/**
|
||||
* Make argument required.
|
||||
*/
|
||||
argRequired(): this;
|
||||
|
||||
/**
|
||||
* Make argument optional.
|
||||
*/
|
||||
argOptional(): this;
|
||||
}
|
||||
|
||||
export class Option {
|
||||
flags: string;
|
||||
description: string;
|
||||
|
||||
required: boolean; // A value must be supplied when the option is specified.
|
||||
optional: boolean; // A value is optional when the option is specified.
|
||||
variadic: boolean;
|
||||
mandatory: boolean; // The option must have a value after parsing, which usually means it must be specified on command line.
|
||||
short?: string;
|
||||
long?: string;
|
||||
negate: boolean;
|
||||
defaultValue?: any;
|
||||
defaultValueDescription?: string;
|
||||
presetArg?: unknown;
|
||||
envVar?: string;
|
||||
parseArg?: <T>(value: string, previous: T) => T;
|
||||
hidden: boolean;
|
||||
argChoices?: string[];
|
||||
|
||||
constructor(flags: string, description?: string);
|
||||
|
||||
/**
|
||||
* Set the default value, and optionally supply the description to be displayed in the help.
|
||||
*/
|
||||
default(value: unknown, description?: string): this;
|
||||
|
||||
/**
|
||||
* Preset to use when option used without option-argument, especially optional but also boolean and negated.
|
||||
* The custom processing (parseArg) is called.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* new Option('--color').default('GREYSCALE').preset('RGB');
|
||||
* new Option('--donate [amount]').preset('20').argParser(parseFloat);
|
||||
* ```
|
||||
*/
|
||||
preset(arg: unknown): this;
|
||||
|
||||
/**
|
||||
* Add option name(s) that conflict with this option.
|
||||
* An error will be displayed if conflicting options are found during parsing.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* new Option('--rgb').conflicts('cmyk');
|
||||
* new Option('--js').conflicts(['ts', 'jsx']);
|
||||
* ```
|
||||
*/
|
||||
conflicts(names: string | string[]): this;
|
||||
|
||||
/**
|
||||
* Specify implied option values for when this option is set and the implied options are not.
|
||||
*
|
||||
* The custom processing (parseArg) is not called on the implied values.
|
||||
*
|
||||
* @example
|
||||
* program
|
||||
* .addOption(new Option('--log', 'write logging information to file'))
|
||||
* .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' }));
|
||||
*/
|
||||
implies(optionValues: OptionValues): this;
|
||||
|
||||
/**
|
||||
* Set environment variable to check for option value.
|
||||
*
|
||||
* An environment variables is only used if when processed the current option value is
|
||||
* undefined, or the source of the current value is 'default' or 'config' or 'env'.
|
||||
*/
|
||||
env(name: string): this;
|
||||
|
||||
/**
|
||||
* Calculate the full description, including defaultValue etc.
|
||||
*/
|
||||
fullDescription(): string;
|
||||
|
||||
/**
|
||||
* Set the custom handler for processing CLI option arguments into option values.
|
||||
*/
|
||||
argParser<T>(fn: (value: string, previous: T) => T): this;
|
||||
|
||||
/**
|
||||
* Whether the option is mandatory and must have a value after parsing.
|
||||
*/
|
||||
makeOptionMandatory(mandatory?: boolean): this;
|
||||
|
||||
/**
|
||||
* Hide option in help.
|
||||
*/
|
||||
hideHelp(hide?: boolean): this;
|
||||
|
||||
/**
|
||||
* Only allow option value to be one of choices.
|
||||
*/
|
||||
choices(values: readonly string[]): this;
|
||||
|
||||
/**
|
||||
* Return option name.
|
||||
*/
|
||||
name(): string;
|
||||
|
||||
/**
|
||||
* Return option name, in a camelcase format that can be used
|
||||
* as a object attribute key.
|
||||
*/
|
||||
attributeName(): string;
|
||||
|
||||
/**
|
||||
* Return whether a boolean option.
|
||||
*
|
||||
* Options are one of boolean, negated, required argument, or optional argument.
|
||||
*/
|
||||
isBoolean(): boolean;
|
||||
}
|
||||
|
||||
export class Help {
|
||||
/** output helpWidth, long lines are wrapped to fit */
|
||||
helpWidth?: number;
|
||||
sortSubcommands: boolean;
|
||||
sortOptions: boolean;
|
||||
showGlobalOptions: boolean;
|
||||
|
||||
constructor();
|
||||
|
||||
/** Get the command term to show in the list of subcommands. */
|
||||
subcommandTerm(cmd: Command): string;
|
||||
/** Get the command summary to show in the list of subcommands. */
|
||||
subcommandDescription(cmd: Command): string;
|
||||
/** Get the option term to show in the list of options. */
|
||||
optionTerm(option: Option): string;
|
||||
/** Get the option description to show in the list of options. */
|
||||
optionDescription(option: Option): string;
|
||||
/** Get the argument term to show in the list of arguments. */
|
||||
argumentTerm(argument: Argument): string;
|
||||
/** Get the argument description to show in the list of arguments. */
|
||||
argumentDescription(argument: Argument): string;
|
||||
|
||||
/** Get the command usage to be displayed at the top of the built-in help. */
|
||||
commandUsage(cmd: Command): string;
|
||||
/** Get the description for the command. */
|
||||
commandDescription(cmd: Command): string;
|
||||
|
||||
/** Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one. */
|
||||
visibleCommands(cmd: Command): Command[];
|
||||
/** Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one. */
|
||||
visibleOptions(cmd: Command): Option[];
|
||||
/** Get an array of the visible global options. (Not including help.) */
|
||||
visibleGlobalOptions(cmd: Command): Option[];
|
||||
/** Get an array of the arguments which have descriptions. */
|
||||
visibleArguments(cmd: Command): Argument[];
|
||||
|
||||
/** Get the longest command term length. */
|
||||
longestSubcommandTermLength(cmd: Command, helper: Help): number;
|
||||
/** Get the longest option term length. */
|
||||
longestOptionTermLength(cmd: Command, helper: Help): number;
|
||||
/** Get the longest global option term length. */
|
||||
longestGlobalOptionTermLength(cmd: Command, helper: Help): number;
|
||||
/** Get the longest argument term length. */
|
||||
longestArgumentTermLength(cmd: Command, helper: Help): number;
|
||||
/** Calculate the pad width from the maximum term length. */
|
||||
padWidth(cmd: Command, helper: Help): number;
|
||||
|
||||
/**
|
||||
* Wrap the given string to width characters per line, with lines after the first indented.
|
||||
* Do not wrap if insufficient room for wrapping (minColumnWidth), or string is manually formatted.
|
||||
*/
|
||||
wrap(str: string, width: number, indent: number, minColumnWidth?: number): string;
|
||||
|
||||
/** Generate the built-in help text. */
|
||||
formatHelp(cmd: Command, helper: Help): string;
|
||||
}
|
||||
export type HelpConfiguration = Partial<Help>;
|
||||
|
||||
export interface ParseOptions {
|
||||
from: 'node' | 'electron' | 'user';
|
||||
}
|
||||
export interface HelpContext { // optional parameter for .help() and .outputHelp()
|
||||
error: boolean;
|
||||
}
|
||||
export interface AddHelpTextContext { // passed to text function used with .addHelpText()
|
||||
error: boolean;
|
||||
command: Command;
|
||||
}
|
||||
export interface OutputConfiguration {
|
||||
writeOut?(str: string): void;
|
||||
writeErr?(str: string): void;
|
||||
getOutHelpWidth?(): number;
|
||||
getErrHelpWidth?(): number;
|
||||
outputError?(str: string, write: (str: string) => void): void;
|
||||
|
||||
}
|
||||
|
||||
export type AddHelpTextPosition = 'beforeAll' | 'before' | 'after' | 'afterAll';
|
||||
export type HookEvent = 'preSubcommand' | 'preAction' | 'postAction';
|
||||
// The source is a string so author can define their own too.
|
||||
export type OptionValueSource = LiteralUnion<'default' | 'config' | 'env' | 'cli' | 'implied', string> | undefined;
|
||||
|
||||
export type OptionValues = Record<string, any>;
|
||||
|
||||
export class Command {
|
||||
args: string[];
|
||||
processedArgs: any[];
|
||||
readonly commands: readonly Command[];
|
||||
readonly options: readonly Option[];
|
||||
readonly registeredArguments: readonly Argument[];
|
||||
parent: Command | null;
|
||||
|
||||
constructor(name?: string);
|
||||
|
||||
/**
|
||||
* Set the program version to `str`.
|
||||
*
|
||||
* This method auto-registers the "-V, --version" flag
|
||||
* which will print the version number when passed.
|
||||
*
|
||||
* You can optionally supply the flags and description to override the defaults.
|
||||
*/
|
||||
version(str: string, flags?: string, description?: string): this;
|
||||
/**
|
||||
* Get the program version.
|
||||
*/
|
||||
version(): string | undefined;
|
||||
|
||||
/**
|
||||
* Define a command, implemented using an action handler.
|
||||
*
|
||||
* @remarks
|
||||
* The command description is supplied using `.description`, not as a parameter to `.command`.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* program
|
||||
* .command('clone <source> [destination]')
|
||||
* .description('clone a repository into a newly created directory')
|
||||
* .action((source, destination) => {
|
||||
* console.log('clone command called');
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @param nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
|
||||
* @param opts - configuration options
|
||||
* @returns new command
|
||||
*/
|
||||
command(nameAndArgs: string, opts?: CommandOptions): ReturnType<this['createCommand']>;
|
||||
/**
|
||||
* Define a command, implemented in a separate executable file.
|
||||
*
|
||||
* @remarks
|
||||
* The command description is supplied as the second parameter to `.command`.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* program
|
||||
* .command('start <service>', 'start named service')
|
||||
* .command('stop [service]', 'stop named service, or all if no name supplied');
|
||||
* ```
|
||||
*
|
||||
* @param nameAndArgs - command name and arguments, args are `<required>` or `[optional]` and last may also be `variadic...`
|
||||
* @param description - description of executable command
|
||||
* @param opts - configuration options
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
command(nameAndArgs: string, description: string, opts?: ExecutableCommandOptions): this;
|
||||
|
||||
/**
|
||||
* Factory routine to create a new unattached command.
|
||||
*
|
||||
* See .command() for creating an attached subcommand, which uses this routine to
|
||||
* create the command. You can override createCommand to customise subcommands.
|
||||
*/
|
||||
createCommand(name?: string): Command;
|
||||
|
||||
/**
|
||||
* Add a prepared subcommand.
|
||||
*
|
||||
* See .command() for creating an attached subcommand which inherits settings from its parent.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
addCommand(cmd: Command, opts?: CommandOptions): this;
|
||||
|
||||
/**
|
||||
* Factory routine to create a new unattached argument.
|
||||
*
|
||||
* See .argument() for creating an attached argument, which uses this routine to
|
||||
* create the argument. You can override createArgument to return a custom argument.
|
||||
*/
|
||||
createArgument(name: string, description?: string): Argument;
|
||||
|
||||
/**
|
||||
* Define argument syntax for command.
|
||||
*
|
||||
* The default is that the argument is required, and you can explicitly
|
||||
* indicate this with <> around the name. Put [] around the name for an optional argument.
|
||||
*
|
||||
* @example
|
||||
* ```
|
||||
* program.argument('<input-file>');
|
||||
* program.argument('[output-file]');
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
argument<T>(flags: string, description: string, fn: (value: string, previous: T) => T, defaultValue?: T): this;
|
||||
argument(name: string, description?: string, defaultValue?: unknown): this;
|
||||
|
||||
/**
|
||||
* Define argument syntax for command, adding a prepared argument.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
addArgument(arg: Argument): this;
|
||||
|
||||
/**
|
||||
* Define argument syntax for command, adding multiple at once (without descriptions).
|
||||
*
|
||||
* See also .argument().
|
||||
*
|
||||
* @example
|
||||
* ```
|
||||
* program.arguments('<cmd> [env]');
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
arguments(names: string): this;
|
||||
|
||||
/**
|
||||
* Override default decision whether to add implicit help command.
|
||||
*
|
||||
* @example
|
||||
* ```
|
||||
* addHelpCommand() // force on
|
||||
* addHelpCommand(false); // force off
|
||||
* addHelpCommand('help [cmd]', 'display help for [cmd]'); // force on with custom details
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
addHelpCommand(enableOrNameAndArgs?: string | boolean, description?: string): this;
|
||||
|
||||
/**
|
||||
* Add hook for life cycle event.
|
||||
*/
|
||||
hook(event: HookEvent, listener: (thisCommand: Command, actionCommand: Command) => void | Promise<void>): this;
|
||||
|
||||
/**
|
||||
* Register callback to use as replacement for calling process.exit.
|
||||
*/
|
||||
exitOverride(callback?: (err: CommanderError) => never | void): this;
|
||||
|
||||
/**
|
||||
* Display error message and exit (or call exitOverride).
|
||||
*/
|
||||
error(message: string, errorOptions?: ErrorOptions): never;
|
||||
|
||||
/**
|
||||
* You can customise the help with a subclass of Help by overriding createHelp,
|
||||
* or by overriding Help properties using configureHelp().
|
||||
*/
|
||||
createHelp(): Help;
|
||||
|
||||
/**
|
||||
* You can customise the help by overriding Help properties using configureHelp(),
|
||||
* or with a subclass of Help by overriding createHelp().
|
||||
*/
|
||||
configureHelp(configuration: HelpConfiguration): this;
|
||||
/** Get configuration */
|
||||
configureHelp(): HelpConfiguration;
|
||||
|
||||
/**
|
||||
* The default output goes to stdout and stderr. You can customise this for special
|
||||
* applications. You can also customise the display of errors by overriding outputError.
|
||||
*
|
||||
* The configuration properties are all functions:
|
||||
* ```
|
||||
* // functions to change where being written, stdout and stderr
|
||||
* writeOut(str)
|
||||
* writeErr(str)
|
||||
* // matching functions to specify width for wrapping help
|
||||
* getOutHelpWidth()
|
||||
* getErrHelpWidth()
|
||||
* // functions based on what is being written out
|
||||
* outputError(str, write) // used for displaying errors, and not used for displaying help
|
||||
* ```
|
||||
*/
|
||||
configureOutput(configuration: OutputConfiguration): this;
|
||||
/** Get configuration */
|
||||
configureOutput(): OutputConfiguration;
|
||||
|
||||
/**
|
||||
* Copy settings that are useful to have in common across root command and subcommands.
|
||||
*
|
||||
* (Used internally when adding a command using `.command()` so subcommands inherit parent settings.)
|
||||
*/
|
||||
copyInheritedSettings(sourceCommand: Command): this;
|
||||
|
||||
/**
|
||||
* Display the help or a custom message after an error occurs.
|
||||
*/
|
||||
showHelpAfterError(displayHelp?: boolean | string): this;
|
||||
|
||||
/**
|
||||
* Display suggestion of similar commands for unknown commands, or options for unknown options.
|
||||
*/
|
||||
showSuggestionAfterError(displaySuggestion?: boolean): this;
|
||||
|
||||
/**
|
||||
* Register callback `fn` for the command.
|
||||
*
|
||||
* @example
|
||||
* ```
|
||||
* program
|
||||
* .command('serve')
|
||||
* .description('start service')
|
||||
* .action(function() {
|
||||
* // do work here
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
action(fn: (...args: any[]) => void | Promise<void>): this;
|
||||
|
||||
/**
|
||||
* Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both.
|
||||
*
|
||||
* The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. A required
|
||||
* option-argument is indicated by `<>` and an optional option-argument by `[]`.
|
||||
*
|
||||
* See the README for more details, and see also addOption() and requiredOption().
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* program
|
||||
* .option('-p, --pepper', 'add pepper')
|
||||
* .option('-p, --pizza-type <TYPE>', 'type of pizza') // required option-argument
|
||||
* .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default
|
||||
* .option('-t, --tip <VALUE>', 'add tip to purchase cost', parseFloat) // custom parse function
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
option(flags: string, description?: string, defaultValue?: string | boolean | string[]): this;
|
||||
option<T>(flags: string, description: string, parseArg: (value: string, previous: T) => T, defaultValue?: T): this;
|
||||
/** @deprecated since v7, instead use choices or a custom function */
|
||||
option(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean | string[]): this;
|
||||
|
||||
/**
|
||||
* Define a required option, which must have a value after parsing. This usually means
|
||||
* the option must be specified on the command line. (Otherwise the same as .option().)
|
||||
*
|
||||
* The `flags` string contains the short and/or long flags, separated by comma, a pipe or space.
|
||||
*/
|
||||
requiredOption(flags: string, description?: string, defaultValue?: string | boolean | string[]): this;
|
||||
requiredOption<T>(flags: string, description: string, parseArg: (value: string, previous: T) => T, defaultValue?: T): this;
|
||||
/** @deprecated since v7, instead use choices or a custom function */
|
||||
requiredOption(flags: string, description: string, regexp: RegExp, defaultValue?: string | boolean | string[]): this;
|
||||
|
||||
/**
|
||||
* Factory routine to create a new unattached option.
|
||||
*
|
||||
* See .option() for creating an attached option, which uses this routine to
|
||||
* create the option. You can override createOption to return a custom option.
|
||||
*/
|
||||
|
||||
createOption(flags: string, description?: string): Option;
|
||||
|
||||
/**
|
||||
* Add a prepared Option.
|
||||
*
|
||||
* See .option() and .requiredOption() for creating and attaching an option in a single call.
|
||||
*/
|
||||
addOption(option: Option): this;
|
||||
|
||||
/**
|
||||
* Whether to store option values as properties on command object,
|
||||
* or store separately (specify false). In both cases the option values can be accessed using .opts().
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
storeOptionsAsProperties<T extends OptionValues>(): this & T;
|
||||
storeOptionsAsProperties<T extends OptionValues>(storeAsProperties: true): this & T;
|
||||
storeOptionsAsProperties(storeAsProperties?: boolean): this;
|
||||
|
||||
/**
|
||||
* Retrieve option value.
|
||||
*/
|
||||
getOptionValue(key: string): any;
|
||||
|
||||
/**
|
||||
* Store option value.
|
||||
*/
|
||||
setOptionValue(key: string, value: unknown): this;
|
||||
|
||||
/**
|
||||
* Store option value and where the value came from.
|
||||
*/
|
||||
setOptionValueWithSource(key: string, value: unknown, source: OptionValueSource): this;
|
||||
|
||||
/**
|
||||
* Get source of option value.
|
||||
*/
|
||||
getOptionValueSource(key: string): OptionValueSource | undefined;
|
||||
|
||||
/**
|
||||
* Get source of option value. See also .optsWithGlobals().
|
||||
*/
|
||||
getOptionValueSourceWithGlobals(key: string): OptionValueSource | undefined;
|
||||
|
||||
/**
|
||||
* Alter parsing of short flags with optional values.
|
||||
*
|
||||
* @example
|
||||
* ```
|
||||
* // for `.option('-f,--flag [value]'):
|
||||
* .combineFlagAndOptionalValue(true) // `-f80` is treated like `--flag=80`, this is the default behaviour
|
||||
* .combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b`
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
combineFlagAndOptionalValue(combine?: boolean): this;
|
||||
|
||||
/**
|
||||
* Allow unknown options on the command line.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
allowUnknownOption(allowUnknown?: boolean): this;
|
||||
|
||||
/**
|
||||
* Allow excess command-arguments on the command line. Pass false to make excess arguments an error.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
allowExcessArguments(allowExcess?: boolean): this;
|
||||
|
||||
/**
|
||||
* Enable positional options. Positional means global options are specified before subcommands which lets
|
||||
* subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions.
|
||||
*
|
||||
* The default behaviour is non-positional and global options may appear anywhere on the command line.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
enablePositionalOptions(positional?: boolean): this;
|
||||
|
||||
/**
|
||||
* Pass through options that come after command-arguments rather than treat them as command-options,
|
||||
* so actual command-options come before command-arguments. Turning this on for a subcommand requires
|
||||
* positional options to have been enabled on the program (parent commands).
|
||||
*
|
||||
* The default behaviour is non-positional and options may appear before or after command-arguments.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
passThroughOptions(passThrough?: boolean): this;
|
||||
|
||||
/**
|
||||
* Parse `argv`, setting options and invoking commands when defined.
|
||||
*
|
||||
* The default expectation is that the arguments are from node and have the application as argv[0]
|
||||
* and the script being run in argv[1], with user parameters after that.
|
||||
*
|
||||
* @example
|
||||
* ```
|
||||
* program.parse(process.argv);
|
||||
* program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions
|
||||
* program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
parse(argv?: readonly string[], options?: ParseOptions): this;
|
||||
|
||||
/**
|
||||
* Parse `argv`, setting options and invoking commands when defined.
|
||||
*
|
||||
* Use parseAsync instead of parse if any of your action handlers are async. Returns a Promise.
|
||||
*
|
||||
* The default expectation is that the arguments are from node and have the application as argv[0]
|
||||
* and the script being run in argv[1], with user parameters after that.
|
||||
*
|
||||
* @example
|
||||
* ```
|
||||
* program.parseAsync(process.argv);
|
||||
* program.parseAsync(); // implicitly use process.argv and auto-detect node vs electron conventions
|
||||
* program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]
|
||||
* ```
|
||||
*
|
||||
* @returns Promise
|
||||
*/
|
||||
parseAsync(argv?: readonly string[], options?: ParseOptions): Promise<this>;
|
||||
|
||||
/**
|
||||
* Parse options from `argv` removing known options,
|
||||
* and return argv split into operands and unknown arguments.
|
||||
*
|
||||
* argv => operands, unknown
|
||||
* --known kkk op => [op], []
|
||||
* op --known kkk => [op], []
|
||||
* sub --unknown uuu op => [sub], [--unknown uuu op]
|
||||
* sub -- --unknown uuu op => [sub --unknown uuu op], []
|
||||
*/
|
||||
parseOptions(argv: string[]): ParseOptionsResult;
|
||||
|
||||
/**
|
||||
* Return an object containing local option values as key-value pairs
|
||||
*/
|
||||
opts<T extends OptionValues>(): T;
|
||||
|
||||
/**
|
||||
* Return an object containing merged local and global option values as key-value pairs.
|
||||
*/
|
||||
optsWithGlobals<T extends OptionValues>(): T;
|
||||
|
||||
/**
|
||||
* Set the description.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
|
||||
description(str: string): this;
|
||||
/** @deprecated since v8, instead use .argument to add command argument with description */
|
||||
description(str: string, argsDescription: Record<string, string>): this;
|
||||
/**
|
||||
* Get the description.
|
||||
*/
|
||||
description(): string;
|
||||
|
||||
/**
|
||||
* Set the summary. Used when listed as subcommand of parent.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
|
||||
summary(str: string): this;
|
||||
/**
|
||||
* Get the summary.
|
||||
*/
|
||||
summary(): string;
|
||||
|
||||
/**
|
||||
* Set an alias for the command.
|
||||
*
|
||||
* You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
alias(alias: string): this;
|
||||
/**
|
||||
* Get alias for the command.
|
||||
*/
|
||||
alias(): string;
|
||||
|
||||
/**
|
||||
* Set aliases for the command.
|
||||
*
|
||||
* Only the first alias is shown in the auto-generated help.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
aliases(aliases: readonly string[]): this;
|
||||
/**
|
||||
* Get aliases for the command.
|
||||
*/
|
||||
aliases(): string[];
|
||||
|
||||
/**
|
||||
* Set the command usage.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
usage(str: string): this;
|
||||
/**
|
||||
* Get the command usage.
|
||||
*/
|
||||
usage(): string;
|
||||
|
||||
/**
|
||||
* Set the name of the command.
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
name(str: string): this;
|
||||
/**
|
||||
* Get the name of the command.
|
||||
*/
|
||||
name(): string;
|
||||
|
||||
/**
|
||||
* Set the name of the command from script filename, such as process.argv[1],
|
||||
* or require.main.filename, or __filename.
|
||||
*
|
||||
* (Used internally and public although not documented in README.)
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* program.nameFromFilename(require.main.filename);
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
nameFromFilename(filename: string): this;
|
||||
|
||||
/**
|
||||
* Set the directory for searching for executable subcommands of this command.
|
||||
*
|
||||
* @example
|
||||
* ```ts
|
||||
* program.executableDir(__dirname);
|
||||
* // or
|
||||
* program.executableDir('subcommands');
|
||||
* ```
|
||||
*
|
||||
* @returns `this` command for chaining
|
||||
*/
|
||||
executableDir(path: string): this;
|
||||
/**
|
||||
* Get the executable search directory.
|
||||
*/
|
||||
executableDir(): string | null;
|
||||
|
||||
/**
|
||||
* Output help information for this command.
|
||||
*
|
||||
* Outputs built-in help, and custom text added using `.addHelpText()`.
|
||||
*
|
||||
*/
|
||||
outputHelp(context?: HelpContext): void;
|
||||
/** @deprecated since v7 */
|
||||
outputHelp(cb?: (str: string) => string): void;
|
||||
|
||||
/**
|
||||
* Return command help documentation.
|
||||
*/
|
||||
helpInformation(context?: HelpContext): string;
|
||||
|
||||
/**
|
||||
* You can pass in flags and a description to override the help
|
||||
* flags and help description for your command. Pass in false
|
||||
* to disable the built-in help option.
|
||||
*/
|
||||
helpOption(flags?: string | boolean, description?: string): this;
|
||||
|
||||
/**
|
||||
* Output help information and exit.
|
||||
*
|
||||
* Outputs built-in help, and custom text added using `.addHelpText()`.
|
||||
*/
|
||||
help(context?: HelpContext): never;
|
||||
/** @deprecated since v7 */
|
||||
help(cb?: (str: string) => string): never;
|
||||
|
||||
/**
|
||||
* Add additional text to be displayed with the built-in help.
|
||||
*
|
||||
* Position is 'before' or 'after' to affect just this command,
|
||||
* and 'beforeAll' or 'afterAll' to affect this command and all its subcommands.
|
||||
*/
|
||||
addHelpText(position: AddHelpTextPosition, text: string): this;
|
||||
addHelpText(position: AddHelpTextPosition, text: (context: AddHelpTextContext) => string): this;
|
||||
|
||||
/**
|
||||
* Add a listener (callback) for when events occur. (Implemented using EventEmitter.)
|
||||
*/
|
||||
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
||||
}
|
||||
|
||||
export interface CommandOptions {
|
||||
hidden?: boolean;
|
||||
isDefault?: boolean;
|
||||
/** @deprecated since v7, replaced by hidden */
|
||||
noHelp?: boolean;
|
||||
}
|
||||
export interface ExecutableCommandOptions extends CommandOptions {
|
||||
executableFile?: string;
|
||||
}
|
||||
|
||||
export interface ParseOptionsResult {
|
||||
operands: string[];
|
||||
unknown: string[];
|
||||
}
|
||||
|
||||
export function createCommand(name?: string): Command;
|
||||
export function createOption(flags: string, description?: string): Option;
|
||||
export function createArgument(name: string, description?: string): Argument;
|
||||
|
||||
export const program: Command;
|
||||
564
node_modules/@dotenvx/dotenvx/node_modules/execa/index.d.ts
generated
vendored
Normal file
564
node_modules/@dotenvx/dotenvx/node_modules/execa/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,564 @@
|
||||
/// <reference types="node"/>
|
||||
import {ChildProcess} from 'child_process';
|
||||
import {Stream, Readable as ReadableStream} from 'stream';
|
||||
|
||||
declare namespace execa {
|
||||
type StdioOption =
|
||||
| 'pipe'
|
||||
| 'ipc'
|
||||
| 'ignore'
|
||||
| 'inherit'
|
||||
| Stream
|
||||
| number
|
||||
| undefined;
|
||||
|
||||
interface CommonOptions<EncodingType> {
|
||||
/**
|
||||
Kill the spawned process when the parent process exits unless either:
|
||||
- the spawned process is [`detached`](https://nodejs.org/api/child_process.html#child_process_options_detached)
|
||||
- the parent process is terminated abruptly, for example, with `SIGKILL` as opposed to `SIGTERM` or a normal exit
|
||||
|
||||
@default true
|
||||
*/
|
||||
readonly cleanup?: boolean;
|
||||
|
||||
/**
|
||||
Prefer locally installed binaries when looking for a binary to execute.
|
||||
|
||||
If you `$ npm install foo`, you can then `execa('foo')`.
|
||||
|
||||
@default false
|
||||
*/
|
||||
readonly preferLocal?: boolean;
|
||||
|
||||
/**
|
||||
Preferred path to find locally installed binaries in (use with `preferLocal`).
|
||||
|
||||
@default process.cwd()
|
||||
*/
|
||||
readonly localDir?: string;
|
||||
|
||||
/**
|
||||
Path to the Node.js executable to use in child processes.
|
||||
|
||||
This can be either an absolute path or a path relative to the `cwd` option.
|
||||
|
||||
Requires `preferLocal` to be `true`.
|
||||
|
||||
For example, this can be used together with [`get-node`](https://github.com/ehmicky/get-node) to run a specific Node.js version in a child process.
|
||||
|
||||
@default process.execPath
|
||||
*/
|
||||
readonly execPath?: string;
|
||||
|
||||
/**
|
||||
Buffer the output from the spawned process. When set to `false`, you must read the output of `stdout` and `stderr` (or `all` if the `all` option is `true`). Otherwise the returned promise will not be resolved/rejected.
|
||||
|
||||
If the spawned process fails, `error.stdout`, `error.stderr`, and `error.all` will contain the buffered data.
|
||||
|
||||
@default true
|
||||
*/
|
||||
readonly buffer?: boolean;
|
||||
|
||||
/**
|
||||
Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
|
||||
|
||||
@default 'pipe'
|
||||
*/
|
||||
readonly stdin?: StdioOption;
|
||||
|
||||
/**
|
||||
Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
|
||||
|
||||
@default 'pipe'
|
||||
*/
|
||||
readonly stdout?: StdioOption;
|
||||
|
||||
/**
|
||||
Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
|
||||
|
||||
@default 'pipe'
|
||||
*/
|
||||
readonly stderr?: StdioOption;
|
||||
|
||||
/**
|
||||
Setting this to `false` resolves the promise with the error instead of rejecting it.
|
||||
|
||||
@default true
|
||||
*/
|
||||
readonly reject?: boolean;
|
||||
|
||||
/**
|
||||
Add an `.all` property on the promise and the resolved value. The property contains the output of the process with `stdout` and `stderr` interleaved.
|
||||
|
||||
@default false
|
||||
*/
|
||||
readonly all?: boolean;
|
||||
|
||||
/**
|
||||
Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from the output.
|
||||
|
||||
@default true
|
||||
*/
|
||||
readonly stripFinalNewline?: boolean;
|
||||
|
||||
/**
|
||||
Set to `false` if you don't want to extend the environment variables when providing the `env` property.
|
||||
|
||||
@default true
|
||||
*/
|
||||
readonly extendEnv?: boolean;
|
||||
|
||||
/**
|
||||
Current working directory of the child process.
|
||||
|
||||
@default process.cwd()
|
||||
*/
|
||||
readonly cwd?: string;
|
||||
|
||||
/**
|
||||
Environment key-value pairs. Extends automatically from `process.env`. Set `extendEnv` to `false` if you don't want this.
|
||||
|
||||
@default process.env
|
||||
*/
|
||||
readonly env?: NodeJS.ProcessEnv;
|
||||
|
||||
/**
|
||||
Explicitly set the value of `argv[0]` sent to the child process. This will be set to `command` or `file` if not specified.
|
||||
*/
|
||||
readonly argv0?: string;
|
||||
|
||||
/**
|
||||
Child's [stdio](https://nodejs.org/api/child_process.html#child_process_options_stdio) configuration.
|
||||
|
||||
@default 'pipe'
|
||||
*/
|
||||
readonly stdio?: 'pipe' | 'ignore' | 'inherit' | readonly StdioOption[];
|
||||
|
||||
/**
|
||||
Specify the kind of serialization used for sending messages between processes when using the `stdio: 'ipc'` option or `execa.node()`:
|
||||
- `json`: Uses `JSON.stringify()` and `JSON.parse()`.
|
||||
- `advanced`: Uses [`v8.serialize()`](https://nodejs.org/api/v8.html#v8_v8_serialize_value)
|
||||
|
||||
Requires Node.js `13.2.0` or later.
|
||||
|
||||
[More info.](https://nodejs.org/api/child_process.html#child_process_advanced_serialization)
|
||||
|
||||
@default 'json'
|
||||
*/
|
||||
readonly serialization?: 'json' | 'advanced';
|
||||
|
||||
/**
|
||||
Prepare child to run independently of its parent process. Specific behavior [depends on the platform](https://nodejs.org/api/child_process.html#child_process_options_detached).
|
||||
|
||||
@default false
|
||||
*/
|
||||
readonly detached?: boolean;
|
||||
|
||||
/**
|
||||
Sets the user identity of the process.
|
||||
*/
|
||||
readonly uid?: number;
|
||||
|
||||
/**
|
||||
Sets the group identity of the process.
|
||||
*/
|
||||
readonly gid?: number;
|
||||
|
||||
/**
|
||||
If `true`, runs `command` inside of a shell. Uses `/bin/sh` on UNIX and `cmd.exe` on Windows. A different shell can be specified as a string. The shell should understand the `-c` switch on UNIX or `/d /s /c` on Windows.
|
||||
|
||||
We recommend against using this option since it is:
|
||||
- not cross-platform, encouraging shell-specific syntax.
|
||||
- slower, because of the additional shell interpretation.
|
||||
- unsafe, potentially allowing command injection.
|
||||
|
||||
@default false
|
||||
*/
|
||||
readonly shell?: boolean | string;
|
||||
|
||||
/**
|
||||
Specify the character encoding used to decode the `stdout` and `stderr` output. If set to `null`, then `stdout` and `stderr` will be a `Buffer` instead of a string.
|
||||
|
||||
@default 'utf8'
|
||||
*/
|
||||
readonly encoding?: EncodingType;
|
||||
|
||||
/**
|
||||
If `timeout` is greater than `0`, the parent will send the signal identified by the `killSignal` property (the default is `SIGTERM`) if the child runs longer than `timeout` milliseconds.
|
||||
|
||||
@default 0
|
||||
*/
|
||||
readonly timeout?: number;
|
||||
|
||||
/**
|
||||
Largest amount of data in bytes allowed on `stdout` or `stderr`. Default: 100 MB.
|
||||
|
||||
@default 100_000_000
|
||||
*/
|
||||
readonly maxBuffer?: number;
|
||||
|
||||
/**
|
||||
Signal value to be used when the spawned process will be killed.
|
||||
|
||||
@default 'SIGTERM'
|
||||
*/
|
||||
readonly killSignal?: string | number;
|
||||
|
||||
/**
|
||||
If `true`, no quoting or escaping of arguments is done on Windows. Ignored on other platforms. This is set to `true` automatically when the `shell` option is `true`.
|
||||
|
||||
@default false
|
||||
*/
|
||||
readonly windowsVerbatimArguments?: boolean;
|
||||
|
||||
/**
|
||||
On Windows, do not create a new console window. Please note this also prevents `CTRL-C` [from working](https://github.com/nodejs/node/issues/29837) on Windows.
|
||||
|
||||
@default true
|
||||
*/
|
||||
readonly windowsHide?: boolean;
|
||||
}
|
||||
|
||||
interface Options<EncodingType = string> extends CommonOptions<EncodingType> {
|
||||
/**
|
||||
Write some input to the `stdin` of your binary.
|
||||
*/
|
||||
readonly input?: string | Buffer | ReadableStream;
|
||||
}
|
||||
|
||||
interface SyncOptions<EncodingType = string> extends CommonOptions<EncodingType> {
|
||||
/**
|
||||
Write some input to the `stdin` of your binary.
|
||||
*/
|
||||
readonly input?: string | Buffer;
|
||||
}
|
||||
|
||||
interface NodeOptions<EncodingType = string> extends Options<EncodingType> {
|
||||
/**
|
||||
The Node.js executable to use.
|
||||
|
||||
@default process.execPath
|
||||
*/
|
||||
readonly nodePath?: string;
|
||||
|
||||
/**
|
||||
List of [CLI options](https://nodejs.org/api/cli.html#cli_options) passed to the Node.js executable.
|
||||
|
||||
@default process.execArgv
|
||||
*/
|
||||
readonly nodeOptions?: string[];
|
||||
}
|
||||
|
||||
interface ExecaReturnBase<StdoutStderrType> {
|
||||
/**
|
||||
The file and arguments that were run, for logging purposes.
|
||||
|
||||
This is not escaped and should not be executed directly as a process, including using `execa()` or `execa.command()`.
|
||||
*/
|
||||
command: string;
|
||||
|
||||
/**
|
||||
Same as `command` but escaped.
|
||||
|
||||
This is meant to be copy and pasted into a shell, for debugging purposes.
|
||||
Since the escaping is fairly basic, this should not be executed directly as a process, including using `execa()` or `execa.command()`.
|
||||
*/
|
||||
escapedCommand: string;
|
||||
|
||||
/**
|
||||
The numeric exit code of the process that was run.
|
||||
*/
|
||||
exitCode: number;
|
||||
|
||||
/**
|
||||
The output of the process on stdout.
|
||||
*/
|
||||
stdout: StdoutStderrType;
|
||||
|
||||
/**
|
||||
The output of the process on stderr.
|
||||
*/
|
||||
stderr: StdoutStderrType;
|
||||
|
||||
/**
|
||||
Whether the process failed to run.
|
||||
*/
|
||||
failed: boolean;
|
||||
|
||||
/**
|
||||
Whether the process timed out.
|
||||
*/
|
||||
timedOut: boolean;
|
||||
|
||||
/**
|
||||
Whether the process was killed.
|
||||
*/
|
||||
killed: boolean;
|
||||
|
||||
/**
|
||||
The name of the signal that was used to terminate the process. For example, `SIGFPE`.
|
||||
|
||||
If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`.
|
||||
*/
|
||||
signal?: string;
|
||||
|
||||
/**
|
||||
A human-friendly description of the signal that was used to terminate the process. For example, `Floating point arithmetic error`.
|
||||
|
||||
If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. It is also `undefined` when the signal is very uncommon which should seldomly happen.
|
||||
*/
|
||||
signalDescription?: string;
|
||||
}
|
||||
|
||||
interface ExecaSyncReturnValue<StdoutErrorType = string>
|
||||
extends ExecaReturnBase<StdoutErrorType> {
|
||||
}
|
||||
|
||||
/**
|
||||
Result of a child process execution. On success this is a plain object. On failure this is also an `Error` instance.
|
||||
|
||||
The child process fails when:
|
||||
- its exit code is not `0`
|
||||
- it was killed with a signal
|
||||
- timing out
|
||||
- being canceled
|
||||
- there's not enough memory or there are already too many child processes
|
||||
*/
|
||||
interface ExecaReturnValue<StdoutErrorType = string>
|
||||
extends ExecaSyncReturnValue<StdoutErrorType> {
|
||||
/**
|
||||
The output of the process with `stdout` and `stderr` interleaved.
|
||||
|
||||
This is `undefined` if either:
|
||||
- the `all` option is `false` (default value)
|
||||
- `execa.sync()` was used
|
||||
*/
|
||||
all?: StdoutErrorType;
|
||||
|
||||
/**
|
||||
Whether the process was canceled.
|
||||
*/
|
||||
isCanceled: boolean;
|
||||
}
|
||||
|
||||
interface ExecaSyncError<StdoutErrorType = string>
|
||||
extends Error,
|
||||
ExecaReturnBase<StdoutErrorType> {
|
||||
/**
|
||||
Error message when the child process failed to run. In addition to the underlying error message, it also contains some information related to why the child process errored.
|
||||
|
||||
The child process stderr then stdout are appended to the end, separated with newlines and not interleaved.
|
||||
*/
|
||||
message: string;
|
||||
|
||||
/**
|
||||
This is the same as the `message` property except it does not include the child process stdout/stderr.
|
||||
*/
|
||||
shortMessage: string;
|
||||
|
||||
/**
|
||||
Original error message. This is the same as the `message` property except it includes neither the child process stdout/stderr nor some additional information added by Execa.
|
||||
|
||||
This is `undefined` unless the child process exited due to an `error` event or a timeout.
|
||||
*/
|
||||
originalMessage?: string;
|
||||
}
|
||||
|
||||
interface ExecaError<StdoutErrorType = string>
|
||||
extends ExecaSyncError<StdoutErrorType> {
|
||||
/**
|
||||
The output of the process with `stdout` and `stderr` interleaved.
|
||||
|
||||
This is `undefined` if either:
|
||||
- the `all` option is `false` (default value)
|
||||
- `execa.sync()` was used
|
||||
*/
|
||||
all?: StdoutErrorType;
|
||||
|
||||
/**
|
||||
Whether the process was canceled.
|
||||
*/
|
||||
isCanceled: boolean;
|
||||
}
|
||||
|
||||
interface KillOptions {
|
||||
/**
|
||||
Milliseconds to wait for the child process to terminate before sending `SIGKILL`.
|
||||
|
||||
Can be disabled with `false`.
|
||||
|
||||
@default 5000
|
||||
*/
|
||||
forceKillAfterTimeout?: number | false;
|
||||
}
|
||||
|
||||
interface ExecaChildPromise<StdoutErrorType> {
|
||||
/**
|
||||
Stream combining/interleaving [`stdout`](https://nodejs.org/api/child_process.html#child_process_subprocess_stdout) and [`stderr`](https://nodejs.org/api/child_process.html#child_process_subprocess_stderr).
|
||||
|
||||
This is `undefined` if either:
|
||||
- the `all` option is `false` (the default value)
|
||||
- both `stdout` and `stderr` options are set to [`'inherit'`, `'ipc'`, `Stream` or `integer`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio)
|
||||
*/
|
||||
all?: ReadableStream;
|
||||
|
||||
catch<ResultType = never>(
|
||||
onRejected?: (reason: ExecaError<StdoutErrorType>) => ResultType | PromiseLike<ResultType>
|
||||
): Promise<ExecaReturnValue<StdoutErrorType> | ResultType>;
|
||||
|
||||
/**
|
||||
Same as the original [`child_process#kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal), except if `signal` is `SIGTERM` (the default value) and the child process is not terminated after 5 seconds, force it by sending `SIGKILL`.
|
||||
*/
|
||||
kill(signal?: string, options?: KillOptions): void;
|
||||
|
||||
/**
|
||||
Similar to [`childProcess.kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal). This is preferred when cancelling the child process execution as the error is more descriptive and [`childProcessResult.isCanceled`](#iscanceled) is set to `true`.
|
||||
*/
|
||||
cancel(): void;
|
||||
}
|
||||
|
||||
type ExecaChildProcess<StdoutErrorType = string> = ChildProcess &
|
||||
ExecaChildPromise<StdoutErrorType> &
|
||||
Promise<ExecaReturnValue<StdoutErrorType>>;
|
||||
}
|
||||
|
||||
declare const execa: {
|
||||
/**
|
||||
Execute a file.
|
||||
|
||||
Think of this as a mix of `child_process.execFile` and `child_process.spawn`.
|
||||
|
||||
@param file - The program/script to execute.
|
||||
@param arguments - Arguments to pass to `file` on execution.
|
||||
@returns A [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties.
|
||||
|
||||
@example
|
||||
```
|
||||
import execa = require('execa');
|
||||
|
||||
(async () => {
|
||||
const {stdout} = await execa('echo', ['unicorns']);
|
||||
console.log(stdout);
|
||||
//=> 'unicorns'
|
||||
|
||||
// Cancelling a spawned process
|
||||
|
||||
const subprocess = execa('node');
|
||||
|
||||
setTimeout(() => {
|
||||
subprocess.cancel()
|
||||
}, 1000);
|
||||
|
||||
try {
|
||||
await subprocess;
|
||||
} catch (error) {
|
||||
console.log(subprocess.killed); // true
|
||||
console.log(error.isCanceled); // true
|
||||
}
|
||||
})();
|
||||
|
||||
// Pipe the child process stdout to the current stdout
|
||||
execa('echo', ['unicorns']).stdout.pipe(process.stdout);
|
||||
```
|
||||
*/
|
||||
(
|
||||
file: string,
|
||||
arguments?: readonly string[],
|
||||
options?: execa.Options
|
||||
): execa.ExecaChildProcess;
|
||||
(
|
||||
file: string,
|
||||
arguments?: readonly string[],
|
||||
options?: execa.Options<null>
|
||||
): execa.ExecaChildProcess<Buffer>;
|
||||
(file: string, options?: execa.Options): execa.ExecaChildProcess;
|
||||
(file: string, options?: execa.Options<null>): execa.ExecaChildProcess<
|
||||
Buffer
|
||||
>;
|
||||
|
||||
/**
|
||||
Execute a file synchronously.
|
||||
|
||||
This method throws an `Error` if the command fails.
|
||||
|
||||
@param file - The program/script to execute.
|
||||
@param arguments - Arguments to pass to `file` on execution.
|
||||
@returns A result `Object` with `stdout` and `stderr` properties.
|
||||
*/
|
||||
sync(
|
||||
file: string,
|
||||
arguments?: readonly string[],
|
||||
options?: execa.SyncOptions
|
||||
): execa.ExecaSyncReturnValue;
|
||||
sync(
|
||||
file: string,
|
||||
arguments?: readonly string[],
|
||||
options?: execa.SyncOptions<null>
|
||||
): execa.ExecaSyncReturnValue<Buffer>;
|
||||
sync(file: string, options?: execa.SyncOptions): execa.ExecaSyncReturnValue;
|
||||
sync(
|
||||
file: string,
|
||||
options?: execa.SyncOptions<null>
|
||||
): execa.ExecaSyncReturnValue<Buffer>;
|
||||
|
||||
/**
|
||||
Same as `execa()` except both file and arguments are specified in a single `command` string. For example, `execa('echo', ['unicorns'])` is the same as `execa.command('echo unicorns')`.
|
||||
|
||||
If the file or an argument contains spaces, they must be escaped with backslashes. This matters especially if `command` is not a constant but a variable, for example with `__dirname` or `process.cwd()`. Except for spaces, no escaping/quoting is needed.
|
||||
|
||||
The `shell` option must be used if the `command` uses shell-specific features (for example, `&&` or `||`), as opposed to being a simple `file` followed by its `arguments`.
|
||||
|
||||
@param command - The program/script to execute and its arguments.
|
||||
@returns A [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties.
|
||||
|
||||
@example
|
||||
```
|
||||
import execa = require('execa');
|
||||
|
||||
(async () => {
|
||||
const {stdout} = await execa.command('echo unicorns');
|
||||
console.log(stdout);
|
||||
//=> 'unicorns'
|
||||
})();
|
||||
```
|
||||
*/
|
||||
command(command: string, options?: execa.Options): execa.ExecaChildProcess;
|
||||
command(command: string, options?: execa.Options<null>): execa.ExecaChildProcess<Buffer>;
|
||||
|
||||
/**
|
||||
Same as `execa.command()` but synchronous.
|
||||
|
||||
@param command - The program/script to execute and its arguments.
|
||||
@returns A result `Object` with `stdout` and `stderr` properties.
|
||||
*/
|
||||
commandSync(command: string, options?: execa.SyncOptions): execa.ExecaSyncReturnValue;
|
||||
commandSync(command: string, options?: execa.SyncOptions<null>): execa.ExecaSyncReturnValue<Buffer>;
|
||||
|
||||
/**
|
||||
Execute a Node.js script as a child process.
|
||||
|
||||
Same as `execa('node', [scriptPath, ...arguments], options)` except (like [`child_process#fork()`](https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options)):
|
||||
- the current Node version and options are used. This can be overridden using the `nodePath` and `nodeArguments` options.
|
||||
- the `shell` option cannot be used
|
||||
- an extra channel [`ipc`](https://nodejs.org/api/child_process.html#child_process_options_stdio) is passed to [`stdio`](#stdio)
|
||||
|
||||
@param scriptPath - Node.js script to execute.
|
||||
@param arguments - Arguments to pass to `scriptPath` on execution.
|
||||
@returns A [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess), which is enhanced to also be a `Promise` for a result `Object` with `stdout` and `stderr` properties.
|
||||
*/
|
||||
node(
|
||||
scriptPath: string,
|
||||
arguments?: readonly string[],
|
||||
options?: execa.NodeOptions
|
||||
): execa.ExecaChildProcess;
|
||||
node(
|
||||
scriptPath: string,
|
||||
arguments?: readonly string[],
|
||||
options?: execa.Options<null>
|
||||
): execa.ExecaChildProcess<Buffer>;
|
||||
node(scriptPath: string, options?: execa.Options): execa.ExecaChildProcess;
|
||||
node(scriptPath: string, options?: execa.Options<null>): execa.ExecaChildProcess<Buffer>;
|
||||
};
|
||||
|
||||
export = execa;
|
||||
268
node_modules/@dotenvx/dotenvx/node_modules/execa/index.js
generated
vendored
Normal file
268
node_modules/@dotenvx/dotenvx/node_modules/execa/index.js
generated
vendored
Normal file
@@ -0,0 +1,268 @@
|
||||
'use strict';
|
||||
const path = require('path');
|
||||
const childProcess = require('child_process');
|
||||
const crossSpawn = require('cross-spawn');
|
||||
const stripFinalNewline = require('strip-final-newline');
|
||||
const npmRunPath = require('npm-run-path');
|
||||
const onetime = require('onetime');
|
||||
const makeError = require('./lib/error');
|
||||
const normalizeStdio = require('./lib/stdio');
|
||||
const {spawnedKill, spawnedCancel, setupTimeout, validateTimeout, setExitHandler} = require('./lib/kill');
|
||||
const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = require('./lib/stream');
|
||||
const {mergePromise, getSpawnedPromise} = require('./lib/promise');
|
||||
const {joinCommand, parseCommand, getEscapedCommand} = require('./lib/command');
|
||||
|
||||
const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100;
|
||||
|
||||
const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => {
|
||||
const env = extendEnv ? {...process.env, ...envOption} : envOption;
|
||||
|
||||
if (preferLocal) {
|
||||
return npmRunPath.env({env, cwd: localDir, execPath});
|
||||
}
|
||||
|
||||
return env;
|
||||
};
|
||||
|
||||
const handleArguments = (file, args, options = {}) => {
|
||||
const parsed = crossSpawn._parse(file, args, options);
|
||||
file = parsed.command;
|
||||
args = parsed.args;
|
||||
options = parsed.options;
|
||||
|
||||
options = {
|
||||
maxBuffer: DEFAULT_MAX_BUFFER,
|
||||
buffer: true,
|
||||
stripFinalNewline: true,
|
||||
extendEnv: true,
|
||||
preferLocal: false,
|
||||
localDir: options.cwd || process.cwd(),
|
||||
execPath: process.execPath,
|
||||
encoding: 'utf8',
|
||||
reject: true,
|
||||
cleanup: true,
|
||||
all: false,
|
||||
windowsHide: true,
|
||||
...options
|
||||
};
|
||||
|
||||
options.env = getEnv(options);
|
||||
|
||||
options.stdio = normalizeStdio(options);
|
||||
|
||||
if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') {
|
||||
// #116
|
||||
args.unshift('/q');
|
||||
}
|
||||
|
||||
return {file, args, options, parsed};
|
||||
};
|
||||
|
||||
const handleOutput = (options, value, error) => {
|
||||
if (typeof value !== 'string' && !Buffer.isBuffer(value)) {
|
||||
// When `execa.sync()` errors, we normalize it to '' to mimic `execa()`
|
||||
return error === undefined ? undefined : '';
|
||||
}
|
||||
|
||||
if (options.stripFinalNewline) {
|
||||
return stripFinalNewline(value);
|
||||
}
|
||||
|
||||
return value;
|
||||
};
|
||||
|
||||
const execa = (file, args, options) => {
|
||||
const parsed = handleArguments(file, args, options);
|
||||
const command = joinCommand(file, args);
|
||||
const escapedCommand = getEscapedCommand(file, args);
|
||||
|
||||
validateTimeout(parsed.options);
|
||||
|
||||
let spawned;
|
||||
try {
|
||||
spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options);
|
||||
} catch (error) {
|
||||
// Ensure the returned error is always both a promise and a child process
|
||||
const dummySpawned = new childProcess.ChildProcess();
|
||||
const errorPromise = Promise.reject(makeError({
|
||||
error,
|
||||
stdout: '',
|
||||
stderr: '',
|
||||
all: '',
|
||||
command,
|
||||
escapedCommand,
|
||||
parsed,
|
||||
timedOut: false,
|
||||
isCanceled: false,
|
||||
killed: false
|
||||
}));
|
||||
return mergePromise(dummySpawned, errorPromise);
|
||||
}
|
||||
|
||||
const spawnedPromise = getSpawnedPromise(spawned);
|
||||
const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise);
|
||||
const processDone = setExitHandler(spawned, parsed.options, timedPromise);
|
||||
|
||||
const context = {isCanceled: false};
|
||||
|
||||
spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned));
|
||||
spawned.cancel = spawnedCancel.bind(null, spawned, context);
|
||||
|
||||
const handlePromise = async () => {
|
||||
const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone);
|
||||
const stdout = handleOutput(parsed.options, stdoutResult);
|
||||
const stderr = handleOutput(parsed.options, stderrResult);
|
||||
const all = handleOutput(parsed.options, allResult);
|
||||
|
||||
if (error || exitCode !== 0 || signal !== null) {
|
||||
const returnedError = makeError({
|
||||
error,
|
||||
exitCode,
|
||||
signal,
|
||||
stdout,
|
||||
stderr,
|
||||
all,
|
||||
command,
|
||||
escapedCommand,
|
||||
parsed,
|
||||
timedOut,
|
||||
isCanceled: context.isCanceled,
|
||||
killed: spawned.killed
|
||||
});
|
||||
|
||||
if (!parsed.options.reject) {
|
||||
return returnedError;
|
||||
}
|
||||
|
||||
throw returnedError;
|
||||
}
|
||||
|
||||
return {
|
||||
command,
|
||||
escapedCommand,
|
||||
exitCode: 0,
|
||||
stdout,
|
||||
stderr,
|
||||
all,
|
||||
failed: false,
|
||||
timedOut: false,
|
||||
isCanceled: false,
|
||||
killed: false
|
||||
};
|
||||
};
|
||||
|
||||
const handlePromiseOnce = onetime(handlePromise);
|
||||
|
||||
handleInput(spawned, parsed.options.input);
|
||||
|
||||
spawned.all = makeAllStream(spawned, parsed.options);
|
||||
|
||||
return mergePromise(spawned, handlePromiseOnce);
|
||||
};
|
||||
|
||||
module.exports = execa;
|
||||
|
||||
module.exports.sync = (file, args, options) => {
|
||||
const parsed = handleArguments(file, args, options);
|
||||
const command = joinCommand(file, args);
|
||||
const escapedCommand = getEscapedCommand(file, args);
|
||||
|
||||
validateInputSync(parsed.options);
|
||||
|
||||
let result;
|
||||
try {
|
||||
result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options);
|
||||
} catch (error) {
|
||||
throw makeError({
|
||||
error,
|
||||
stdout: '',
|
||||
stderr: '',
|
||||
all: '',
|
||||
command,
|
||||
escapedCommand,
|
||||
parsed,
|
||||
timedOut: false,
|
||||
isCanceled: false,
|
||||
killed: false
|
||||
});
|
||||
}
|
||||
|
||||
const stdout = handleOutput(parsed.options, result.stdout, result.error);
|
||||
const stderr = handleOutput(parsed.options, result.stderr, result.error);
|
||||
|
||||
if (result.error || result.status !== 0 || result.signal !== null) {
|
||||
const error = makeError({
|
||||
stdout,
|
||||
stderr,
|
||||
error: result.error,
|
||||
signal: result.signal,
|
||||
exitCode: result.status,
|
||||
command,
|
||||
escapedCommand,
|
||||
parsed,
|
||||
timedOut: result.error && result.error.code === 'ETIMEDOUT',
|
||||
isCanceled: false,
|
||||
killed: result.signal !== null
|
||||
});
|
||||
|
||||
if (!parsed.options.reject) {
|
||||
return error;
|
||||
}
|
||||
|
||||
throw error;
|
||||
}
|
||||
|
||||
return {
|
||||
command,
|
||||
escapedCommand,
|
||||
exitCode: 0,
|
||||
stdout,
|
||||
stderr,
|
||||
failed: false,
|
||||
timedOut: false,
|
||||
isCanceled: false,
|
||||
killed: false
|
||||
};
|
||||
};
|
||||
|
||||
module.exports.command = (command, options) => {
|
||||
const [file, ...args] = parseCommand(command);
|
||||
return execa(file, args, options);
|
||||
};
|
||||
|
||||
module.exports.commandSync = (command, options) => {
|
||||
const [file, ...args] = parseCommand(command);
|
||||
return execa.sync(file, args, options);
|
||||
};
|
||||
|
||||
module.exports.node = (scriptPath, args, options = {}) => {
|
||||
if (args && !Array.isArray(args) && typeof args === 'object') {
|
||||
options = args;
|
||||
args = [];
|
||||
}
|
||||
|
||||
const stdio = normalizeStdio.node(options);
|
||||
const defaultExecArgv = process.execArgv.filter(arg => !arg.startsWith('--inspect'));
|
||||
|
||||
const {
|
||||
nodePath = process.execPath,
|
||||
nodeOptions = defaultExecArgv
|
||||
} = options;
|
||||
|
||||
return execa(
|
||||
nodePath,
|
||||
[
|
||||
...nodeOptions,
|
||||
scriptPath,
|
||||
...(Array.isArray(args) ? args : [])
|
||||
],
|
||||
{
|
||||
...options,
|
||||
stdin: undefined,
|
||||
stdout: undefined,
|
||||
stderr: undefined,
|
||||
stdio,
|
||||
shell: false
|
||||
}
|
||||
);
|
||||
};
|
||||
52
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/command.js
generated
vendored
Normal file
52
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/command.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
'use strict';
|
||||
const normalizeArgs = (file, args = []) => {
|
||||
if (!Array.isArray(args)) {
|
||||
return [file];
|
||||
}
|
||||
|
||||
return [file, ...args];
|
||||
};
|
||||
|
||||
const NO_ESCAPE_REGEXP = /^[\w.-]+$/;
|
||||
const DOUBLE_QUOTES_REGEXP = /"/g;
|
||||
|
||||
const escapeArg = arg => {
|
||||
if (typeof arg !== 'string' || NO_ESCAPE_REGEXP.test(arg)) {
|
||||
return arg;
|
||||
}
|
||||
|
||||
return `"${arg.replace(DOUBLE_QUOTES_REGEXP, '\\"')}"`;
|
||||
};
|
||||
|
||||
const joinCommand = (file, args) => {
|
||||
return normalizeArgs(file, args).join(' ');
|
||||
};
|
||||
|
||||
const getEscapedCommand = (file, args) => {
|
||||
return normalizeArgs(file, args).map(arg => escapeArg(arg)).join(' ');
|
||||
};
|
||||
|
||||
const SPACES_REGEXP = / +/g;
|
||||
|
||||
// Handle `execa.command()`
|
||||
const parseCommand = command => {
|
||||
const tokens = [];
|
||||
for (const token of command.trim().split(SPACES_REGEXP)) {
|
||||
// Allow spaces to be escaped by a backslash if not meant as a delimiter
|
||||
const previousToken = tokens[tokens.length - 1];
|
||||
if (previousToken && previousToken.endsWith('\\')) {
|
||||
// Merge previous token with current one
|
||||
tokens[tokens.length - 1] = `${previousToken.slice(0, -1)} ${token}`;
|
||||
} else {
|
||||
tokens.push(token);
|
||||
}
|
||||
}
|
||||
|
||||
return tokens;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
joinCommand,
|
||||
getEscapedCommand,
|
||||
parseCommand
|
||||
};
|
||||
88
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/error.js
generated
vendored
Normal file
88
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/error.js
generated
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
'use strict';
|
||||
const {signalsByName} = require('human-signals');
|
||||
|
||||
const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => {
|
||||
if (timedOut) {
|
||||
return `timed out after ${timeout} milliseconds`;
|
||||
}
|
||||
|
||||
if (isCanceled) {
|
||||
return 'was canceled';
|
||||
}
|
||||
|
||||
if (errorCode !== undefined) {
|
||||
return `failed with ${errorCode}`;
|
||||
}
|
||||
|
||||
if (signal !== undefined) {
|
||||
return `was killed with ${signal} (${signalDescription})`;
|
||||
}
|
||||
|
||||
if (exitCode !== undefined) {
|
||||
return `failed with exit code ${exitCode}`;
|
||||
}
|
||||
|
||||
return 'failed';
|
||||
};
|
||||
|
||||
const makeError = ({
|
||||
stdout,
|
||||
stderr,
|
||||
all,
|
||||
error,
|
||||
signal,
|
||||
exitCode,
|
||||
command,
|
||||
escapedCommand,
|
||||
timedOut,
|
||||
isCanceled,
|
||||
killed,
|
||||
parsed: {options: {timeout}}
|
||||
}) => {
|
||||
// `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`.
|
||||
// We normalize them to `undefined`
|
||||
exitCode = exitCode === null ? undefined : exitCode;
|
||||
signal = signal === null ? undefined : signal;
|
||||
const signalDescription = signal === undefined ? undefined : signalsByName[signal].description;
|
||||
|
||||
const errorCode = error && error.code;
|
||||
|
||||
const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled});
|
||||
const execaMessage = `Command ${prefix}: ${command}`;
|
||||
const isError = Object.prototype.toString.call(error) === '[object Error]';
|
||||
const shortMessage = isError ? `${execaMessage}\n${error.message}` : execaMessage;
|
||||
const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n');
|
||||
|
||||
if (isError) {
|
||||
error.originalMessage = error.message;
|
||||
error.message = message;
|
||||
} else {
|
||||
error = new Error(message);
|
||||
}
|
||||
|
||||
error.shortMessage = shortMessage;
|
||||
error.command = command;
|
||||
error.escapedCommand = escapedCommand;
|
||||
error.exitCode = exitCode;
|
||||
error.signal = signal;
|
||||
error.signalDescription = signalDescription;
|
||||
error.stdout = stdout;
|
||||
error.stderr = stderr;
|
||||
|
||||
if (all !== undefined) {
|
||||
error.all = all;
|
||||
}
|
||||
|
||||
if ('bufferedData' in error) {
|
||||
delete error.bufferedData;
|
||||
}
|
||||
|
||||
error.failed = true;
|
||||
error.timedOut = Boolean(timedOut);
|
||||
error.isCanceled = isCanceled;
|
||||
error.killed = killed && !timedOut;
|
||||
|
||||
return error;
|
||||
};
|
||||
|
||||
module.exports = makeError;
|
||||
115
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/kill.js
generated
vendored
Normal file
115
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/kill.js
generated
vendored
Normal file
@@ -0,0 +1,115 @@
|
||||
'use strict';
|
||||
const os = require('os');
|
||||
const onExit = require('signal-exit');
|
||||
|
||||
const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5;
|
||||
|
||||
// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior
|
||||
const spawnedKill = (kill, signal = 'SIGTERM', options = {}) => {
|
||||
const killResult = kill(signal);
|
||||
setKillTimeout(kill, signal, options, killResult);
|
||||
return killResult;
|
||||
};
|
||||
|
||||
const setKillTimeout = (kill, signal, options, killResult) => {
|
||||
if (!shouldForceKill(signal, options, killResult)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const timeout = getForceKillAfterTimeout(options);
|
||||
const t = setTimeout(() => {
|
||||
kill('SIGKILL');
|
||||
}, timeout);
|
||||
|
||||
// Guarded because there's no `.unref()` when `execa` is used in the renderer
|
||||
// process in Electron. This cannot be tested since we don't run tests in
|
||||
// Electron.
|
||||
// istanbul ignore else
|
||||
if (t.unref) {
|
||||
t.unref();
|
||||
}
|
||||
};
|
||||
|
||||
const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => {
|
||||
return isSigterm(signal) && forceKillAfterTimeout !== false && killResult;
|
||||
};
|
||||
|
||||
const isSigterm = signal => {
|
||||
return signal === os.constants.signals.SIGTERM ||
|
||||
(typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM');
|
||||
};
|
||||
|
||||
const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => {
|
||||
if (forceKillAfterTimeout === true) {
|
||||
return DEFAULT_FORCE_KILL_TIMEOUT;
|
||||
}
|
||||
|
||||
if (!Number.isFinite(forceKillAfterTimeout) || forceKillAfterTimeout < 0) {
|
||||
throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`);
|
||||
}
|
||||
|
||||
return forceKillAfterTimeout;
|
||||
};
|
||||
|
||||
// `childProcess.cancel()`
|
||||
const spawnedCancel = (spawned, context) => {
|
||||
const killResult = spawned.kill();
|
||||
|
||||
if (killResult) {
|
||||
context.isCanceled = true;
|
||||
}
|
||||
};
|
||||
|
||||
const timeoutKill = (spawned, signal, reject) => {
|
||||
spawned.kill(signal);
|
||||
reject(Object.assign(new Error('Timed out'), {timedOut: true, signal}));
|
||||
};
|
||||
|
||||
// `timeout` option handling
|
||||
const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => {
|
||||
if (timeout === 0 || timeout === undefined) {
|
||||
return spawnedPromise;
|
||||
}
|
||||
|
||||
let timeoutId;
|
||||
const timeoutPromise = new Promise((resolve, reject) => {
|
||||
timeoutId = setTimeout(() => {
|
||||
timeoutKill(spawned, killSignal, reject);
|
||||
}, timeout);
|
||||
});
|
||||
|
||||
const safeSpawnedPromise = spawnedPromise.finally(() => {
|
||||
clearTimeout(timeoutId);
|
||||
});
|
||||
|
||||
return Promise.race([timeoutPromise, safeSpawnedPromise]);
|
||||
};
|
||||
|
||||
const validateTimeout = ({timeout}) => {
|
||||
if (timeout !== undefined && (!Number.isFinite(timeout) || timeout < 0)) {
|
||||
throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`);
|
||||
}
|
||||
};
|
||||
|
||||
// `cleanup` option handling
|
||||
const setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => {
|
||||
if (!cleanup || detached) {
|
||||
return timedPromise;
|
||||
}
|
||||
|
||||
const removeExitHandler = onExit(() => {
|
||||
spawned.kill();
|
||||
});
|
||||
|
||||
return timedPromise.finally(() => {
|
||||
removeExitHandler();
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
spawnedKill,
|
||||
spawnedCancel,
|
||||
setupTimeout,
|
||||
validateTimeout,
|
||||
setExitHandler
|
||||
};
|
||||
46
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/promise.js
generated
vendored
Normal file
46
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/promise.js
generated
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
'use strict';
|
||||
|
||||
const nativePromisePrototype = (async () => {})().constructor.prototype;
|
||||
const descriptors = ['then', 'catch', 'finally'].map(property => [
|
||||
property,
|
||||
Reflect.getOwnPropertyDescriptor(nativePromisePrototype, property)
|
||||
]);
|
||||
|
||||
// The return value is a mixin of `childProcess` and `Promise`
|
||||
const mergePromise = (spawned, promise) => {
|
||||
for (const [property, descriptor] of descriptors) {
|
||||
// Starting the main `promise` is deferred to avoid consuming streams
|
||||
const value = typeof promise === 'function' ?
|
||||
(...args) => Reflect.apply(descriptor.value, promise(), args) :
|
||||
descriptor.value.bind(promise);
|
||||
|
||||
Reflect.defineProperty(spawned, property, {...descriptor, value});
|
||||
}
|
||||
|
||||
return spawned;
|
||||
};
|
||||
|
||||
// Use promises instead of `child_process` events
|
||||
const getSpawnedPromise = spawned => {
|
||||
return new Promise((resolve, reject) => {
|
||||
spawned.on('exit', (exitCode, signal) => {
|
||||
resolve({exitCode, signal});
|
||||
});
|
||||
|
||||
spawned.on('error', error => {
|
||||
reject(error);
|
||||
});
|
||||
|
||||
if (spawned.stdin) {
|
||||
spawned.stdin.on('error', error => {
|
||||
reject(error);
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
mergePromise,
|
||||
getSpawnedPromise
|
||||
};
|
||||
|
||||
52
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/stdio.js
generated
vendored
Normal file
52
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/stdio.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
'use strict';
|
||||
const aliases = ['stdin', 'stdout', 'stderr'];
|
||||
|
||||
const hasAlias = options => aliases.some(alias => options[alias] !== undefined);
|
||||
|
||||
const normalizeStdio = options => {
|
||||
if (!options) {
|
||||
return;
|
||||
}
|
||||
|
||||
const {stdio} = options;
|
||||
|
||||
if (stdio === undefined) {
|
||||
return aliases.map(alias => options[alias]);
|
||||
}
|
||||
|
||||
if (hasAlias(options)) {
|
||||
throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`);
|
||||
}
|
||||
|
||||
if (typeof stdio === 'string') {
|
||||
return stdio;
|
||||
}
|
||||
|
||||
if (!Array.isArray(stdio)) {
|
||||
throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``);
|
||||
}
|
||||
|
||||
const length = Math.max(stdio.length, aliases.length);
|
||||
return Array.from({length}, (value, index) => stdio[index]);
|
||||
};
|
||||
|
||||
module.exports = normalizeStdio;
|
||||
|
||||
// `ipc` is pushed unless it is already present
|
||||
module.exports.node = options => {
|
||||
const stdio = normalizeStdio(options);
|
||||
|
||||
if (stdio === 'ipc') {
|
||||
return 'ipc';
|
||||
}
|
||||
|
||||
if (stdio === undefined || typeof stdio === 'string') {
|
||||
return [stdio, stdio, stdio, 'ipc'];
|
||||
}
|
||||
|
||||
if (stdio.includes('ipc')) {
|
||||
return stdio;
|
||||
}
|
||||
|
||||
return [...stdio, 'ipc'];
|
||||
};
|
||||
97
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/stream.js
generated
vendored
Normal file
97
node_modules/@dotenvx/dotenvx/node_modules/execa/lib/stream.js
generated
vendored
Normal file
@@ -0,0 +1,97 @@
|
||||
'use strict';
|
||||
const isStream = require('is-stream');
|
||||
const getStream = require('get-stream');
|
||||
const mergeStream = require('merge-stream');
|
||||
|
||||
// `input` option
|
||||
const handleInput = (spawned, input) => {
|
||||
// Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852
|
||||
// @todo remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0
|
||||
if (input === undefined || spawned.stdin === undefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isStream(input)) {
|
||||
input.pipe(spawned.stdin);
|
||||
} else {
|
||||
spawned.stdin.end(input);
|
||||
}
|
||||
};
|
||||
|
||||
// `all` interleaves `stdout` and `stderr`
|
||||
const makeAllStream = (spawned, {all}) => {
|
||||
if (!all || (!spawned.stdout && !spawned.stderr)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const mixed = mergeStream();
|
||||
|
||||
if (spawned.stdout) {
|
||||
mixed.add(spawned.stdout);
|
||||
}
|
||||
|
||||
if (spawned.stderr) {
|
||||
mixed.add(spawned.stderr);
|
||||
}
|
||||
|
||||
return mixed;
|
||||
};
|
||||
|
||||
// On failure, `result.stdout|stderr|all` should contain the currently buffered stream
|
||||
const getBufferedData = async (stream, streamPromise) => {
|
||||
if (!stream) {
|
||||
return;
|
||||
}
|
||||
|
||||
stream.destroy();
|
||||
|
||||
try {
|
||||
return await streamPromise;
|
||||
} catch (error) {
|
||||
return error.bufferedData;
|
||||
}
|
||||
};
|
||||
|
||||
const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => {
|
||||
if (!stream || !buffer) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (encoding) {
|
||||
return getStream(stream, {encoding, maxBuffer});
|
||||
}
|
||||
|
||||
return getStream.buffer(stream, {maxBuffer});
|
||||
};
|
||||
|
||||
// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all)
|
||||
const getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => {
|
||||
const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer});
|
||||
const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer});
|
||||
const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2});
|
||||
|
||||
try {
|
||||
return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]);
|
||||
} catch (error) {
|
||||
return Promise.all([
|
||||
{error, signal: error.signal, timedOut: error.timedOut},
|
||||
getBufferedData(stdout, stdoutPromise),
|
||||
getBufferedData(stderr, stderrPromise),
|
||||
getBufferedData(all, allPromise)
|
||||
]);
|
||||
}
|
||||
};
|
||||
|
||||
const validateInputSync = ({input}) => {
|
||||
if (isStream(input)) {
|
||||
throw new TypeError('The `input` option cannot be a stream in sync mode');
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
handleInput,
|
||||
makeAllStream,
|
||||
getSpawnedResult,
|
||||
validateInputSync
|
||||
};
|
||||
|
||||
9
node_modules/@dotenvx/dotenvx/node_modules/execa/license
generated
vendored
Normal file
9
node_modules/@dotenvx/dotenvx/node_modules/execa/license
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
74
node_modules/@dotenvx/dotenvx/node_modules/execa/package.json
generated
vendored
Normal file
74
node_modules/@dotenvx/dotenvx/node_modules/execa/package.json
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"name": "execa",
|
||||
"version": "5.1.1",
|
||||
"description": "Process execution for humans",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/execa",
|
||||
"funding": "https://github.com/sindresorhus/execa?sponsor=1",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "https://sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && nyc ava && tsd"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts",
|
||||
"lib"
|
||||
],
|
||||
"keywords": [
|
||||
"exec",
|
||||
"child",
|
||||
"process",
|
||||
"execute",
|
||||
"fork",
|
||||
"execfile",
|
||||
"spawn",
|
||||
"file",
|
||||
"shell",
|
||||
"bin",
|
||||
"binary",
|
||||
"binaries",
|
||||
"npm",
|
||||
"path",
|
||||
"local"
|
||||
],
|
||||
"dependencies": {
|
||||
"cross-spawn": "^7.0.3",
|
||||
"get-stream": "^6.0.0",
|
||||
"human-signals": "^2.1.0",
|
||||
"is-stream": "^2.0.0",
|
||||
"merge-stream": "^2.0.0",
|
||||
"npm-run-path": "^4.0.1",
|
||||
"onetime": "^5.1.2",
|
||||
"signal-exit": "^3.0.3",
|
||||
"strip-final-newline": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^14.14.10",
|
||||
"ava": "^2.4.0",
|
||||
"get-node": "^11.0.1",
|
||||
"is-running": "^2.1.0",
|
||||
"nyc": "^15.1.0",
|
||||
"p-event": "^4.2.0",
|
||||
"tempfile": "^3.0.0",
|
||||
"tsd": "^0.13.1",
|
||||
"xo": "^0.35.0"
|
||||
},
|
||||
"nyc": {
|
||||
"reporter": [
|
||||
"text",
|
||||
"lcov"
|
||||
],
|
||||
"exclude": [
|
||||
"**/fixtures/**",
|
||||
"**/test.js",
|
||||
"**/test/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
663
node_modules/@dotenvx/dotenvx/node_modules/execa/readme.md
generated
vendored
Normal file
663
node_modules/@dotenvx/dotenvx/node_modules/execa/readme.md
generated
vendored
Normal file
@@ -0,0 +1,663 @@
|
||||
<img src="media/logo.svg" width="400">
|
||||
<br>
|
||||
|
||||
[](https://codecov.io/gh/sindresorhus/execa)
|
||||
|
||||
> Process execution for humans
|
||||
|
||||
## Why
|
||||
|
||||
This package improves [`child_process`](https://nodejs.org/api/child_process.html) methods with:
|
||||
|
||||
- Promise interface.
|
||||
- [Strips the final newline](#stripfinalnewline) from the output so you don't have to do `stdout.trim()`.
|
||||
- Supports [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) binaries cross-platform.
|
||||
- [Improved Windows support.](https://github.com/IndigoUnited/node-cross-spawn#why)
|
||||
- Higher max buffer. 100 MB instead of 200 KB.
|
||||
- [Executes locally installed binaries by name.](#preferlocal)
|
||||
- [Cleans up spawned processes when the parent process dies.](#cleanup)
|
||||
- [Get interleaved output](#all) from `stdout` and `stderr` similar to what is printed on the terminal. [*(Async only)*](#execasyncfile-arguments-options)
|
||||
- [Can specify file and arguments as a single string without a shell](#execacommandcommand-options)
|
||||
- More descriptive errors.
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install execa
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const execa = require('execa');
|
||||
|
||||
(async () => {
|
||||
const {stdout} = await execa('echo', ['unicorns']);
|
||||
console.log(stdout);
|
||||
//=> 'unicorns'
|
||||
})();
|
||||
```
|
||||
|
||||
### Pipe the child process stdout to the parent
|
||||
|
||||
```js
|
||||
const execa = require('execa');
|
||||
|
||||
execa('echo', ['unicorns']).stdout.pipe(process.stdout);
|
||||
```
|
||||
|
||||
### Handling Errors
|
||||
|
||||
```js
|
||||
const execa = require('execa');
|
||||
|
||||
(async () => {
|
||||
// Catching an error
|
||||
try {
|
||||
await execa('unknown', ['command']);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
/*
|
||||
{
|
||||
message: 'Command failed with ENOENT: unknown command spawn unknown ENOENT',
|
||||
errno: -2,
|
||||
code: 'ENOENT',
|
||||
syscall: 'spawn unknown',
|
||||
path: 'unknown',
|
||||
spawnargs: ['command'],
|
||||
originalMessage: 'spawn unknown ENOENT',
|
||||
shortMessage: 'Command failed with ENOENT: unknown command spawn unknown ENOENT',
|
||||
command: 'unknown command',
|
||||
escapedCommand: 'unknown command',
|
||||
stdout: '',
|
||||
stderr: '',
|
||||
all: '',
|
||||
failed: true,
|
||||
timedOut: false,
|
||||
isCanceled: false,
|
||||
killed: false
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
})();
|
||||
```
|
||||
|
||||
### Cancelling a spawned process
|
||||
|
||||
```js
|
||||
const execa = require('execa');
|
||||
|
||||
(async () => {
|
||||
const subprocess = execa('node');
|
||||
|
||||
setTimeout(() => {
|
||||
subprocess.cancel();
|
||||
}, 1000);
|
||||
|
||||
try {
|
||||
await subprocess;
|
||||
} catch (error) {
|
||||
console.log(subprocess.killed); // true
|
||||
console.log(error.isCanceled); // true
|
||||
}
|
||||
})()
|
||||
```
|
||||
|
||||
### Catching an error with the sync method
|
||||
|
||||
```js
|
||||
try {
|
||||
execa.sync('unknown', ['command']);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
/*
|
||||
{
|
||||
message: 'Command failed with ENOENT: unknown command spawnSync unknown ENOENT',
|
||||
errno: -2,
|
||||
code: 'ENOENT',
|
||||
syscall: 'spawnSync unknown',
|
||||
path: 'unknown',
|
||||
spawnargs: ['command'],
|
||||
originalMessage: 'spawnSync unknown ENOENT',
|
||||
shortMessage: 'Command failed with ENOENT: unknown command spawnSync unknown ENOENT',
|
||||
command: 'unknown command',
|
||||
escapedCommand: 'unknown command',
|
||||
stdout: '',
|
||||
stderr: '',
|
||||
all: '',
|
||||
failed: true,
|
||||
timedOut: false,
|
||||
isCanceled: false,
|
||||
killed: false
|
||||
}
|
||||
*/
|
||||
}
|
||||
```
|
||||
|
||||
### Kill a process
|
||||
|
||||
Using SIGTERM, and after 2 seconds, kill it with SIGKILL.
|
||||
|
||||
```js
|
||||
const subprocess = execa('node');
|
||||
|
||||
setTimeout(() => {
|
||||
subprocess.kill('SIGTERM', {
|
||||
forceKillAfterTimeout: 2000
|
||||
});
|
||||
}, 1000);
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### execa(file, arguments, options?)
|
||||
|
||||
Execute a file. Think of this as a mix of [`child_process.execFile()`](https://nodejs.org/api/child_process.html#child_process_child_process_execfile_file_args_options_callback) and [`child_process.spawn()`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options).
|
||||
|
||||
No escaping/quoting is needed.
|
||||
|
||||
Unless the [`shell`](#shell) option is used, no shell interpreter (Bash, `cmd.exe`, etc.) is used, so shell features such as variables substitution (`echo $PATH`) are not allowed.
|
||||
|
||||
Returns a [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess) which:
|
||||
- is also a `Promise` resolving or rejecting with a [`childProcessResult`](#childProcessResult).
|
||||
- exposes the following additional methods and properties.
|
||||
|
||||
#### kill(signal?, options?)
|
||||
|
||||
Same as the original [`child_process#kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal) except: if `signal` is `SIGTERM` (the default value) and the child process is not terminated after 5 seconds, force it by sending `SIGKILL`.
|
||||
|
||||
##### options.forceKillAfterTimeout
|
||||
|
||||
Type: `number | false`\
|
||||
Default: `5000`
|
||||
|
||||
Milliseconds to wait for the child process to terminate before sending `SIGKILL`.
|
||||
|
||||
Can be disabled with `false`.
|
||||
|
||||
#### cancel()
|
||||
|
||||
Similar to [`childProcess.kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal). This is preferred when cancelling the child process execution as the error is more descriptive and [`childProcessResult.isCanceled`](#iscanceled) is set to `true`.
|
||||
|
||||
#### all
|
||||
|
||||
Type: `ReadableStream | undefined`
|
||||
|
||||
Stream combining/interleaving [`stdout`](https://nodejs.org/api/child_process.html#child_process_subprocess_stdout) and [`stderr`](https://nodejs.org/api/child_process.html#child_process_subprocess_stderr).
|
||||
|
||||
This is `undefined` if either:
|
||||
- the [`all` option](#all-2) is `false` (the default value)
|
||||
- both [`stdout`](#stdout-1) and [`stderr`](#stderr-1) options are set to [`'inherit'`, `'ipc'`, `Stream` or `integer`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio)
|
||||
|
||||
### execa.sync(file, arguments?, options?)
|
||||
|
||||
Execute a file synchronously.
|
||||
|
||||
Returns or throws a [`childProcessResult`](#childProcessResult).
|
||||
|
||||
### execa.command(command, options?)
|
||||
|
||||
Same as [`execa()`](#execafile-arguments-options) except both file and arguments are specified in a single `command` string. For example, `execa('echo', ['unicorns'])` is the same as `execa.command('echo unicorns')`.
|
||||
|
||||
If the file or an argument contains spaces, they must be escaped with backslashes. This matters especially if `command` is not a constant but a variable, for example with `__dirname` or `process.cwd()`. Except for spaces, no escaping/quoting is needed.
|
||||
|
||||
The [`shell` option](#shell) must be used if the `command` uses shell-specific features (for example, `&&` or `||`), as opposed to being a simple `file` followed by its `arguments`.
|
||||
|
||||
### execa.commandSync(command, options?)
|
||||
|
||||
Same as [`execa.command()`](#execacommand-command-options) but synchronous.
|
||||
|
||||
Returns or throws a [`childProcessResult`](#childProcessResult).
|
||||
|
||||
### execa.node(scriptPath, arguments?, options?)
|
||||
|
||||
Execute a Node.js script as a child process.
|
||||
|
||||
Same as `execa('node', [scriptPath, ...arguments], options)` except (like [`child_process#fork()`](https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options)):
|
||||
- the current Node version and options are used. This can be overridden using the [`nodePath`](#nodepath-for-node-only) and [`nodeOptions`](#nodeoptions-for-node-only) options.
|
||||
- the [`shell`](#shell) option cannot be used
|
||||
- an extra channel [`ipc`](https://nodejs.org/api/child_process.html#child_process_options_stdio) is passed to [`stdio`](#stdio)
|
||||
|
||||
### childProcessResult
|
||||
|
||||
Type: `object`
|
||||
|
||||
Result of a child process execution. On success this is a plain object. On failure this is also an `Error` instance.
|
||||
|
||||
The child process [fails](#failed) when:
|
||||
- its [exit code](#exitcode) is not `0`
|
||||
- it was [killed](#killed) with a [signal](#signal)
|
||||
- [timing out](#timedout)
|
||||
- [being canceled](#iscanceled)
|
||||
- there's not enough memory or there are already too many child processes
|
||||
|
||||
#### command
|
||||
|
||||
Type: `string`
|
||||
|
||||
The file and arguments that were run, for logging purposes.
|
||||
|
||||
This is not escaped and should not be executed directly as a process, including using [`execa()`](#execafile-arguments-options) or [`execa.command()`](#execacommandcommand-options).
|
||||
|
||||
#### escapedCommand
|
||||
|
||||
Type: `string`
|
||||
|
||||
Same as [`command`](#command) but escaped.
|
||||
|
||||
This is meant to be copy and pasted into a shell, for debugging purposes.
|
||||
Since the escaping is fairly basic, this should not be executed directly as a process, including using [`execa()`](#execafile-arguments-options) or [`execa.command()`](#execacommandcommand-options).
|
||||
|
||||
#### exitCode
|
||||
|
||||
Type: `number`
|
||||
|
||||
The numeric exit code of the process that was run.
|
||||
|
||||
#### stdout
|
||||
|
||||
Type: `string | Buffer`
|
||||
|
||||
The output of the process on stdout.
|
||||
|
||||
#### stderr
|
||||
|
||||
Type: `string | Buffer`
|
||||
|
||||
The output of the process on stderr.
|
||||
|
||||
#### all
|
||||
|
||||
Type: `string | Buffer | undefined`
|
||||
|
||||
The output of the process with `stdout` and `stderr` interleaved.
|
||||
|
||||
This is `undefined` if either:
|
||||
- the [`all` option](#all-2) is `false` (the default value)
|
||||
- `execa.sync()` was used
|
||||
|
||||
#### failed
|
||||
|
||||
Type: `boolean`
|
||||
|
||||
Whether the process failed to run.
|
||||
|
||||
#### timedOut
|
||||
|
||||
Type: `boolean`
|
||||
|
||||
Whether the process timed out.
|
||||
|
||||
#### isCanceled
|
||||
|
||||
Type: `boolean`
|
||||
|
||||
Whether the process was canceled.
|
||||
|
||||
#### killed
|
||||
|
||||
Type: `boolean`
|
||||
|
||||
Whether the process was killed.
|
||||
|
||||
#### signal
|
||||
|
||||
Type: `string | undefined`
|
||||
|
||||
The name of the signal that was used to terminate the process. For example, `SIGFPE`.
|
||||
|
||||
If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`.
|
||||
|
||||
#### signalDescription
|
||||
|
||||
Type: `string | undefined`
|
||||
|
||||
A human-friendly description of the signal that was used to terminate the process. For example, `Floating point arithmetic error`.
|
||||
|
||||
If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. It is also `undefined` when the signal is very uncommon which should seldomly happen.
|
||||
|
||||
#### message
|
||||
|
||||
Type: `string`
|
||||
|
||||
Error message when the child process failed to run. In addition to the [underlying error message](#originalMessage), it also contains some information related to why the child process errored.
|
||||
|
||||
The child process [stderr](#stderr) then [stdout](#stdout) are appended to the end, separated with newlines and not interleaved.
|
||||
|
||||
#### shortMessage
|
||||
|
||||
Type: `string`
|
||||
|
||||
This is the same as the [`message` property](#message) except it does not include the child process stdout/stderr.
|
||||
|
||||
#### originalMessage
|
||||
|
||||
Type: `string | undefined`
|
||||
|
||||
Original error message. This is the same as the `message` property except it includes neither the child process stdout/stderr nor some additional information added by Execa.
|
||||
|
||||
This is `undefined` unless the child process exited due to an `error` event or a timeout.
|
||||
|
||||
### options
|
||||
|
||||
Type: `object`
|
||||
|
||||
#### cleanup
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `true`
|
||||
|
||||
Kill the spawned process when the parent process exits unless either:
|
||||
- the spawned process is [`detached`](https://nodejs.org/api/child_process.html#child_process_options_detached)
|
||||
- the parent process is terminated abruptly, for example, with `SIGKILL` as opposed to `SIGTERM` or a normal exit
|
||||
|
||||
#### preferLocal
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `false`
|
||||
|
||||
Prefer locally installed binaries when looking for a binary to execute.\
|
||||
If you `$ npm install foo`, you can then `execa('foo')`.
|
||||
|
||||
#### localDir
|
||||
|
||||
Type: `string`\
|
||||
Default: `process.cwd()`
|
||||
|
||||
Preferred path to find locally installed binaries in (use with `preferLocal`).
|
||||
|
||||
#### execPath
|
||||
|
||||
Type: `string`\
|
||||
Default: `process.execPath` (Current Node.js executable)
|
||||
|
||||
Path to the Node.js executable to use in child processes.
|
||||
|
||||
This can be either an absolute path or a path relative to the [`cwd` option](#cwd).
|
||||
|
||||
Requires [`preferLocal`](#preferlocal) to be `true`.
|
||||
|
||||
For example, this can be used together with [`get-node`](https://github.com/ehmicky/get-node) to run a specific Node.js version in a child process.
|
||||
|
||||
#### buffer
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `true`
|
||||
|
||||
Buffer the output from the spawned process. When set to `false`, you must read the output of [`stdout`](#stdout-1) and [`stderr`](#stderr-1) (or [`all`](#all) if the [`all`](#all-2) option is `true`). Otherwise the returned promise will not be resolved/rejected.
|
||||
|
||||
If the spawned process fails, [`error.stdout`](#stdout), [`error.stderr`](#stderr), and [`error.all`](#all) will contain the buffered data.
|
||||
|
||||
#### input
|
||||
|
||||
Type: `string | Buffer | stream.Readable`
|
||||
|
||||
Write some input to the `stdin` of your binary.\
|
||||
Streams are not allowed when using the synchronous methods.
|
||||
|
||||
#### stdin
|
||||
|
||||
Type: `string | number | Stream | undefined`\
|
||||
Default: `pipe`
|
||||
|
||||
Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
|
||||
|
||||
#### stdout
|
||||
|
||||
Type: `string | number | Stream | undefined`\
|
||||
Default: `pipe`
|
||||
|
||||
Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
|
||||
|
||||
#### stderr
|
||||
|
||||
Type: `string | number | Stream | undefined`\
|
||||
Default: `pipe`
|
||||
|
||||
Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
|
||||
|
||||
#### all
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `false`
|
||||
|
||||
Add an `.all` property on the [promise](#all) and the [resolved value](#all-1). The property contains the output of the process with `stdout` and `stderr` interleaved.
|
||||
|
||||
#### reject
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `true`
|
||||
|
||||
Setting this to `false` resolves the promise with the error instead of rejecting it.
|
||||
|
||||
#### stripFinalNewline
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `true`
|
||||
|
||||
Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from the output.
|
||||
|
||||
#### extendEnv
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `true`
|
||||
|
||||
Set to `false` if you don't want to extend the environment variables when providing the `env` property.
|
||||
|
||||
---
|
||||
|
||||
Execa also accepts the below options which are the same as the options for [`child_process#spawn()`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options)/[`child_process#exec()`](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback)
|
||||
|
||||
#### cwd
|
||||
|
||||
Type: `string`\
|
||||
Default: `process.cwd()`
|
||||
|
||||
Current working directory of the child process.
|
||||
|
||||
#### env
|
||||
|
||||
Type: `object`\
|
||||
Default: `process.env`
|
||||
|
||||
Environment key-value pairs. Extends automatically from `process.env`. Set [`extendEnv`](#extendenv) to `false` if you don't want this.
|
||||
|
||||
#### argv0
|
||||
|
||||
Type: `string`
|
||||
|
||||
Explicitly set the value of `argv[0]` sent to the child process. This will be set to `file` if not specified.
|
||||
|
||||
#### stdio
|
||||
|
||||
Type: `string | string[]`\
|
||||
Default: `pipe`
|
||||
|
||||
Child's [stdio](https://nodejs.org/api/child_process.html#child_process_options_stdio) configuration.
|
||||
|
||||
#### serialization
|
||||
|
||||
Type: `string`\
|
||||
Default: `'json'`
|
||||
|
||||
Specify the kind of serialization used for sending messages between processes when using the [`stdio: 'ipc'`](#stdio) option or [`execa.node()`](#execanodescriptpath-arguments-options):
|
||||
- `json`: Uses `JSON.stringify()` and `JSON.parse()`.
|
||||
- `advanced`: Uses [`v8.serialize()`](https://nodejs.org/api/v8.html#v8_v8_serialize_value)
|
||||
|
||||
Requires Node.js `13.2.0` or later.
|
||||
|
||||
[More info.](https://nodejs.org/api/child_process.html#child_process_advanced_serialization)
|
||||
|
||||
#### detached
|
||||
|
||||
Type: `boolean`
|
||||
|
||||
Prepare child to run independently of its parent process. Specific behavior [depends on the platform](https://nodejs.org/api/child_process.html#child_process_options_detached).
|
||||
|
||||
#### uid
|
||||
|
||||
Type: `number`
|
||||
|
||||
Sets the user identity of the process.
|
||||
|
||||
#### gid
|
||||
|
||||
Type: `number`
|
||||
|
||||
Sets the group identity of the process.
|
||||
|
||||
#### shell
|
||||
|
||||
Type: `boolean | string`\
|
||||
Default: `false`
|
||||
|
||||
If `true`, runs `file` inside of a shell. Uses `/bin/sh` on UNIX and `cmd.exe` on Windows. A different shell can be specified as a string. The shell should understand the `-c` switch on UNIX or `/d /s /c` on Windows.
|
||||
|
||||
We recommend against using this option since it is:
|
||||
- not cross-platform, encouraging shell-specific syntax.
|
||||
- slower, because of the additional shell interpretation.
|
||||
- unsafe, potentially allowing command injection.
|
||||
|
||||
#### encoding
|
||||
|
||||
Type: `string | null`\
|
||||
Default: `utf8`
|
||||
|
||||
Specify the character encoding used to decode the `stdout` and `stderr` output. If set to `null`, then `stdout` and `stderr` will be a `Buffer` instead of a string.
|
||||
|
||||
#### timeout
|
||||
|
||||
Type: `number`\
|
||||
Default: `0`
|
||||
|
||||
If timeout is greater than `0`, the parent will send the signal identified by the `killSignal` property (the default is `SIGTERM`) if the child runs longer than timeout milliseconds.
|
||||
|
||||
#### maxBuffer
|
||||
|
||||
Type: `number`\
|
||||
Default: `100_000_000` (100 MB)
|
||||
|
||||
Largest amount of data in bytes allowed on `stdout` or `stderr`.
|
||||
|
||||
#### killSignal
|
||||
|
||||
Type: `string | number`\
|
||||
Default: `SIGTERM`
|
||||
|
||||
Signal value to be used when the spawned process will be killed.
|
||||
|
||||
#### windowsVerbatimArguments
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `false`
|
||||
|
||||
If `true`, no quoting or escaping of arguments is done on Windows. Ignored on other platforms. This is set to `true` automatically when the `shell` option is `true`.
|
||||
|
||||
#### windowsHide
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `true`
|
||||
|
||||
On Windows, do not create a new console window. Please note this also prevents `CTRL-C` [from working](https://github.com/nodejs/node/issues/29837) on Windows.
|
||||
|
||||
#### nodePath *(For `.node()` only)*
|
||||
|
||||
Type: `string`\
|
||||
Default: [`process.execPath`](https://nodejs.org/api/process.html#process_process_execpath)
|
||||
|
||||
Node.js executable used to create the child process.
|
||||
|
||||
#### nodeOptions *(For `.node()` only)*
|
||||
|
||||
Type: `string[]`\
|
||||
Default: [`process.execArgv`](https://nodejs.org/api/process.html#process_process_execargv)
|
||||
|
||||
List of [CLI options](https://nodejs.org/api/cli.html#cli_options) passed to the Node.js executable.
|
||||
|
||||
## Tips
|
||||
|
||||
### Retry on error
|
||||
|
||||
Gracefully handle failures by using automatic retries and exponential backoff with the [`p-retry`](https://github.com/sindresorhus/p-retry) package:
|
||||
|
||||
```js
|
||||
const pRetry = require('p-retry');
|
||||
|
||||
const run = async () => {
|
||||
const results = await execa('curl', ['-sSL', 'https://sindresorhus.com/unicorn']);
|
||||
return results;
|
||||
};
|
||||
|
||||
(async () => {
|
||||
console.log(await pRetry(run, {retries: 5}));
|
||||
})();
|
||||
```
|
||||
|
||||
### Save and pipe output from a child process
|
||||
|
||||
Let's say you want to show the output of a child process in real-time while also saving it to a variable.
|
||||
|
||||
```js
|
||||
const execa = require('execa');
|
||||
|
||||
const subprocess = execa('echo', ['foo']);
|
||||
subprocess.stdout.pipe(process.stdout);
|
||||
|
||||
(async () => {
|
||||
const {stdout} = await subprocess;
|
||||
console.log('child output:', stdout);
|
||||
})();
|
||||
```
|
||||
|
||||
### Redirect output to a file
|
||||
|
||||
```js
|
||||
const execa = require('execa');
|
||||
|
||||
const subprocess = execa('echo', ['foo'])
|
||||
subprocess.stdout.pipe(fs.createWriteStream('stdout.txt'))
|
||||
```
|
||||
|
||||
### Redirect input from a file
|
||||
|
||||
```js
|
||||
const execa = require('execa');
|
||||
|
||||
const subprocess = execa('cat')
|
||||
fs.createReadStream('stdin.txt').pipe(subprocess.stdin)
|
||||
```
|
||||
|
||||
### Execute the current package's binary
|
||||
|
||||
```js
|
||||
const {getBinPathSync} = require('get-bin-path');
|
||||
|
||||
const binPath = getBinPathSync();
|
||||
const subprocess = execa(binPath);
|
||||
```
|
||||
|
||||
`execa` can be combined with [`get-bin-path`](https://github.com/ehmicky/get-bin-path) to test the current package's binary. As opposed to hard-coding the path to the binary, this validates that the `package.json` `bin` field is correctly set up.
|
||||
|
||||
## Related
|
||||
|
||||
- [gulp-execa](https://github.com/ehmicky/gulp-execa) - Gulp plugin for `execa`
|
||||
- [nvexeca](https://github.com/ehmicky/nvexeca) - Run `execa` using any Node.js version
|
||||
- [sudo-prompt](https://github.com/jorangreef/sudo-prompt) - Run commands with elevated privileges.
|
||||
|
||||
## Maintainers
|
||||
|
||||
- [Sindre Sorhus](https://github.com/sindresorhus)
|
||||
- [@ehmicky](https://github.com/ehmicky)
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<b>
|
||||
<a href="https://tidelift.com/subscription/pkg/npm-execa?utm_source=npm-execa&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
|
||||
</b>
|
||||
<br>
|
||||
<sub>
|
||||
Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
|
||||
</sub>
|
||||
</div>
|
||||
52
node_modules/@dotenvx/dotenvx/node_modules/get-stream/buffer-stream.js
generated
vendored
Normal file
52
node_modules/@dotenvx/dotenvx/node_modules/get-stream/buffer-stream.js
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
'use strict';
|
||||
const {PassThrough: PassThroughStream} = require('stream');
|
||||
|
||||
module.exports = options => {
|
||||
options = {...options};
|
||||
|
||||
const {array} = options;
|
||||
let {encoding} = options;
|
||||
const isBuffer = encoding === 'buffer';
|
||||
let objectMode = false;
|
||||
|
||||
if (array) {
|
||||
objectMode = !(encoding || isBuffer);
|
||||
} else {
|
||||
encoding = encoding || 'utf8';
|
||||
}
|
||||
|
||||
if (isBuffer) {
|
||||
encoding = null;
|
||||
}
|
||||
|
||||
const stream = new PassThroughStream({objectMode});
|
||||
|
||||
if (encoding) {
|
||||
stream.setEncoding(encoding);
|
||||
}
|
||||
|
||||
let length = 0;
|
||||
const chunks = [];
|
||||
|
||||
stream.on('data', chunk => {
|
||||
chunks.push(chunk);
|
||||
|
||||
if (objectMode) {
|
||||
length = chunks.length;
|
||||
} else {
|
||||
length += chunk.length;
|
||||
}
|
||||
});
|
||||
|
||||
stream.getBufferedValue = () => {
|
||||
if (array) {
|
||||
return chunks;
|
||||
}
|
||||
|
||||
return isBuffer ? Buffer.concat(chunks, length) : chunks.join('');
|
||||
};
|
||||
|
||||
stream.getBufferedLength = () => length;
|
||||
|
||||
return stream;
|
||||
};
|
||||
105
node_modules/@dotenvx/dotenvx/node_modules/get-stream/index.d.ts
generated
vendored
Normal file
105
node_modules/@dotenvx/dotenvx/node_modules/get-stream/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,105 @@
|
||||
/// <reference types="node"/>
|
||||
import {Stream} from 'stream';
|
||||
|
||||
declare class MaxBufferErrorClass extends Error {
|
||||
readonly name: 'MaxBufferError';
|
||||
constructor();
|
||||
}
|
||||
|
||||
declare namespace getStream {
|
||||
interface Options {
|
||||
/**
|
||||
Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `MaxBufferError` error.
|
||||
|
||||
@default Infinity
|
||||
*/
|
||||
readonly maxBuffer?: number;
|
||||
}
|
||||
|
||||
interface OptionsWithEncoding<EncodingType = BufferEncoding> extends Options {
|
||||
/**
|
||||
[Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream.
|
||||
|
||||
@default 'utf8'
|
||||
*/
|
||||
readonly encoding?: EncodingType;
|
||||
}
|
||||
|
||||
type MaxBufferError = MaxBufferErrorClass;
|
||||
}
|
||||
|
||||
declare const getStream: {
|
||||
/**
|
||||
Get the `stream` as a string.
|
||||
|
||||
@returns A promise that resolves when the end event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode.
|
||||
|
||||
@example
|
||||
```
|
||||
import * as fs from 'fs';
|
||||
import getStream = require('get-stream');
|
||||
|
||||
(async () => {
|
||||
const stream = fs.createReadStream('unicorn.txt');
|
||||
|
||||
console.log(await getStream(stream));
|
||||
// ,,))))))));,
|
||||
// __)))))))))))))),
|
||||
// \|/ -\(((((''''((((((((.
|
||||
// -*-==//////(('' . `)))))),
|
||||
// /|\ ))| o ;-. '((((( ,(,
|
||||
// ( `| / ) ;))))' ,_))^;(~
|
||||
// | | | ,))((((_ _____------~~~-. %,;(;(>';'~
|
||||
// o_); ; )))(((` ~---~ `:: \ %%~~)(v;(`('~
|
||||
// ; ''''```` `: `:::|\,__,%% );`'; ~
|
||||
// | _ ) / `:|`----' `-'
|
||||
// ______/\/~ | / /
|
||||
// /~;;.____/;;' / ___--,-( `;;;/
|
||||
// / // _;______;'------~~~~~ /;;/\ /
|
||||
// // | | / ; \;;,\
|
||||
// (<_ | ; /',/-----' _>
|
||||
// \_| ||_ //~;~~~~~~~~~
|
||||
// `\_| (,~~
|
||||
// \~\
|
||||
// ~~
|
||||
})();
|
||||
```
|
||||
*/
|
||||
(stream: Stream, options?: getStream.OptionsWithEncoding): Promise<string>;
|
||||
|
||||
/**
|
||||
Get the `stream` as a buffer.
|
||||
|
||||
It honors the `maxBuffer` option as above, but it refers to byte length rather than string length.
|
||||
*/
|
||||
buffer(
|
||||
stream: Stream,
|
||||
options?: getStream.Options
|
||||
): Promise<Buffer>;
|
||||
|
||||
/**
|
||||
Get the `stream` as an array of values.
|
||||
|
||||
It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen:
|
||||
|
||||
- When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes).
|
||||
- When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array.
|
||||
- When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array.
|
||||
*/
|
||||
array<StreamObjectModeType>(
|
||||
stream: Stream,
|
||||
options?: getStream.Options
|
||||
): Promise<StreamObjectModeType[]>;
|
||||
array(
|
||||
stream: Stream,
|
||||
options: getStream.OptionsWithEncoding<'buffer'>
|
||||
): Promise<Buffer[]>;
|
||||
array(
|
||||
stream: Stream,
|
||||
options: getStream.OptionsWithEncoding<BufferEncoding>
|
||||
): Promise<string[]>;
|
||||
|
||||
MaxBufferError: typeof MaxBufferErrorClass;
|
||||
};
|
||||
|
||||
export = getStream;
|
||||
61
node_modules/@dotenvx/dotenvx/node_modules/get-stream/index.js
generated
vendored
Normal file
61
node_modules/@dotenvx/dotenvx/node_modules/get-stream/index.js
generated
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
'use strict';
|
||||
const {constants: BufferConstants} = require('buffer');
|
||||
const stream = require('stream');
|
||||
const {promisify} = require('util');
|
||||
const bufferStream = require('./buffer-stream');
|
||||
|
||||
const streamPipelinePromisified = promisify(stream.pipeline);
|
||||
|
||||
class MaxBufferError extends Error {
|
||||
constructor() {
|
||||
super('maxBuffer exceeded');
|
||||
this.name = 'MaxBufferError';
|
||||
}
|
||||
}
|
||||
|
||||
async function getStream(inputStream, options) {
|
||||
if (!inputStream) {
|
||||
throw new Error('Expected a stream');
|
||||
}
|
||||
|
||||
options = {
|
||||
maxBuffer: Infinity,
|
||||
...options
|
||||
};
|
||||
|
||||
const {maxBuffer} = options;
|
||||
const stream = bufferStream(options);
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
const rejectPromise = error => {
|
||||
// Don't retrieve an oversized buffer.
|
||||
if (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) {
|
||||
error.bufferedData = stream.getBufferedValue();
|
||||
}
|
||||
|
||||
reject(error);
|
||||
};
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
await streamPipelinePromisified(inputStream, stream);
|
||||
resolve();
|
||||
} catch (error) {
|
||||
rejectPromise(error);
|
||||
}
|
||||
})();
|
||||
|
||||
stream.on('data', () => {
|
||||
if (stream.getBufferedLength() > maxBuffer) {
|
||||
rejectPromise(new MaxBufferError());
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return stream.getBufferedValue();
|
||||
}
|
||||
|
||||
module.exports = getStream;
|
||||
module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'});
|
||||
module.exports.array = (stream, options) => getStream(stream, {...options, array: true});
|
||||
module.exports.MaxBufferError = MaxBufferError;
|
||||
9
node_modules/@dotenvx/dotenvx/node_modules/get-stream/license
generated
vendored
Normal file
9
node_modules/@dotenvx/dotenvx/node_modules/get-stream/license
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
47
node_modules/@dotenvx/dotenvx/node_modules/get-stream/package.json
generated
vendored
Normal file
47
node_modules/@dotenvx/dotenvx/node_modules/get-stream/package.json
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"name": "get-stream",
|
||||
"version": "6.0.1",
|
||||
"description": "Get a stream as a string, buffer, or array",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/get-stream",
|
||||
"funding": "https://github.com/sponsors/sindresorhus",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "https://sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && ava && tsd"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts",
|
||||
"buffer-stream.js"
|
||||
],
|
||||
"keywords": [
|
||||
"get",
|
||||
"stream",
|
||||
"promise",
|
||||
"concat",
|
||||
"string",
|
||||
"text",
|
||||
"buffer",
|
||||
"read",
|
||||
"data",
|
||||
"consume",
|
||||
"readable",
|
||||
"readablestream",
|
||||
"array",
|
||||
"object"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@types/node": "^14.0.27",
|
||||
"ava": "^2.4.0",
|
||||
"into-stream": "^5.0.0",
|
||||
"tsd": "^0.13.1",
|
||||
"xo": "^0.24.0"
|
||||
}
|
||||
}
|
||||
124
node_modules/@dotenvx/dotenvx/node_modules/get-stream/readme.md
generated
vendored
Normal file
124
node_modules/@dotenvx/dotenvx/node_modules/get-stream/readme.md
generated
vendored
Normal file
@@ -0,0 +1,124 @@
|
||||
# get-stream
|
||||
|
||||
> Get a stream as a string, buffer, or array
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install get-stream
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const fs = require('fs');
|
||||
const getStream = require('get-stream');
|
||||
|
||||
(async () => {
|
||||
const stream = fs.createReadStream('unicorn.txt');
|
||||
|
||||
console.log(await getStream(stream));
|
||||
/*
|
||||
,,))))))));,
|
||||
__)))))))))))))),
|
||||
\|/ -\(((((''''((((((((.
|
||||
-*-==//////(('' . `)))))),
|
||||
/|\ ))| o ;-. '((((( ,(,
|
||||
( `| / ) ;))))' ,_))^;(~
|
||||
| | | ,))((((_ _____------~~~-. %,;(;(>';'~
|
||||
o_); ; )))(((` ~---~ `:: \ %%~~)(v;(`('~
|
||||
; ''''```` `: `:::|\,__,%% );`'; ~
|
||||
| _ ) / `:|`----' `-'
|
||||
______/\/~ | / /
|
||||
/~;;.____/;;' / ___--,-( `;;;/
|
||||
/ // _;______;'------~~~~~ /;;/\ /
|
||||
// | | / ; \;;,\
|
||||
(<_ | ; /',/-----' _>
|
||||
\_| ||_ //~;~~~~~~~~~
|
||||
`\_| (,~~
|
||||
\~\
|
||||
~~
|
||||
*/
|
||||
})();
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
The methods returns a promise that resolves when the `end` event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode.
|
||||
|
||||
### getStream(stream, options?)
|
||||
|
||||
Get the `stream` as a string.
|
||||
|
||||
#### options
|
||||
|
||||
Type: `object`
|
||||
|
||||
##### encoding
|
||||
|
||||
Type: `string`\
|
||||
Default: `'utf8'`
|
||||
|
||||
[Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream.
|
||||
|
||||
##### maxBuffer
|
||||
|
||||
Type: `number`\
|
||||
Default: `Infinity`
|
||||
|
||||
Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `getStream.MaxBufferError` error.
|
||||
|
||||
### getStream.buffer(stream, options?)
|
||||
|
||||
Get the `stream` as a buffer.
|
||||
|
||||
It honors the `maxBuffer` option as above, but it refers to byte length rather than string length.
|
||||
|
||||
### getStream.array(stream, options?)
|
||||
|
||||
Get the `stream` as an array of values.
|
||||
|
||||
It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen:
|
||||
|
||||
- When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes).
|
||||
|
||||
- When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array.
|
||||
|
||||
- When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array.
|
||||
|
||||
## Errors
|
||||
|
||||
If the input stream emits an `error` event, the promise will be rejected with the error. The buffered data will be attached to the `bufferedData` property of the error.
|
||||
|
||||
```js
|
||||
(async () => {
|
||||
try {
|
||||
await getStream(streamThatErrorsAtTheEnd('unicorn'));
|
||||
} catch (error) {
|
||||
console.log(error.bufferedData);
|
||||
//=> 'unicorn'
|
||||
}
|
||||
})()
|
||||
```
|
||||
|
||||
## FAQ
|
||||
|
||||
### How is this different from [`concat-stream`](https://github.com/maxogden/concat-stream)?
|
||||
|
||||
This module accepts a stream instead of being one and returns a promise instead of using a callback. The API is simpler and it only supports returning a string, buffer, or array. It doesn't have a fragile type inference. You explicitly choose what you want. And it doesn't depend on the huge `readable-stream` package.
|
||||
|
||||
## Related
|
||||
|
||||
- [get-stdin](https://github.com/sindresorhus/get-stdin) - Get stdin as a string or buffer
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<b>
|
||||
<a href="https://tidelift.com/subscription/pkg/npm-get-stream?utm_source=npm-get-stream&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
|
||||
</b>
|
||||
<br>
|
||||
<sub>
|
||||
Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
|
||||
</sub>
|
||||
</div>
|
||||
11
node_modules/@dotenvx/dotenvx/node_modules/human-signals/CHANGELOG.md
generated
vendored
Normal file
11
node_modules/@dotenvx/dotenvx/node_modules/human-signals/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# 2.1.0
|
||||
|
||||
## TypeScript types
|
||||
|
||||
- Add [TypeScript definitions](src/main.d.ts)
|
||||
|
||||
# 2.0.0
|
||||
|
||||
## Breaking changes
|
||||
|
||||
- Minimal supported Node.js version is now `10.17.0`
|
||||
201
node_modules/@dotenvx/dotenvx/node_modules/human-signals/LICENSE
generated
vendored
Normal file
201
node_modules/@dotenvx/dotenvx/node_modules/human-signals/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2019 ehmicky <ehmicky@gmail.com>
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
165
node_modules/@dotenvx/dotenvx/node_modules/human-signals/README.md
generated
vendored
Normal file
165
node_modules/@dotenvx/dotenvx/node_modules/human-signals/README.md
generated
vendored
Normal file
@@ -0,0 +1,165 @@
|
||||
[](https://codecov.io/gh/ehmicky/human-signals)
|
||||
[](https://travis-ci.org/ehmicky/human-signals)
|
||||
[](https://www.npmjs.com/package/human-signals)
|
||||
[](https://gitter.im/ehmicky/human-signals)
|
||||
[](https://twitter.com/intent/follow?screen_name=ehmicky)
|
||||
[](https://medium.com/@ehmicky)
|
||||
|
||||
Human-friendly process signals.
|
||||
|
||||
This is a map of known process signals with some information about each signal.
|
||||
|
||||
Unlike
|
||||
[`os.constants.signals`](https://nodejs.org/api/os.html#os_signal_constants)
|
||||
this includes:
|
||||
|
||||
- human-friendly [descriptions](#description)
|
||||
- [default actions](#action), including whether they [can be prevented](#forced)
|
||||
- whether the signal is [supported](#supported) by the current OS
|
||||
|
||||
# Example
|
||||
|
||||
```js
|
||||
const { signalsByName, signalsByNumber } = require('human-signals')
|
||||
|
||||
console.log(signalsByName.SIGINT)
|
||||
// {
|
||||
// name: 'SIGINT',
|
||||
// number: 2,
|
||||
// description: 'User interruption with CTRL-C',
|
||||
// supported: true,
|
||||
// action: 'terminate',
|
||||
// forced: false,
|
||||
// standard: 'ansi'
|
||||
// }
|
||||
|
||||
console.log(signalsByNumber[8])
|
||||
// {
|
||||
// name: 'SIGFPE',
|
||||
// number: 8,
|
||||
// description: 'Floating point arithmetic error',
|
||||
// supported: true,
|
||||
// action: 'core',
|
||||
// forced: false,
|
||||
// standard: 'ansi'
|
||||
// }
|
||||
```
|
||||
|
||||
# Install
|
||||
|
||||
```bash
|
||||
npm install human-signals
|
||||
```
|
||||
|
||||
# Usage
|
||||
|
||||
## signalsByName
|
||||
|
||||
_Type_: `object`
|
||||
|
||||
Object whose keys are signal [names](#name) and values are
|
||||
[signal objects](#signal).
|
||||
|
||||
## signalsByNumber
|
||||
|
||||
_Type_: `object`
|
||||
|
||||
Object whose keys are signal [numbers](#number) and values are
|
||||
[signal objects](#signal).
|
||||
|
||||
## signal
|
||||
|
||||
_Type_: `object`
|
||||
|
||||
Signal object with the following properties.
|
||||
|
||||
### name
|
||||
|
||||
_Type_: `string`
|
||||
|
||||
Standard name of the signal, for example `'SIGINT'`.
|
||||
|
||||
### number
|
||||
|
||||
_Type_: `number`
|
||||
|
||||
Code number of the signal, for example `2`. While most `number` are
|
||||
cross-platform, some are different between different OS.
|
||||
|
||||
### description
|
||||
|
||||
_Type_: `string`
|
||||
|
||||
Human-friendly description for the signal, for example
|
||||
`'User interruption with CTRL-C'`.
|
||||
|
||||
### supported
|
||||
|
||||
_Type_: `boolean`
|
||||
|
||||
Whether the current OS can handle this signal in Node.js using
|
||||
[`process.on(name, handler)`](https://nodejs.org/api/process.html#process_signal_events).
|
||||
|
||||
The list of supported signals
|
||||
[is OS-specific](https://github.com/ehmicky/cross-platform-node-guide/blob/master/docs/6_networking_ipc/signals.md#cross-platform-signals).
|
||||
|
||||
### action
|
||||
|
||||
_Type_: `string`\
|
||||
_Enum_: `'terminate'`, `'core'`, `'ignore'`, `'pause'`, `'unpause'`
|
||||
|
||||
What is the default action for this signal when it is not handled.
|
||||
|
||||
### forced
|
||||
|
||||
_Type_: `boolean`
|
||||
|
||||
Whether the signal's default action cannot be prevented. This is `true` for
|
||||
`SIGTERM`, `SIGKILL` and `SIGSTOP`.
|
||||
|
||||
### standard
|
||||
|
||||
_Type_: `string`\
|
||||
_Enum_: `'ansi'`, `'posix'`, `'bsd'`, `'systemv'`, `'other'`
|
||||
|
||||
Which standard defined that signal.
|
||||
|
||||
# Support
|
||||
|
||||
If you found a bug or would like a new feature, _don't hesitate_ to
|
||||
[submit an issue on GitHub](../../issues).
|
||||
|
||||
For other questions, feel free to
|
||||
[chat with us on Gitter](https://gitter.im/ehmicky/human-signals).
|
||||
|
||||
Everyone is welcome regardless of personal background. We enforce a
|
||||
[Code of conduct](CODE_OF_CONDUCT.md) in order to promote a positive and
|
||||
inclusive environment.
|
||||
|
||||
# Contributing
|
||||
|
||||
This project was made with ❤️. The simplest way to give back is by starring and
|
||||
sharing it online.
|
||||
|
||||
If the documentation is unclear or has a typo, please click on the page's `Edit`
|
||||
button (pencil icon) and suggest a correction.
|
||||
|
||||
If you would like to help us fix a bug or add a new feature, please check our
|
||||
[guidelines](CONTRIBUTING.md). Pull requests are welcome!
|
||||
|
||||
Thanks go to our wonderful contributors:
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center"><a href="https://twitter.com/ehmicky"><img src="https://avatars2.githubusercontent.com/u/8136211?v=4" width="100px;" alt=""/><br /><sub><b>ehmicky</b></sub></a><br /><a href="https://github.com/ehmicky/human-signals/commits?author=ehmicky" title="Code">💻</a> <a href="#design-ehmicky" title="Design">🎨</a> <a href="#ideas-ehmicky" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/ehmicky/human-signals/commits?author=ehmicky" title="Documentation">📖</a></td>
|
||||
<td align="center"><a href="http://www.electrovir.com"><img src="https://avatars0.githubusercontent.com/u/1205860?v=4" width="100px;" alt=""/><br /><sub><b>electrovir</b></sub></a><br /><a href="https://github.com/ehmicky/human-signals/commits?author=electrovir" title="Code">💻</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-enable -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
273
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/core.js
generated
vendored
Normal file
273
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/core.js
generated
vendored
Normal file
@@ -0,0 +1,273 @@
|
||||
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.SIGNALS=void 0;
|
||||
|
||||
const SIGNALS=[
|
||||
{
|
||||
name:"SIGHUP",
|
||||
number:1,
|
||||
action:"terminate",
|
||||
description:"Terminal closed",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGINT",
|
||||
number:2,
|
||||
action:"terminate",
|
||||
description:"User interruption with CTRL-C",
|
||||
standard:"ansi"},
|
||||
|
||||
{
|
||||
name:"SIGQUIT",
|
||||
number:3,
|
||||
action:"core",
|
||||
description:"User interruption with CTRL-\\",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGILL",
|
||||
number:4,
|
||||
action:"core",
|
||||
description:"Invalid machine instruction",
|
||||
standard:"ansi"},
|
||||
|
||||
{
|
||||
name:"SIGTRAP",
|
||||
number:5,
|
||||
action:"core",
|
||||
description:"Debugger breakpoint",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGABRT",
|
||||
number:6,
|
||||
action:"core",
|
||||
description:"Aborted",
|
||||
standard:"ansi"},
|
||||
|
||||
{
|
||||
name:"SIGIOT",
|
||||
number:6,
|
||||
action:"core",
|
||||
description:"Aborted",
|
||||
standard:"bsd"},
|
||||
|
||||
{
|
||||
name:"SIGBUS",
|
||||
number:7,
|
||||
action:"core",
|
||||
description:
|
||||
"Bus error due to misaligned, non-existing address or paging error",
|
||||
standard:"bsd"},
|
||||
|
||||
{
|
||||
name:"SIGEMT",
|
||||
number:7,
|
||||
action:"terminate",
|
||||
description:"Command should be emulated but is not implemented",
|
||||
standard:"other"},
|
||||
|
||||
{
|
||||
name:"SIGFPE",
|
||||
number:8,
|
||||
action:"core",
|
||||
description:"Floating point arithmetic error",
|
||||
standard:"ansi"},
|
||||
|
||||
{
|
||||
name:"SIGKILL",
|
||||
number:9,
|
||||
action:"terminate",
|
||||
description:"Forced termination",
|
||||
standard:"posix",
|
||||
forced:true},
|
||||
|
||||
{
|
||||
name:"SIGUSR1",
|
||||
number:10,
|
||||
action:"terminate",
|
||||
description:"Application-specific signal",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGSEGV",
|
||||
number:11,
|
||||
action:"core",
|
||||
description:"Segmentation fault",
|
||||
standard:"ansi"},
|
||||
|
||||
{
|
||||
name:"SIGUSR2",
|
||||
number:12,
|
||||
action:"terminate",
|
||||
description:"Application-specific signal",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGPIPE",
|
||||
number:13,
|
||||
action:"terminate",
|
||||
description:"Broken pipe or socket",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGALRM",
|
||||
number:14,
|
||||
action:"terminate",
|
||||
description:"Timeout or timer",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGTERM",
|
||||
number:15,
|
||||
action:"terminate",
|
||||
description:"Termination",
|
||||
standard:"ansi"},
|
||||
|
||||
{
|
||||
name:"SIGSTKFLT",
|
||||
number:16,
|
||||
action:"terminate",
|
||||
description:"Stack is empty or overflowed",
|
||||
standard:"other"},
|
||||
|
||||
{
|
||||
name:"SIGCHLD",
|
||||
number:17,
|
||||
action:"ignore",
|
||||
description:"Child process terminated, paused or unpaused",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGCLD",
|
||||
number:17,
|
||||
action:"ignore",
|
||||
description:"Child process terminated, paused or unpaused",
|
||||
standard:"other"},
|
||||
|
||||
{
|
||||
name:"SIGCONT",
|
||||
number:18,
|
||||
action:"unpause",
|
||||
description:"Unpaused",
|
||||
standard:"posix",
|
||||
forced:true},
|
||||
|
||||
{
|
||||
name:"SIGSTOP",
|
||||
number:19,
|
||||
action:"pause",
|
||||
description:"Paused",
|
||||
standard:"posix",
|
||||
forced:true},
|
||||
|
||||
{
|
||||
name:"SIGTSTP",
|
||||
number:20,
|
||||
action:"pause",
|
||||
description:"Paused using CTRL-Z or \"suspend\"",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGTTIN",
|
||||
number:21,
|
||||
action:"pause",
|
||||
description:"Background process cannot read terminal input",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGBREAK",
|
||||
number:21,
|
||||
action:"terminate",
|
||||
description:"User interruption with CTRL-BREAK",
|
||||
standard:"other"},
|
||||
|
||||
{
|
||||
name:"SIGTTOU",
|
||||
number:22,
|
||||
action:"pause",
|
||||
description:"Background process cannot write to terminal output",
|
||||
standard:"posix"},
|
||||
|
||||
{
|
||||
name:"SIGURG",
|
||||
number:23,
|
||||
action:"ignore",
|
||||
description:"Socket received out-of-band data",
|
||||
standard:"bsd"},
|
||||
|
||||
{
|
||||
name:"SIGXCPU",
|
||||
number:24,
|
||||
action:"core",
|
||||
description:"Process timed out",
|
||||
standard:"bsd"},
|
||||
|
||||
{
|
||||
name:"SIGXFSZ",
|
||||
number:25,
|
||||
action:"core",
|
||||
description:"File too big",
|
||||
standard:"bsd"},
|
||||
|
||||
{
|
||||
name:"SIGVTALRM",
|
||||
number:26,
|
||||
action:"terminate",
|
||||
description:"Timeout or timer",
|
||||
standard:"bsd"},
|
||||
|
||||
{
|
||||
name:"SIGPROF",
|
||||
number:27,
|
||||
action:"terminate",
|
||||
description:"Timeout or timer",
|
||||
standard:"bsd"},
|
||||
|
||||
{
|
||||
name:"SIGWINCH",
|
||||
number:28,
|
||||
action:"ignore",
|
||||
description:"Terminal window size changed",
|
||||
standard:"bsd"},
|
||||
|
||||
{
|
||||
name:"SIGIO",
|
||||
number:29,
|
||||
action:"terminate",
|
||||
description:"I/O is available",
|
||||
standard:"other"},
|
||||
|
||||
{
|
||||
name:"SIGPOLL",
|
||||
number:29,
|
||||
action:"terminate",
|
||||
description:"Watched event",
|
||||
standard:"other"},
|
||||
|
||||
{
|
||||
name:"SIGINFO",
|
||||
number:29,
|
||||
action:"ignore",
|
||||
description:"Request for process information",
|
||||
standard:"other"},
|
||||
|
||||
{
|
||||
name:"SIGPWR",
|
||||
number:30,
|
||||
action:"terminate",
|
||||
description:"Device running out of power",
|
||||
standard:"systemv"},
|
||||
|
||||
{
|
||||
name:"SIGSYS",
|
||||
number:31,
|
||||
action:"core",
|
||||
description:"Invalid system call",
|
||||
standard:"other"},
|
||||
|
||||
{
|
||||
name:"SIGUNUSED",
|
||||
number:31,
|
||||
action:"terminate",
|
||||
description:"Invalid system call",
|
||||
standard:"other"}];exports.SIGNALS=SIGNALS;
|
||||
//# sourceMappingURL=core.js.map
|
||||
1
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/core.js.map
generated
vendored
Normal file
1
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/core.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
52
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/main.d.ts
generated
vendored
Normal file
52
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/main.d.ts
generated
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* Object whose keys are signal names and values are signal objects.
|
||||
*/
|
||||
export declare const signalsByName: { [signalName: string]: Signal }
|
||||
/**
|
||||
* Object whose keys are signal numbers and values are signal objects.
|
||||
*/
|
||||
export declare const signalsByNumber: { [signalNumber: string]: Signal }
|
||||
|
||||
export declare type SignalAction =
|
||||
| 'terminate'
|
||||
| 'core'
|
||||
| 'ignore'
|
||||
| 'pause'
|
||||
| 'unpause'
|
||||
export declare type SignalStandard =
|
||||
| 'ansi'
|
||||
| 'posix'
|
||||
| 'bsd'
|
||||
| 'systemv'
|
||||
| 'other'
|
||||
|
||||
export declare type Signal = {
|
||||
/**
|
||||
* Standard name of the signal, for example 'SIGINT'.
|
||||
*/
|
||||
name: string
|
||||
/**
|
||||
* Code number of the signal, for example 2. While most number are cross-platform, some are different between different OS.
|
||||
*/
|
||||
number: number
|
||||
/**
|
||||
* Human-friendly description for the signal, for example 'User interruption with CTRL-C'.
|
||||
*/
|
||||
description: string
|
||||
/**
|
||||
* Whether the current OS can handle this signal in Node.js using process.on(name, handler). The list of supported signals is OS-specific.
|
||||
*/
|
||||
supported: boolean
|
||||
/**
|
||||
* What is the default action for this signal when it is not handled.
|
||||
*/
|
||||
action: SignalAction
|
||||
/**
|
||||
* Whether the signal's default action cannot be prevented. This is true for SIGTERM, SIGKILL and SIGSTOP.
|
||||
*/
|
||||
forced: boolean
|
||||
/**
|
||||
* Which standard defined that signal.
|
||||
*/
|
||||
standard: SignalStandard
|
||||
}
|
||||
71
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/main.js
generated
vendored
Normal file
71
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/main.js
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=require("os");
|
||||
|
||||
var _signals=require("./signals.js");
|
||||
var _realtime=require("./realtime.js");
|
||||
|
||||
|
||||
|
||||
const getSignalsByName=function(){
|
||||
const signals=(0,_signals.getSignals)();
|
||||
return signals.reduce(getSignalByName,{});
|
||||
};
|
||||
|
||||
const getSignalByName=function(
|
||||
signalByNameMemo,
|
||||
{name,number,description,supported,action,forced,standard})
|
||||
{
|
||||
return{
|
||||
...signalByNameMemo,
|
||||
[name]:{name,number,description,supported,action,forced,standard}};
|
||||
|
||||
};
|
||||
|
||||
const signalsByName=getSignalsByName();exports.signalsByName=signalsByName;
|
||||
|
||||
|
||||
|
||||
|
||||
const getSignalsByNumber=function(){
|
||||
const signals=(0,_signals.getSignals)();
|
||||
const length=_realtime.SIGRTMAX+1;
|
||||
const signalsA=Array.from({length},(value,number)=>
|
||||
getSignalByNumber(number,signals));
|
||||
|
||||
return Object.assign({},...signalsA);
|
||||
};
|
||||
|
||||
const getSignalByNumber=function(number,signals){
|
||||
const signal=findSignalByNumber(number,signals);
|
||||
|
||||
if(signal===undefined){
|
||||
return{};
|
||||
}
|
||||
|
||||
const{name,description,supported,action,forced,standard}=signal;
|
||||
return{
|
||||
[number]:{
|
||||
name,
|
||||
number,
|
||||
description,
|
||||
supported,
|
||||
action,
|
||||
forced,
|
||||
standard}};
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
const findSignalByNumber=function(number,signals){
|
||||
const signal=signals.find(({name})=>_os.constants.signals[name]===number);
|
||||
|
||||
if(signal!==undefined){
|
||||
return signal;
|
||||
}
|
||||
|
||||
return signals.find(signalA=>signalA.number===number);
|
||||
};
|
||||
|
||||
const signalsByNumber=getSignalsByNumber();exports.signalsByNumber=signalsByNumber;
|
||||
//# sourceMappingURL=main.js.map
|
||||
1
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/main.js.map
generated
vendored
Normal file
1
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/main.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../src/main.js"],"names":["getSignalsByName","signals","reduce","getSignalByName","signalByNameMemo","name","number","description","supported","action","forced","standard","signalsByName","getSignalsByNumber","length","SIGRTMAX","signalsA","Array","from","value","getSignalByNumber","Object","assign","signal","findSignalByNumber","undefined","find","constants","signalA","signalsByNumber"],"mappings":"2HAAA;;AAEA;AACA;;;;AAIA,KAAMA,CAAAA,gBAAgB,CAAG,UAAW;AAClC,KAAMC,CAAAA,OAAO,CAAG,yBAAhB;AACA,MAAOA,CAAAA,OAAO,CAACC,MAAR,CAAeC,eAAf,CAAgC,EAAhC,CAAP;AACD,CAHD;;AAKA,KAAMA,CAAAA,eAAe,CAAG;AACtBC,gBADsB;AAEtB,CAAEC,IAAF,CAAQC,MAAR,CAAgBC,WAAhB,CAA6BC,SAA7B,CAAwCC,MAAxC,CAAgDC,MAAhD,CAAwDC,QAAxD,CAFsB;AAGtB;AACA,MAAO;AACL,GAAGP,gBADE;AAEL,CAACC,IAAD,EAAQ,CAAEA,IAAF,CAAQC,MAAR,CAAgBC,WAAhB,CAA6BC,SAA7B,CAAwCC,MAAxC,CAAgDC,MAAhD,CAAwDC,QAAxD,CAFH,CAAP;;AAID,CARD;;AAUO,KAAMC,CAAAA,aAAa,CAAGZ,gBAAgB,EAAtC,C;;;;;AAKP,KAAMa,CAAAA,kBAAkB,CAAG,UAAW;AACpC,KAAMZ,CAAAA,OAAO,CAAG,yBAAhB;AACA,KAAMa,CAAAA,MAAM,CAAGC,mBAAW,CAA1B;AACA,KAAMC,CAAAA,QAAQ,CAAGC,KAAK,CAACC,IAAN,CAAW,CAAEJ,MAAF,CAAX,CAAuB,CAACK,KAAD,CAAQb,MAAR;AACtCc,iBAAiB,CAACd,MAAD,CAASL,OAAT,CADF,CAAjB;;AAGA,MAAOoB,CAAAA,MAAM,CAACC,MAAP,CAAc,EAAd,CAAkB,GAAGN,QAArB,CAAP;AACD,CAPD;;AASA,KAAMI,CAAAA,iBAAiB,CAAG,SAASd,MAAT,CAAiBL,OAAjB,CAA0B;AAClD,KAAMsB,CAAAA,MAAM,CAAGC,kBAAkB,CAAClB,MAAD,CAASL,OAAT,CAAjC;;AAEA,GAAIsB,MAAM,GAAKE,SAAf,CAA0B;AACxB,MAAO,EAAP;AACD;;AAED,KAAM,CAAEpB,IAAF,CAAQE,WAAR,CAAqBC,SAArB,CAAgCC,MAAhC,CAAwCC,MAAxC,CAAgDC,QAAhD,EAA6DY,MAAnE;AACA,MAAO;AACL,CAACjB,MAAD,EAAU;AACRD,IADQ;AAERC,MAFQ;AAGRC,WAHQ;AAIRC,SAJQ;AAKRC,MALQ;AAMRC,MANQ;AAORC,QAPQ,CADL,CAAP;;;AAWD,CAnBD;;;;AAuBA,KAAMa,CAAAA,kBAAkB,CAAG,SAASlB,MAAT,CAAiBL,OAAjB,CAA0B;AACnD,KAAMsB,CAAAA,MAAM,CAAGtB,OAAO,CAACyB,IAAR,CAAa,CAAC,CAAErB,IAAF,CAAD,GAAcsB,cAAU1B,OAAV,CAAkBI,IAAlB,IAA4BC,MAAvD,CAAf;;AAEA,GAAIiB,MAAM,GAAKE,SAAf,CAA0B;AACxB,MAAOF,CAAAA,MAAP;AACD;;AAED,MAAOtB,CAAAA,OAAO,CAACyB,IAAR,CAAaE,OAAO,EAAIA,OAAO,CAACtB,MAAR,GAAmBA,MAA3C,CAAP;AACD,CARD;;AAUO,KAAMuB,CAAAA,eAAe,CAAGhB,kBAAkB,EAA1C,C","sourcesContent":["import { constants } from 'os'\n\nimport { getSignals } from './signals.js'\nimport { SIGRTMAX } from './realtime.js'\n\n// Retrieve `signalsByName`, an object mapping signal name to signal properties.\n// We make sure the object is sorted by `number`.\nconst getSignalsByName = function() {\n const signals = getSignals()\n return signals.reduce(getSignalByName, {})\n}\n\nconst getSignalByName = function(\n signalByNameMemo,\n { name, number, description, supported, action, forced, standard },\n) {\n return {\n ...signalByNameMemo,\n [name]: { name, number, description, supported, action, forced, standard },\n }\n}\n\nexport const signalsByName = getSignalsByName()\n\n// Retrieve `signalsByNumber`, an object mapping signal number to signal\n// properties.\n// We make sure the object is sorted by `number`.\nconst getSignalsByNumber = function() {\n const signals = getSignals()\n const length = SIGRTMAX + 1\n const signalsA = Array.from({ length }, (value, number) =>\n getSignalByNumber(number, signals),\n )\n return Object.assign({}, ...signalsA)\n}\n\nconst getSignalByNumber = function(number, signals) {\n const signal = findSignalByNumber(number, signals)\n\n if (signal === undefined) {\n return {}\n }\n\n const { name, description, supported, action, forced, standard } = signal\n return {\n [number]: {\n name,\n number,\n description,\n supported,\n action,\n forced,\n standard,\n },\n }\n}\n\n// Several signals might end up sharing the same number because of OS-specific\n// numbers, in which case those prevail.\nconst findSignalByNumber = function(number, signals) {\n const signal = signals.find(({ name }) => constants.signals[name] === number)\n\n if (signal !== undefined) {\n return signal\n }\n\n return signals.find(signalA => signalA.number === number)\n}\n\nexport const signalsByNumber = getSignalsByNumber()\n"],"file":"src/main.js"}
|
||||
19
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/realtime.js
generated
vendored
Normal file
19
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/realtime.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.SIGRTMAX=exports.getRealtimeSignals=void 0;
|
||||
const getRealtimeSignals=function(){
|
||||
const length=SIGRTMAX-SIGRTMIN+1;
|
||||
return Array.from({length},getRealtimeSignal);
|
||||
};exports.getRealtimeSignals=getRealtimeSignals;
|
||||
|
||||
const getRealtimeSignal=function(value,index){
|
||||
return{
|
||||
name:`SIGRT${index+1}`,
|
||||
number:SIGRTMIN+index,
|
||||
action:"terminate",
|
||||
description:"Application-specific signal (realtime)",
|
||||
standard:"posix"};
|
||||
|
||||
};
|
||||
|
||||
const SIGRTMIN=34;
|
||||
const SIGRTMAX=64;exports.SIGRTMAX=SIGRTMAX;
|
||||
//# sourceMappingURL=realtime.js.map
|
||||
1
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/realtime.js.map
generated
vendored
Normal file
1
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/realtime.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../src/realtime.js"],"names":["getRealtimeSignals","length","SIGRTMAX","SIGRTMIN","Array","from","getRealtimeSignal","value","index","name","number","action","description","standard"],"mappings":";AACO,KAAMA,CAAAA,kBAAkB,CAAG,UAAW;AAC3C,KAAMC,CAAAA,MAAM,CAAGC,QAAQ,CAAGC,QAAX,CAAsB,CAArC;AACA,MAAOC,CAAAA,KAAK,CAACC,IAAN,CAAW,CAAEJ,MAAF,CAAX,CAAuBK,iBAAvB,CAAP;AACD,CAHM,C;;AAKP,KAAMA,CAAAA,iBAAiB,CAAG,SAASC,KAAT,CAAgBC,KAAhB,CAAuB;AAC/C,MAAO;AACLC,IAAI,CAAG,QAAOD,KAAK,CAAG,CAAE,EADnB;AAELE,MAAM,CAAEP,QAAQ,CAAGK,KAFd;AAGLG,MAAM,CAAE,WAHH;AAILC,WAAW,CAAE,wCAJR;AAKLC,QAAQ,CAAE,OALL,CAAP;;AAOD,CARD;;AAUA,KAAMV,CAAAA,QAAQ,CAAG,EAAjB;AACO,KAAMD,CAAAA,QAAQ,CAAG,EAAjB,C","sourcesContent":["// List of realtime signals with information about them\nexport const getRealtimeSignals = function() {\n const length = SIGRTMAX - SIGRTMIN + 1\n return Array.from({ length }, getRealtimeSignal)\n}\n\nconst getRealtimeSignal = function(value, index) {\n return {\n name: `SIGRT${index + 1}`,\n number: SIGRTMIN + index,\n action: 'terminate',\n description: 'Application-specific signal (realtime)',\n standard: 'posix',\n }\n}\n\nconst SIGRTMIN = 34\nexport const SIGRTMAX = 64\n"],"file":"src/realtime.js"}
|
||||
35
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/signals.js
generated
vendored
Normal file
35
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/signals.js
generated
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=require("os");
|
||||
|
||||
var _core=require("./core.js");
|
||||
var _realtime=require("./realtime.js");
|
||||
|
||||
|
||||
|
||||
const getSignals=function(){
|
||||
const realtimeSignals=(0,_realtime.getRealtimeSignals)();
|
||||
const signals=[..._core.SIGNALS,...realtimeSignals].map(normalizeSignal);
|
||||
return signals;
|
||||
};exports.getSignals=getSignals;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const normalizeSignal=function({
|
||||
name,
|
||||
number:defaultNumber,
|
||||
description,
|
||||
action,
|
||||
forced=false,
|
||||
standard})
|
||||
{
|
||||
const{
|
||||
signals:{[name]:constantSignal}}=
|
||||
_os.constants;
|
||||
const supported=constantSignal!==undefined;
|
||||
const number=supported?constantSignal:defaultNumber;
|
||||
return{name,number,description,supported,action,forced,standard};
|
||||
};
|
||||
//# sourceMappingURL=signals.js.map
|
||||
1
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/signals.js.map
generated
vendored
Normal file
1
node_modules/@dotenvx/dotenvx/node_modules/human-signals/build/src/signals.js.map
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["../../src/signals.js"],"names":["getSignals","realtimeSignals","signals","SIGNALS","map","normalizeSignal","name","number","defaultNumber","description","action","forced","standard","constantSignal","constants","supported","undefined"],"mappings":"gGAAA;;AAEA;AACA;;;;AAIO,KAAMA,CAAAA,UAAU,CAAG,UAAW;AACnC,KAAMC,CAAAA,eAAe,CAAG,kCAAxB;AACA,KAAMC,CAAAA,OAAO,CAAG,CAAC,GAAGC,aAAJ,CAAa,GAAGF,eAAhB,EAAiCG,GAAjC,CAAqCC,eAArC,CAAhB;AACA,MAAOH,CAAAA,OAAP;AACD,CAJM,C;;;;;;;;AAYP,KAAMG,CAAAA,eAAe,CAAG,SAAS;AAC/BC,IAD+B;AAE/BC,MAAM,CAAEC,aAFuB;AAG/BC,WAH+B;AAI/BC,MAJ+B;AAK/BC,MAAM,CAAG,KALsB;AAM/BC,QAN+B,CAAT;AAOrB;AACD,KAAM;AACJV,OAAO,CAAE,CAAE,CAACI,IAAD,EAAQO,cAAV,CADL;AAEFC,aAFJ;AAGA,KAAMC,CAAAA,SAAS,CAAGF,cAAc,GAAKG,SAArC;AACA,KAAMT,CAAAA,MAAM,CAAGQ,SAAS,CAAGF,cAAH,CAAoBL,aAA5C;AACA,MAAO,CAAEF,IAAF,CAAQC,MAAR,CAAgBE,WAAhB,CAA6BM,SAA7B,CAAwCL,MAAxC,CAAgDC,MAAhD,CAAwDC,QAAxD,CAAP;AACD,CAdD","sourcesContent":["import { constants } from 'os'\n\nimport { SIGNALS } from './core.js'\nimport { getRealtimeSignals } from './realtime.js'\n\n// Retrieve list of know signals (including realtime) with information about\n// them\nexport const getSignals = function() {\n const realtimeSignals = getRealtimeSignals()\n const signals = [...SIGNALS, ...realtimeSignals].map(normalizeSignal)\n return signals\n}\n\n// Normalize signal:\n// - `number`: signal numbers are OS-specific. This is taken into account by\n// `os.constants.signals`. However we provide a default `number` since some\n// signals are not defined for some OS.\n// - `forced`: set default to `false`\n// - `supported`: set value\nconst normalizeSignal = function({\n name,\n number: defaultNumber,\n description,\n action,\n forced = false,\n standard,\n}) {\n const {\n signals: { [name]: constantSignal },\n } = constants\n const supported = constantSignal !== undefined\n const number = supported ? constantSignal : defaultNumber\n return { name, number, description, supported, action, forced, standard }\n}\n"],"file":"src/signals.js"}
|
||||
64
node_modules/@dotenvx/dotenvx/node_modules/human-signals/package.json
generated
vendored
Normal file
64
node_modules/@dotenvx/dotenvx/node_modules/human-signals/package.json
generated
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"name": "human-signals",
|
||||
"version": "2.1.0",
|
||||
"main": "build/src/main.js",
|
||||
"files": [
|
||||
"build/src",
|
||||
"!~"
|
||||
],
|
||||
"scripts": {
|
||||
"test": "gulp test"
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-push": "gulp check --full"
|
||||
}
|
||||
},
|
||||
"description": "Human-friendly process signals",
|
||||
"keywords": [
|
||||
"signal",
|
||||
"signals",
|
||||
"handlers",
|
||||
"error-handling",
|
||||
"errors",
|
||||
"interrupts",
|
||||
"sigterm",
|
||||
"sigint",
|
||||
"irq",
|
||||
"process",
|
||||
"exit",
|
||||
"exit-code",
|
||||
"status",
|
||||
"operating-system",
|
||||
"es6",
|
||||
"javascript",
|
||||
"linux",
|
||||
"macos",
|
||||
"windows",
|
||||
"nodejs"
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"homepage": "https://git.io/JeluP",
|
||||
"repository": "ehmicky/human-signals",
|
||||
"bugs": {
|
||||
"url": "https://github.com/ehmicky/human-signals/issues"
|
||||
},
|
||||
"author": "ehmicky <ehmicky@gmail.com> (https://github.com/ehmicky)",
|
||||
"directories": {
|
||||
"lib": "src",
|
||||
"test": "test"
|
||||
},
|
||||
"types": "build/src/main.d.ts",
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"@ehmicky/dev-tasks": "^0.31.9",
|
||||
"ajv": "^6.12.0",
|
||||
"ava": "^3.5.0",
|
||||
"gulp": "^4.0.2",
|
||||
"husky": "^4.2.3",
|
||||
"test-each": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.17.0"
|
||||
}
|
||||
}
|
||||
79
node_modules/@dotenvx/dotenvx/node_modules/is-stream/index.d.ts
generated
vendored
Normal file
79
node_modules/@dotenvx/dotenvx/node_modules/is-stream/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
import * as stream from 'stream';
|
||||
|
||||
declare const isStream: {
|
||||
/**
|
||||
@returns Whether `stream` is a [`Stream`](https://nodejs.org/api/stream.html#stream_stream).
|
||||
|
||||
@example
|
||||
```
|
||||
import * as fs from 'fs';
|
||||
import isStream = require('is-stream');
|
||||
|
||||
isStream(fs.createReadStream('unicorn.png'));
|
||||
//=> true
|
||||
|
||||
isStream({});
|
||||
//=> false
|
||||
```
|
||||
*/
|
||||
(stream: unknown): stream is stream.Stream;
|
||||
|
||||
/**
|
||||
@returns Whether `stream` is a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable).
|
||||
|
||||
@example
|
||||
```
|
||||
import * as fs from 'fs';
|
||||
import isStream = require('is-stream');
|
||||
|
||||
isStream.writable(fs.createWriteStrem('unicorn.txt'));
|
||||
//=> true
|
||||
```
|
||||
*/
|
||||
writable(stream: unknown): stream is stream.Writable;
|
||||
|
||||
/**
|
||||
@returns Whether `stream` is a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable).
|
||||
|
||||
@example
|
||||
```
|
||||
import * as fs from 'fs';
|
||||
import isStream = require('is-stream');
|
||||
|
||||
isStream.readable(fs.createReadStream('unicorn.png'));
|
||||
//=> true
|
||||
```
|
||||
*/
|
||||
readable(stream: unknown): stream is stream.Readable;
|
||||
|
||||
/**
|
||||
@returns Whether `stream` is a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex).
|
||||
|
||||
@example
|
||||
```
|
||||
import {Duplex} from 'stream';
|
||||
import isStream = require('is-stream');
|
||||
|
||||
isStream.duplex(new Duplex());
|
||||
//=> true
|
||||
```
|
||||
*/
|
||||
duplex(stream: unknown): stream is stream.Duplex;
|
||||
|
||||
/**
|
||||
@returns Whether `stream` is a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform).
|
||||
|
||||
@example
|
||||
```
|
||||
import * as fs from 'fs';
|
||||
import Stringify = require('streaming-json-stringify');
|
||||
import isStream = require('is-stream');
|
||||
|
||||
isStream.transform(Stringify());
|
||||
//=> true
|
||||
```
|
||||
*/
|
||||
transform(input: unknown): input is stream.Transform;
|
||||
};
|
||||
|
||||
export = isStream;
|
||||
28
node_modules/@dotenvx/dotenvx/node_modules/is-stream/index.js
generated
vendored
Normal file
28
node_modules/@dotenvx/dotenvx/node_modules/is-stream/index.js
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
'use strict';
|
||||
|
||||
const isStream = stream =>
|
||||
stream !== null &&
|
||||
typeof stream === 'object' &&
|
||||
typeof stream.pipe === 'function';
|
||||
|
||||
isStream.writable = stream =>
|
||||
isStream(stream) &&
|
||||
stream.writable !== false &&
|
||||
typeof stream._write === 'function' &&
|
||||
typeof stream._writableState === 'object';
|
||||
|
||||
isStream.readable = stream =>
|
||||
isStream(stream) &&
|
||||
stream.readable !== false &&
|
||||
typeof stream._read === 'function' &&
|
||||
typeof stream._readableState === 'object';
|
||||
|
||||
isStream.duplex = stream =>
|
||||
isStream.writable(stream) &&
|
||||
isStream.readable(stream);
|
||||
|
||||
isStream.transform = stream =>
|
||||
isStream.duplex(stream) &&
|
||||
typeof stream._transform === 'function';
|
||||
|
||||
module.exports = isStream;
|
||||
9
node_modules/@dotenvx/dotenvx/node_modules/is-stream/license
generated
vendored
Normal file
9
node_modules/@dotenvx/dotenvx/node_modules/is-stream/license
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
42
node_modules/@dotenvx/dotenvx/node_modules/is-stream/package.json
generated
vendored
Normal file
42
node_modules/@dotenvx/dotenvx/node_modules/is-stream/package.json
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "is-stream",
|
||||
"version": "2.0.1",
|
||||
"description": "Check if something is a Node.js stream",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/is-stream",
|
||||
"funding": "https://github.com/sponsors/sindresorhus",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "https://sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && ava && tsd"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts"
|
||||
],
|
||||
"keywords": [
|
||||
"stream",
|
||||
"type",
|
||||
"streams",
|
||||
"writable",
|
||||
"readable",
|
||||
"duplex",
|
||||
"transform",
|
||||
"check",
|
||||
"detect",
|
||||
"is"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@types/node": "^11.13.6",
|
||||
"ava": "^1.4.1",
|
||||
"tempy": "^0.3.0",
|
||||
"tsd": "^0.7.2",
|
||||
"xo": "^0.24.0"
|
||||
}
|
||||
}
|
||||
60
node_modules/@dotenvx/dotenvx/node_modules/is-stream/readme.md
generated
vendored
Normal file
60
node_modules/@dotenvx/dotenvx/node_modules/is-stream/readme.md
generated
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
# is-stream
|
||||
|
||||
> Check if something is a [Node.js stream](https://nodejs.org/api/stream.html)
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install is-stream
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const fs = require('fs');
|
||||
const isStream = require('is-stream');
|
||||
|
||||
isStream(fs.createReadStream('unicorn.png'));
|
||||
//=> true
|
||||
|
||||
isStream({});
|
||||
//=> false
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### isStream(stream)
|
||||
|
||||
Returns a `boolean` for whether it's a [`Stream`](https://nodejs.org/api/stream.html#stream_stream).
|
||||
|
||||
#### isStream.writable(stream)
|
||||
|
||||
Returns a `boolean` for whether it's a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable).
|
||||
|
||||
#### isStream.readable(stream)
|
||||
|
||||
Returns a `boolean` for whether it's a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable).
|
||||
|
||||
#### isStream.duplex(stream)
|
||||
|
||||
Returns a `boolean` for whether it's a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex).
|
||||
|
||||
#### isStream.transform(stream)
|
||||
|
||||
Returns a `boolean` for whether it's a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform).
|
||||
|
||||
## Related
|
||||
|
||||
- [is-file-stream](https://github.com/jamestalmage/is-file-stream) - Detect if a stream is a file stream
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<b>
|
||||
<a href="https://tidelift.com/subscription/pkg/npm-is-stream?utm_source=npm-is-stream&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
|
||||
</b>
|
||||
<br>
|
||||
<sub>
|
||||
Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
|
||||
</sub>
|
||||
</div>
|
||||
89
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/index.d.ts
generated
vendored
Normal file
89
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
declare namespace npmRunPath {
|
||||
interface RunPathOptions {
|
||||
/**
|
||||
Working directory.
|
||||
|
||||
@default process.cwd()
|
||||
*/
|
||||
readonly cwd?: string;
|
||||
|
||||
/**
|
||||
PATH to be appended. Default: [`PATH`](https://github.com/sindresorhus/path-key).
|
||||
|
||||
Set it to an empty string to exclude the default PATH.
|
||||
*/
|
||||
readonly path?: string;
|
||||
|
||||
/**
|
||||
Path to the Node.js executable to use in child processes if that is different from the current one. Its directory is pushed to the front of PATH.
|
||||
|
||||
This can be either an absolute path or a path relative to the `cwd` option.
|
||||
|
||||
@default process.execPath
|
||||
*/
|
||||
readonly execPath?: string;
|
||||
}
|
||||
|
||||
interface ProcessEnv {
|
||||
[key: string]: string | undefined;
|
||||
}
|
||||
|
||||
interface EnvOptions {
|
||||
/**
|
||||
Working directory.
|
||||
|
||||
@default process.cwd()
|
||||
*/
|
||||
readonly cwd?: string;
|
||||
|
||||
/**
|
||||
Accepts an object of environment variables, like `process.env`, and modifies the PATH using the correct [PATH key](https://github.com/sindresorhus/path-key). Use this if you're modifying the PATH for use in the `child_process` options.
|
||||
*/
|
||||
readonly env?: ProcessEnv;
|
||||
|
||||
/**
|
||||
Path to the current Node.js executable. Its directory is pushed to the front of PATH.
|
||||
|
||||
This can be either an absolute path or a path relative to the `cwd` option.
|
||||
|
||||
@default process.execPath
|
||||
*/
|
||||
readonly execPath?: string;
|
||||
}
|
||||
}
|
||||
|
||||
declare const npmRunPath: {
|
||||
/**
|
||||
Get your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) prepended with locally installed binaries.
|
||||
|
||||
@returns The augmented path string.
|
||||
|
||||
@example
|
||||
```
|
||||
import * as childProcess from 'child_process';
|
||||
import npmRunPath = require('npm-run-path');
|
||||
|
||||
console.log(process.env.PATH);
|
||||
//=> '/usr/local/bin'
|
||||
|
||||
console.log(npmRunPath());
|
||||
//=> '/Users/sindresorhus/dev/foo/node_modules/.bin:/Users/sindresorhus/dev/node_modules/.bin:/Users/sindresorhus/node_modules/.bin:/Users/node_modules/.bin:/node_modules/.bin:/usr/local/bin'
|
||||
|
||||
// `foo` is a locally installed binary
|
||||
childProcess.execFileSync('foo', {
|
||||
env: npmRunPath.env()
|
||||
});
|
||||
```
|
||||
*/
|
||||
(options?: npmRunPath.RunPathOptions): string;
|
||||
|
||||
/**
|
||||
@returns The augmented [`process.env`](https://nodejs.org/api/process.html#process_process_env) object.
|
||||
*/
|
||||
env(options?: npmRunPath.EnvOptions): npmRunPath.ProcessEnv;
|
||||
|
||||
// TODO: Remove this for the next major release
|
||||
default: typeof npmRunPath;
|
||||
};
|
||||
|
||||
export = npmRunPath;
|
||||
47
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/index.js
generated
vendored
Normal file
47
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/index.js
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
'use strict';
|
||||
const path = require('path');
|
||||
const pathKey = require('path-key');
|
||||
|
||||
const npmRunPath = options => {
|
||||
options = {
|
||||
cwd: process.cwd(),
|
||||
path: process.env[pathKey()],
|
||||
execPath: process.execPath,
|
||||
...options
|
||||
};
|
||||
|
||||
let previous;
|
||||
let cwdPath = path.resolve(options.cwd);
|
||||
const result = [];
|
||||
|
||||
while (previous !== cwdPath) {
|
||||
result.push(path.join(cwdPath, 'node_modules/.bin'));
|
||||
previous = cwdPath;
|
||||
cwdPath = path.resolve(cwdPath, '..');
|
||||
}
|
||||
|
||||
// Ensure the running `node` binary is used
|
||||
const execPathDir = path.resolve(options.cwd, options.execPath, '..');
|
||||
result.push(execPathDir);
|
||||
|
||||
return result.concat(options.path).join(path.delimiter);
|
||||
};
|
||||
|
||||
module.exports = npmRunPath;
|
||||
// TODO: Remove this for the next major release
|
||||
module.exports.default = npmRunPath;
|
||||
|
||||
module.exports.env = options => {
|
||||
options = {
|
||||
env: process.env,
|
||||
...options
|
||||
};
|
||||
|
||||
const env = {...options.env};
|
||||
const path = pathKey({env});
|
||||
|
||||
options.path = env[path];
|
||||
env[path] = module.exports(options);
|
||||
|
||||
return env;
|
||||
};
|
||||
9
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/license
generated
vendored
Normal file
9
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/license
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
44
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/package.json
generated
vendored
Normal file
44
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/package.json
generated
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "npm-run-path",
|
||||
"version": "4.0.1",
|
||||
"description": "Get your PATH prepended with locally installed binaries",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/npm-run-path",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && ava && tsd"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts"
|
||||
],
|
||||
"keywords": [
|
||||
"npm",
|
||||
"run",
|
||||
"path",
|
||||
"package",
|
||||
"bin",
|
||||
"binary",
|
||||
"binaries",
|
||||
"script",
|
||||
"cli",
|
||||
"command-line",
|
||||
"execute",
|
||||
"executable"
|
||||
],
|
||||
"dependencies": {
|
||||
"path-key": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ava": "^1.4.1",
|
||||
"tsd": "^0.7.2",
|
||||
"xo": "^0.24.0"
|
||||
}
|
||||
}
|
||||
115
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/readme.md
generated
vendored
Normal file
115
node_modules/@dotenvx/dotenvx/node_modules/npm-run-path/readme.md
generated
vendored
Normal file
@@ -0,0 +1,115 @@
|
||||
# npm-run-path [](https://travis-ci.org/sindresorhus/npm-run-path)
|
||||
|
||||
> Get your [PATH](https://en.wikipedia.org/wiki/PATH_(variable)) prepended with locally installed binaries
|
||||
|
||||
In [npm run scripts](https://docs.npmjs.com/cli/run-script) you can execute locally installed binaries by name. This enables the same outside npm.
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install npm-run-path
|
||||
```
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const childProcess = require('child_process');
|
||||
const npmRunPath = require('npm-run-path');
|
||||
|
||||
console.log(process.env.PATH);
|
||||
//=> '/usr/local/bin'
|
||||
|
||||
console.log(npmRunPath());
|
||||
//=> '/Users/sindresorhus/dev/foo/node_modules/.bin:/Users/sindresorhus/dev/node_modules/.bin:/Users/sindresorhus/node_modules/.bin:/Users/node_modules/.bin:/node_modules/.bin:/usr/local/bin'
|
||||
|
||||
// `foo` is a locally installed binary
|
||||
childProcess.execFileSync('foo', {
|
||||
env: npmRunPath.env()
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
## API
|
||||
|
||||
### npmRunPath(options?)
|
||||
|
||||
Returns the augmented path string.
|
||||
|
||||
#### options
|
||||
|
||||
Type: `object`
|
||||
|
||||
##### cwd
|
||||
|
||||
Type: `string`<br>
|
||||
Default: `process.cwd()`
|
||||
|
||||
Working directory.
|
||||
|
||||
##### path
|
||||
|
||||
Type: `string`<br>
|
||||
Default: [`PATH`](https://github.com/sindresorhus/path-key)
|
||||
|
||||
PATH to be appended.<br>
|
||||
Set it to an empty string to exclude the default PATH.
|
||||
|
||||
##### execPath
|
||||
|
||||
Type: `string`<br>
|
||||
Default: `process.execPath`
|
||||
|
||||
Path to the current Node.js executable. Its directory is pushed to the front of PATH.
|
||||
|
||||
This can be either an absolute path or a path relative to the [`cwd` option](#cwd).
|
||||
|
||||
### npmRunPath.env(options?)
|
||||
|
||||
Returns the augmented [`process.env`](https://nodejs.org/api/process.html#process_process_env) object.
|
||||
|
||||
#### options
|
||||
|
||||
Type: `object`
|
||||
|
||||
##### cwd
|
||||
|
||||
Type: `string`<br>
|
||||
Default: `process.cwd()`
|
||||
|
||||
Working directory.
|
||||
|
||||
##### env
|
||||
|
||||
Type: `Object`
|
||||
|
||||
Accepts an object of environment variables, like `process.env`, and modifies the PATH using the correct [PATH key](https://github.com/sindresorhus/path-key). Use this if you're modifying the PATH for use in the `child_process` options.
|
||||
|
||||
##### execPath
|
||||
|
||||
Type: `string`<br>
|
||||
Default: `process.execPath`
|
||||
|
||||
Path to the Node.js executable to use in child processes if that is different from the current one. Its directory is pushed to the front of PATH.
|
||||
|
||||
This can be either an absolute path or a path relative to the [`cwd` option](#cwd).
|
||||
|
||||
|
||||
## Related
|
||||
|
||||
- [npm-run-path-cli](https://github.com/sindresorhus/npm-run-path-cli) - CLI for this module
|
||||
- [execa](https://github.com/sindresorhus/execa) - Execute a locally installed binary
|
||||
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
<b>
|
||||
<a href="https://tidelift.com/subscription/pkg/npm-npm-run-path?utm_source=npm-npm-run-path&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
|
||||
</b>
|
||||
<br>
|
||||
<sub>
|
||||
Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
|
||||
</sub>
|
||||
</div>
|
||||
64
node_modules/@dotenvx/dotenvx/node_modules/onetime/index.d.ts
generated
vendored
Normal file
64
node_modules/@dotenvx/dotenvx/node_modules/onetime/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
declare namespace onetime {
|
||||
interface Options {
|
||||
/**
|
||||
Throw an error when called more than once.
|
||||
|
||||
@default false
|
||||
*/
|
||||
throw?: boolean;
|
||||
}
|
||||
}
|
||||
|
||||
declare const onetime: {
|
||||
/**
|
||||
Ensure a function is only called once. When called multiple times it will return the return value from the first call.
|
||||
|
||||
@param fn - Function that should only be called once.
|
||||
@returns A function that only calls `fn` once.
|
||||
|
||||
@example
|
||||
```
|
||||
import onetime = require('onetime');
|
||||
|
||||
let i = 0;
|
||||
|
||||
const foo = onetime(() => ++i);
|
||||
|
||||
foo(); //=> 1
|
||||
foo(); //=> 1
|
||||
foo(); //=> 1
|
||||
|
||||
onetime.callCount(foo); //=> 3
|
||||
```
|
||||
*/
|
||||
<ArgumentsType extends unknown[], ReturnType>(
|
||||
fn: (...arguments: ArgumentsType) => ReturnType,
|
||||
options?: onetime.Options
|
||||
): (...arguments: ArgumentsType) => ReturnType;
|
||||
|
||||
/**
|
||||
Get the number of times `fn` has been called.
|
||||
|
||||
@param fn - Function to get call count from.
|
||||
@returns A number representing how many times `fn` has been called.
|
||||
|
||||
@example
|
||||
```
|
||||
import onetime = require('onetime');
|
||||
|
||||
const foo = onetime(() => {});
|
||||
foo();
|
||||
foo();
|
||||
foo();
|
||||
|
||||
console.log(onetime.callCount(foo));
|
||||
//=> 3
|
||||
```
|
||||
*/
|
||||
callCount(fn: (...arguments: any[]) => unknown): number;
|
||||
|
||||
// TODO: Remove this for the next major release
|
||||
default: typeof onetime;
|
||||
};
|
||||
|
||||
export = onetime;
|
||||
44
node_modules/@dotenvx/dotenvx/node_modules/onetime/index.js
generated
vendored
Normal file
44
node_modules/@dotenvx/dotenvx/node_modules/onetime/index.js
generated
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
'use strict';
|
||||
const mimicFn = require('mimic-fn');
|
||||
|
||||
const calledFunctions = new WeakMap();
|
||||
|
||||
const onetime = (function_, options = {}) => {
|
||||
if (typeof function_ !== 'function') {
|
||||
throw new TypeError('Expected a function');
|
||||
}
|
||||
|
||||
let returnValue;
|
||||
let callCount = 0;
|
||||
const functionName = function_.displayName || function_.name || '<anonymous>';
|
||||
|
||||
const onetime = function (...arguments_) {
|
||||
calledFunctions.set(onetime, ++callCount);
|
||||
|
||||
if (callCount === 1) {
|
||||
returnValue = function_.apply(this, arguments_);
|
||||
function_ = null;
|
||||
} else if (options.throw === true) {
|
||||
throw new Error(`Function \`${functionName}\` can only be called once`);
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
};
|
||||
|
||||
mimicFn(onetime, function_);
|
||||
calledFunctions.set(onetime, callCount);
|
||||
|
||||
return onetime;
|
||||
};
|
||||
|
||||
module.exports = onetime;
|
||||
// TODO: Remove this for the next major release
|
||||
module.exports.default = onetime;
|
||||
|
||||
module.exports.callCount = function_ => {
|
||||
if (!calledFunctions.has(function_)) {
|
||||
throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`);
|
||||
}
|
||||
|
||||
return calledFunctions.get(function_);
|
||||
};
|
||||
9
node_modules/@dotenvx/dotenvx/node_modules/onetime/license
generated
vendored
Normal file
9
node_modules/@dotenvx/dotenvx/node_modules/onetime/license
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
43
node_modules/@dotenvx/dotenvx/node_modules/onetime/package.json
generated
vendored
Normal file
43
node_modules/@dotenvx/dotenvx/node_modules/onetime/package.json
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "onetime",
|
||||
"version": "5.1.2",
|
||||
"description": "Ensure a function is only called once",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/onetime",
|
||||
"funding": "https://github.com/sponsors/sindresorhus",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "https://sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && ava && tsd"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts"
|
||||
],
|
||||
"keywords": [
|
||||
"once",
|
||||
"function",
|
||||
"one",
|
||||
"onetime",
|
||||
"func",
|
||||
"fn",
|
||||
"single",
|
||||
"call",
|
||||
"called",
|
||||
"prevent"
|
||||
],
|
||||
"dependencies": {
|
||||
"mimic-fn": "^2.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ava": "^1.4.1",
|
||||
"tsd": "^0.7.1",
|
||||
"xo": "^0.24.0"
|
||||
}
|
||||
}
|
||||
94
node_modules/@dotenvx/dotenvx/node_modules/onetime/readme.md
generated
vendored
Normal file
94
node_modules/@dotenvx/dotenvx/node_modules/onetime/readme.md
generated
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
# onetime [](https://travis-ci.com/github/sindresorhus/onetime)
|
||||
|
||||
> Ensure a function is only called once
|
||||
|
||||
When called multiple times it will return the return value from the first call.
|
||||
|
||||
*Unlike the module [once](https://github.com/isaacs/once), this one isn't naughty and extending `Function.prototype`.*
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install onetime
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const onetime = require('onetime');
|
||||
|
||||
let i = 0;
|
||||
|
||||
const foo = onetime(() => ++i);
|
||||
|
||||
foo(); //=> 1
|
||||
foo(); //=> 1
|
||||
foo(); //=> 1
|
||||
|
||||
onetime.callCount(foo); //=> 3
|
||||
```
|
||||
|
||||
```js
|
||||
const onetime = require('onetime');
|
||||
|
||||
const foo = onetime(() => {}, {throw: true});
|
||||
|
||||
foo();
|
||||
|
||||
foo();
|
||||
//=> Error: Function `foo` can only be called once
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
### onetime(fn, options?)
|
||||
|
||||
Returns a function that only calls `fn` once.
|
||||
|
||||
#### fn
|
||||
|
||||
Type: `Function`
|
||||
|
||||
Function that should only be called once.
|
||||
|
||||
#### options
|
||||
|
||||
Type: `object`
|
||||
|
||||
##### throw
|
||||
|
||||
Type: `boolean`\
|
||||
Default: `false`
|
||||
|
||||
Throw an error when called more than once.
|
||||
|
||||
### onetime.callCount(fn)
|
||||
|
||||
Returns a number representing how many times `fn` has been called.
|
||||
|
||||
Note: It throws an error if you pass in a function that is not wrapped by `onetime`.
|
||||
|
||||
```js
|
||||
const onetime = require('onetime');
|
||||
|
||||
const foo = onetime(() => {});
|
||||
|
||||
foo();
|
||||
foo();
|
||||
foo();
|
||||
|
||||
console.log(onetime.callCount(foo));
|
||||
//=> 3
|
||||
```
|
||||
|
||||
#### fn
|
||||
|
||||
Type: `Function`
|
||||
|
||||
Function to get call count from.
|
||||
|
||||
## onetime for enterprise
|
||||
|
||||
Available as part of the Tidelift Subscription.
|
||||
|
||||
The maintainers of onetime and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-onetime?utm_source=npm-onetime&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
|
||||
16
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/LICENSE.txt
generated
vendored
Normal file
16
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/LICENSE.txt
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
The ISC License
|
||||
|
||||
Copyright (c) 2015, Contributors
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software
|
||||
for any purpose with or without fee is hereby granted, provided
|
||||
that the above copyright notice and this permission notice
|
||||
appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
|
||||
LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
|
||||
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
||||
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
39
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/README.md
generated
vendored
Normal file
39
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/README.md
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
# signal-exit
|
||||
|
||||
[](https://travis-ci.org/tapjs/signal-exit)
|
||||
[](https://coveralls.io/r/tapjs/signal-exit?branch=master)
|
||||
[](https://www.npmjs.com/package/signal-exit)
|
||||
[](https://github.com/conventional-changelog/standard-version)
|
||||
|
||||
When you want to fire an event no matter how a process exits:
|
||||
|
||||
* reaching the end of execution.
|
||||
* explicitly having `process.exit(code)` called.
|
||||
* having `process.kill(pid, sig)` called.
|
||||
* receiving a fatal signal from outside the process
|
||||
|
||||
Use `signal-exit`.
|
||||
|
||||
```js
|
||||
var onExit = require('signal-exit')
|
||||
|
||||
onExit(function (code, signal) {
|
||||
console.log('process exited!')
|
||||
})
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
`var remove = onExit(function (code, signal) {}, options)`
|
||||
|
||||
The return value of the function is a function that will remove the
|
||||
handler.
|
||||
|
||||
Note that the function *only* fires for signals if the signal would
|
||||
cause the process to exit. That is, there are no other listeners, and
|
||||
it is a fatal signal.
|
||||
|
||||
## Options
|
||||
|
||||
* `alwaysLast`: Run this handler after any other signal or exit
|
||||
handlers. This causes `process.emit` to be monkeypatched.
|
||||
202
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/index.js
generated
vendored
Normal file
202
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/index.js
generated
vendored
Normal file
@@ -0,0 +1,202 @@
|
||||
// Note: since nyc uses this module to output coverage, any lines
|
||||
// that are in the direct sync flow of nyc's outputCoverage are
|
||||
// ignored, since we can never get coverage for them.
|
||||
// grab a reference to node's real process object right away
|
||||
var process = global.process
|
||||
|
||||
const processOk = function (process) {
|
||||
return process &&
|
||||
typeof process === 'object' &&
|
||||
typeof process.removeListener === 'function' &&
|
||||
typeof process.emit === 'function' &&
|
||||
typeof process.reallyExit === 'function' &&
|
||||
typeof process.listeners === 'function' &&
|
||||
typeof process.kill === 'function' &&
|
||||
typeof process.pid === 'number' &&
|
||||
typeof process.on === 'function'
|
||||
}
|
||||
|
||||
// some kind of non-node environment, just no-op
|
||||
/* istanbul ignore if */
|
||||
if (!processOk(process)) {
|
||||
module.exports = function () {
|
||||
return function () {}
|
||||
}
|
||||
} else {
|
||||
var assert = require('assert')
|
||||
var signals = require('./signals.js')
|
||||
var isWin = /^win/i.test(process.platform)
|
||||
|
||||
var EE = require('events')
|
||||
/* istanbul ignore if */
|
||||
if (typeof EE !== 'function') {
|
||||
EE = EE.EventEmitter
|
||||
}
|
||||
|
||||
var emitter
|
||||
if (process.__signal_exit_emitter__) {
|
||||
emitter = process.__signal_exit_emitter__
|
||||
} else {
|
||||
emitter = process.__signal_exit_emitter__ = new EE()
|
||||
emitter.count = 0
|
||||
emitter.emitted = {}
|
||||
}
|
||||
|
||||
// Because this emitter is a global, we have to check to see if a
|
||||
// previous version of this library failed to enable infinite listeners.
|
||||
// I know what you're about to say. But literally everything about
|
||||
// signal-exit is a compromise with evil. Get used to it.
|
||||
if (!emitter.infinite) {
|
||||
emitter.setMaxListeners(Infinity)
|
||||
emitter.infinite = true
|
||||
}
|
||||
|
||||
module.exports = function (cb, opts) {
|
||||
/* istanbul ignore if */
|
||||
if (!processOk(global.process)) {
|
||||
return function () {}
|
||||
}
|
||||
assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')
|
||||
|
||||
if (loaded === false) {
|
||||
load()
|
||||
}
|
||||
|
||||
var ev = 'exit'
|
||||
if (opts && opts.alwaysLast) {
|
||||
ev = 'afterexit'
|
||||
}
|
||||
|
||||
var remove = function () {
|
||||
emitter.removeListener(ev, cb)
|
||||
if (emitter.listeners('exit').length === 0 &&
|
||||
emitter.listeners('afterexit').length === 0) {
|
||||
unload()
|
||||
}
|
||||
}
|
||||
emitter.on(ev, cb)
|
||||
|
||||
return remove
|
||||
}
|
||||
|
||||
var unload = function unload () {
|
||||
if (!loaded || !processOk(global.process)) {
|
||||
return
|
||||
}
|
||||
loaded = false
|
||||
|
||||
signals.forEach(function (sig) {
|
||||
try {
|
||||
process.removeListener(sig, sigListeners[sig])
|
||||
} catch (er) {}
|
||||
})
|
||||
process.emit = originalProcessEmit
|
||||
process.reallyExit = originalProcessReallyExit
|
||||
emitter.count -= 1
|
||||
}
|
||||
module.exports.unload = unload
|
||||
|
||||
var emit = function emit (event, code, signal) {
|
||||
/* istanbul ignore if */
|
||||
if (emitter.emitted[event]) {
|
||||
return
|
||||
}
|
||||
emitter.emitted[event] = true
|
||||
emitter.emit(event, code, signal)
|
||||
}
|
||||
|
||||
// { <signal>: <listener fn>, ... }
|
||||
var sigListeners = {}
|
||||
signals.forEach(function (sig) {
|
||||
sigListeners[sig] = function listener () {
|
||||
/* istanbul ignore if */
|
||||
if (!processOk(global.process)) {
|
||||
return
|
||||
}
|
||||
// If there are no other listeners, an exit is coming!
|
||||
// Simplest way: remove us and then re-send the signal.
|
||||
// We know that this will kill the process, so we can
|
||||
// safely emit now.
|
||||
var listeners = process.listeners(sig)
|
||||
if (listeners.length === emitter.count) {
|
||||
unload()
|
||||
emit('exit', null, sig)
|
||||
/* istanbul ignore next */
|
||||
emit('afterexit', null, sig)
|
||||
/* istanbul ignore next */
|
||||
if (isWin && sig === 'SIGHUP') {
|
||||
// "SIGHUP" throws an `ENOSYS` error on Windows,
|
||||
// so use a supported signal instead
|
||||
sig = 'SIGINT'
|
||||
}
|
||||
/* istanbul ignore next */
|
||||
process.kill(process.pid, sig)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
module.exports.signals = function () {
|
||||
return signals
|
||||
}
|
||||
|
||||
var loaded = false
|
||||
|
||||
var load = function load () {
|
||||
if (loaded || !processOk(global.process)) {
|
||||
return
|
||||
}
|
||||
loaded = true
|
||||
|
||||
// This is the number of onSignalExit's that are in play.
|
||||
// It's important so that we can count the correct number of
|
||||
// listeners on signals, and don't wait for the other one to
|
||||
// handle it instead of us.
|
||||
emitter.count += 1
|
||||
|
||||
signals = signals.filter(function (sig) {
|
||||
try {
|
||||
process.on(sig, sigListeners[sig])
|
||||
return true
|
||||
} catch (er) {
|
||||
return false
|
||||
}
|
||||
})
|
||||
|
||||
process.emit = processEmit
|
||||
process.reallyExit = processReallyExit
|
||||
}
|
||||
module.exports.load = load
|
||||
|
||||
var originalProcessReallyExit = process.reallyExit
|
||||
var processReallyExit = function processReallyExit (code) {
|
||||
/* istanbul ignore if */
|
||||
if (!processOk(global.process)) {
|
||||
return
|
||||
}
|
||||
process.exitCode = code || /* istanbul ignore next */ 0
|
||||
emit('exit', process.exitCode, null)
|
||||
/* istanbul ignore next */
|
||||
emit('afterexit', process.exitCode, null)
|
||||
/* istanbul ignore next */
|
||||
originalProcessReallyExit.call(process, process.exitCode)
|
||||
}
|
||||
|
||||
var originalProcessEmit = process.emit
|
||||
var processEmit = function processEmit (ev, arg) {
|
||||
if (ev === 'exit' && processOk(global.process)) {
|
||||
/* istanbul ignore else */
|
||||
if (arg !== undefined) {
|
||||
process.exitCode = arg
|
||||
}
|
||||
var ret = originalProcessEmit.apply(this, arguments)
|
||||
/* istanbul ignore next */
|
||||
emit('exit', process.exitCode, null)
|
||||
/* istanbul ignore next */
|
||||
emit('afterexit', process.exitCode, null)
|
||||
/* istanbul ignore next */
|
||||
return ret
|
||||
} else {
|
||||
return originalProcessEmit.apply(this, arguments)
|
||||
}
|
||||
}
|
||||
}
|
||||
38
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/package.json
generated
vendored
Normal file
38
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/package.json
generated
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"name": "signal-exit",
|
||||
"version": "3.0.7",
|
||||
"description": "when you want to fire an event no matter how a process exits.",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "tap",
|
||||
"snap": "tap",
|
||||
"preversion": "npm test",
|
||||
"postversion": "npm publish",
|
||||
"prepublishOnly": "git push origin --follow-tags"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"signals.js"
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/tapjs/signal-exit.git"
|
||||
},
|
||||
"keywords": [
|
||||
"signal",
|
||||
"exit"
|
||||
],
|
||||
"author": "Ben Coe <ben@npmjs.com>",
|
||||
"license": "ISC",
|
||||
"bugs": {
|
||||
"url": "https://github.com/tapjs/signal-exit/issues"
|
||||
},
|
||||
"homepage": "https://github.com/tapjs/signal-exit",
|
||||
"devDependencies": {
|
||||
"chai": "^3.5.0",
|
||||
"coveralls": "^3.1.1",
|
||||
"nyc": "^15.1.0",
|
||||
"standard-version": "^9.3.1",
|
||||
"tap": "^15.1.1"
|
||||
}
|
||||
}
|
||||
53
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/signals.js
generated
vendored
Normal file
53
node_modules/@dotenvx/dotenvx/node_modules/signal-exit/signals.js
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
// This is not the set of all possible signals.
|
||||
//
|
||||
// It IS, however, the set of all signals that trigger
|
||||
// an exit on either Linux or BSD systems. Linux is a
|
||||
// superset of the signal names supported on BSD, and
|
||||
// the unknown signals just fail to register, so we can
|
||||
// catch that easily enough.
|
||||
//
|
||||
// Don't bother with SIGKILL. It's uncatchable, which
|
||||
// means that we can't fire any callbacks anyway.
|
||||
//
|
||||
// If a user does happen to register a handler on a non-
|
||||
// fatal signal like SIGWINCH or something, and then
|
||||
// exit, it'll end up firing `process.emit('exit')`, so
|
||||
// the handler will be fired anyway.
|
||||
//
|
||||
// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised
|
||||
// artificially, inherently leave the process in a
|
||||
// state from which it is not safe to try and enter JS
|
||||
// listeners.
|
||||
module.exports = [
|
||||
'SIGABRT',
|
||||
'SIGALRM',
|
||||
'SIGHUP',
|
||||
'SIGINT',
|
||||
'SIGTERM'
|
||||
]
|
||||
|
||||
if (process.platform !== 'win32') {
|
||||
module.exports.push(
|
||||
'SIGVTALRM',
|
||||
'SIGXCPU',
|
||||
'SIGXFSZ',
|
||||
'SIGUSR2',
|
||||
'SIGTRAP',
|
||||
'SIGSYS',
|
||||
'SIGQUIT',
|
||||
'SIGIOT'
|
||||
// should detect profiler and enable/disable accordingly.
|
||||
// see #21
|
||||
// 'SIGPROF'
|
||||
)
|
||||
}
|
||||
|
||||
if (process.platform === 'linux') {
|
||||
module.exports.push(
|
||||
'SIGIO',
|
||||
'SIGPOLL',
|
||||
'SIGPWR',
|
||||
'SIGSTKFLT',
|
||||
'SIGUNUSED'
|
||||
)
|
||||
}
|
||||
16
node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline/index.js
generated
vendored
Normal file
16
node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline/index.js
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = input => {
|
||||
const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt();
|
||||
const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt();
|
||||
|
||||
if (input[input.length - 1] === LF) {
|
||||
input = input.slice(0, input.length - 1);
|
||||
}
|
||||
|
||||
if (input[input.length - 1] === CR) {
|
||||
input = input.slice(0, input.length - 1);
|
||||
}
|
||||
|
||||
return input;
|
||||
};
|
||||
9
node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline/license
generated
vendored
Normal file
9
node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline/license
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
40
node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline/package.json
generated
vendored
Normal file
40
node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline/package.json
generated
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "strip-final-newline",
|
||||
"version": "2.0.0",
|
||||
"description": "Strip the final newline character from a string/buffer",
|
||||
"license": "MIT",
|
||||
"repository": "sindresorhus/strip-final-newline",
|
||||
"author": {
|
||||
"name": "Sindre Sorhus",
|
||||
"email": "sindresorhus@gmail.com",
|
||||
"url": "sindresorhus.com"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && ava"
|
||||
},
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"keywords": [
|
||||
"strip",
|
||||
"trim",
|
||||
"remove",
|
||||
"delete",
|
||||
"final",
|
||||
"last",
|
||||
"end",
|
||||
"file",
|
||||
"newline",
|
||||
"linebreak",
|
||||
"character",
|
||||
"string",
|
||||
"buffer"
|
||||
],
|
||||
"devDependencies": {
|
||||
"ava": "^0.25.0",
|
||||
"xo": "^0.23.0"
|
||||
}
|
||||
}
|
||||
30
node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline/readme.md
generated
vendored
Normal file
30
node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline/readme.md
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
# strip-final-newline [](https://travis-ci.com/sindresorhus/strip-final-newline)
|
||||
|
||||
> Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from a string/buffer
|
||||
|
||||
Can be useful when parsing the output of, for example, `ChildProcess#execFile`, as [binaries usually output a newline at the end](https://stackoverflow.com/questions/729692/why-should-text-files-end-with-a-newline). Normally, you would use `stdout.trim()`, but that would also remove newlines at the start and whitespace.
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
```
|
||||
$ npm install strip-final-newline
|
||||
```
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const stripFinalNewline = require('strip-final-newline');
|
||||
|
||||
stripFinalNewline('foo\nbar\n\n');
|
||||
//=> 'foo\nbar\n'
|
||||
|
||||
stripFinalNewline(Buffer.from('foo\nbar\n\n')).toString();
|
||||
//=> 'foo\nbar\n'
|
||||
```
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT © [Sindre Sorhus](https://sindresorhus.com)
|
||||
70
node_modules/@dotenvx/dotenvx/package.json
generated
vendored
Normal file
70
node_modules/@dotenvx/dotenvx/package.json
generated
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"version": "1.57.2",
|
||||
"name": "@dotenvx/dotenvx",
|
||||
"description": "a secure dotenv–from the creator of `dotenv`",
|
||||
"author": "@motdotla",
|
||||
"keywords": [
|
||||
"dotenv",
|
||||
"env"
|
||||
],
|
||||
"homepage": "https://github.com/dotenvx/dotenvx",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/dotenvx/dotenvx.git"
|
||||
},
|
||||
"license": "BSD-3-Clause",
|
||||
"files": [
|
||||
"src/**/*",
|
||||
"CHANGELOG.md"
|
||||
],
|
||||
"main": "src/lib/main.js",
|
||||
"types": "src/lib/main.d.ts",
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./src/lib/main.d.ts",
|
||||
"require": "./src/lib/main.js",
|
||||
"default": "./src/lib/main.js"
|
||||
},
|
||||
"./config": "./src/lib/config.js",
|
||||
"./config.js": "./src/lib/config.js",
|
||||
"./package.json": "./package.json"
|
||||
},
|
||||
"bin": {
|
||||
"dotenvx": "./src/cli/dotenvx.js"
|
||||
},
|
||||
"scripts": {
|
||||
"standard": "standard",
|
||||
"standard:fix": "standard --fix",
|
||||
"test": "tap run --test-env=DOTENVX_OPS_OFF=true --allow-empty-coverage --disable-coverage --timeout=60000",
|
||||
"test-coverage": "tap run --test-env=DOTENVX_OPS_OFF=true --show-full-coverage --timeout=60000",
|
||||
"testshell": "bash shellspec",
|
||||
"prerelease": "npm test && npm run testshell",
|
||||
"release": "standard-version"
|
||||
},
|
||||
"funding": "https://dotenvx.com",
|
||||
"dependencies": {
|
||||
"commander": "^11.1.0",
|
||||
"dotenv": "^17.2.1",
|
||||
"eciesjs": "^0.4.10",
|
||||
"execa": "^5.1.1",
|
||||
"fdir": "^6.2.0",
|
||||
"ignore": "^5.3.0",
|
||||
"object-treeify": "1.1.33",
|
||||
"picomatch": "^4.0.2",
|
||||
"which": "^4.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@yao-pkg/pkg": "^5.14.2",
|
||||
"capture-console": "^1.0.2",
|
||||
"esbuild": "^0.25.8",
|
||||
"proxyquire": "^2.1.3",
|
||||
"sinon": "^14.0.1",
|
||||
"standard": "^17.1.0",
|
||||
"standard-version": "^9.5.0",
|
||||
"tap": "^21.0.1"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public",
|
||||
"provenance": true
|
||||
}
|
||||
}
|
||||
77
node_modules/@dotenvx/dotenvx/src/cli/actions/decrypt.js
generated
vendored
Normal file
77
node_modules/@dotenvx/dotenvx/src/cli/actions/decrypt.js
generated
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
const fsx = require('./../../lib/helpers/fsx')
|
||||
const { logger } = require('./../../shared/logger')
|
||||
|
||||
const Decrypt = require('./../../lib/services/decrypt')
|
||||
const catchAndLog = require('../../lib/helpers/catchAndLog')
|
||||
|
||||
function decrypt () {
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
const envs = this.envs
|
||||
const opsOn = options.opsOff !== true
|
||||
|
||||
let errorCount = 0
|
||||
|
||||
// stdout - should not have a try so that exit codes can surface to stdout
|
||||
if (options.stdout) {
|
||||
const {
|
||||
processedEnvs
|
||||
} = new Decrypt(envs, options.key, options.excludeKey, options.envKeysFile, opsOn).run()
|
||||
|
||||
for (const processedEnv of processedEnvs) {
|
||||
if (processedEnv.error) {
|
||||
errorCount += 1
|
||||
logger.error(processedEnv.error.messageWithHelp)
|
||||
} else {
|
||||
console.log(processedEnv.envSrc)
|
||||
}
|
||||
}
|
||||
|
||||
if (errorCount > 0) {
|
||||
process.exit(1)
|
||||
} else {
|
||||
process.exit(0) // exit early
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
const {
|
||||
processedEnvs,
|
||||
changedFilepaths,
|
||||
unchangedFilepaths
|
||||
} = new Decrypt(envs, options.key, options.excludeKey, options.envKeysFile, opsOn).run()
|
||||
|
||||
for (const processedEnv of processedEnvs) {
|
||||
logger.verbose(`decrypting ${processedEnv.envFilepath} (${processedEnv.filepath})`)
|
||||
|
||||
if (processedEnv.error) {
|
||||
errorCount += 1
|
||||
logger.error(processedEnv.error.messageWithHelp)
|
||||
} else if (processedEnv.changed) {
|
||||
fsx.writeFileX(processedEnv.filepath, processedEnv.envSrc)
|
||||
|
||||
logger.verbose(`decrypted ${processedEnv.envFilepath} (${processedEnv.filepath})`)
|
||||
} else {
|
||||
logger.verbose(`no changes ${processedEnv.envFilepath} (${processedEnv.filepath})`)
|
||||
}
|
||||
}
|
||||
|
||||
if (changedFilepaths.length > 0) {
|
||||
logger.success(`◇ decrypted (${changedFilepaths.join(',')})`)
|
||||
} else if (unchangedFilepaths.length > 0) {
|
||||
logger.info(`○ no changes (${unchangedFilepaths})`)
|
||||
} else {
|
||||
// do nothing - scenario when no .env files found
|
||||
}
|
||||
|
||||
if (errorCount > 0) {
|
||||
process.exit(1)
|
||||
}
|
||||
} catch (error) {
|
||||
catchAndLog(error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = decrypt
|
||||
73
node_modules/@dotenvx/dotenvx/src/cli/actions/encrypt.js
generated
vendored
Normal file
73
node_modules/@dotenvx/dotenvx/src/cli/actions/encrypt.js
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
const fsx = require('./../../lib/helpers/fsx')
|
||||
const { logger } = require('./../../shared/logger')
|
||||
|
||||
const Encrypt = require('./../../lib/services/encrypt')
|
||||
|
||||
const catchAndLog = require('../../lib/helpers/catchAndLog')
|
||||
const localDisplayPath = require('../../lib/helpers/localDisplayPath')
|
||||
|
||||
function encrypt () {
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
const envs = this.envs
|
||||
const opsOn = options.opsOff !== true
|
||||
|
||||
// stdout - should not have a try so that exit codes can surface to stdout
|
||||
if (options.stdout) {
|
||||
const {
|
||||
processedEnvs
|
||||
} = new Encrypt(envs, options.key, options.excludeKey, options.envKeysFile, opsOn).run()
|
||||
|
||||
for (const processedEnv of processedEnvs) {
|
||||
console.log(processedEnv.envSrc)
|
||||
}
|
||||
process.exit(0) // exit early
|
||||
} else {
|
||||
try {
|
||||
const {
|
||||
processedEnvs,
|
||||
changedFilepaths,
|
||||
unchangedFilepaths
|
||||
} = new Encrypt(envs, options.key, options.excludeKey, options.envKeysFile, opsOn).run()
|
||||
|
||||
for (const processedEnv of processedEnvs) {
|
||||
logger.verbose(`encrypting ${processedEnv.envFilepath} (${processedEnv.filepath})`)
|
||||
if (processedEnv.error) {
|
||||
logger.warn(processedEnv.error.messageWithHelp)
|
||||
} else if (processedEnv.changed) {
|
||||
fsx.writeFileX(processedEnv.filepath, processedEnv.envSrc)
|
||||
|
||||
logger.verbose(`encrypted ${processedEnv.envFilepath} (${processedEnv.filepath})`)
|
||||
} else {
|
||||
logger.verbose(`no changes ${processedEnv.envFilepath} (${processedEnv.filepath})`)
|
||||
}
|
||||
}
|
||||
|
||||
if (changedFilepaths.length > 0) {
|
||||
const keyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.privateKeyAdded)
|
||||
let msg = `◈ encrypted (${changedFilepaths.join(',')})`
|
||||
if (keyAddedEnv) {
|
||||
const envKeysFilepath = localDisplayPath(keyAddedEnv.envKeysFilepath)
|
||||
msg += ` + key (${envKeysFilepath})`
|
||||
}
|
||||
logger.success(msg)
|
||||
} else if (unchangedFilepaths.length > 0) {
|
||||
logger.info(`○ no changes (${unchangedFilepaths})`)
|
||||
} else {
|
||||
// do nothing - scenario when no .env files found
|
||||
}
|
||||
|
||||
for (const processedEnv of processedEnvs) {
|
||||
if (processedEnv.privateKeyAdded) {
|
||||
// intentionally quiet: success line already communicates key creation
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
catchAndLog(error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = encrypt
|
||||
36
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/genexample.js
generated
vendored
Normal file
36
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/genexample.js
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
const fsx = require('./../../../lib/helpers/fsx')
|
||||
const path = require('path')
|
||||
const main = require('./../../../lib/main')
|
||||
const { logger } = require('./../../../shared/logger')
|
||||
const catchAndLog = require('./../../../lib/helpers/catchAndLog')
|
||||
|
||||
function genexample (directory) {
|
||||
logger.debug(`directory: ${directory}`)
|
||||
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
try {
|
||||
const {
|
||||
envExampleFile,
|
||||
envFile,
|
||||
exampleFilepath,
|
||||
addedKeys
|
||||
} = main.genexample(directory, options.envFile)
|
||||
|
||||
logger.verbose(`loading env from ${envFile}`)
|
||||
|
||||
fsx.writeFileX(exampleFilepath, envExampleFile)
|
||||
|
||||
if (addedKeys.length > 0) {
|
||||
logger.success(`▣ generated (${path.basename(exampleFilepath)})`)
|
||||
} else {
|
||||
logger.info('○ no changes (.env.example)')
|
||||
}
|
||||
} catch (error) {
|
||||
catchAndLog(error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = genexample
|
||||
105
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/gitignore.js
generated
vendored
Normal file
105
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/gitignore.js
generated
vendored
Normal file
@@ -0,0 +1,105 @@
|
||||
const fsx = require('./../../../lib/helpers/fsx')
|
||||
|
||||
const DEFAULT_PATTERNS = ['.env*']
|
||||
const { logger } = require('./../../../shared/logger')
|
||||
|
||||
class Generic {
|
||||
constructor (filename, patterns = DEFAULT_PATTERNS, touchFile = false) {
|
||||
this.filename = filename
|
||||
this.patterns = patterns
|
||||
this.touchFile = touchFile
|
||||
}
|
||||
|
||||
append (str) {
|
||||
fsx.appendFileSync(this.filename, `\n${str}`)
|
||||
}
|
||||
|
||||
run () {
|
||||
const changedPatterns = []
|
||||
if (!fsx.existsSync(this.filename)) {
|
||||
if (this.touchFile === true && this.patterns.length > 0) {
|
||||
fsx.writeFileX(this.filename, '')
|
||||
} else {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
const lines = fsx.readFileX(this.filename).split(/\r?\n/)
|
||||
this.patterns.forEach(pattern => {
|
||||
if (!lines.includes(pattern.trim())) {
|
||||
this.append(pattern)
|
||||
|
||||
changedPatterns.push(pattern.trim())
|
||||
}
|
||||
})
|
||||
|
||||
if (changedPatterns.length > 0) {
|
||||
logger.success(`▣ ignored ${this.patterns} (${this.filename})`)
|
||||
} else {
|
||||
logger.info(`○ no changes (${this.filename})`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Git {
|
||||
constructor (patterns = DEFAULT_PATTERNS) {
|
||||
this.patterns = patterns
|
||||
}
|
||||
|
||||
run () {
|
||||
logger.verbose('add to .gitignore')
|
||||
new Generic('.gitignore', this.patterns, true).run()
|
||||
}
|
||||
}
|
||||
|
||||
class Docker {
|
||||
constructor (patterns = DEFAULT_PATTERNS) {
|
||||
this.patterns = patterns
|
||||
}
|
||||
|
||||
run () {
|
||||
logger.verbose('add to .dockerignore (if exists)')
|
||||
new Generic('.dockerignore', this.patterns).run()
|
||||
}
|
||||
}
|
||||
|
||||
class Npm {
|
||||
constructor (patterns = DEFAULT_PATTERNS) {
|
||||
this.patterns = patterns
|
||||
}
|
||||
|
||||
run () {
|
||||
logger.verbose('add to .npmignore (if existing)')
|
||||
new Generic('.npmignore', this.patterns).run()
|
||||
}
|
||||
}
|
||||
|
||||
class Vercel {
|
||||
constructor (patterns = DEFAULT_PATTERNS) {
|
||||
this.patterns = patterns
|
||||
}
|
||||
|
||||
run () {
|
||||
logger.verbose('add to .vercelignore (if existing)')
|
||||
new Generic('.vercelignore', this.patterns).run()
|
||||
}
|
||||
}
|
||||
|
||||
function gitignore () {
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
const patterns = options.pattern
|
||||
|
||||
new Git(patterns).run()
|
||||
new Docker(patterns).run()
|
||||
new Npm(patterns).run()
|
||||
new Vercel(patterns).run()
|
||||
}
|
||||
|
||||
module.exports = gitignore
|
||||
module.exports.Git = Git
|
||||
module.exports.Docker = Docker
|
||||
module.exports.Npm = Npm
|
||||
module.exports.Vercel = Vercel
|
||||
module.exports.Generic = Generic
|
||||
30
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/prebuild.js
generated
vendored
Normal file
30
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/prebuild.js
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
const { logger } = require('./../../../shared/logger')
|
||||
|
||||
const Prebuild = require('./../../../lib/services/prebuild')
|
||||
const catchAndLog = require('./../../../lib/helpers/catchAndLog')
|
||||
|
||||
function prebuild (directory) {
|
||||
// debug args
|
||||
logger.debug(`directory: ${directory}`)
|
||||
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
try {
|
||||
const {
|
||||
successMessage,
|
||||
warnings
|
||||
} = new Prebuild(directory, options).run()
|
||||
|
||||
for (const warning of warnings) {
|
||||
logger.warn(warning.messageWithHelp)
|
||||
}
|
||||
|
||||
logger.success(successMessage)
|
||||
} catch (error) {
|
||||
catchAndLog(error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = prebuild
|
||||
30
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/precommit.js
generated
vendored
Normal file
30
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/precommit.js
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
const { logger } = require('./../../../shared/logger')
|
||||
|
||||
const Precommit = require('./../../../lib/services/precommit')
|
||||
const catchAndLog = require('./../../../lib/helpers/catchAndLog')
|
||||
|
||||
function precommit (directory) {
|
||||
// debug args
|
||||
logger.debug(`directory: ${directory}`)
|
||||
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
try {
|
||||
const {
|
||||
successMessage,
|
||||
warnings
|
||||
} = new Precommit(directory, options).run()
|
||||
|
||||
for (const warning of warnings) {
|
||||
logger.warn(warning.messageWithHelp)
|
||||
}
|
||||
|
||||
logger.success(successMessage)
|
||||
} catch (error) {
|
||||
catchAndLog(error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = precommit
|
||||
34
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/scan.js
generated
vendored
Normal file
34
node_modules/@dotenvx/dotenvx/src/cli/actions/ext/scan.js
generated
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
const childProcess = require('child_process')
|
||||
|
||||
const { logger } = require('./../../../shared/logger')
|
||||
const chomp = require('./../../../lib/helpers/chomp')
|
||||
|
||||
function scan () {
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
try {
|
||||
// redirect stderr to stdout to capture and ignore it
|
||||
childProcess.execSync('gitleaks version', { stdio: ['ignore', 'pipe', 'ignore'] })
|
||||
} catch (error) {
|
||||
logger.error('gitleaks: command not found')
|
||||
logger.help('fix: install gitleaks: [brew install gitleaks]')
|
||||
logger.help('fix: other install options: [https://github.com/gitleaks/gitleaks]')
|
||||
process.exit(1)
|
||||
return
|
||||
}
|
||||
|
||||
let output = ''
|
||||
try {
|
||||
output = childProcess.execSync('gitleaks detect --no-banner --verbose 2>&1').toString() // gitleaks sends exit code 1 but puts data on stdout for failures, so we catch later and resurface the stdout
|
||||
logger.info(chomp(output))
|
||||
} catch (error) {
|
||||
if (error.stdout) {
|
||||
logger.error(chomp(error.stdout.toString()))
|
||||
}
|
||||
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = scan
|
||||
81
node_modules/@dotenvx/dotenvx/src/cli/actions/get.js
generated
vendored
Normal file
81
node_modules/@dotenvx/dotenvx/src/cli/actions/get.js
generated
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
const { logger } = require('./../../shared/logger')
|
||||
|
||||
const conventions = require('./../../lib/helpers/conventions')
|
||||
const escape = require('./../../lib/helpers/escape')
|
||||
const catchAndLog = require('./../../lib/helpers/catchAndLog')
|
||||
|
||||
const Get = require('./../../lib/services/get')
|
||||
|
||||
function get (key) {
|
||||
if (key) {
|
||||
logger.debug(`key: ${key}`)
|
||||
}
|
||||
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
const prettyPrint = options.prettyPrint || options.pp
|
||||
|
||||
const ignore = options.ignore || []
|
||||
|
||||
let envs = []
|
||||
// handle shorthand conventions - like --convention=nextjs
|
||||
if (options.convention) {
|
||||
envs = conventions(options.convention).concat(this.envs)
|
||||
} else {
|
||||
envs = this.envs
|
||||
}
|
||||
|
||||
try {
|
||||
const opsOn = options.opsOff !== true
|
||||
const { parsed, errors } = new Get(key, envs, options.overload, options.all, options.envKeysFile, opsOn).run()
|
||||
|
||||
for (const error of errors || []) {
|
||||
if (options.strict) throw error // throw immediately if strict
|
||||
|
||||
if (ignore.includes(error.code)) {
|
||||
continue // ignore error
|
||||
}
|
||||
|
||||
logger.error(error.messageWithHelp)
|
||||
}
|
||||
|
||||
if (key) {
|
||||
const single = parsed[key]
|
||||
if (single === undefined) {
|
||||
console.log('')
|
||||
} else {
|
||||
console.log(single)
|
||||
}
|
||||
} else {
|
||||
if (options.format === 'eval') {
|
||||
let inline = ''
|
||||
for (const [key, value] of Object.entries(parsed)) {
|
||||
inline += `${key}=${escape(value)}\n`
|
||||
}
|
||||
inline = inline.trim()
|
||||
|
||||
console.log(inline)
|
||||
} else if (options.format === 'shell') {
|
||||
let inline = ''
|
||||
for (const [key, value] of Object.entries(parsed)) {
|
||||
inline += `${key}=${value} `
|
||||
}
|
||||
inline = inline.trim()
|
||||
|
||||
console.log(inline)
|
||||
} else {
|
||||
let space = 0
|
||||
if (prettyPrint) {
|
||||
space = 2
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(parsed, null, space))
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
catchAndLog(error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = get
|
||||
45
node_modules/@dotenvx/dotenvx/src/cli/actions/keypair.js
generated
vendored
Normal file
45
node_modules/@dotenvx/dotenvx/src/cli/actions/keypair.js
generated
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
const { logger } = require('./../../shared/logger')
|
||||
|
||||
const main = require('./../../lib/main')
|
||||
|
||||
function keypair (key) {
|
||||
if (key) {
|
||||
logger.debug(`key: ${key}`)
|
||||
}
|
||||
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
const prettyPrint = options.prettyPrint || options.pp
|
||||
|
||||
const results = main.keypair(options.envFile, key, options.envKeysFile, options.opsOff)
|
||||
|
||||
if (typeof results === 'object' && results !== null) {
|
||||
// inline shell format - env $(dotenvx keypair --format=shell) your-command
|
||||
if (options.format === 'shell') {
|
||||
let inline = ''
|
||||
for (const [key, value] of Object.entries(results)) {
|
||||
inline += `${key}=${value || ''} `
|
||||
}
|
||||
inline = inline.trim()
|
||||
|
||||
console.log(inline)
|
||||
// json format
|
||||
} else {
|
||||
let space = 0
|
||||
if (prettyPrint) {
|
||||
space = 2
|
||||
}
|
||||
|
||||
console.log(JSON.stringify(results, null, space))
|
||||
}
|
||||
} else {
|
||||
if (results === undefined) {
|
||||
console.log('')
|
||||
process.exit(1)
|
||||
} else {
|
||||
console.log(results)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = keypair
|
||||
24
node_modules/@dotenvx/dotenvx/src/cli/actions/ls.js
generated
vendored
Normal file
24
node_modules/@dotenvx/dotenvx/src/cli/actions/ls.js
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
const treeify = require('object-treeify')
|
||||
|
||||
const { logger } = require('./../../shared/logger')
|
||||
|
||||
const main = require('./../../lib/main')
|
||||
const ArrayToTree = require('./../../lib/helpers/arrayToTree')
|
||||
|
||||
function ls (directory) {
|
||||
// debug args
|
||||
logger.debug(`directory: ${directory}`)
|
||||
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
const filepaths = main.ls(directory, options.envFile, options.excludeEnvFile)
|
||||
logger.debug(`filepaths: ${JSON.stringify(filepaths)}`)
|
||||
|
||||
const tree = new ArrayToTree(filepaths).run()
|
||||
logger.debug(`tree: ${JSON.stringify(tree)}`)
|
||||
|
||||
logger.info(treeify(tree))
|
||||
}
|
||||
|
||||
module.exports = ls
|
||||
74
node_modules/@dotenvx/dotenvx/src/cli/actions/rotate.js
generated
vendored
Normal file
74
node_modules/@dotenvx/dotenvx/src/cli/actions/rotate.js
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
const fsx = require('./../../lib/helpers/fsx')
|
||||
const { logger } = require('./../../shared/logger')
|
||||
|
||||
const Rotate = require('./../../lib/services/rotate')
|
||||
|
||||
const catchAndLog = require('../../lib/helpers/catchAndLog')
|
||||
const localDisplayPath = require('../../lib/helpers/localDisplayPath')
|
||||
|
||||
function rotate () {
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
const envs = this.envs
|
||||
const opsOn = options.opsOff !== true
|
||||
|
||||
// stdout - should not have a try so that exit codes can surface to stdout
|
||||
if (options.stdout) {
|
||||
const {
|
||||
processedEnvs
|
||||
} = new Rotate(envs, options.key, options.excludeKey, options.envKeysFile, opsOn).run()
|
||||
|
||||
for (const processedEnv of processedEnvs) {
|
||||
console.log(processedEnv.envSrc)
|
||||
if (processedEnv.privateKeyAdded) {
|
||||
console.log('')
|
||||
console.log(processedEnv.envKeysSrc)
|
||||
}
|
||||
}
|
||||
process.exit(0) // exit early
|
||||
} else {
|
||||
try {
|
||||
const {
|
||||
processedEnvs,
|
||||
changedFilepaths,
|
||||
unchangedFilepaths
|
||||
} = new Rotate(envs, options.key, options.excludeKey, options.envKeysFile, opsOn).run()
|
||||
|
||||
for (const processedEnv of processedEnvs) {
|
||||
logger.verbose(`rotating ${processedEnv.envFilepath} (${processedEnv.filepath})`)
|
||||
if (processedEnv.error) {
|
||||
logger.warn(processedEnv.error.messageWithHelp)
|
||||
} else if (processedEnv.changed) {
|
||||
fsx.writeFileX(processedEnv.filepath, processedEnv.envSrc)
|
||||
if (processedEnv.privateKeyAdded) {
|
||||
fsx.writeFileX(processedEnv.envKeysFilepath, processedEnv.envKeysSrc)
|
||||
}
|
||||
|
||||
logger.verbose(`rotated ${processedEnv.envFilepath} (${processedEnv.filepath})`)
|
||||
} else {
|
||||
logger.verbose(`no changes ${processedEnv.envFilepath} (${processedEnv.filepath})`)
|
||||
}
|
||||
}
|
||||
|
||||
if (changedFilepaths.length > 0) {
|
||||
const keyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.privateKeyAdded)
|
||||
let msg = `⟳ rotated (${changedFilepaths.join(',')})`
|
||||
if (keyAddedEnv) {
|
||||
const envKeysFilepath = localDisplayPath(keyAddedEnv.envKeysFilepath)
|
||||
msg += ` + key (${envKeysFilepath})`
|
||||
}
|
||||
logger.success(msg)
|
||||
} else if (unchangedFilepaths.length > 0) {
|
||||
logger.info(`○ no changes (${unchangedFilepaths})`)
|
||||
} else {
|
||||
// do nothing - scenario when no .env files found
|
||||
}
|
||||
} catch (error) {
|
||||
catchAndLog(error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = rotate
|
||||
109
node_modules/@dotenvx/dotenvx/src/cli/actions/run.js
generated
vendored
Normal file
109
node_modules/@dotenvx/dotenvx/src/cli/actions/run.js
generated
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
const path = require('path')
|
||||
const { logger } = require('./../../shared/logger')
|
||||
|
||||
const executeCommand = require('./../../lib/helpers/executeCommand')
|
||||
const Run = require('./../../lib/services/run')
|
||||
const catchAndLog = require('./../../lib/helpers/catchAndLog')
|
||||
|
||||
const conventions = require('./../../lib/helpers/conventions')
|
||||
|
||||
async function run () {
|
||||
const commandArgs = this.args
|
||||
logger.debug(`process command [${commandArgs.join(' ')}]`)
|
||||
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
const ignore = options.ignore || []
|
||||
|
||||
// dotenvx-ops related
|
||||
const opsOn = options.opsOff !== true
|
||||
|
||||
if (commandArgs.length < 1) {
|
||||
const hasSeparator = process.argv.indexOf('--') !== -1
|
||||
|
||||
if (hasSeparator) {
|
||||
logger.error('missing command after [dotenvx run --]. try [dotenvx run -- yourcommand]')
|
||||
} else {
|
||||
const realExample = options.envFile[0] || '.env'
|
||||
logger.error(`ambiguous command due to missing '--' separator. try [dotenvx run -f ${realExample} -- yourcommand]`)
|
||||
}
|
||||
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
try {
|
||||
let envs = []
|
||||
// handle shorthand conventions - like --convention=nextjs
|
||||
if (options.convention) {
|
||||
envs = conventions(options.convention).concat(this.envs)
|
||||
} else {
|
||||
envs = this.envs
|
||||
}
|
||||
|
||||
const {
|
||||
processedEnvs,
|
||||
readableStrings,
|
||||
readableFilepaths,
|
||||
uniqueInjectedKeys
|
||||
} = new Run(envs, options.overload, process.env, options.envKeysFile, opsOn).run()
|
||||
|
||||
for (const processedEnv of processedEnvs) {
|
||||
if (processedEnv.type === 'envFile') {
|
||||
logger.verbose(`loading env from ${processedEnv.filepath} (${path.resolve(processedEnv.filepath)})`)
|
||||
}
|
||||
|
||||
if (processedEnv.type === 'env') {
|
||||
logger.verbose(`loading env from string (${processedEnv.string})`)
|
||||
}
|
||||
|
||||
for (const error of processedEnv.errors || []) {
|
||||
if (ignore.includes(error.code)) {
|
||||
logger.verbose(`ignored: ${error.message}`)
|
||||
continue // ignore error
|
||||
}
|
||||
|
||||
if (options.strict) throw error // throw if strict and not ignored
|
||||
|
||||
if (error.code === 'MISSING_ENV_FILE' && options.convention) { // do not output error for conventions (too noisy)
|
||||
// intentionally quiet
|
||||
} else {
|
||||
logger.error(error.messageWithHelp)
|
||||
}
|
||||
}
|
||||
|
||||
// debug parsed
|
||||
logger.debug(processedEnv.parsed)
|
||||
|
||||
// verbose/debug injected key/value
|
||||
for (const [key, value] of Object.entries(processedEnv.injected || {})) {
|
||||
logger.verbose(`${key} set`)
|
||||
logger.debug(`${key} set to ${value}`)
|
||||
}
|
||||
|
||||
// verbose/debug preExisted key/value
|
||||
for (const [key, value] of Object.entries(processedEnv.preExisted || {})) {
|
||||
logger.verbose(`${key} pre-exists (protip: use --overload to override)`)
|
||||
logger.debug(`${key} pre-exists as ${value} (protip: use --overload to override)`)
|
||||
}
|
||||
}
|
||||
|
||||
let msg = `injecting env (${uniqueInjectedKeys.length})`
|
||||
if (readableFilepaths.length > 0 && readableStrings.length > 0) {
|
||||
msg += ` from ${readableFilepaths.join(', ')}, and --env flag${readableStrings.length > 1 ? 's' : ''}`
|
||||
} else if (readableFilepaths.length > 0) {
|
||||
msg += ` from ${readableFilepaths.join(', ')}`
|
||||
} else if (readableStrings.length > 0) {
|
||||
msg += ` from --env flag${readableStrings.length > 1 ? 's' : ''}`
|
||||
}
|
||||
|
||||
logger.successv(msg)
|
||||
} catch (error) {
|
||||
catchAndLog(error)
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
await executeCommand(commandArgs, process.env)
|
||||
}
|
||||
|
||||
module.exports = run
|
||||
77
node_modules/@dotenvx/dotenvx/src/cli/actions/set.js
generated
vendored
Normal file
77
node_modules/@dotenvx/dotenvx/src/cli/actions/set.js
generated
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
const fsx = require('./../../lib/helpers/fsx')
|
||||
const { logger } = require('./../../shared/logger')
|
||||
|
||||
const Sets = require('./../../lib/services/sets')
|
||||
|
||||
const catchAndLog = require('../../lib/helpers/catchAndLog')
|
||||
const localDisplayPath = require('../../lib/helpers/localDisplayPath')
|
||||
|
||||
function set (key, value) {
|
||||
logger.debug(`key: ${key}`)
|
||||
logger.debug(`value: ${value}`)
|
||||
|
||||
const options = this.opts()
|
||||
logger.debug(`options: ${JSON.stringify(options)}`)
|
||||
|
||||
// encrypt
|
||||
let encrypt = true
|
||||
if (options.plain) {
|
||||
encrypt = false
|
||||
}
|
||||
|
||||
try {
|
||||
const envs = this.envs
|
||||
const envKeysFilepath = options.envKeysFile
|
||||
const opsOn = options.opsOff !== true
|
||||
|
||||
const {
|
||||
processedEnvs,
|
||||
changedFilepaths,
|
||||
unchangedFilepaths
|
||||
} = new Sets(key, value, envs, encrypt, envKeysFilepath, opsOn).run()
|
||||
|
||||
let withEncryption = ''
|
||||
|
||||
if (encrypt) {
|
||||
withEncryption = ' with encryption'
|
||||
}
|
||||
|
||||
for (const processedEnv of processedEnvs) {
|
||||
logger.verbose(`setting for ${processedEnv.envFilepath}`)
|
||||
|
||||
if (processedEnv.error) {
|
||||
logger.warn(processedEnv.error.messageWithHelp)
|
||||
} else {
|
||||
fsx.writeFileX(processedEnv.filepath, processedEnv.envSrc)
|
||||
|
||||
logger.verbose(`${processedEnv.key} set${withEncryption} (${processedEnv.envFilepath})`)
|
||||
logger.debug(`${processedEnv.key} set${withEncryption} to ${processedEnv.value} (${processedEnv.envFilepath})`)
|
||||
}
|
||||
}
|
||||
|
||||
const keyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.privateKeyAdded)
|
||||
const keyAddedSuffix = keyAddedEnv ? ` + key (${localDisplayPath(keyAddedEnv.envKeysFilepath)})` : ''
|
||||
|
||||
if (changedFilepaths.length > 0) {
|
||||
if (encrypt) {
|
||||
logger.success(`◈ encrypted ${key} (${changedFilepaths.join(',')})${keyAddedSuffix}`)
|
||||
} else {
|
||||
logger.success(`◇ set ${key} (${changedFilepaths.join(',')})`)
|
||||
}
|
||||
} else if (encrypt && keyAddedEnv) {
|
||||
const keyAddedEnvFilepath = keyAddedEnv.envFilepath || changedFilepaths[0] || '.env'
|
||||
logger.success(`◈ encrypted ${key} (${keyAddedEnvFilepath})${keyAddedSuffix}`)
|
||||
} else if (unchangedFilepaths.length > 0) {
|
||||
logger.info(`○ no changes (${unchangedFilepaths})`)
|
||||
} else {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
// intentionally quiet: success line communicates key creation
|
||||
} catch (error) {
|
||||
catchAndLog(error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = set
|
||||
73
node_modules/@dotenvx/dotenvx/src/cli/commands/ext.js
generated
vendored
Normal file
73
node_modules/@dotenvx/dotenvx/src/cli/commands/ext.js
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
const { Command } = require('commander')
|
||||
|
||||
const examples = require('./../examples')
|
||||
const executeExtension = require('../../lib/helpers/executeExtension')
|
||||
const removeDynamicHelpSection = require('../../lib/helpers/removeDynamicHelpSection')
|
||||
|
||||
const ext = new Command('ext')
|
||||
|
||||
ext
|
||||
.description('🔌 extensions')
|
||||
.allowUnknownOption()
|
||||
|
||||
ext
|
||||
.argument('[command]', 'dynamic ext command')
|
||||
.argument('[args...]', 'dynamic ext command arguments')
|
||||
.action((command, args, cmdObj) => {
|
||||
const rawArgs = process.argv.slice(3) // adjust the index based on where actual args start
|
||||
executeExtension(ext, command, rawArgs)
|
||||
})
|
||||
|
||||
// dotenvx ext ls
|
||||
ext.command('ls')
|
||||
.description('print all .env files in a tree structure')
|
||||
.argument('[directory]', 'directory to list .env files from', '.')
|
||||
.option('-f, --env-file <filenames...>', 'path(s) to your env file(s)', '.env*')
|
||||
.option('-ef, --exclude-env-file <excludeFilenames...>', 'path(s) to exclude from your env file(s) (default: none)')
|
||||
.action(require('./../actions/ls'))
|
||||
|
||||
// dotenvx ext genexample
|
||||
ext.command('genexample')
|
||||
.description('generate .env.example')
|
||||
.argument('[directory]', 'directory to generate from', '.')
|
||||
.option('-f, --env-file <paths...>', 'path(s) to your env file(s)', '.env')
|
||||
.action(require('./../actions/ext/genexample'))
|
||||
|
||||
// dotenvx ext gitignore
|
||||
ext.command('gitignore')
|
||||
.description('append to .gitignore file (and if existing, .dockerignore, .npmignore, and .vercelignore)')
|
||||
.addHelpText('after', examples.gitignore)
|
||||
.option('--pattern <patterns...>', 'pattern(s) to gitignore', ['.env*'])
|
||||
.action(require('./../actions/ext/gitignore'))
|
||||
|
||||
// dotenvx ext prebuild
|
||||
ext.command('prebuild')
|
||||
.description('prevent including .env files in docker builds')
|
||||
.addHelpText('after', examples.prebuild)
|
||||
.argument('[directory]', 'directory to prevent including .env files from', '.')
|
||||
.action(require('./../actions/ext/prebuild'))
|
||||
|
||||
// dotenvx ext precommit
|
||||
ext.command('precommit')
|
||||
.description('prevent committing .env files to code')
|
||||
.addHelpText('after', examples.precommit)
|
||||
.argument('[directory]', 'directory to prevent committing .env files from', '.')
|
||||
.option('-i, --install', 'install to .git/hooks/pre-commit')
|
||||
.action(require('./../actions/ext/precommit'))
|
||||
|
||||
// dotenvx scan
|
||||
ext.command('scan')
|
||||
.description('scan for leaked secrets')
|
||||
.action(require('./../actions/ext/scan'))
|
||||
|
||||
// override helpInformation to hide dynamic commands
|
||||
ext.helpInformation = function () {
|
||||
const originalHelp = Command.prototype.helpInformation.call(this)
|
||||
const lines = originalHelp.split('\n')
|
||||
|
||||
removeDynamicHelpSection(lines)
|
||||
|
||||
return lines.join('\n')
|
||||
}
|
||||
|
||||
module.exports = ext
|
||||
262
node_modules/@dotenvx/dotenvx/src/cli/dotenvx.js
generated
vendored
Executable file
262
node_modules/@dotenvx/dotenvx/src/cli/dotenvx.js
generated
vendored
Executable file
@@ -0,0 +1,262 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/* c8 ignore start */
|
||||
const { Command } = require('commander')
|
||||
const program = new Command()
|
||||
|
||||
const { setLogLevel, logger } = require('../shared/logger')
|
||||
const examples = require('./examples')
|
||||
const packageJson = require('./../lib/helpers/packageJson')
|
||||
const Errors = require('./../lib/helpers/errors')
|
||||
const getCommanderVersion = require('./../lib/helpers/getCommanderVersion')
|
||||
const executeDynamic = require('./../lib/helpers/executeDynamic')
|
||||
const removeDynamicHelpSection = require('./../lib/helpers/removeDynamicHelpSection')
|
||||
const removeOptionsHelpParts = require('./../lib/helpers/removeOptionsHelpParts')
|
||||
|
||||
const Session = require('./../db/session')
|
||||
const sesh = new Session()
|
||||
|
||||
// for use with run
|
||||
const envs = []
|
||||
function collectEnvs (type) {
|
||||
return function (value, previous) {
|
||||
envs.push({ type, value })
|
||||
return previous.concat([value])
|
||||
}
|
||||
}
|
||||
|
||||
// surface hoisting problems
|
||||
const commanderVersion = getCommanderVersion()
|
||||
if (commanderVersion && parseInt(commanderVersion.split('.')[0], 10) >= 12) {
|
||||
const message = `dotenvx depends on commander@11.x.x but you are attempting to hoist commander@${commanderVersion}`
|
||||
const error = new Errors({ message }).dangerousDependencyHoist()
|
||||
logger.error(error.messageWithHelp)
|
||||
}
|
||||
|
||||
// global log levels
|
||||
program
|
||||
.usage('run -- yourcommand')
|
||||
.option('-l, --log-level <level>', 'set log level', 'info')
|
||||
.option('-q, --quiet', 'sets log level to error')
|
||||
.option('-v, --verbose', 'sets log level to verbose')
|
||||
.option('-d, --debug', 'sets log level to debug')
|
||||
.hook('preAction', (thisCommand, actionCommand) => {
|
||||
const options = thisCommand.opts()
|
||||
|
||||
setLogLevel(options)
|
||||
})
|
||||
|
||||
// for dynamic loading of dotenvx-ops, etc
|
||||
program
|
||||
.argument('[command]', 'dynamic command')
|
||||
.argument('[args...]', 'dynamic command arguments')
|
||||
.action((command, args, cmdObj) => {
|
||||
const rawArgs = process.argv.slice(3) // adjust the index based on where actual args start
|
||||
executeDynamic(program, command, rawArgs)
|
||||
})
|
||||
|
||||
// cli
|
||||
program
|
||||
.name('dotenvx')
|
||||
.description(packageJson.description)
|
||||
.version(packageJson.version)
|
||||
.allowUnknownOption()
|
||||
|
||||
// dotenvx run -- node index.js
|
||||
const runAction = require('./actions/run')
|
||||
program.command('run')
|
||||
.description('inject env at runtime [dotenvx run -- yourcommand]')
|
||||
.addHelpText('after', examples.run)
|
||||
.option('-e, --env <strings...>', 'environment variable(s) set as string (example: "HELLO=World")', collectEnvs('env'), [])
|
||||
.option('-f, --env-file <paths...>', 'path(s) to your env file(s)', collectEnvs('envFile'), [])
|
||||
.option('-fk, --env-keys-file <path>', 'path to your .env.keys file (default: same path as your env file)')
|
||||
.option('-o, --overload', 'override existing env variables (by default, existing env vars take precedence over .env files)')
|
||||
.option('--strict', 'process.exit(1) on any errors', false)
|
||||
.option('--convention <name>', 'load a .env convention (available conventions: [\'nextjs\', \'flow\'])')
|
||||
.option('--ignore <errorCodes...>', 'error code(s) to ignore (example: --ignore=MISSING_ENV_FILE)')
|
||||
.option('--ops-off', 'disable dotenvx-ops features', sesh.opsOff())
|
||||
.action(function (...args) {
|
||||
this.envs = envs
|
||||
runAction.apply(this, args)
|
||||
})
|
||||
|
||||
// dotenvx get
|
||||
const getAction = require('./actions/get')
|
||||
program.command('get')
|
||||
.usage('[KEY] [options]')
|
||||
.description('return a single environment variable')
|
||||
.argument('[KEY]', 'environment variable name')
|
||||
.option('-e, --env <strings...>', 'environment variable(s) set as string (example: "HELLO=World")', collectEnvs('env'), [])
|
||||
.option('-f, --env-file <paths...>', 'path(s) to your env file(s)', collectEnvs('envFile'), [])
|
||||
.option('-fk, --env-keys-file <path>', 'path to your .env.keys file (default: same path as your env file)')
|
||||
.option('-o, --overload', 'override existing env variables (by default, existing env vars take precedence over .env files)')
|
||||
.option('--strict', 'process.exit(1) on any errors', false)
|
||||
.option('--convention <name>', 'load a .env convention (available conventions: [\'nextjs\', \'flow\'])')
|
||||
.option('--ignore <errorCodes...>', 'error code(s) to ignore (example: --ignore=MISSING_ENV_FILE)')
|
||||
.option('-a, --all', 'include all machine envs as well')
|
||||
.option('-pp, --pretty-print', 'pretty print output')
|
||||
.option('--pp', 'pretty print output (alias)')
|
||||
.option('--format <type>', 'format of the output (json, shell, eval)', 'json')
|
||||
.option('--ops-off', 'disable dotenvx-ops features', sesh.opsOff())
|
||||
.action(function (...args) {
|
||||
this.envs = envs
|
||||
getAction.apply(this, args)
|
||||
})
|
||||
|
||||
// dotenvx set
|
||||
const setAction = require('./actions/set')
|
||||
program.command('set')
|
||||
.usage('<KEY> <value> [options]')
|
||||
.description('encrypt a single environment variable')
|
||||
.addHelpText('after', examples.set)
|
||||
.allowUnknownOption()
|
||||
.argument('KEY', 'KEY')
|
||||
.argument('value', 'value')
|
||||
.option('-f, --env-file <paths...>', 'path(s) to your env file(s)', collectEnvs('envFile'), [])
|
||||
.option('-fk, --env-keys-file <path>', 'path to your .env.keys file (default: same path as your env file)')
|
||||
.option('-c, --encrypt', 'encrypt value', true)
|
||||
.option('-p, --plain', 'store value as plain text', false)
|
||||
.option('--ops-off', 'disable dotenvx-ops features', sesh.opsOff())
|
||||
.action(function (...args) {
|
||||
this.envs = envs
|
||||
setAction.apply(this, args)
|
||||
})
|
||||
|
||||
// dotenvx encrypt
|
||||
const encryptAction = require('./actions/encrypt')
|
||||
program.command('encrypt')
|
||||
.description('convert .env file(s) to encrypted .env file(s)')
|
||||
.option('-f, --env-file <paths...>', 'path(s) to your env file(s)', collectEnvs('envFile'), [])
|
||||
.option('-fk, --env-keys-file <path>', 'path to your .env.keys file (default: same path as your env file)')
|
||||
.option('-k, --key <keys...>', 'keys(s) to encrypt (default: all keys in file)')
|
||||
.option('-ek, --exclude-key <excludeKeys...>', 'keys(s) to exclude from encryption (default: none)')
|
||||
.option('--ops-off', 'disable dotenvx-ops features', sesh.opsOff())
|
||||
.option('--stdout', 'send to stdout')
|
||||
.action(function (...args) {
|
||||
this.envs = envs
|
||||
encryptAction.apply(this, args)
|
||||
})
|
||||
|
||||
// dotenvx decrypt
|
||||
const decryptAction = require('./actions/decrypt')
|
||||
program.command('decrypt')
|
||||
.description('convert encrypted .env file(s) to plain .env file(s)')
|
||||
.option('-f, --env-file <paths...>', 'path(s) to your env file(s)', collectEnvs('envFile'), [])
|
||||
.option('-fk, --env-keys-file <path>', 'path to your .env.keys file (default: same path as your env file)')
|
||||
.option('-k, --key <keys...>', 'keys(s) to decrypt (default: all keys in file)')
|
||||
.option('-ek, --exclude-key <excludeKeys...>', 'keys(s) to exclude from decryption (default: none)')
|
||||
.option('--ops-off', 'disable dotenvx-ops features', sesh.opsOff())
|
||||
.option('--stdout', 'send to stdout')
|
||||
.action(function (...args) {
|
||||
this.envs = envs
|
||||
decryptAction.apply(this, args)
|
||||
})
|
||||
|
||||
// dotenvx rotate
|
||||
const rotateAction = require('./actions/rotate')
|
||||
program.command('rotate')
|
||||
.description('rotate keypair(s) and re-encrypt .env file(s)')
|
||||
.option('-f, --env-file <paths...>', 'path(s) to your env file(s)', collectEnvs('envFile'), [])
|
||||
.option('-fk, --env-keys-file <path>', 'path to your .env.keys file (default: same path as your env file)')
|
||||
.option('-k, --key <keys...>', 'keys(s) to encrypt (default: all keys in file)')
|
||||
.option('-ek, --exclude-key <excludeKeys...>', 'keys(s) to exclude from encryption (default: none)')
|
||||
.option('--ops-off', 'disable dotenvx-ops features', sesh.opsOff())
|
||||
.option('--stdout', 'send to stdout')
|
||||
.action(function (...args) {
|
||||
this.envs = envs
|
||||
rotateAction.apply(this, args)
|
||||
})
|
||||
|
||||
// dotenvx keypair
|
||||
const keypairAction = require('./actions/keypair')
|
||||
program.command('keypair')
|
||||
.usage('[KEY] [options]')
|
||||
.description('print public/private keys for .env file(s)')
|
||||
.argument('[KEY]', 'environment variable key name')
|
||||
.option('-f, --env-file <paths...>', 'path(s) to your env file(s)')
|
||||
.option('-fk, --env-keys-file <path>', 'path to your .env.keys file (default: same path as your env file)')
|
||||
.option('--ops-off', 'disable dotenvx-ops features', sesh.opsOff())
|
||||
.option('-pp, --pretty-print', 'pretty print output')
|
||||
.option('--pp', 'pretty print output (alias)')
|
||||
.option('--format <type>', 'format of the output (json, shell)', 'json')
|
||||
.action(keypairAction)
|
||||
|
||||
// dotenvx ls
|
||||
const lsAction = require('./actions/ls')
|
||||
program.command('ls')
|
||||
.description('print all .env files in a tree structure')
|
||||
.argument('[directory]', 'directory to list .env files from', '.')
|
||||
.option('-f, --env-file <filenames...>', 'path(s) to your env file(s)', '.env*')
|
||||
.option('-ef, --exclude-env-file <excludeFilenames...>', 'path(s) to exclude from your env file(s) (default: none)')
|
||||
.action(lsAction)
|
||||
|
||||
// dotenvx help
|
||||
program.command('help [command]')
|
||||
.description('display help for command')
|
||||
.action((command) => {
|
||||
if (command) {
|
||||
const subCommand = program.commands.find(c => c.name() === command)
|
||||
if (subCommand) {
|
||||
subCommand.outputHelp()
|
||||
} else {
|
||||
program.outputHelp()
|
||||
}
|
||||
} else {
|
||||
program.outputHelp()
|
||||
}
|
||||
})
|
||||
|
||||
// dotenvx pro
|
||||
program.addHelpText('after', ' ')
|
||||
program.addHelpText('after', 'Advanced: ')
|
||||
program.addHelpText('after', ' ops 🛡️ ops')
|
||||
program.addHelpText('after', ' ext 🔌 extensions')
|
||||
|
||||
// dotenvx ext
|
||||
program.addCommand(require('./commands/ext'))
|
||||
|
||||
//
|
||||
// MOVED
|
||||
//
|
||||
const prebuildAction = require('./actions/ext/prebuild')
|
||||
program.command('prebuild')
|
||||
.description('DEPRECATED: moved to [dotenvx ext prebuild]')
|
||||
.addHelpText('after', examples.prebuild)
|
||||
.action(function (...args) {
|
||||
logger.warn('DEPRECATION NOTICE: [prebuild] has moved to [dotenvx ext prebuild]')
|
||||
|
||||
prebuildAction.apply(this, args)
|
||||
})
|
||||
|
||||
const precommitAction = require('./actions/ext/precommit')
|
||||
program.command('precommit')
|
||||
.description('DEPRECATED: moved to [dotenvx ext precommit]')
|
||||
.addHelpText('after', examples.precommit)
|
||||
.option('-i, --install', 'install to .git/hooks/pre-commit')
|
||||
.action(function (...args) {
|
||||
logger.warn('DEPRECATION NOTICE: [precommit] has moved to [dotenvx ext precommit]')
|
||||
|
||||
precommitAction.apply(this, args)
|
||||
})
|
||||
|
||||
// override helpInformation to hide DEPRECATED and 'ext' commands
|
||||
program.helpInformation = function () {
|
||||
const originalHelp = Command.prototype.helpInformation.call(this)
|
||||
const lines = originalHelp.split('\n')
|
||||
|
||||
removeDynamicHelpSection(lines)
|
||||
removeOptionsHelpParts(lines)
|
||||
|
||||
// Filter out the hidden command from the help output
|
||||
const filteredLines = lines.filter(line =>
|
||||
!line.includes('DEPRECATED') &&
|
||||
!line.includes('help [command]') &&
|
||||
!line.includes('🔌 extensions') &&
|
||||
!/^\s*ls\b/.test(line)
|
||||
)
|
||||
|
||||
return filteredLines.join('\n')
|
||||
}
|
||||
/* c8 ignore stop */
|
||||
|
||||
program.parse(process.argv)
|
||||
99
node_modules/@dotenvx/dotenvx/src/cli/examples.js
generated
vendored
Normal file
99
node_modules/@dotenvx/dotenvx/src/cli/examples.js
generated
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
const run = function () {
|
||||
return `
|
||||
Examples:
|
||||
|
||||
\`\`\`
|
||||
$ dotenvx run -- npm run dev
|
||||
$ dotenvx run -- flask --app index run
|
||||
$ dotenvx run -- php artisan serve
|
||||
$ dotenvx run -- bin/rails s
|
||||
\`\`\`
|
||||
|
||||
Try it:
|
||||
|
||||
\`\`\`
|
||||
$ echo "HELLO=World" > .env
|
||||
$ echo "console.log('Hello ' + process.env.HELLO)" > index.js
|
||||
|
||||
$ dotenvx run -f .env -- node index.js
|
||||
[dotenvx] injecting env (1) from .env
|
||||
Hello World
|
||||
\`\`\`
|
||||
`
|
||||
}
|
||||
|
||||
const precommit = function () {
|
||||
return `
|
||||
Examples:
|
||||
|
||||
\`\`\`
|
||||
$ dotenvx ext precommit
|
||||
$ dotenvx ext precommit --install
|
||||
\`\`\`
|
||||
|
||||
Try it:
|
||||
|
||||
\`\`\`
|
||||
$ dotenvx ext precommit
|
||||
[dotenvx@0.45.0][precommit] success
|
||||
\`\`\`
|
||||
`
|
||||
}
|
||||
|
||||
const prebuild = function () {
|
||||
return `
|
||||
Examples:
|
||||
|
||||
\`\`\`
|
||||
$ dotenvx ext prebuild
|
||||
\`\`\`
|
||||
|
||||
Try it:
|
||||
|
||||
\`\`\`
|
||||
$ dotenvx ext prebuild
|
||||
[dotenvx@0.10.0][prebuild] success
|
||||
\`\`\`
|
||||
`
|
||||
}
|
||||
|
||||
const gitignore = function () {
|
||||
return `
|
||||
Examples:
|
||||
|
||||
\`\`\`
|
||||
$ dotenvx ext gitignore
|
||||
$ dotenvx ext gitignore --pattern .env.keys
|
||||
\`\`\`
|
||||
|
||||
Try it:
|
||||
|
||||
\`\`\`
|
||||
$ dotenvx ext gitignore
|
||||
▣ ignored .env* (.gitignore)
|
||||
\`\`\`
|
||||
`
|
||||
}
|
||||
|
||||
const set = function () {
|
||||
return `
|
||||
Examples:
|
||||
|
||||
\`\`\`
|
||||
$ dotenvx set KEY value
|
||||
$ dotenvx set KEY "value with spaces"
|
||||
$ dotenvx set KEY -- "---value with a dash---"
|
||||
$ dotenvx set KEY -- "-----BEGIN OPENSSH PRIVATE KEY-----
|
||||
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
|
||||
-----END OPENSSH PRIVATE KEY-----"
|
||||
\`\`\`
|
||||
`
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
run,
|
||||
precommit,
|
||||
prebuild,
|
||||
gitignore,
|
||||
set
|
||||
}
|
||||
21
node_modules/@dotenvx/dotenvx/src/db/session.js
generated
vendored
Normal file
21
node_modules/@dotenvx/dotenvx/src/db/session.js
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
const Ops = require('./../lib/extensions/ops')
|
||||
|
||||
class Session {
|
||||
constructor () {
|
||||
this.ops = new Ops()
|
||||
this.opsStatus = this.ops.status()
|
||||
}
|
||||
|
||||
//
|
||||
// opsOff/On
|
||||
//
|
||||
opsOn () {
|
||||
return this.opsStatus === 'on'
|
||||
}
|
||||
|
||||
opsOff () {
|
||||
return !this.opsOn()
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Session
|
||||
1
node_modules/@dotenvx/dotenvx/src/lib/config.d.ts
generated
vendored
Normal file
1
node_modules/@dotenvx/dotenvx/src/lib/config.d.ts
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export {};
|
||||
1
node_modules/@dotenvx/dotenvx/src/lib/config.js
generated
vendored
Normal file
1
node_modules/@dotenvx/dotenvx/src/lib/config.js
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
require('./main.js').config()
|
||||
98
node_modules/@dotenvx/dotenvx/src/lib/extensions/ops.js
generated
vendored
Normal file
98
node_modules/@dotenvx/dotenvx/src/lib/extensions/ops.js
generated
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
const path = require('path')
|
||||
const childProcess = require('child_process')
|
||||
|
||||
// const { logger } = require('./../../shared/logger')
|
||||
|
||||
class Ops {
|
||||
constructor () {
|
||||
this.opsLib = null
|
||||
|
||||
if (this._isForcedOff()) {
|
||||
return
|
||||
}
|
||||
|
||||
// check npm lib
|
||||
try { this.opsLib = this._opsNpm() } catch (_e) {}
|
||||
|
||||
// check binary cli
|
||||
if (!this.opsLib) {
|
||||
try { this.opsLib = this._opsCli() } catch (_e) {}
|
||||
}
|
||||
|
||||
if (this.opsLib) {
|
||||
// logger.successv(`🛡️ ops: ${this.opsLib.status()}`)
|
||||
}
|
||||
}
|
||||
|
||||
status () {
|
||||
if (this._isForcedOff() || !this.opsLib) {
|
||||
return 'off'
|
||||
}
|
||||
|
||||
return this.opsLib.status()
|
||||
}
|
||||
|
||||
keypair (publicKey) {
|
||||
if (this._isForcedOff() || !this.opsLib) {
|
||||
return {}
|
||||
}
|
||||
|
||||
return this.opsLib.keypair(publicKey)
|
||||
}
|
||||
|
||||
observe (payload) {
|
||||
if (!this._isForcedOff() && this.opsLib && this.opsLib.status() !== 'off') {
|
||||
const encoded = Buffer.from(JSON.stringify(payload)).toString('base64')
|
||||
this.opsLib.observe(encoded)
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// private
|
||||
//
|
||||
_opsNpm () {
|
||||
const npmBin = path.resolve(process.cwd(), 'node_modules/.bin/dotenvx-ops')
|
||||
return this._opsLib(npmBin)
|
||||
}
|
||||
|
||||
_opsCli () {
|
||||
return this._opsLib('dotenvx-ops')
|
||||
}
|
||||
|
||||
_opsLib (binary) {
|
||||
childProcess.execFileSync(binary, ['--version'], { stdio: ['pipe', 'pipe', 'ignore'] })
|
||||
|
||||
return {
|
||||
status: () => {
|
||||
return childProcess.execFileSync(binary, ['status'], { stdio: ['pipe', 'pipe', 'ignore'] }).toString().trim()
|
||||
},
|
||||
keypair: (publicKey) => {
|
||||
const args = ['keypair']
|
||||
if (publicKey) {
|
||||
args.push(publicKey)
|
||||
}
|
||||
const output = childProcess.execFileSync(binary, args, { stdio: ['pipe', 'pipe', 'ignore'] }).toString().trim()
|
||||
const parsed = JSON.parse(output.toString())
|
||||
return parsed
|
||||
},
|
||||
observe: (encoded) => {
|
||||
try {
|
||||
const subprocess = childProcess.spawn(binary, ['observe', encoded], {
|
||||
stdio: 'ignore',
|
||||
detached: true
|
||||
})
|
||||
|
||||
subprocess.unref() // let it run independently
|
||||
} catch (e) {
|
||||
// noop
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_isForcedOff () {
|
||||
return process.env.DOTENVX_OPS_OFF === 'true'
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Ops
|
||||
61
node_modules/@dotenvx/dotenvx/src/lib/helpers/append.js
generated
vendored
Normal file
61
node_modules/@dotenvx/dotenvx/src/lib/helpers/append.js
generated
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
const quotes = require('./quotes')
|
||||
const dotenvParse = require('./dotenvParse')
|
||||
const escapeForRegex = require('./escapeForRegex')
|
||||
const escapeDollarSigns = require('./escapeDollarSigns')
|
||||
|
||||
function append (src, key, appendValue) {
|
||||
let output
|
||||
let newPart = ''
|
||||
|
||||
const parsed = dotenvParse(src, true, true) // skip expanding \n and skip converting \r\n
|
||||
const _quotes = quotes(src)
|
||||
if (Object.prototype.hasOwnProperty.call(parsed, key)) {
|
||||
const quote = _quotes[key]
|
||||
const originalValue = parsed[key]
|
||||
|
||||
newPart += `${key}=${quote}${originalValue},${appendValue}${quote}`
|
||||
|
||||
const escapedOriginalValue = escapeForRegex(originalValue)
|
||||
|
||||
// conditionally enforce end of line
|
||||
let enforceEndOfLine = ''
|
||||
if (escapedOriginalValue === '') {
|
||||
enforceEndOfLine = '$' // EMPTY scenario
|
||||
}
|
||||
|
||||
const currentPart = new RegExp(
|
||||
'^' + // start of line
|
||||
'(\\s*)?' + // spaces
|
||||
'(export\\s+)?' + // export
|
||||
key + // KEY
|
||||
'\\s*=\\s*' + // spaces (KEY = value)
|
||||
'["\'`]?' + // open quote
|
||||
escapedOriginalValue + // escaped value
|
||||
'["\'`]?' + // close quote
|
||||
enforceEndOfLine
|
||||
,
|
||||
'gm' // (g)lobal (m)ultiline
|
||||
)
|
||||
|
||||
const saferInput = escapeDollarSigns(newPart) // cleanse user inputted capture groups ($1, $2 etc)
|
||||
|
||||
// $1 preserves spaces
|
||||
// $2 preserves export
|
||||
output = src.replace(currentPart, `$1$2${saferInput}`)
|
||||
} else {
|
||||
newPart += `${key}="${appendValue}"`
|
||||
|
||||
// append
|
||||
if (src.endsWith('\n')) {
|
||||
newPart = newPart + '\n'
|
||||
} else {
|
||||
newPart = '\n' + newPart
|
||||
}
|
||||
|
||||
output = src + newPart
|
||||
}
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
module.exports = append
|
||||
27
node_modules/@dotenvx/dotenvx/src/lib/helpers/arrayToTree.js
generated
vendored
Normal file
27
node_modules/@dotenvx/dotenvx/src/lib/helpers/arrayToTree.js
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
const path = require('path')
|
||||
|
||||
class ArrayToTree {
|
||||
constructor (arr) {
|
||||
this.arr = arr
|
||||
}
|
||||
|
||||
run () {
|
||||
const tree = {}
|
||||
|
||||
for (let i = 0; i < this.arr.length; i++) {
|
||||
const normalizedPath = path.normalize(this.arr[i]) // normalize any strange paths
|
||||
const parts = normalizedPath.split(path.sep) // use the platform-specific path segment separator
|
||||
let current = tree
|
||||
|
||||
for (let j = 0; j < parts.length; j++) {
|
||||
const part = parts[j]
|
||||
current[part] = current[part] || {}
|
||||
current = current[part]
|
||||
}
|
||||
}
|
||||
|
||||
return tree
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = ArrayToTree
|
||||
20
node_modules/@dotenvx/dotenvx/src/lib/helpers/buildEnvs.js
generated
vendored
Normal file
20
node_modules/@dotenvx/dotenvx/src/lib/helpers/buildEnvs.js
generated
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
const conventions = require('./conventions')
|
||||
const dotenvOptionPaths = require('./dotenvOptionPaths')
|
||||
|
||||
function buildEnvs (options) {
|
||||
// build envs using user set option.path
|
||||
const optionPaths = dotenvOptionPaths(options) // [ '.env' ]
|
||||
|
||||
let envs = []
|
||||
if (options.convention) { // handle shorthand conventions
|
||||
envs = conventions(options.convention).concat(envs)
|
||||
}
|
||||
|
||||
for (const optionPath of optionPaths) {
|
||||
envs.push({ type: 'envFile', value: optionPath })
|
||||
}
|
||||
|
||||
return envs
|
||||
}
|
||||
|
||||
module.exports = buildEnvs
|
||||
13
node_modules/@dotenvx/dotenvx/src/lib/helpers/catchAndLog.js
generated
vendored
Normal file
13
node_modules/@dotenvx/dotenvx/src/lib/helpers/catchAndLog.js
generated
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
const { logger } = require('./../../shared/logger')
|
||||
|
||||
function catchAndLog (error) {
|
||||
logger.error(error.messageWithHelp)
|
||||
if (error.debug) {
|
||||
logger.debug(error.debug)
|
||||
}
|
||||
if (error.code) {
|
||||
logger.debug(`ERROR_CODE: ${error.code}`)
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = catchAndLog
|
||||
5
node_modules/@dotenvx/dotenvx/src/lib/helpers/chomp.js
generated
vendored
Normal file
5
node_modules/@dotenvx/dotenvx/src/lib/helpers/chomp.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
function chomp (value) {
|
||||
return value.replace(/[\r\n]+$/, '')
|
||||
}
|
||||
|
||||
module.exports = chomp
|
||||
17
node_modules/@dotenvx/dotenvx/src/lib/helpers/colorDepth.js
generated
vendored
Normal file
17
node_modules/@dotenvx/dotenvx/src/lib/helpers/colorDepth.js
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
const { WriteStream } = require('tty')
|
||||
|
||||
const getColorDepth = () => {
|
||||
try {
|
||||
return WriteStream.prototype.getColorDepth()
|
||||
} catch (error) {
|
||||
const term = process.env.TERM
|
||||
|
||||
if (term && (term.includes('256color') || term.includes('xterm'))) {
|
||||
return 8 // 256 colors
|
||||
}
|
||||
|
||||
return 4
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { getColorDepth }
|
||||
28
node_modules/@dotenvx/dotenvx/src/lib/helpers/conventions.js
generated
vendored
Normal file
28
node_modules/@dotenvx/dotenvx/src/lib/helpers/conventions.js
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
const Errors = require('./errors')
|
||||
|
||||
function conventions (convention) {
|
||||
const env = process.env.DOTENV_ENV || process.env.NODE_ENV || 'development'
|
||||
|
||||
if (convention === 'nextjs') {
|
||||
const canonicalEnv = ['development', 'test', 'production'].includes(env) && env
|
||||
|
||||
return [
|
||||
canonicalEnv && { type: 'envFile', value: `.env.${canonicalEnv}.local` },
|
||||
canonicalEnv !== 'test' && { type: 'envFile', value: '.env.local' },
|
||||
canonicalEnv && { type: 'envFile', value: `.env.${canonicalEnv}` },
|
||||
{ type: 'envFile', value: '.env' }
|
||||
].filter(Boolean)
|
||||
} else if (convention === 'flow') {
|
||||
return [
|
||||
{ type: 'envFile', value: `.env.${env}.local` },
|
||||
{ type: 'envFile', value: `.env.${env}` },
|
||||
{ type: 'envFile', value: '.env.local' },
|
||||
{ type: 'envFile', value: '.env' },
|
||||
{ type: 'envFile', value: '.env.defaults' }
|
||||
]
|
||||
} else {
|
||||
throw new Errors({ convention }).invalidConvention()
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = conventions
|
||||
50
node_modules/@dotenvx/dotenvx/src/lib/helpers/cryptography/decryptKeyValue.js
generated
vendored
Normal file
50
node_modules/@dotenvx/dotenvx/src/lib/helpers/cryptography/decryptKeyValue.js
generated
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
const { decrypt } = require('eciesjs')
|
||||
|
||||
const Errors = require('./../errors')
|
||||
|
||||
const PREFIX = 'encrypted:'
|
||||
|
||||
function decryptKeyValue (key, value, privateKeyName, privateKey) {
|
||||
let decryptedValue
|
||||
let decryptionError
|
||||
|
||||
if (!value.startsWith(PREFIX)) {
|
||||
return value
|
||||
}
|
||||
|
||||
privateKey = privateKey || ''
|
||||
if (privateKey.length <= 0) {
|
||||
decryptionError = new Errors({ key, privateKeyName, privateKey }).missingPrivateKey()
|
||||
} else {
|
||||
const privateKeys = privateKey.split(',')
|
||||
for (const privKey of privateKeys) {
|
||||
const secret = Buffer.from(privKey, 'hex')
|
||||
const encoded = value.substring(PREFIX.length)
|
||||
const ciphertext = Buffer.from(encoded, 'base64')
|
||||
|
||||
try {
|
||||
decryptedValue = decrypt(secret, ciphertext).toString()
|
||||
decryptionError = null // reset to null error (scenario for multiple private keys)
|
||||
break
|
||||
} catch (e) {
|
||||
if (e.message === 'Invalid private key') {
|
||||
decryptionError = new Errors({ key, privateKeyName, privateKey }).invalidPrivateKey()
|
||||
} else if (e.message === 'Unsupported state or unable to authenticate data') {
|
||||
decryptionError = new Errors({ key, privateKeyName, privateKey }).wrongPrivateKey()
|
||||
} else if (e.message === 'Point of length 65 was invalid. Expected 33 compressed bytes or 65 uncompressed bytes') {
|
||||
decryptionError = new Errors({ key, privateKeyName, privateKey }).malformedEncryptedData()
|
||||
} else {
|
||||
decryptionError = new Errors({ key, privateKeyName, privateKey, message: e.message }).decryptionFailed()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (decryptionError) {
|
||||
throw decryptionError
|
||||
}
|
||||
|
||||
return decryptedValue
|
||||
}
|
||||
|
||||
module.exports = decryptKeyValue
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user