Skip to content

Instantly share code, notes, and snippets.

@cef62
Created June 12, 2017 06:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cef62/abf525ab703d4f18b413b1fce2b85403 to your computer and use it in GitHub Desktop.
Save cef62/abf525ab703d4f18b413b1fce2b85403 to your computer and use it in GitHub Desktop.
Flow-type workaround for peer dependencies
#!/usr/bin/env node
const { installFlowTypeDefinitions } = require('./flow-typed')
const { echo, exit } = require('shelljs')
installFlowTypeDefinitions().then(() => exit(0)).catch(err => {
echo(err)
exit(1)
})
const path = require('path')
const fs = require('fs-extra')
const Promise = require('bluebird')
const { echo, exec } = require('./helpers')
const execFolder = process.cwd()
const flowTypedCLI = path.join(execFolder, 'node_modules', '.bin', 'flow-typed')
const backupPackageJson = silent =>
new Promise((resolve, reject) => {
const src = path.join(execFolder, 'package.json')
const target = path.join(execFolder, 'tmp.package.json')
try {
fs.copySync(src, target)
echo(silent, `package.json backup done`)
resolve()
} catch (err) {
echo(
silent,
`Something went wrong creating a backup of package.json.`,
err
)
reject(err)
}
})
const restorePackageJson = silent =>
new Promise((resolve, reject) => {
const src = path.join(execFolder, 'tmp.package.json')
const target = path.join(execFolder, 'package.json')
try {
fs.copySync(src, target)
fs.removeSync(src)
echo(silent, `package.json restored`)
resolve()
} catch (err) {
echo(
silent,
`Something went wrong restoring package.json from a backup`,
err
)
reject(err)
}
})
const preparePackageJson = (silent) =>
new Promise((resolve, reject) => {
try {
const target = path.join(execFolder, 'package.json')
const packageObj = fs.readJsonSync(target)
delete packageObj.peerDependencies
fs.writeJsonSync(target, packageObj)
resolve()
} catch (err) {
echo(
silent,
`Something went wrong preparing package.json for flow-typed install`,
err
)
reject(err)
}
})
const installFlowTypeDefinitions = silent => {
const failOnError = false
return backupPackageJson(silent)
.then(() => preparePackageJson(silent))
.then(() => exec(
`"${flowTypedCLI}" install`,
`Something could have gone wrong installing flow-typed definitions. Read above messages.`,
silent,
failOnError
))
.then(msg => echo(silent, 'Flow type output:\n', msg))
.then(() => restorePackageJson(silent))
}
module.exports = {
installFlowTypeDefinitions,
}
const sh = require('shelljs')
const rimraf = require('rimraf')
const Promise = require('bluebird')
const exec = (
code,
errorMsg = 'Something went wrong',
silent = false,
failOnError = true
) =>
new Promise((resolve, reject) => {
sh.echo(`Executing: "${code}"`)
sh.exec(code, { silent }, (errorCode, stdout, stderr) => {
if (errorCode) {
if (failOnError) {
reject(stderr || errorMsg)
} else {
resolve(stderr || errorMsg)
}
} else {
resolve(stdout)
}
})
})
const echo = (silent, ...msgs) => {
if (!silent) {
sh.echo(...msgs)
}
}
module.exports = { exec, echo }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment