lerna-update-wizard
Advanced tools
Comparing version 0.9.0 to 0.9.1
@@ -6,3 +6,3 @@ { | ||
}, | ||
"version": "0.9.0", | ||
"version": "0.9.1", | ||
"main": "index.js", | ||
@@ -9,0 +9,0 @@ "license": "MIT", |
@@ -36,2 +36,10 @@ const path = require("path"); | ||
ui.log.write( | ||
`\n${chalk.bold("Lerna Update Wizard")}\n${chalk.grey( | ||
"v" + require("../package.json").version | ||
)}\n\n` | ||
); | ||
ui.logBottom("Collecting packages..."); | ||
const packagesRead = await globby( | ||
@@ -54,2 +62,4 @@ (lernaConfig.packages || ["packages/*"]).map(glob => | ||
ui.logBottom(""); | ||
const setSourceForDeps = (deps = [], source = "dependencies") => | ||
@@ -56,0 +66,0 @@ Object.keys(deps).reduce( |
@@ -28,2 +28,4 @@ const { default: runProgram } = require("./utils/runProgram"); | ||
? Select a dependency to upgrade: (Use arrow keys or type to search) | ||
❯ lodash (1 version) | ||
treediff (1 version) | ||
@@ -30,0 +32,0 @@ >>> input tree |
@@ -7,3 +7,3 @@ const fs = require("fs-extra"); | ||
const generateProject = async options => { | ||
const generateProject = async (options, log) => { | ||
const { name, packages, dependencies, prefixPath, lernaJson } = options; | ||
@@ -13,3 +13,3 @@ | ||
console.info(chalk.bold("Creating project", p)); | ||
console.info(log); | ||
@@ -49,6 +49,9 @@ await fs.outputFile( | ||
for (let pOptions of packages) { | ||
await generateProject({ | ||
...pOptions, | ||
prefixPath: path.resolve(p, pOptions.moduleDirName || "packages"), | ||
}); | ||
await generateProject( | ||
{ | ||
...pOptions, | ||
prefixPath: path.resolve(p, pOptions.moduleDirName || "packages"), | ||
}, | ||
`└──${pOptions.name}` | ||
); | ||
} | ||
@@ -62,5 +65,8 @@ } | ||
await generateProject({ ...options, prefixPath }); | ||
await generateProject( | ||
{ ...options, prefixPath }, | ||
`${chalk.bold.white("Creating project:")} ${options.name}` | ||
); | ||
return path.resolve(prefixPath, options.name); | ||
}; |
@@ -7,2 +7,4 @@ const chalk = require("chalk"); | ||
const { scan: liveScan } = require("./liveScan"); | ||
// From https://www.novell.com/documentation/extend5/Docs/help/Composer/books/TelnetAppendixB.html | ||
@@ -20,7 +22,7 @@ const keys = { | ||
let latestBuffer = ""; | ||
const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); | ||
const run = (proc, { type, value, maxWait = 10 }, onStdOut) => | ||
let scanner; | ||
const run = (proc, { type, value, maxWait = 5 }, onStdOut) => | ||
new Promise(async (resolve, reject) => { | ||
@@ -33,4 +35,4 @@ if (!proc) return resolve(); | ||
const data = bufferData.toString(); | ||
latestBuffer += data; | ||
onStdOut && onStdOut(data); | ||
scanner && scanner.feed(data); | ||
}); | ||
@@ -42,36 +44,33 @@ | ||
case "find": | ||
let timeoutId = setTimeout(() => { | ||
reject(new Error(`Did not find "${value}" within ${maxWait} sec.`)); | ||
}, maxWait * 1000); | ||
const lastBuffer = scanner && scanner.getBuffer(); | ||
const resolveIfFound = bufferOrString => { | ||
const data = bufferOrString.toString(); | ||
const isFound = Array.isArray(value) | ||
? value.every(line => data.includes(line)) | ||
: data.includes(value); | ||
scanner = liveScan({ | ||
timeout: maxWait * 1000, | ||
target: value, | ||
onFind: ({ matchContext, matchTarget }) => { | ||
console.info( | ||
[ | ||
chalk.green.dim(matchContext), | ||
chalk.green.bold(matchTarget), | ||
].join("\n") | ||
); | ||
if (isFound) { | ||
clearTimeout(timeoutId); | ||
resolve(proc); | ||
}, | ||
onTimeout: ({ targetBlob, bufferBlob }) => { | ||
console.info( | ||
[ | ||
chalk.bold.red("Did not find:"), | ||
chalk.yellow(targetBlob), | ||
chalk.bold.red("\nInstead found:"), | ||
chalk.yellow(bufferBlob), | ||
chalk.bold.red(`\n\n(After waiting ${maxWait} seconds)`), | ||
].join("\n") | ||
); | ||
reject(new Error("Timeout error")); | ||
}, | ||
}); | ||
const output = Array.isArray(value) | ||
? latestBuffer | ||
.toString() | ||
.split("\n") | ||
.filter(l => value.some(lf => l.includes(lf))) | ||
.join("\n") | ||
: `"${value}"`; | ||
lastBuffer && scanner.feed(lastBuffer); | ||
console.info(chalk.green(`Found:\n${output}\n`)); | ||
delay(500).then(() => resolve(proc)); | ||
} | ||
return isFound; | ||
}; | ||
const foundInBuffer = resolveIfFound(latestBuffer); | ||
if (!foundInBuffer) { | ||
proc.stdout.on("data", resolveIfFound); | ||
} | ||
break; | ||
@@ -82,3 +81,3 @@ case "input": | ||
streamWrite(proc.stdin, keys[data] || data); | ||
await delay(200); // Prevent clogging | ||
await delay(250); // Simulate natural user input | ||
}; | ||
@@ -88,4 +87,2 @@ | ||
for (const input of inputs) { | ||
latestBuffer = ""; | ||
await sendInput(input); | ||
@@ -111,3 +108,3 @@ } | ||
inputSequence, | ||
{ log = !!process.env.CI } = {} | ||
{ log = !!process.env.CI || !!process.env.DEBUG } = {} | ||
) => { | ||
@@ -126,3 +123,2 @@ const program = | ||
console.info(chalk.white.bold(`Running program: ${cmd}`)); | ||
const logFilePath = `./tmp/test-log.txt`; | ||
@@ -132,4 +128,8 @@ | ||
console.info("Track log output:"); | ||
console.info(chalk.bold.white(`tail -f ${logFilePath} | sed 's/\\n/\\n/g'`)); | ||
console.info(`${chalk.white.bold( | ||
"Running command:" | ||
)} ${cmd}\n${chalk.bold.white( | ||
"Log output:" | ||
)} ${`tail -f ${logFilePath} | sed 's/\\n/\\n/g'`} | ||
`); | ||
@@ -136,0 +136,0 @@ const onStdOut = content => { |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
175444
26
1349
11