feat: estructura base OpenSpec + Skills + arquitectura limpia Capacitor+Dextie

This commit is contained in:
mono
2026-10-24 20:49:29 -05:00
parent 2e6262b5a5
commit 0c7cf651ce
1659 changed files with 265883 additions and 0 deletions

293
node_modules/@ionic/utils-subprocess/CHANGELOG.md generated vendored Normal file
View File

@@ -0,0 +1,293 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.1.11](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.10...@ionic/utils-subprocess@2.1.11) (2022-06-16)
**Note:** Version bump only for package @ionic/utils-subprocess
## [2.1.10](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.9...@ionic/utils-subprocess@2.1.10) (2022-05-09)
**Note:** Version bump only for package @ionic/utils-subprocess
## [2.1.9](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.8...@ionic/utils-subprocess@2.1.9) (2022-03-04)
### Bug Fixes
* bump cross-spawn version to avoid windows problem ([#4784](https://github.com/ionic-team/ionic-cli/issues/4784)) ([2c88a71](https://github.com/ionic-team/ionic-cli/commit/2c88a7180e87497a27a97ca979c612d6663cbb2a))
## [2.1.8](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.7...@ionic/utils-subprocess@2.1.8) (2020-09-29)
**Note:** Version bump only for package @ionic/utils-subprocess
## [2.1.7](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.6...@ionic/utils-subprocess@2.1.7) (2020-09-24)
**Note:** Version bump only for package @ionic/utils-subprocess
## [2.1.6](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.5...@ionic/utils-subprocess@2.1.6) (2020-08-28)
**Note:** Version bump only for package @ionic/utils-subprocess
## [2.1.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.4...@ionic/utils-subprocess@2.1.5) (2020-08-27)
**Note:** Version bump only for package @ionic/utils-subprocess
## [2.1.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.3...@ionic/utils-subprocess@2.1.4) (2020-08-25)
**Note:** Version bump only for package @ionic/utils-subprocess
## [2.1.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.2...@ionic/utils-subprocess@2.1.3) (2020-05-12)
### Bug Fixes
* pin tslib to avoid "Cannot set property pathExists" error ([689e1f0](https://github.com/ionic-team/ionic-cli/commit/689e1f038b907356ef855a067a76d4822e7072a8))
## [2.1.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.1...@ionic/utils-subprocess@2.1.2) (2020-05-06)
**Note:** Version bump only for package @ionic/utils-subprocess
## [2.1.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.1.0...@ionic/utils-subprocess@2.1.1) (2020-03-03)
**Note:** Version bump only for package @ionic/utils-subprocess
# 2.1.0 (2020-02-11)
### Features
* **start:** add new list starter option ([#4315](https://github.com/ionic-team/ionic-cli/issues/4315)) ([1df44c1](https://github.com/ionic-team/ionic-cli/commit/1df44c1591f37b89f2b672857740edd6cb2aea67))
## [2.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.0.1...@ionic/utils-subprocess@2.0.2) (2020-02-10)
**Note:** Version bump only for package @ionic/utils-subprocess
## [2.0.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@2.0.0...@ionic/utils-subprocess@2.0.1) (2020-02-03)
**Note:** Version bump only for package @ionic/utils-subprocess
# [2.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.13...@ionic/utils-subprocess@2.0.0) (2020-01-25)
### chore
* require Node 10 ([5a47874](https://github.com/ionic-team/ionic-cli/commit/5a478746c074207b6dc96aa8771f04a606deb1ef))
### BREAKING CHANGES
* A minimum of Node.js 10.3.0 is required.
## [1.0.13](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.12...@ionic/utils-subprocess@1.0.13) (2020-01-13)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.12](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.11...@ionic/utils-subprocess@1.0.12) (2019-12-10)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.11](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.10...@ionic/utils-subprocess@1.0.11) (2019-12-05)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.10](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.9...@ionic/utils-subprocess@1.0.10) (2019-11-21)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.9](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.8...@ionic/utils-subprocess@1.0.9) (2019-10-14)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.8](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.7...@ionic/utils-subprocess@1.0.8) (2019-09-18)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.7](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.6...@ionic/utils-subprocess@1.0.7) (2019-08-28)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.6](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.5...@ionic/utils-subprocess@1.0.6) (2019-08-23)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.4...@ionic/utils-subprocess@1.0.5) (2019-08-14)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.3...@ionic/utils-subprocess@1.0.4) (2019-08-07)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.2...@ionic/utils-subprocess@1.0.3) (2019-06-28)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.1...@ionic/utils-subprocess@1.0.2) (2019-06-10)
**Note:** Version bump only for package @ionic/utils-subprocess
## [1.0.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@1.0.0...@ionic/utils-subprocess@1.0.1) (2019-06-05)
**Note:** Version bump only for package @ionic/utils-subprocess
# [1.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@0.1.0...@ionic/utils-subprocess@1.0.0) (2019-05-29)
### Bug Fixes
* **subprocess:** check all executable extensions on windows ([#3949](https://github.com/ionic-team/ionic-cli/issues/3949)) ([e1cf74e](https://github.com/ionic-team/ionic-cli/commit/e1cf74e))
### chore
* require Node 8 ([5670e68](https://github.com/ionic-team/ionic-cli/commit/5670e68))
### BREAKING CHANGES
* A minimum of Node.js 8.9.4 is required.
<a name="0.1.0"></a>
# [0.1.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-subprocess@0.0.1...@ionic/utils-subprocess@0.1.0) (2019-03-06)
### Bug Fixes
* **subprocess:** allow symlinks for commands found by `which` ([ce5bf80](https://github.com/ionic-team/ionic-cli/commit/ce5bf80))
* **subprocess:** check if command found by `which` is executable ([638cf61](https://github.com/ionic-team/ionic-cli/commit/638cf61))
### Features
* **subprocess:** add `convertPATH` utility ([eb14e8d](https://github.com/ionic-team/ionic-cli/commit/eb14e8d))
* **subprocess:** add `findExecutables` (like `which`, but for all) ([95acb53](https://github.com/ionic-team/ionic-cli/commit/95acb53))
* **subprocess:** options for `bashify()` ([465fafc](https://github.com/ionic-team/ionic-cli/commit/465fafc))
<a name="0.0.1"></a>
## 0.0.1 (2019-02-27)
**Note:** Version bump only for package @ionic/utils-subprocess

21
node_modules/@ionic/utils-subprocess/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2017 Drifty Co
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.

1
node_modules/@ionic/utils-subprocess/README.md generated vendored Normal file
View File

@@ -0,0 +1 @@
# @ionic/utils-process

102
node_modules/@ionic/utils-subprocess/dist/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,102 @@
/// <reference types="node" />
import { ChildProcess, ForkOptions, SpawnOptions } from 'child_process';
export declare const ERROR_COMMAND_NOT_FOUND = "ERR_SUBPROCESS_COMMAND_NOT_FOUND";
export declare const ERROR_NON_ZERO_EXIT = "ERR_SUBPROCESS_NON_ZERO_EXIT";
export declare const ERROR_SIGNAL_EXIT = "ERR_SUBPROCESS_SIGNAL_EXIT";
export declare const TILDE_PATH_REGEX: RegExp;
export declare function expandTildePath(p: string): string;
/**
* Prepare the PATH environment variable for use with subprocesses.
*
* If a raw tilde is found in PATH, e.g. `~/.bin`, it is expanded. The raw
* tilde works in Bash, but not in Node's `child_process` outside of a shell.
*
* This is a utility method. You do not need to use it with `Subprocess`.
*
* @param path Defaults to `process.env.PATH`
*/
export declare function convertPATH(path?: string): string;
export declare class SubprocessError extends Error {
readonly name = "SubprocessError";
message: string;
stack: string;
code?: typeof ERROR_COMMAND_NOT_FOUND | typeof ERROR_NON_ZERO_EXIT | typeof ERROR_SIGNAL_EXIT;
error?: Error;
output?: string;
signal?: string;
exitCode?: number;
constructor(message: string);
}
export interface SubprocessOptions extends SpawnOptions {
}
export interface SubprocessBashifyOptions {
/**
* Mask file path to first argument.
*
* The first argument to subprocesses is the program name or path, e.g.
* `/path/to/bin/my-program`. If `true`, `bashify()` will return the program
* name without a file path, e.g. `my-program`.
*
* The default is `true`.
*/
maskArgv0?: boolean;
/**
* Mask file path to second argument.
*
* In some subprocesses, the second argument is a script file to run, e.g.
* `node ./scripts/post-install`. If `true`, `bashify()` will return the
* script name without a file path, e.g. `node post-install`.
*
* The default is `false`.
*/
maskArgv1?: boolean;
/**
* Remove the first argument from output.
*
* Useful to make a command such as `node ./scripts/post-install` appear as
* simply `post-install`.
*
* The default is `false`.
*/
shiftArgv0?: boolean;
}
export declare class Subprocess {
name: string;
args: readonly string[];
protected readonly path?: string;
protected _options: SpawnOptions;
constructor(name: string, args: readonly string[], options?: SubprocessOptions);
get options(): Readonly<SpawnOptions>;
output(): Promise<string>;
combinedOutput(): Promise<string>;
run(): Promise<void> & {
p: ChildProcess;
};
spawn(): ChildProcess;
bashify({ maskArgv0, maskArgv1, shiftArgv0 }?: SubprocessBashifyOptions): string;
bashifyArg(arg: string): string;
maskArg(arg: string): string;
}
export declare function spawn(command: string, args?: readonly string[], options?: SpawnOptions): ChildProcess;
export declare function fork(modulePath: string, args?: readonly string[], options?: ForkOptions & Pick<SpawnOptions, 'stdio'>): ChildProcess;
export interface WhichOptions {
PATH?: string;
PATHEXT?: string;
}
/**
* Find the first instance of a program in PATH.
*
* If `program` contains a path separator, this function will merely return it.
*
* @param program A command name, such as `ionic`
*/
export declare function which(program: string, { PATH, PATHEXT }?: WhichOptions): Promise<string>;
/**
* Find all instances of a program in PATH.
*
* If `program` contains a path separator, this function will merely return it
* inside an array.
*
* @param program A command name, such as `ionic`
*/
export declare function findExecutables(program: string, { PATH, PATHEXT }?: WhichOptions): Promise<string[]>;

227
node_modules/@ionic/utils-subprocess/dist/index.js generated vendored Normal file
View File

@@ -0,0 +1,227 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.findExecutables = exports.which = exports.fork = exports.spawn = exports.Subprocess = exports.SubprocessError = exports.convertPATH = exports.expandTildePath = exports.TILDE_PATH_REGEX = exports.ERROR_SIGNAL_EXIT = exports.ERROR_NON_ZERO_EXIT = exports.ERROR_COMMAND_NOT_FOUND = void 0;
const utils_array_1 = require("@ionic/utils-array");
const utils_fs_1 = require("@ionic/utils-fs");
const utils_process_1 = require("@ionic/utils-process");
const utils_stream_1 = require("@ionic/utils-stream");
const utils_terminal_1 = require("@ionic/utils-terminal");
const child_process_1 = require("child_process");
const crossSpawn = require("cross-spawn");
const os = require("os");
const pathlib = require("path");
exports.ERROR_COMMAND_NOT_FOUND = 'ERR_SUBPROCESS_COMMAND_NOT_FOUND';
exports.ERROR_NON_ZERO_EXIT = 'ERR_SUBPROCESS_NON_ZERO_EXIT';
exports.ERROR_SIGNAL_EXIT = 'ERR_SUBPROCESS_SIGNAL_EXIT';
exports.TILDE_PATH_REGEX = /^~($|\/|\\)/;
function expandTildePath(p) {
const h = os.homedir();
return p.replace(exports.TILDE_PATH_REGEX, `${h}$1`);
}
exports.expandTildePath = expandTildePath;
/**
* Prepare the PATH environment variable for use with subprocesses.
*
* If a raw tilde is found in PATH, e.g. `~/.bin`, it is expanded. The raw
* tilde works in Bash, but not in Node's `child_process` outside of a shell.
*
* This is a utility method. You do not need to use it with `Subprocess`.
*
* @param path Defaults to `process.env.PATH`
*/
function convertPATH(path = process.env.PATH || '') {
return path.split(pathlib.delimiter).map(expandTildePath).join(pathlib.delimiter);
}
exports.convertPATH = convertPATH;
class SubprocessError extends Error {
constructor(message) {
super(message);
this.name = 'SubprocessError';
this.message = message;
this.stack = (new Error()).stack || '';
}
}
exports.SubprocessError = SubprocessError;
class Subprocess {
constructor(name, args, options = {}) {
this.name = name;
this.args = args;
const masked = this.maskArg(name);
if (masked !== name) {
this.name = masked;
this.path = name;
}
this._options = options;
}
get options() {
const opts = this._options;
if (!opts.env) {
opts.env = process.env;
}
const env = utils_process_1.createProcessEnv(opts.env || {}, {
PATH: convertPATH(typeof opts.env.PATH === 'string' ? opts.env.PATH : process.env.PATH),
});
return { ...opts, env };
}
async output() {
this._options.stdio = 'pipe';
const promise = this.run();
const stdoutBuf = new utils_stream_1.WritableStreamBuffer();
const stderrBuf = new utils_stream_1.WritableStreamBuffer();
const combinedBuf = new utils_stream_1.WritableStreamBuffer();
promise.p.stdout.pipe(stdoutBuf);
promise.p.stdout.pipe(combinedBuf);
promise.p.stderr.pipe(stderrBuf);
promise.p.stderr.pipe(combinedBuf);
try {
await promise;
}
catch (e) {
stdoutBuf.end();
stderrBuf.end();
e.output = combinedBuf.consume().toString();
throw e;
}
stderrBuf.end();
combinedBuf.end();
return stdoutBuf.consume().toString();
}
async combinedOutput() {
this._options.stdio = 'pipe';
const promise = this.run();
const buf = new utils_stream_1.WritableStreamBuffer();
promise.p.stdout.pipe(buf);
promise.p.stderr.pipe(buf);
try {
await promise;
}
catch (e) {
e.output = buf.consume().toString();
throw e;
}
return buf.consume().toString();
}
run() {
const p = this.spawn();
const promise = new Promise((resolve, reject) => {
p.on('error', (error) => {
let err;
if (error.code === 'ENOENT') {
err = new SubprocessError('Command not found.');
err.code = exports.ERROR_COMMAND_NOT_FOUND;
}
else {
err = new SubprocessError('Command error.');
}
err.error = error;
reject(err);
});
p.on('close', (code, signal) => {
let err;
if (code === 0) {
return resolve();
}
if (signal) {
err = new SubprocessError('Signal exit from subprocess.');
err.code = exports.ERROR_SIGNAL_EXIT;
err.signal = signal;
}
else {
err = new SubprocessError('Non-zero exit from subprocess.');
err.code = exports.ERROR_NON_ZERO_EXIT;
err.exitCode = code;
}
reject(err);
});
});
Object.defineProperties(promise, {
p: { value: p },
});
return promise;
}
spawn() {
return spawn(this.path ? this.path : this.name, this.args, this.options);
}
bashify({ maskArgv0 = true, maskArgv1 = false, shiftArgv0 = false } = {}) {
const args = [this.path ? this.path : this.name, ...this.args];
if (shiftArgv0) {
args.shift();
}
if (args[0] && maskArgv0) {
args[0] = this.maskArg(args[0]);
}
if (args[1] && maskArgv1) {
args[1] = this.maskArg(args[1]);
}
return args.length > 0
? args.map(arg => this.bashifyArg(arg)).join(' ')
: '';
}
bashifyArg(arg) {
return arg.includes(' ') ? `"${arg.replace(/\"/g, '\\"')}"` : arg;
}
maskArg(arg) {
const i = arg.lastIndexOf(pathlib.sep);
return i >= 0 ? arg.substring(i + 1) : arg;
}
}
exports.Subprocess = Subprocess;
function spawn(command, args = [], options) {
return crossSpawn(command, [...args], options);
}
exports.spawn = spawn;
function fork(modulePath, args = [], options = {}) {
return child_process_1.fork(modulePath, [...args], options);
}
exports.fork = fork;
const DEFAULT_PATHEXT = utils_terminal_1.TERMINAL_INFO.windows ? '.COM;.EXE;.BAT;.CMD' : undefined;
/**
* Find the first instance of a program in PATH.
*
* If `program` contains a path separator, this function will merely return it.
*
* @param program A command name, such as `ionic`
*/
async function which(program, { PATH = process.env.PATH, PATHEXT = process.env.PATHEXT || DEFAULT_PATHEXT } = {}) {
if (program.includes(pathlib.sep)) {
return program;
}
const results = await _findExecutables(program, { PATH });
if (!results.length) {
const err = new Error(`${program} cannot be found within PATH`);
err.code = 'ENOENT';
throw err;
}
return results[0];
}
exports.which = which;
/**
* Find all instances of a program in PATH.
*
* If `program` contains a path separator, this function will merely return it
* inside an array.
*
* @param program A command name, such as `ionic`
*/
async function findExecutables(program, { PATH = process.env.PATH, PATHEXT = process.env.PATHEXT || DEFAULT_PATHEXT } = {}) {
if (program.includes(pathlib.sep)) {
return [program];
}
return _findExecutables(program, { PATH });
}
exports.findExecutables = findExecutables;
async function _findExecutables(program, { PATH = process.env.PATH, PATHEXT = process.env.PATHEXT || DEFAULT_PATHEXT } = {}) {
const pathParts = utils_process_1.getPathParts(PATH);
let programNames;
// if windows, cycle through all possible executable extensions
// ex: node.exe, npm.cmd, etc.
if (utils_terminal_1.TERMINAL_INFO.windows) {
const exts = utils_process_1.getPathParts(PATHEXT).map(ext => ext.toLowerCase());
// don't append extensions if one has already been provided
programNames = exts.includes(pathlib.extname(program).toLowerCase()) ? [program] : exts.map(ext => program + ext);
}
else {
programNames = [program];
}
return [].concat(...await utils_array_1.map(programNames, async (programName) => utils_array_1.concurrentFilter(pathParts.map(p => pathlib.join(p, programName)), async (p) => utils_fs_1.isExecutableFile(p))));
}

View File

@@ -0,0 +1,310 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.1.6](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@3.1.5...@ionic/utils-fs@3.1.6) (2022-06-16)
**Note:** Version bump only for package @ionic/utils-fs
## [3.1.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@3.1.4...@ionic/utils-fs@3.1.5) (2020-08-28)
**Note:** Version bump only for package @ionic/utils-fs
## [3.1.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@3.1.3...@ionic/utils-fs@3.1.4) (2020-08-25)
**Note:** Version bump only for package @ionic/utils-fs
## [3.1.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@3.1.2...@ionic/utils-fs@3.1.3) (2020-05-12)
### Bug Fixes
* pin tslib to avoid "Cannot set property pathExists" error ([689e1f0](https://github.com/ionic-team/ionic-cli/commit/689e1f038b907356ef855a067a76d4822e7072a8))
## [3.1.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@3.1.1...@ionic/utils-fs@3.1.2) (2020-05-06)
**Note:** Version bump only for package @ionic/utils-fs
## [3.1.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@3.1.0...@ionic/utils-fs@3.1.1) (2020-03-03)
**Note:** Version bump only for package @ionic/utils-fs
# 3.1.0 (2020-02-11)
### Features
* **start:** add new list starter option ([#4315](https://github.com/ionic-team/ionic-cli/issues/4315)) ([1df44c1](https://github.com/ionic-team/ionic-cli/commit/1df44c1591f37b89f2b672857740edd6cb2aea67))
## [3.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@3.0.1...@ionic/utils-fs@3.0.2) (2020-02-10)
**Note:** Version bump only for package @ionic/utils-fs
## [3.0.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@3.0.0...@ionic/utils-fs@3.0.1) (2020-02-03)
**Note:** Version bump only for package @ionic/utils-fs
# [3.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.9...@ionic/utils-fs@3.0.0) (2020-01-25)
### chore
* require Node 10 ([5a47874](https://github.com/ionic-team/ionic-cli/commit/5a478746c074207b6dc96aa8771f04a606deb1ef))
### BREAKING CHANGES
* A minimum of Node.js 10.3.0 is required.
## [2.0.9](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.8...@ionic/utils-fs@2.0.9) (2019-12-05)
**Note:** Version bump only for package @ionic/utils-fs
## [2.0.8](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.7...@ionic/utils-fs@2.0.8) (2019-10-14)
### Bug Fixes
* **fileToString:** handle ENOTDIR errors ([fab07d8](https://github.com/ionic-team/ionic-cli/commit/fab07d8c6e3d6756d633ada4c81165d11c70eb8f))
## [2.0.7](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.6...@ionic/utils-fs@2.0.7) (2019-09-18)
**Note:** Version bump only for package @ionic/utils-fs
## [2.0.6](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.5...@ionic/utils-fs@2.0.6) (2019-08-23)
**Note:** Version bump only for package @ionic/utils-fs
## [2.0.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.4...@ionic/utils-fs@2.0.5) (2019-08-14)
**Note:** Version bump only for package @ionic/utils-fs
## [2.0.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.3...@ionic/utils-fs@2.0.4) (2019-08-07)
**Note:** Version bump only for package @ionic/utils-fs
## [2.0.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.2...@ionic/utils-fs@2.0.3) (2019-06-28)
**Note:** Version bump only for package @ionic/utils-fs
## [2.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.1...@ionic/utils-fs@2.0.2) (2019-06-10)
**Note:** Version bump only for package @ionic/utils-fs
## [2.0.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@2.0.0...@ionic/utils-fs@2.0.1) (2019-06-05)
**Note:** Version bump only for package @ionic/utils-fs
# [2.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@1.2.0...@ionic/utils-fs@2.0.0) (2019-05-29)
### chore
* require Node 8 ([5670e68](https://github.com/ionic-team/ionic-cli/commit/5670e68))
### BREAKING CHANGES
* A minimum of Node.js 8.9.4 is required.
<a name="1.2.0"></a>
# [1.2.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@1.1.1...@ionic/utils-fs@1.2.0) (2019-03-06)
### Features
* **fs:** add `isExecutableFile` utility ([53d9626](https://github.com/ionic-team/ionic-cli/commit/53d9626))
* **fs:** add `pathReadable`, `pathWritable`, and `pathExecutable` ([5412791](https://github.com/ionic-team/ionic-cli/commit/5412791))
<a name="1.1.1"></a>
## [1.1.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@1.1.0...@ionic/utils-fs@1.1.1) (2019-02-27)
**Note:** Version bump only for package @ionic/utils-fs
<a name="1.1.0"></a>
# [1.1.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@1.0.0...@ionic/utils-fs@1.1.0) (2019-02-15)
### Bug Fixes
* **walk:** stat symlinks themselves while walking ([92f2cee](https://github.com/ionic-team/ionic-cli/commit/92f2cee))
### Features
* **fs:** `onError` option for `readdirp` and `getFileTree` ([90bcfcd](https://github.com/ionic-team/ionic-cli/commit/90bcfcd))
* **fs:** `onFileNode` and `onDirectoryNode` options for `getFileTree` ([1858e96](https://github.com/ionic-team/ionic-cli/commit/1858e96))
* **fs:** add `getFileTree` for creating file tree object structures ([c14b46b](https://github.com/ionic-team/ionic-cli/commit/c14b46b))
<a name="1.0.0"></a>
# [1.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@0.0.7...@ionic/utils-fs@1.0.0) (2019-01-08)
### Bug Fixes
* rimraf is a full dependency ([962ad94](https://github.com/ionic-team/ionic-cli/commit/962ad94))
### Features
* switch to fs-extra ([c17d8d8](https://github.com/ionic-team/ionic-cli/commit/c17d8d8))
### BREAKING CHANGES
* `readDir`, `readDirp`, `readDirSafe` were renamed to be
consistent with fs and fs-extra. `readJsonFile` and `writeJsonFile` have
been renamed to `readJson` and `writeJson` and use the fs-extra version
directly. `isDir` was removed (use stat). `copyFile` and `copyDirectory`
were removed (use `copy`). `removeDirectory` was removed (use `remove`).
<a name="0.0.7"></a>
## [0.0.7](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@0.0.6...@ionic/utils-fs@0.0.7) (2019-01-07)
**Note:** Version bump only for package @ionic/utils-fs
<a name="0.0.6"></a>
## [0.0.6](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@0.0.5...@ionic/utils-fs@0.0.6) (2018-12-19)
**Note:** Version bump only for package @ionic/utils-fs
<a name="0.0.5"></a>
## [0.0.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@0.0.4...@ionic/utils-fs@0.0.5) (2018-11-20)
**Note:** Version bump only for package @ionic/utils-fs
<a name="0.0.4"></a>
## [0.0.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@0.0.3...@ionic/utils-fs@0.0.4) (2018-10-31)
**Note:** Version bump only for package @ionic/utils-fs
<a name="0.0.3"></a>
## [0.0.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@0.0.2...@ionic/utils-fs@0.0.3) (2018-10-05)
**Note:** Version bump only for package @ionic/utils-fs
<a name="0.0.2"></a>
## [0.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-fs@0.0.1...@ionic/utils-fs@0.0.2) (2018-10-03)
**Note:** Version bump only for package @ionic/utils-fs
<a name="0.0.1"></a>
## 0.0.1 (2018-09-05)
**Note:** Version bump only for package @ionic/utils-fs
# Change Log

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2017 Drifty Co
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.

View File

@@ -0,0 +1 @@
# @ionic/utils-fs

View File

@@ -0,0 +1,146 @@
/// <reference types="node" />
import * as fs from 'fs-extra';
import * as stream from 'stream';
export * from 'fs-extra';
export { stat as statSafe, readdir as readdirSafe } from './safe';
export interface ReaddirPOptions {
/**
* Filter out items from the walk process from the final result.
*
* @return `true` to keep, otherwise the item is filtered out
*/
readonly filter?: (item: WalkerItem) => boolean;
/**
* Called whenever an error occurs during the walk process.
*
* If excluded, the function will throw an error when first encountered.
*/
readonly onError?: (err: Error) => void;
readonly walkerOptions?: WalkerOptions;
}
export declare function readdirp(dir: string, { filter, onError, walkerOptions }?: ReaddirPOptions): Promise<string[]>;
export declare const enum FileType {
FILE = "file",
DIRECTORY = "directory"
}
export interface RegularFileNode {
path: string;
type: FileType.FILE;
parent: FileNode;
}
export interface DirectoryNode {
path: string;
type: FileType.DIRECTORY;
parent?: FileNode;
children: FileNode[];
}
export declare type FileNode = RegularFileNode | DirectoryNode;
export interface GetFileTreeOptions<RE = {}, DE = {}> {
/**
* Called whenever an error occurs during the walk process.
*
* If excluded, the function will throw an error when first encountered.
*/
readonly onError?: (err: Error) => void;
/**
* Called whenever a file node is added to the tree.
*
* File nodes can be supplemented by returning a new object from this
* function.
*/
readonly onFileNode?: (node: RegularFileNode) => RegularFileNode & RE;
/**
* Called whenever a directory node is added to the tree.
*
* Directory nodes can be supplemented by returning a new object from this
* function.
*/
readonly onDirectoryNode?: (node: DirectoryNode) => DirectoryNode & DE;
readonly walkerOptions?: WalkerOptions;
}
/**
* Compile and return a file tree structure.
*
* This function walks a directory structure recursively, building a nested
* object structure in memory that represents it. When finished, the root
* directory node is returned.
*
* @param dir The root directory from which to compile the file tree
*/
export declare function getFileTree<RE = {}, DE = {}>(dir: string, { onError, onFileNode, onDirectoryNode, walkerOptions }?: GetFileTreeOptions<RE, DE>): Promise<RegularFileNode & RE | DirectoryNode & DE>;
export declare function fileToString(filePath: string): Promise<string>;
export declare function getFileChecksum(filePath: string): Promise<string>;
/**
* Return true and cached checksums for a file by its path.
*
* Cached checksums are stored as `.md5` files next to the original file. If
* the cache file is missing, the cached checksum is undefined.
*
* @param p The file path
* @return Promise<[true checksum, cached checksum or undefined if cache file missing]>
*/
export declare function getFileChecksums(p: string): Promise<[string, string | undefined]>;
/**
* Store a cache file containing the source file's md5 checksum hash.
*
* @param p The file path
* @param checksum The checksum. If excluded, the checksum is computed
*/
export declare function cacheFileChecksum(p: string, checksum?: string): Promise<void>;
export declare function writeStreamToFile(stream: NodeJS.ReadableStream, destination: string): Promise<any>;
export declare function pathAccessible(filePath: string, mode: number): Promise<boolean>;
export declare function pathExists(filePath: string): Promise<boolean>;
export declare function pathReadable(filePath: string): Promise<boolean>;
export declare function pathWritable(filePath: string): Promise<boolean>;
export declare function pathExecutable(filePath: string): Promise<boolean>;
export declare function isExecutableFile(filePath: string): Promise<boolean>;
/**
* Find the base directory based on the path given and a marker file to look for.
*/
export declare function findBaseDirectory(dir: string, file: string): Promise<string | undefined>;
/**
* Generate a random file path within the computer's temporary directory.
*
* @param prefix Optionally provide a filename prefix.
*/
export declare function tmpfilepath(prefix?: string): string;
/**
* Given an absolute system path, compile an array of paths working backwards
* one directory at a time, always ending in the root directory.
*
* For example, `'/some/dir'` => `['/some/dir', '/some', '/']`
*
* @param filePath Absolute system base path.
*/
export declare function compilePaths(filePath: string): string[];
export interface WalkerItem {
path: string;
stats: fs.Stats;
}
export interface WalkerOptions {
/**
* Filter out file paths during walk.
*
* As the file tree is walked, this function can be used to exclude files and
* directories from the final result.
*
* It can also be used to tune performance. If a subdirectory is excluded, it
* is not walked.
*
* @param p The file path.
* @return `true` to include file path, otherwise it is excluded
*/
readonly pathFilter?: (p: string) => boolean;
}
export interface Walker extends stream.Readable {
on(event: 'data', callback: (item: WalkerItem) => void): this;
on(event: string, callback: (...args: any[]) => any): this;
}
export declare class Walker extends stream.Readable {
readonly p: string;
readonly options: WalkerOptions;
readonly paths: string[];
constructor(p: string, options?: WalkerOptions);
_read(): void;
}
export declare function walk(p: string, options?: WalkerOptions): Walker;

View File

@@ -0,0 +1,286 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.walk = exports.Walker = exports.compilePaths = exports.tmpfilepath = exports.findBaseDirectory = exports.isExecutableFile = exports.pathExecutable = exports.pathWritable = exports.pathReadable = exports.pathExists = exports.pathAccessible = exports.writeStreamToFile = exports.cacheFileChecksum = exports.getFileChecksums = exports.getFileChecksum = exports.fileToString = exports.getFileTree = exports.readdirp = exports.readdirSafe = exports.statSafe = void 0;
const tslib_1 = require("tslib");
const fs = require("fs-extra");
const os = require("os");
const path = require("path");
const stream = require("stream");
const safe = require("./safe");
tslib_1.__exportStar(require("fs-extra"), exports);
var safe_1 = require("./safe");
Object.defineProperty(exports, "statSafe", { enumerable: true, get: function () { return safe_1.stat; } });
Object.defineProperty(exports, "readdirSafe", { enumerable: true, get: function () { return safe_1.readdir; } });
async function readdirp(dir, { filter, onError, walkerOptions } = {}) {
return new Promise((resolve, reject) => {
const items = [];
let rs = walk(dir, walkerOptions);
if (filter) {
rs = rs.pipe(new stream.Transform({
objectMode: true,
transform(obj, enc, cb) {
if (!filter || filter(obj)) {
this.push(obj);
}
cb();
},
}));
}
rs
.on('error', (err) => onError ? onError(err) : reject(err))
.on('data', (item) => items.push(item.path))
.on('end', () => resolve(items));
});
}
exports.readdirp = readdirp;
/**
* Compile and return a file tree structure.
*
* This function walks a directory structure recursively, building a nested
* object structure in memory that represents it. When finished, the root
* directory node is returned.
*
* @param dir The root directory from which to compile the file tree
*/
async function getFileTree(dir, { onError, onFileNode = n => n, onDirectoryNode = n => n, walkerOptions } = {}) {
const fileMap = new Map([]);
const getOrCreateParent = (item) => {
const parentPath = path.dirname(item.path);
const parent = fileMap.get(parentPath);
if (parent && parent.type === "directory" /* DIRECTORY */) {
return parent;
}
return onDirectoryNode({ path: parentPath, type: "directory" /* DIRECTORY */, children: [] });
};
const createFileNode = (item, parent) => {
const node = { path: item.path, parent };
return item.stats.isDirectory() ?
onDirectoryNode({ ...node, type: "directory" /* DIRECTORY */, children: [] }) :
onFileNode({ ...node, type: "file" /* FILE */ });
};
return new Promise((resolve, reject) => {
dir = path.resolve(dir);
const rs = walk(dir, walkerOptions);
rs
.on('error', err => onError ? onError(err) : reject(err))
.on('data', item => {
const parent = getOrCreateParent(item);
const node = createFileNode(item, parent);
parent.children.push(node);
fileMap.set(item.path, node);
fileMap.set(parent.path, parent);
})
.on('end', () => {
const root = fileMap.get(dir);
if (!root) {
return reject(new Error('No root node found after walking directory structure.'));
}
delete root.parent;
resolve(root);
});
});
}
exports.getFileTree = getFileTree;
async function fileToString(filePath) {
try {
return await fs.readFile(filePath, { encoding: 'utf8' });
}
catch (e) {
if (e.code === 'ENOENT' || e.code === 'ENOTDIR') {
return '';
}
throw e;
}
}
exports.fileToString = fileToString;
async function getFileChecksum(filePath) {
const crypto = await Promise.resolve().then(() => require('crypto'));
return new Promise((resolve, reject) => {
const hash = crypto.createHash('md5');
const input = fs.createReadStream(filePath);
input.on('error', (err) => {
reject(err);
});
hash.once('readable', () => {
const fullChecksum = hash.read().toString('hex');
resolve(fullChecksum);
});
input.pipe(hash);
});
}
exports.getFileChecksum = getFileChecksum;
/**
* Return true and cached checksums for a file by its path.
*
* Cached checksums are stored as `.md5` files next to the original file. If
* the cache file is missing, the cached checksum is undefined.
*
* @param p The file path
* @return Promise<[true checksum, cached checksum or undefined if cache file missing]>
*/
async function getFileChecksums(p) {
return Promise.all([
getFileChecksum(p),
(async () => {
try {
const md5 = await fs.readFile(`${p}.md5`, { encoding: 'utf8' });
return md5.trim();
}
catch (e) {
if (e.code !== 'ENOENT') {
throw e;
}
}
})(),
]);
}
exports.getFileChecksums = getFileChecksums;
/**
* Store a cache file containing the source file's md5 checksum hash.
*
* @param p The file path
* @param checksum The checksum. If excluded, the checksum is computed
*/
async function cacheFileChecksum(p, checksum) {
const md5 = await getFileChecksum(p);
await fs.writeFile(`${p}.md5`, md5, { encoding: 'utf8' });
}
exports.cacheFileChecksum = cacheFileChecksum;
function writeStreamToFile(stream, destination) {
return new Promise((resolve, reject) => {
const dest = fs.createWriteStream(destination);
stream.pipe(dest);
dest.on('error', reject);
dest.on('finish', resolve);
});
}
exports.writeStreamToFile = writeStreamToFile;
async function pathAccessible(filePath, mode) {
try {
await fs.access(filePath, mode);
}
catch (e) {
return false;
}
return true;
}
exports.pathAccessible = pathAccessible;
async function pathExists(filePath) {
return pathAccessible(filePath, fs.constants.F_OK);
}
exports.pathExists = pathExists;
async function pathReadable(filePath) {
return pathAccessible(filePath, fs.constants.R_OK);
}
exports.pathReadable = pathReadable;
async function pathWritable(filePath) {
return pathAccessible(filePath, fs.constants.W_OK);
}
exports.pathWritable = pathWritable;
async function pathExecutable(filePath) {
return pathAccessible(filePath, fs.constants.X_OK);
}
exports.pathExecutable = pathExecutable;
async function isExecutableFile(filePath) {
const [stats, executable] = await (Promise.all([
safe.stat(filePath),
pathExecutable(filePath),
]));
return !!stats && (stats.isFile() || stats.isSymbolicLink()) && executable;
}
exports.isExecutableFile = isExecutableFile;
/**
* Find the base directory based on the path given and a marker file to look for.
*/
async function findBaseDirectory(dir, file) {
if (!dir || !file) {
return;
}
for (const d of compilePaths(dir)) {
const results = await safe.readdir(d);
if (results.includes(file)) {
return d;
}
}
}
exports.findBaseDirectory = findBaseDirectory;
/**
* Generate a random file path within the computer's temporary directory.
*
* @param prefix Optionally provide a filename prefix.
*/
function tmpfilepath(prefix) {
const rn = Math.random().toString(16).substring(2, 8);
const p = path.resolve(os.tmpdir(), prefix ? `${prefix}-${rn}` : rn);
return p;
}
exports.tmpfilepath = tmpfilepath;
/**
* Given an absolute system path, compile an array of paths working backwards
* one directory at a time, always ending in the root directory.
*
* For example, `'/some/dir'` => `['/some/dir', '/some', '/']`
*
* @param filePath Absolute system base path.
*/
function compilePaths(filePath) {
filePath = path.normalize(filePath);
if (!path.isAbsolute(filePath)) {
throw new Error(`${filePath} is not an absolute path`);
}
const parsed = path.parse(filePath);
if (filePath === parsed.root) {
return [filePath];
}
return filePath
.slice(parsed.root.length)
.split(path.sep)
.map((segment, i, array) => parsed.root + path.join(...array.slice(0, array.length - i)))
.concat(parsed.root);
}
exports.compilePaths = compilePaths;
class Walker extends stream.Readable {
constructor(p, options = {}) {
super({ objectMode: true });
this.p = p;
this.options = options;
this.paths = [this.p];
}
_read() {
const p = this.paths.shift();
const { pathFilter } = this.options;
if (!p) {
this.push(null);
return;
}
fs.lstat(p, (err, stats) => {
if (err) {
this.emit('error', err);
return;
}
const item = { path: p, stats };
if (stats.isDirectory()) {
fs.readdir(p, (err, contents) => {
if (err) {
this.emit('error', err);
return;
}
let paths = contents.map(file => path.join(p, file));
if (pathFilter) {
paths = paths.filter(p => pathFilter(p.substring(this.p.length + 1)));
}
this.paths.push(...paths);
this.push(item);
});
}
else {
this.push(item);
}
});
}
}
exports.Walker = Walker;
function walk(p, options = {}) {
return new Walker(p, options);
}
exports.walk = walk;

View File

@@ -0,0 +1,4 @@
/// <reference types="node" />
import * as fs from 'fs-extra';
export declare function stat(p: string): Promise<fs.Stats | undefined>;
export declare function readdir(dir: string): Promise<string[]>;

View File

@@ -0,0 +1,22 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.readdir = exports.stat = void 0;
const fs = require("fs-extra");
async function stat(p) {
try {
return await fs.stat(p);
}
catch (e) {
// ignore
}
}
exports.stat = stat;
async function readdir(dir) {
try {
return await fs.readdir(dir);
}
catch (e) {
return [];
}
}
exports.readdir = readdir;

View File

@@ -0,0 +1,51 @@
{
"name": "@ionic/utils-fs",
"version": "3.1.6",
"description": "Filesystem utils for Node",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"homepage": "https://ionicframework.com/",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
"license": "MIT",
"engines": {
"node": ">=10.3.0"
},
"files": [
"dist/",
"LICENSE",
"README.md"
],
"repository": {
"type": "git",
"url": "https://github.com/ionic-team/ionic-cli.git"
},
"bugs": {
"url": "https://github.com/ionic-team/ionic-cli/issues"
},
"scripts": {
"clean": "rimraf dist",
"lint": "true",
"build": "npm run clean && tsc",
"watch": "tsc -w --preserveWatchOutput",
"test": "jest --maxWorkers=4",
"prepublishOnly": "npm run build"
},
"dependencies": {
"@types/fs-extra": "^8.0.0",
"debug": "^4.0.0",
"fs-extra": "^9.0.0",
"tslib": "^2.0.1"
},
"devDependencies": {
"@types/debug": "^4.1.1",
"@types/jest": "^26.0.10",
"@types/node": "~10.17.13",
"jest": "^26.4.2",
"jest-cli": "^26.0.1",
"lint-staged": "^10.0.2",
"rimraf": "^3.0.0",
"ts-jest": "~26.3.0",
"typescript": "~4.0.2"
},
"gitHead": "f090194e755912d7b8e659f4323c5c2804115c81"
}

View File

@@ -0,0 +1,244 @@
# Change Log
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.3.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.3.2...@ionic/utils-terminal@2.3.3) (2022-06-16)
**Note:** Version bump only for package @ionic/utils-terminal
## [2.3.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.3.1...@ionic/utils-terminal@2.3.2) (2022-05-09)
**Note:** Version bump only for package @ionic/utils-terminal
## [2.3.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.3.0...@ionic/utils-terminal@2.3.1) (2020-09-29)
### Bug Fixes
* add signal-exit dependency in correct place ([178e5e5](https://github.com/ionic-team/ionic-cli/commit/178e5e51cdc3593e3d096a5197e1dc0e17292bbd))
# [2.3.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.2.1...@ionic/utils-terminal@2.3.0) (2020-09-24)
### Features
* **format:** add more formatting utilities ([d30f099](https://github.com/ionic-team/ionic-cli/commit/d30f099f50df18816fb1d3064c434f1b318518a2))
* **format:** terminal prose formatting utils ([8912348](https://github.com/ionic-team/ionic-cli/commit/8912348ca348ae6192ddfff1af88f9c9443d205d))
## [2.2.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.2.0...@ionic/utils-terminal@2.2.1) (2020-08-28)
**Note:** Version bump only for package @ionic/utils-terminal
# [2.2.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.1.4...@ionic/utils-terminal@2.2.0) (2020-08-27)
### Features
* add some ansi escape codes + cursor wrapper ([edbdb57](https://github.com/ionic-team/ionic-cli/commit/edbdb572bfe2fb5710eff7e49a483c86601ba425))
## [2.1.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.1.3...@ionic/utils-terminal@2.1.4) (2020-08-25)
**Note:** Version bump only for package @ionic/utils-terminal
## [2.1.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.1.2...@ionic/utils-terminal@2.1.3) (2020-05-12)
### Bug Fixes
* pin tslib to avoid "Cannot set property pathExists" error ([689e1f0](https://github.com/ionic-team/ionic-cli/commit/689e1f038b907356ef855a067a76d4822e7072a8))
## [2.1.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.1.1...@ionic/utils-terminal@2.1.2) (2020-05-06)
**Note:** Version bump only for package @ionic/utils-terminal
## [2.1.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.1.0...@ionic/utils-terminal@2.1.1) (2020-03-03)
**Note:** Version bump only for package @ionic/utils-terminal
# 2.1.0 (2020-02-11)
### Features
* **start:** add new list starter option ([#4315](https://github.com/ionic-team/ionic-cli/issues/4315)) ([1df44c1](https://github.com/ionic-team/ionic-cli/commit/1df44c1591f37b89f2b672857740edd6cb2aea67))
## [2.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.0.1...@ionic/utils-terminal@2.0.2) (2020-02-10)
**Note:** Version bump only for package @ionic/utils-terminal
## [2.0.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@2.0.0...@ionic/utils-terminal@2.0.1) (2020-02-03)
**Note:** Version bump only for package @ionic/utils-terminal
# [2.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@1.1.2...@ionic/utils-terminal@2.0.0) (2020-01-25)
### chore
* require Node 10 ([5a47874](https://github.com/ionic-team/ionic-cli/commit/5a478746c074207b6dc96aa8771f04a606deb1ef))
### BREAKING CHANGES
* A minimum of Node.js 10.3.0 is required.
## [1.1.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@1.1.1...@ionic/utils-terminal@1.1.2) (2019-12-10)
### Bug Fixes
* **windows:** do not check TERM for windows detection ([ac4b417](https://github.com/ionic-team/ionic-cli/commit/ac4b417385c0c7859674e2ba59e495e9abc5bce4))
## [1.1.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@1.1.0...@ionic/utils-terminal@1.1.1) (2019-12-05)
**Note:** Version bump only for package @ionic/utils-terminal
# [1.1.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@1.0.5...@ionic/utils-terminal@1.1.0) (2019-11-21)
### Bug Fixes
* **shell:** use shell from NodeJS if available ([53d0afa](https://github.com/ionic-team/ionic-cli/commit/53d0afaea8966f7742220896a98da570c706fb63))
### Features
* **ci:** support GitHub Actions detection ([5646c8e](https://github.com/ionic-team/ionic-cli/commit/5646c8e083862dbf976cd6cdecabe209c0ad8cfd))
## [1.0.5](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@1.0.4...@ionic/utils-terminal@1.0.5) (2019-09-18)
**Note:** Version bump only for package @ionic/utils-terminal
## [1.0.4](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@1.0.3...@ionic/utils-terminal@1.0.4) (2019-08-23)
**Note:** Version bump only for package @ionic/utils-terminal
## [1.0.3](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@1.0.2...@ionic/utils-terminal@1.0.3) (2019-08-14)
**Note:** Version bump only for package @ionic/utils-terminal
## [1.0.2](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@1.0.1...@ionic/utils-terminal@1.0.2) (2019-08-07)
**Note:** Version bump only for package @ionic/utils-terminal
## [1.0.1](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@1.0.0...@ionic/utils-terminal@1.0.1) (2019-06-05)
**Note:** Version bump only for package @ionic/utils-terminal
# [1.0.0](https://github.com/ionic-team/ionic-cli/compare/@ionic/utils-terminal@0.0.1...@ionic/utils-terminal@1.0.0) (2019-05-29)
### chore
* require Node 8 ([5670e68](https://github.com/ionic-team/ionic-cli/commit/5670e68))
### Features
* include path to shell in terminal info ([79480b9](https://github.com/ionic-team/ionic-cli/commit/79480b9))
### BREAKING CHANGES
* A minimum of Node.js 8.9.4 is required.
<a name="0.0.1"></a>
## 0.0.1 (2019-02-27)
**Note:** Version bump only for package @ionic/utils-terminal

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2017 Drifty Co
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.

View File

@@ -0,0 +1 @@
# @ionic/utils-terminal

View File

@@ -0,0 +1,19 @@
/**
* ANSI escape codes (WIP)
*
* @see https://en.wikipedia.org/wiki/ANSI_escape_code
*/
export declare class EscapeCode {
static readonly cursorLeft: () => string;
static readonly cursorUp: (count?: number) => string;
static readonly cursorDown: (count?: number) => string;
static readonly cursorForward: (count?: number) => string;
static readonly cursorBackward: (count?: number) => string;
static readonly cursorHide: () => string;
static readonly cursorShow: () => string;
static readonly eraseLine: () => string;
static readonly eraseLines: (count: number) => string;
static readonly eraseUp: () => string;
static readonly eraseDown: () => string;
static readonly eraseScreen: () => string;
}

View File

@@ -0,0 +1,33 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.EscapeCode = void 0;
const ESC = '\u001B[';
/**
* ANSI escape codes (WIP)
*
* @see https://en.wikipedia.org/wiki/ANSI_escape_code
*/
class EscapeCode {
}
exports.EscapeCode = EscapeCode;
EscapeCode.cursorLeft = () => `${ESC}G`;
EscapeCode.cursorUp = (count = 1) => `${ESC}${count}A`;
EscapeCode.cursorDown = (count = 1) => `${ESC}${count}B`;
EscapeCode.cursorForward = (count = 1) => `${ESC}${count}C`;
EscapeCode.cursorBackward = (count = 1) => `${ESC}${count}D`;
EscapeCode.cursorHide = () => `${ESC}?25l`;
EscapeCode.cursorShow = () => `${ESC}?25h`;
EscapeCode.eraseLine = () => `${ESC}2K`;
EscapeCode.eraseLines = (count) => {
let seq = '';
for (let i = 0; i < count; i++) {
seq += EscapeCode.eraseLine();
if (i < count - 1) {
seq += EscapeCode.cursorUp();
}
}
return `${seq}${EscapeCode.cursorLeft()}`;
};
EscapeCode.eraseUp = () => `${ESC}1J`;
EscapeCode.eraseDown = () => `${ESC}J`;
EscapeCode.eraseScreen = () => `${ESC}2J`;

View File

@@ -0,0 +1,9 @@
/// <reference types="node" />
export declare class Cursor {
static stream: NodeJS.WriteStream;
private static _isVisible;
private static _listenerAttached;
static show(): void;
static hide(): void;
static toggle(): void;
}

View File

@@ -0,0 +1,37 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Cursor = void 0;
const onExit = require("signal-exit");
const ansi_1 = require("./ansi");
class Cursor {
static show() {
if (Cursor.stream.isTTY) {
Cursor._isVisible = true;
Cursor.stream.write(ansi_1.EscapeCode.cursorShow());
}
}
static hide() {
if (Cursor.stream.isTTY) {
if (!Cursor._listenerAttached) {
onExit(() => {
Cursor.show();
});
Cursor._listenerAttached = true;
}
Cursor._isVisible = false;
Cursor.stream.write(ansi_1.EscapeCode.cursorHide());
}
}
static toggle() {
if (Cursor._isVisible) {
Cursor.hide();
}
else {
Cursor.show();
}
}
}
exports.Cursor = Cursor;
Cursor.stream = process.stderr;
Cursor._isVisible = true;
Cursor._listenerAttached = false;

View File

@@ -0,0 +1,35 @@
import sliceAnsi = require('slice-ansi');
import stringWidth = require('string-width');
import stripAnsi = require('strip-ansi');
export { sliceAnsi, stringWidth, stripAnsi };
export declare const TTY_WIDTH: number;
export declare function indent(n?: number): string;
export interface WordWrapOptions {
width?: number;
indentation?: number;
append?: string;
}
export declare function wordWrap(msg: string, { width, indentation, append }: WordWrapOptions): string;
export declare function prettyPath(p: string): string;
export declare function expandPath(p: string): string;
export declare function generateFillSpaceStringList(list: string[], optimalLength?: number, fillCharacter?: string): string[];
export interface ColumnarOptions {
hsep?: string;
vsep?: string;
headers?: string[];
}
/**
* Basic CLI table generator with support for ANSI colors.
*
* @param rows 2-dimensional matrix containing cells. An array of columns,
* which are arrays of cells.
* @param options.vsep The vertical separator character, default is
* `chalk.dim('|')`. Supply an empty string to hide
* the separator altogether.
* @param options.hsep The horizontal separator character, default is
* `chalk.dim('-')`. This is used under the headers,
* if supplied. Supply an empty string to hide the
* separator altogether.
* @param options.headers An array of header cells.
*/
export declare function columnar(rows: string[][], { hsep, vsep, headers }: ColumnarOptions): string;

View File

@@ -0,0 +1,122 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.columnar = exports.generateFillSpaceStringList = exports.expandPath = exports.prettyPath = exports.wordWrap = exports.indent = exports.TTY_WIDTH = exports.stripAnsi = exports.stringWidth = exports.sliceAnsi = void 0;
const os = require("os");
const path = require("path");
const sliceAnsi = require("slice-ansi");
exports.sliceAnsi = sliceAnsi;
const stringWidth = require("string-width");
exports.stringWidth = stringWidth;
const stripAnsi = require("strip-ansi");
exports.stripAnsi = stripAnsi;
const wrapAnsi = require("wrap-ansi");
const untildify = require("untildify");
const MIN_TTY_WIDTH = 80;
const MAX_TTY_WIDTH = 120;
exports.TTY_WIDTH = process.stdout.columns ? Math.max(MIN_TTY_WIDTH, Math.min(process.stdout.columns, MAX_TTY_WIDTH)) : Infinity;
function indent(n = 4) {
return ' '.repeat(n);
}
exports.indent = indent;
function wordWrap(msg, { width = exports.TTY_WIDTH, indentation = 0, append = '' }) {
return wrapAnsi(msg, width - indentation - append.length, { trim: true }).split('\n').join(`${append}\n${indent(indentation)}`);
}
exports.wordWrap = wordWrap;
function prettyPath(p) {
p = expandPath(p);
const cwd = process.cwd();
const d = path.dirname(p);
const h = os.homedir();
const distanceFromCwd = Math.abs(d.split(path.sep).length - cwd.split(path.sep).length);
if (cwd === d) {
return '.' + path.sep + path.basename(p);
}
else if (d.startsWith(cwd)) {
return '.' + path.sep + p.substring(cwd.length + 1);
}
else if (distanceFromCwd <= 2) {
const rel = path.relative(cwd, p);
return rel ? rel : '.';
}
else if (p === h) {
return '~';
}
else if (p.indexOf(h) === 0) {
return '~' + path.sep + p.substring(h.length + 1);
}
return p;
}
exports.prettyPath = prettyPath;
function expandPath(p) {
return path.resolve(untildify(p));
}
exports.expandPath = expandPath;
function generateFillSpaceStringList(list, optimalLength = 1, fillCharacter = ' ') {
if (optimalLength < 2) {
optimalLength = 2;
}
const longestItem = Math.max(...list.map(item => stringWidth(item)));
const fullLength = longestItem > optimalLength ? longestItem + 1 : optimalLength;
const fullLengthString = fillCharacter.repeat(fullLength);
return list.map(item => sliceAnsi(fullLengthString, 0, fullLength - stringWidth(item)));
}
exports.generateFillSpaceStringList = generateFillSpaceStringList;
/**
* Basic CLI table generator with support for ANSI colors.
*
* @param rows 2-dimensional matrix containing cells. An array of columns,
* which are arrays of cells.
* @param options.vsep The vertical separator character, default is
* `chalk.dim('|')`. Supply an empty string to hide
* the separator altogether.
* @param options.hsep The horizontal separator character, default is
* `chalk.dim('-')`. This is used under the headers,
* if supplied. Supply an empty string to hide the
* separator altogether.
* @param options.headers An array of header cells.
*/
function columnar(rows, { hsep = '-', vsep = '|', headers }) {
const includeHeaders = headers ? true : false;
if (!rows[0]) {
return '';
}
const columnCount = headers ? headers.length : rows[0].length;
const columns = headers ?
headers.map(header => [header]) :
rows[0].map(() => []);
for (const row of rows) {
let highestLineCount = 0;
const splitRows = row.map(cell => {
const lines = cell.split('\n');
highestLineCount = Math.max(highestLineCount, lines.length);
return lines;
});
for (const rowIndex in row) {
if (columns[rowIndex]) {
columns[rowIndex].push(...splitRows[rowIndex], ...Array(highestLineCount - splitRows[rowIndex].length).fill(''));
}
}
}
const paddedColumns = columns.map((col, columnIndex) => {
if (columnIndex < columnCount - 1) {
const spaceCol = generateFillSpaceStringList(col);
return col.map((cell, cellIndex) => `${cell}${spaceCol[cellIndex]}${vsep === '' ? '' : `${vsep} `}`);
}
else {
return col;
}
});
let longestRowLength = 0;
const singleColumn = paddedColumns.reduce((a, b) => {
return a.map((_, i) => {
const r = a[i] + b[i];
longestRowLength = Math.max(longestRowLength, stringWidth(r));
return r;
});
});
if (includeHeaders && hsep !== '') {
singleColumn.splice(1, 0, hsep.repeat(longestRowLength));
}
return singleColumn.join('\n');
}
exports.columnar = columnar;

View File

@@ -0,0 +1,4 @@
export * from './ansi';
export * from './cursor';
export * from './format';
export * from './info';

View File

@@ -0,0 +1,7 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./ansi"), exports);
tslib_1.__exportStar(require("./cursor"), exports);
tslib_1.__exportStar(require("./format"), exports);
tslib_1.__exportStar(require("./info"), exports);

View File

@@ -0,0 +1,26 @@
/**
* These environment variables work for: GitHub Actions, Travis CI, CircleCI,
* Gitlab CI, AppVeyor, CodeShip, Jenkins, TeamCity, Bitbucket Pipelines, AWS
* CodeBuild
*/
export declare const CI_ENVIRONMENT_VARIABLES: readonly string[];
export declare const CI_ENVIRONMENT_VARIABLES_DETECTED: string[];
export interface TerminalInfo {
/**
* Whether this is in CI or not.
*/
readonly ci: boolean;
/**
* Path to the user's shell program.
*/
readonly shell: string;
/**
* Whether the terminal is an interactive TTY or not.
*/
readonly tty: boolean;
/**
* Whether this is a Windows shell or not.
*/
readonly windows: boolean;
}
export declare const TERMINAL_INFO: TerminalInfo;

View File

@@ -0,0 +1,39 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TERMINAL_INFO = exports.CI_ENVIRONMENT_VARIABLES_DETECTED = exports.CI_ENVIRONMENT_VARIABLES = void 0;
const Debug = require("debug");
const os = require("os");
const debug = Debug('ionic:utils-terminal:info');
/**
* These environment variables work for: GitHub Actions, Travis CI, CircleCI,
* Gitlab CI, AppVeyor, CodeShip, Jenkins, TeamCity, Bitbucket Pipelines, AWS
* CodeBuild
*/
exports.CI_ENVIRONMENT_VARIABLES = ['CI', 'BUILD_ID', 'BUILD_NUMBER', 'BITBUCKET_COMMIT', 'CODEBUILD_BUILD_ARN', 'GITHUB_ACTIONS'];
exports.CI_ENVIRONMENT_VARIABLES_DETECTED = exports.CI_ENVIRONMENT_VARIABLES.filter(v => !!process.env[v]);
function getShell() {
const { shell } = os.userInfo();
if (shell) {
return shell;
}
if (process.env.SHELL) {
return process.env.SHELL;
}
if (process.platform === 'darwin') {
return '/bin/bash';
}
if (process.platform === 'win32') {
return process.env.COMSPEC ? process.env.COMSPEC : 'cmd.exe';
}
return '/bin/sh';
}
if (exports.CI_ENVIRONMENT_VARIABLES_DETECTED.length > 0) {
debug(`Environment variables for CI detected: ${exports.CI_ENVIRONMENT_VARIABLES_DETECTED.join(', ')}`);
}
exports.TERMINAL_INFO = Object.freeze({
ci: exports.CI_ENVIRONMENT_VARIABLES_DETECTED.length > 0,
shell: getShell(),
tty: Boolean(process.stdin.isTTY && process.stdout.isTTY && process.stderr.isTTY),
windows: process.platform === 'win32' || !!(process.env.OSTYPE && /^(msys|cygwin)$/.test(process.env.OSTYPE) ||
process.env.MSYSTEM && /^MINGW(32|64)$/.test(process.env.MSYSTEM)),
});

View File

@@ -0,0 +1,58 @@
{
"name": "@ionic/utils-terminal",
"version": "2.3.3",
"description": "Terminal utils for NodeJS",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"homepage": "https://ionicframework.com/",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
"license": "MIT",
"engines": {
"node": ">=10.3.0"
},
"files": [
"dist/",
"LICENSE",
"README.md"
],
"repository": {
"type": "git",
"url": "https://github.com/ionic-team/ionic-cli.git"
},
"bugs": {
"url": "https://github.com/ionic-team/ionic-cli/issues"
},
"scripts": {
"clean": "rimraf dist",
"lint": "true",
"build": "npm run clean && tsc",
"watch": "tsc -w --preserveWatchOutput",
"test": "jest --maxWorkers=4",
"prepublishOnly": "npm run build"
},
"dependencies": {
"@types/slice-ansi": "^4.0.0",
"debug": "^4.0.0",
"signal-exit": "^3.0.3",
"slice-ansi": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0",
"tslib": "^2.0.1",
"untildify": "^4.0.0",
"wrap-ansi": "^7.0.0"
},
"devDependencies": {
"@types/debug": "^4.1.1",
"@types/jest": "^26.0.10",
"@types/node": "~10.17.13",
"@types/signal-exit": "^3.0.0",
"@types/wrap-ansi": "^3.0.0",
"jest": "^26.4.2",
"jest-cli": "^26.0.1",
"lint-staged": "^10.0.2",
"rimraf": "^3.0.0",
"ts-jest": "~26.3.0",
"typescript": "~4.0.2"
},
"gitHead": "f090194e755912d7b8e659f4323c5c2804115c81"
}

56
node_modules/@ionic/utils-subprocess/package.json generated vendored Normal file
View File

@@ -0,0 +1,56 @@
{
"name": "@ionic/utils-subprocess",
"version": "2.1.11",
"description": "Subprocess utils for NodeJS",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"homepage": "https://ionicframework.com/",
"author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
"license": "MIT",
"engines": {
"node": ">=10.3.0"
},
"files": [
"dist/",
"LICENSE",
"README.md"
],
"repository": {
"type": "git",
"url": "https://github.com/ionic-team/ionic-cli.git"
},
"bugs": {
"url": "https://github.com/ionic-team/ionic-cli/issues"
},
"scripts": {
"clean": "rimraf dist",
"lint": "true",
"build": "npm run clean && tsc",
"watch": "tsc -w --preserveWatchOutput",
"test": "jest --maxWorkers=4",
"prepublishOnly": "npm run build"
},
"dependencies": {
"@ionic/utils-array": "2.1.5",
"@ionic/utils-fs": "3.1.6",
"@ionic/utils-process": "2.1.10",
"@ionic/utils-stream": "3.1.5",
"@ionic/utils-terminal": "2.3.3",
"cross-spawn": "^7.0.3",
"debug": "^4.0.0",
"tslib": "^2.0.1"
},
"devDependencies": {
"@types/cross-spawn": "^6.0.0",
"@types/debug": "^4.1.1",
"@types/jest": "^26.0.10",
"@types/node": "~10.17.13",
"jest": "^26.4.2",
"jest-cli": "^26.0.1",
"lint-staged": "^10.0.2",
"rimraf": "^3.0.0",
"ts-jest": "~26.3.0",
"typescript": "~4.0.2"
},
"gitHead": "f090194e755912d7b8e659f4323c5c2804115c81"
}