concurrently 7.3.0 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -57,6 +57,9 @@ npm install concurrently --save
57
57
 
58
58
  ## Usage
59
59
 
60
+ > **Note**
61
+ > The `concurrently` command is now also available under the shorthand alias `conc`.
62
+
60
63
  Remember to surround separate commands with quotes:
61
64
 
62
65
  ```bash
@@ -149,8 +152,8 @@ General
149
152
  template.
150
153
  Example names: "main,browser,server" [string]
151
154
  --name-separator The character to split <names> on. Example usage:
152
- concurrently -n "styles|scripts|server"
153
- --name-separator "|" [default: ","]
155
+ -n "styles|scripts|server" --name-separator "|"
156
+ [default: ","]
154
157
  -s, --success Which command(s) must exit with code 0 in order
155
158
  for concurrently exit with code 0 too. Options
156
159
  are:
@@ -35,7 +35,7 @@ const epilogue_1 = require("./epilogue");
35
35
  // Clean-up arguments (yargs expects only the arguments after the program name)
36
36
  const cleanArgs = (0, helpers_1.hideBin)(process.argv);
37
37
  // Find argument separator (double dash)
38
- const argsSepIdx = cleanArgs.findIndex(arg => arg === '--');
38
+ const argsSepIdx = cleanArgs.findIndex((arg) => arg === '--');
39
39
  // Arguments before separator
40
40
  const argsBeforeSep = argsSepIdx >= 0 ? cleanArgs.slice(0, argsSepIdx) : cleanArgs;
41
41
  // Arguments after separator
@@ -65,7 +65,7 @@ const args = (0, yargs_1.default)(argsBeforeSep)
65
65
  },
66
66
  'name-separator': {
67
67
  describe: 'The character to split <names> on. Example usage:\n' +
68
- 'concurrently -n "styles|scripts|server" --name-separator "|"',
68
+ '-n "styles|scripts|server" --name-separator "|"',
69
69
  default: defaults.nameSeparator,
70
70
  },
71
71
  success: {
@@ -69,7 +69,7 @@ const examplesString = examples
69
69
  ` - ${description}`,
70
70
  example
71
71
  .split('\n')
72
- .map(line => ` ${line}`)
72
+ .map((line) => ` ${line}`)
73
73
  .join('\n'),
74
74
  ].join('\n\n'))
75
75
  .join('\n\n');
@@ -42,7 +42,7 @@ class ExpandNpmWildcard {
42
42
  const wildcardRegex = new RegExp(`^${preWildcard}(.*?)${postWildcard}$`);
43
43
  const currentName = commandInfo.name || '';
44
44
  return this.scripts
45
- .map(script => {
45
+ .map((script) => {
46
46
  const match = script.match(wildcardRegex);
47
47
  if (omissionRegex) {
48
48
  const toOmit = script.match(new RegExp(omissionRegex[1]));
@@ -57,7 +57,7 @@ class Command {
57
57
  const startDate = new Date(Date.now());
58
58
  const highResStartTime = process.hrtime();
59
59
  this.timer.next({ startDate });
60
- Rx.fromEvent(child, 'error').subscribe(event => {
60
+ Rx.fromEvent(child, 'error').subscribe((event) => {
61
61
  this.process = undefined;
62
62
  const endDate = new Date(Date.now());
63
63
  this.timer.next({ startDate, endDate });
@@ -100,5 +100,5 @@ exports.Command = Command;
100
100
  * Pipes all events emitted by `stream` into `subject`.
101
101
  */
102
102
  function pipeTo(stream, subject) {
103
- stream.subscribe(event => subject.next(event));
103
+ stream.subscribe((event) => subject.next(event));
104
104
  }
@@ -53,11 +53,11 @@ class CompletionListener {
53
53
  const targetCommandsEvents = events.filter(({ command, index }) => command.name === nameOrIndex || index === Number(nameOrIndex));
54
54
  if (this.successCondition.startsWith('!')) {
55
55
  // All commands except the specified ones must exit succesfully
56
- return events.every(event => targetCommandsEvents.includes(event) || event.exitCode === 0);
56
+ return events.every((event) => targetCommandsEvents.includes(event) || event.exitCode === 0);
57
57
  }
58
58
  // Only the specified commands must exit succesfully
59
59
  return (targetCommandsEvents.length > 0 &&
60
- targetCommandsEvents.every(event => event.exitCode === 0));
60
+ targetCommandsEvents.every((event) => event.exitCode === 0));
61
61
  }
62
62
  /**
63
63
  * Given a list of commands, wait for all of them to exit and then evaluate their exit codes.
@@ -65,8 +65,8 @@ class CompletionListener {
65
65
  * @returns A Promise that resolves if the success condition is met, or rejects otherwise.
66
66
  */
67
67
  listen(commands) {
68
- const closeStreams = commands.map(command => command.close);
69
- return Rx.lastValueFrom(Rx.merge(...closeStreams).pipe((0, operators_1.bufferCount)(closeStreams.length), (0, operators_1.switchMap)(exitInfos => this.isSuccess(exitInfos)
68
+ const closeStreams = commands.map((command) => command.close);
69
+ return Rx.lastValueFrom(Rx.merge(...closeStreams).pipe((0, operators_1.bufferCount)(closeStreams.length), (0, operators_1.switchMap)((exitInfos) => this.isSuccess(exitInfos)
70
70
  ? Rx.of(exitInfos, this.scheduler)
71
71
  : Rx.throwError(exitInfos, this.scheduler)), (0, operators_1.take)(1)));
72
72
  }
@@ -44,7 +44,7 @@ function concurrently(baseCommands, baseOptions) {
44
44
  let lastColor = '';
45
45
  let commands = (0, lodash_1.default)(baseCommands)
46
46
  .map(mapToCommandInfo)
47
- .flatMap(command => parseCommand(command, commandParsers))
47
+ .flatMap((command) => parseCommand(command, commandParsers))
48
48
  .map((command, index) => {
49
49
  // Use documented behaviour of repeating last color when specifying more commands than colors
50
50
  lastColor = (options.prefixColors && options.prefixColors[index]) || lastColor;
@@ -83,7 +83,7 @@ function concurrently(baseCommands, baseOptions) {
83
83
  const result = new completion_listener_1.CompletionListener({ successCondition: options.successCondition })
84
84
  .listen(commands)
85
85
  .finally(() => {
86
- handleResult.onFinishCallbacks.forEach(onFinish => onFinish());
86
+ handleResult.onFinishCallbacks.forEach((onFinish) => onFinish());
87
87
  });
88
88
  return {
89
89
  result,
@@ -113,7 +113,7 @@ function mapToCommandInfo(command) {
113
113
  };
114
114
  }
115
115
  function parseCommand(command, parsers) {
116
- return parsers.reduce((commands, parser) => lodash_1.default.flatMap(commands, command => parser.parse(command)), lodash_1.default.castArray(command));
116
+ return parsers.reduce((commands, parser) => lodash_1.default.flatMap(commands, (command) => parser.parse(command)), lodash_1.default.castArray(command));
117
117
  }
118
118
  function maybeRunMore(commandsLeft) {
119
119
  const command = commandsLeft.shift();
@@ -48,12 +48,12 @@ class InputHandler {
48
48
  return { commands };
49
49
  }
50
50
  Rx.fromEvent(this.inputStream, 'data')
51
- .pipe((0, operators_1.map)(data => data.toString()))
52
- .subscribe(data => {
51
+ .pipe((0, operators_1.map)((data) => data.toString()))
52
+ .subscribe((data) => {
53
53
  const dataParts = data.split(/:(.+)/);
54
54
  const targetId = dataParts.length > 1 ? dataParts[0] : this.defaultInputTarget;
55
55
  const input = dataParts[1] || data;
56
- const command = commands.find(command => command.name === targetId ||
56
+ const command = commands.find((command) => command.name === targetId ||
57
57
  command.index.toString() === targetId.toString());
58
58
  if (command && command.stdin) {
59
59
  command.stdin.write(input);
@@ -12,15 +12,15 @@ class KillOnSignal {
12
12
  }
13
13
  handle(commands) {
14
14
  let caughtSignal;
15
- ['SIGINT', 'SIGTERM', 'SIGHUP'].forEach(signal => {
15
+ ['SIGINT', 'SIGTERM', 'SIGHUP'].forEach((signal) => {
16
16
  this.process.on(signal, () => {
17
17
  caughtSignal = signal;
18
- commands.forEach(command => command.kill(signal));
18
+ commands.forEach((command) => command.kill(signal));
19
19
  });
20
20
  });
21
21
  return {
22
- commands: commands.map(command => {
23
- const closeStream = command.close.pipe((0, operators_1.map)(exitInfo => {
22
+ commands: commands.map((command) => {
23
+ const closeStream = command.close.pipe((0, operators_1.map)((exitInfo) => {
24
24
  const exitCode = caughtSignal === 'SIGINT' ? 0 : exitInfo.exitCode;
25
25
  return { ...exitInfo, exitCode };
26
26
  }));
@@ -15,16 +15,16 @@ class KillOthers {
15
15
  this.conditions = lodash_1.default.castArray(conditions);
16
16
  }
17
17
  handle(commands) {
18
- const conditions = this.conditions.filter(condition => condition === 'failure' || condition === 'success');
18
+ const conditions = this.conditions.filter((condition) => condition === 'failure' || condition === 'success');
19
19
  if (!conditions.length) {
20
20
  return { commands };
21
21
  }
22
- const closeStates = commands.map(command => command.close.pipe((0, operators_1.map)(({ exitCode }) => exitCode === 0 ? 'success' : 'failure'), (0, operators_1.filter)(state => conditions.includes(state))));
23
- closeStates.forEach(closeState => closeState.subscribe(() => {
24
- const killableCommands = commands.filter(command => command.killable);
22
+ const closeStates = commands.map((command) => command.close.pipe((0, operators_1.map)(({ exitCode }) => exitCode === 0 ? 'success' : 'failure'), (0, operators_1.filter)((state) => conditions.includes(state))));
23
+ closeStates.forEach((closeState) => closeState.subscribe(() => {
24
+ const killableCommands = commands.filter((command) => command.killable);
25
25
  if (killableCommands.length) {
26
26
  this.logger.logGlobalEvent('Sending SIGTERM to other processes..');
27
- killableCommands.forEach(command => command.kill());
27
+ killableCommands.forEach((command) => command.kill());
28
28
  }
29
29
  }));
30
30
  return { commands };
@@ -9,7 +9,7 @@ class LogError {
9
9
  this.logger = logger;
10
10
  }
11
11
  handle(commands) {
12
- commands.forEach(command => command.error.subscribe(event => {
12
+ commands.forEach((command) => command.error.subscribe((event) => {
13
13
  this.logger.logCommandEvent(`Error occurred when executing command: ${command.command}`, command);
14
14
  const errorText = String(event instanceof Error ? event.stack || event : event);
15
15
  this.logger.logCommandEvent(errorText, command);
@@ -9,7 +9,7 @@ class LogExit {
9
9
  this.logger = logger;
10
10
  }
11
11
  handle(commands) {
12
- commands.forEach(command => command.close.subscribe(({ exitCode }) => {
12
+ commands.forEach((command) => command.close.subscribe(({ exitCode }) => {
13
13
  this.logger.logCommandEvent(`${command.command} exited with code ${exitCode}`, command);
14
14
  }));
15
15
  return { commands };
@@ -9,9 +9,9 @@ class LogOutput {
9
9
  this.logger = logger;
10
10
  }
11
11
  handle(commands) {
12
- commands.forEach(command => {
13
- command.stdout.subscribe(text => this.logger.logCommandText(text.toString(), command));
14
- command.stderr.subscribe(text => this.logger.logCommandText(text.toString(), command));
12
+ commands.forEach((command) => {
13
+ command.stdout.subscribe((text) => this.logger.logCommandText(text.toString(), command));
14
+ command.stderr.subscribe((text) => this.logger.logCommandText(text.toString(), command));
15
15
  });
16
16
  return { commands };
17
17
  }
@@ -65,7 +65,7 @@ class LogTimings {
65
65
  return { commands };
66
66
  }
67
67
  // individual process timings
68
- commands.forEach(command => {
68
+ commands.forEach((command) => {
69
69
  command.timer.subscribe(({ startDate, endDate }) => {
70
70
  if (!endDate) {
71
71
  const formattedStartDate = (0, format_1.default)(startDate, this.timestampFormat);
@@ -79,9 +79,9 @@ class LogTimings {
79
79
  });
80
80
  });
81
81
  // overall summary timings
82
- const closeStreams = commands.map(command => command.close);
82
+ const closeStreams = commands.map((command) => command.close);
83
83
  const allProcessesClosed = Rx.merge(...closeStreams).pipe((0, operators_1.bufferCount)(closeStreams.length), (0, operators_1.take)(1));
84
- allProcessesClosed.subscribe(exitInfos => this.printExitInfoTimingTable(exitInfos));
84
+ allProcessesClosed.subscribe((exitInfos) => this.printExitInfoTimingTable(exitInfos));
85
85
  return { commands };
86
86
  }
87
87
  }
@@ -43,7 +43,7 @@ class RestartProcess {
43
43
  return { commands };
44
44
  }
45
45
  commands
46
- .map(command => command.close.pipe((0, operators_1.take)(this.tries), (0, operators_1.takeWhile)(({ exitCode }) => exitCode !== 0)))
46
+ .map((command) => command.close.pipe((0, operators_1.take)(this.tries), (0, operators_1.takeWhile)(({ exitCode }) => exitCode !== 0)))
47
47
  .map((failure, index) => Rx.merge(
48
48
  // Delay the emission (so that the restarts happen on time),
49
49
  // explicitly telling the subscriber that a restart is needed
@@ -51,7 +51,7 @@ class RestartProcess {
51
51
  // Skip the first N emissions (as these would be duplicates of the above),
52
52
  // meaning it will be empty because of success, or failed all N times,
53
53
  // and no more restarts should be attempted.
54
- failure.pipe((0, operators_1.skip)(this.tries), (0, operators_1.mapTo)(false), (0, operators_1.defaultIfEmpty)(false))).subscribe(restart => {
54
+ failure.pipe((0, operators_1.skip)(this.tries), (0, operators_1.mapTo)(false), (0, operators_1.defaultIfEmpty)(false))).subscribe((restart) => {
55
55
  const command = commands[index];
56
56
  if (restart) {
57
57
  this.logger.logCommandEvent(`${command.command} restarted`, command);
@@ -59,7 +59,7 @@ class RestartProcess {
59
59
  }
60
60
  }));
61
61
  return {
62
- commands: commands.map(command => {
62
+ commands: commands.map((command) => {
63
63
  const closeStream = command.close.pipe((0, operators_1.filter)(({ exitCode }, emission) => {
64
64
  // We let all success codes pass, and failures only after restarting won't happen again
65
65
  return exitCode === 0 || emission >= this.tries;
@@ -71,4 +71,4 @@ export declare type ConcurrentlyOptions = BaseConcurrentlyOptions & {
71
71
  };
72
72
  declare const _default: (commands: ConcurrentlyCommandInput[], options?: Partial<ConcurrentlyOptions>) => ConcurrentlyResult;
73
73
  export default _default;
74
- export { concurrently, ConcurrentlyCommandInput, ConcurrentlyResult, Logger, Command, CloseEvent, TimerEvent, CommandIdentifier, FlowController, InputHandler, KillOnSignal, KillOthers, LogError, LogExit, LogOutput, LogTimings, RestartProcess, };
74
+ export { CloseEvent, Command, CommandIdentifier, concurrently, ConcurrentlyCommandInput, ConcurrentlyResult, FlowController, InputHandler, KillOnSignal, KillOthers, LogError, LogExit, Logger, LogOutput, LogTimings, RestartProcess, TimerEvent, };
package/dist/src/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RestartProcess = exports.LogTimings = exports.LogOutput = exports.LogExit = exports.LogError = exports.KillOthers = exports.KillOnSignal = exports.InputHandler = exports.Command = exports.Logger = exports.concurrently = void 0;
3
+ exports.RestartProcess = exports.LogTimings = exports.LogOutput = exports.Logger = exports.LogExit = exports.LogError = exports.KillOthers = exports.KillOnSignal = exports.InputHandler = exports.concurrently = exports.Command = void 0;
4
4
  const command_1 = require("./command");
5
5
  Object.defineProperty(exports, "Command", { enumerable: true, get: function () { return command_1.Command; } });
6
6
  const concurrently_1 = require("./concurrently");
@@ -28,8 +28,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.Logger = void 0;
30
30
  const chalk_1 = __importDefault(require("chalk"));
31
- const lodash_1 = __importDefault(require("lodash"));
32
31
  const format_1 = __importDefault(require("date-fns/format"));
32
+ const lodash_1 = __importDefault(require("lodash"));
33
33
  const Rx = __importStar(require("rxjs"));
34
34
  const defaults = __importStar(require("./defaults"));
35
35
  class Logger {
@@ -43,7 +43,7 @@ class Logger {
43
43
  // keep in the list of commands to hide only strings with some length.
44
44
  // This might happen through the CLI when no `--hide` argument is specified, for example.
45
45
  this.hide = lodash_1.default.castArray(hide)
46
- .filter(name => name || name === 0)
46
+ .filter((name) => name || name === 0)
47
47
  .map(String);
48
48
  this.raw = raw;
49
49
  this.prefixFormat = prefixFormat;
@@ -137,9 +137,9 @@ class Logger {
137
137
  }
138
138
  let nextColIndex = 0;
139
139
  const headers = {};
140
- const contentRows = tableContents.map(row => {
140
+ const contentRows = tableContents.map((row) => {
141
141
  const rowContents = [];
142
- Object.keys(row).forEach(col => {
142
+ Object.keys(row).forEach((col) => {
143
143
  if (!headers[col]) {
144
144
  headers[col] = {
145
145
  index: nextColIndex++,
@@ -155,16 +155,16 @@ class Logger {
155
155
  });
156
156
  return rowContents;
157
157
  });
158
- const headersFormatted = Object.keys(headers).map(header => header.padEnd(headers[header].length, ' '));
158
+ const headersFormatted = Object.keys(headers).map((header) => header.padEnd(headers[header].length, ' '));
159
159
  if (!headersFormatted.length) {
160
160
  // No columns exist.
161
161
  return;
162
162
  }
163
- const borderRowFormatted = headersFormatted.map(header => '─'.padEnd(header.length, '─'));
163
+ const borderRowFormatted = headersFormatted.map((header) => '─'.padEnd(header.length, '─'));
164
164
  this.logGlobalEvent(`┌─${borderRowFormatted.join('─┬─')}─┐`);
165
165
  this.logGlobalEvent(`│ ${headersFormatted.join(' │ ')} │`);
166
166
  this.logGlobalEvent(`├─${borderRowFormatted.join('─┼─')}─┤`);
167
- contentRows.forEach(contentRow => {
167
+ contentRows.forEach((contentRow) => {
168
168
  const contentRowFormatted = headersFormatted.map((header, colIndex) => {
169
169
  // If the table was expanded after this row was processed, it won't have this column.
170
170
  // Use an empty string in this case.
@@ -35,7 +35,7 @@ class OutputWriter {
35
35
  this.group = group;
36
36
  this.buffers = commands.map(() => []);
37
37
  if (this.group) {
38
- Rx.merge(...commands.map(c => c.close)).subscribe(command => {
38
+ Rx.merge(...commands.map((c) => c.close)).subscribe((command) => {
39
39
  if (command.index !== this.activeCommandIndex) {
40
40
  return;
41
41
  }
@@ -64,7 +64,7 @@ class OutputWriter {
64
64
  }
65
65
  }
66
66
  flushBuffer(index) {
67
- this.buffers[index].forEach(t => this.outputStream.write(t));
67
+ this.buffers[index].forEach((t) => this.outputStream.write(t));
68
68
  this.buffers[index] = [];
69
69
  }
70
70
  }
package/index.js CHANGED
@@ -1,8 +1,9 @@
1
- //
2
- // While in local development, make sure you've run `npm run build` first.
3
- //
1
+ /*
2
+ * While in local development, make sure you've run `npm run build` first.
3
+ */
4
4
 
5
5
  // eslint-disable-next-line @typescript-eslint/no-var-requires
6
6
  const concurrently = require('./dist/src/index.js');
7
+
7
8
  module.exports = exports = concurrently.default;
8
9
  Object.assign(exports, concurrently);
package/index.mjs CHANGED
@@ -1,9 +1,10 @@
1
- //
2
- // While in local development, make sure you've run `npm run build` first.
3
- //
1
+ /*
2
+ * While in local development, make sure you've run `npm run build` first.
3
+ */
4
+
5
+ import concurrently from './dist/src/index.js';
4
6
 
5
7
  // NOTE: the star reexport doesn't work in Node <12.20, <14.13 and <15.
6
8
  export * from './dist/src/index.js';
7
9
 
8
- import concurrently from './dist/src/index.js';
9
10
  export default concurrently.default;
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "concurrently",
3
- "version": "7.3.0",
3
+ "version": "7.4.0",
4
4
  "description": "Run commands concurrently",
5
5
  "main": "index.js",
6
6
  "types": "dist/src/index.d.ts",
7
7
  "type": "commonjs",
8
8
  "bin": {
9
- "concurrently": "./dist/bin/concurrently.js"
9
+ "concurrently": "./dist/bin/concurrently.js",
10
+ "conc": "./dist/bin/concurrently.js"
10
11
  },
11
12
  "engines": {
12
13
  "node": "^12.20.0 || ^14.13.0 || >=16.0.0"
@@ -26,7 +27,7 @@
26
27
  "clean": "tsc --build --clean",
27
28
  "format": "prettier --ignore-path .gitignore --check '**/{!(package-lock).json,*.y?(a)ml,*.md}'",
28
29
  "format:fix": "npm run format -- --write",
29
- "lint": "eslint . --ext js,ts --ignore-path .gitignore",
30
+ "lint": "eslint . --ext mjs,js,ts --ignore-path .gitignore",
30
31
  "lint:fix": "npm run lint -- --fix",
31
32
  "prepublishOnly": "npm run build",
32
33
  "report-coverage": "cat coverage/lcov.info | coveralls",
@@ -36,6 +37,7 @@
36
37
  "type": "git",
37
38
  "url": "https://github.com/open-cli-tools/concurrently.git"
38
39
  },
40
+ "funding": "https://github.com/open-cli-tools/concurrently?sponsor=1",
39
41
  "keywords": [
40
42
  "bash",
41
43
  "concurrent",
@@ -48,7 +50,7 @@
48
50
  "license": "MIT",
49
51
  "dependencies": {
50
52
  "chalk": "^4.1.0",
51
- "date-fns": "^2.16.1",
53
+ "date-fns": "^2.29.1",
52
54
  "lodash": "^4.17.21",
53
55
  "rxjs": "^7.0.0",
54
56
  "shell-quote": "^1.7.3",
@@ -58,26 +60,32 @@
58
60
  "yargs": "^17.3.1"
59
61
  },
60
62
  "devDependencies": {
61
- "@swc-node/register": "^1.5.1",
62
- "@swc/core": "^1.2.204",
63
+ "@hirez_io/observer-spy": "^2.2.0",
64
+ "@swc/core": "^1.2.224",
63
65
  "@swc/jest": "^0.2.21",
64
- "@types/jest": "^27.0.3",
66
+ "@types/jest": "^28.1.6",
65
67
  "@types/lodash": "^4.14.178",
66
- "@types/node": "^17.0.0",
68
+ "@types/node": "^16.11.47",
67
69
  "@types/shell-quote": "^1.7.1",
68
70
  "@types/supports-color": "^8.1.1",
69
- "@types/yargs": "^17.0.8",
70
- "@typescript-eslint/eslint-plugin": "^5.8.1",
71
- "@typescript-eslint/parser": "^5.8.1",
71
+ "@types/yargs": "^17.0.11",
72
+ "@typescript-eslint/eslint-plugin": "^5.33.0",
73
+ "@typescript-eslint/parser": "^5.33.0",
72
74
  "coveralls-next": "^4.1.2",
73
- "eslint": "^8.15.0",
75
+ "ctrlc-wrapper": "^0.0.4",
76
+ "esbuild": "^0.15.1",
77
+ "eslint": "^8.21.0",
74
78
  "eslint-config-prettier": "^8.5.0",
79
+ "eslint-plugin-import": "^2.26.0",
80
+ "eslint-plugin-jest": "^26.8.2",
75
81
  "eslint-plugin-prettier": "^4.0.0",
76
- "jest": "^27.5.1",
82
+ "eslint-plugin-simple-import-sort": "^7.0.0",
83
+ "jest": "^28.1.3",
77
84
  "jest-create-mock-instance": "^2.0.0",
78
85
  "lint-staged": "^12.4.1",
79
86
  "prettier": "^2.6.2",
80
87
  "simple-git-hooks": "^2.7.0",
88
+ "string-argv": "^0.3.1",
81
89
  "typescript": "^4.5.4"
82
90
  },
83
91
  "files": [
@@ -92,7 +100,7 @@
92
100
  "pre-commit": "npx lint-staged"
93
101
  },
94
102
  "lint-staged": {
95
- "*.{js,ts}": "eslint --fix",
96
- "{!(package-lock).json,*.y?(a)ml,*.md}": "prettier --write"
103
+ "*.m?{js,ts}": "eslint --fix",
104
+ "{!(package-lock).json,*.{y?(a)ml,md}}": "prettier --write"
97
105
  }
98
106
  }