forked from react-native-community/cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore: setup monorepo with Lerna (react-native-community#109)
* chore: setup monorepo with lerna * chore: move flow to root * fix: lint * chore: add watch command
- Loading branch information
Showing
11 changed files
with
2,625 additions
and
321 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,3 +5,4 @@ node_modules | |
package-lock.json | ||
npm-debug.log | ||
build/ | ||
.eslintcache |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,14 @@ | ||
module.exports = { | ||
babelrcRoots: ['packages/*'], | ||
presets: [ | ||
[ | ||
require.resolve('@babel/preset-env'), | ||
{ | ||
targets: { node: 8 }, | ||
useBuiltIns: 'entry', | ||
}, | ||
], | ||
require.resolve('@babel/preset-flow'), | ||
], | ||
plugins: [require.resolve('@babel/plugin-transform-strict-mode')], | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
{ | ||
"lerna": "3.10.6", | ||
"version": "independent", | ||
"npmClient": "yarn", | ||
"useWorkspaces": true | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
/** | ||
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
|
||
/** | ||
* script to build (transpile) files. | ||
* By default it transpiles js files for all packages and writes them | ||
* into `build/` directory. | ||
* Non-js files not matching IGNORE_PATTERN will be copied without transpiling. | ||
* | ||
* Example: | ||
* node ./scripts/build.js | ||
* node ./scripts/build.js /users/123/jest/packages/jest-111/src/111.js | ||
* | ||
* NOTE: this script is node@4 compatible | ||
*/ | ||
|
||
const fs = require('fs'); | ||
const path = require('path'); | ||
const glob = require('glob'); | ||
const mkdirp = require('mkdirp'); | ||
const babel = require('@babel/core'); | ||
const chalk = require('chalk'); | ||
const micromatch = require('micromatch'); | ||
const prettier = require('prettier'); | ||
const stringLength = require('string-length'); | ||
const { PACKAGES_DIR, getPackages } = require('./helpers'); | ||
|
||
const OK = chalk.reset.inverse.bold.green(' DONE '); | ||
const SRC_DIR = 'src'; | ||
const BUILD_DIR = 'build'; | ||
const JS_FILES_PATTERN = '**/*.js'; | ||
const IGNORE_PATTERN = '**/__{tests,mocks,fixtures}__/**'; | ||
|
||
const transformOptions = require('../babel.config.js'); | ||
|
||
const prettierConfig = prettier.resolveConfig.sync(__filename); | ||
prettierConfig.trailingComma = 'none'; | ||
prettierConfig.parser = 'babel'; | ||
|
||
const adjustToTerminalWidth = str => { | ||
const columns = process.stdout.columns || 80; | ||
const WIDTH = columns - stringLength(OK) + 1; | ||
const strs = str.match(new RegExp(`(.{1,${WIDTH}})`, 'g')); | ||
let lastString = strs[strs.length - 1]; | ||
if (lastString.length < WIDTH) { | ||
lastString += Array(WIDTH - lastString.length).join(chalk.dim('.')); | ||
} | ||
return strs | ||
.slice(0, -1) | ||
.concat(lastString) | ||
.join('\n'); | ||
}; | ||
|
||
function getPackageName(file) { | ||
return path.relative(PACKAGES_DIR, file).split(path.sep)[0]; | ||
} | ||
|
||
function getBuildPath(file, buildFolder) { | ||
const pkgName = getPackageName(file); | ||
const pkgSrcPath = path.resolve(PACKAGES_DIR, pkgName, SRC_DIR); | ||
const pkgBuildPath = path.resolve(PACKAGES_DIR, pkgName, buildFolder); | ||
const relativeToSrcPath = path.relative(pkgSrcPath, file); | ||
return path.resolve(pkgBuildPath, relativeToSrcPath); | ||
} | ||
|
||
function buildNodePackage(p) { | ||
const srcDir = path.resolve(p, SRC_DIR); | ||
const pattern = path.resolve(srcDir, '**/*'); | ||
const files = glob.sync(pattern, { | ||
nodir: true, | ||
}); | ||
|
||
process.stdout.write(adjustToTerminalWidth(`${path.basename(p)}\n`)); | ||
|
||
files.forEach(file => buildFile(file, true)); | ||
process.stdout.write(`${OK}\n`); | ||
} | ||
|
||
function buildFile(file, silent) { | ||
const destPath = getBuildPath(file, BUILD_DIR); | ||
|
||
if (micromatch.isMatch(file, IGNORE_PATTERN)) { | ||
silent || | ||
process.stdout.write( | ||
`${chalk.dim(' \u2022 ') + | ||
path.relative(PACKAGES_DIR, file)} (ignore)\n` | ||
); | ||
return; | ||
} | ||
|
||
mkdirp.sync(path.dirname(destPath), '777'); | ||
|
||
if (!micromatch.isMatch(file, JS_FILES_PATTERN)) { | ||
fs.createReadStream(file).pipe(fs.createWriteStream(destPath)); | ||
silent || | ||
process.stdout.write( | ||
`${chalk.red(' \u2022 ') + | ||
path.relative(PACKAGES_DIR, file) + | ||
chalk.red(' \u21D2 ') + | ||
path.relative(PACKAGES_DIR, destPath)} (copy)\n` | ||
); | ||
} else { | ||
const options = Object.assign({}, transformOptions); | ||
const transformed = babel.transformFileSync(file, options).code; | ||
const prettyCode = prettier.format(transformed, prettierConfig); | ||
|
||
fs.writeFileSync(destPath, prettyCode); | ||
|
||
silent || | ||
process.stdout.write( | ||
`${chalk.green(' \u2022 ') + | ||
path.relative(PACKAGES_DIR, file) + | ||
chalk.green(' \u21D2 ') + | ||
path.relative(PACKAGES_DIR, destPath)}\n` | ||
); | ||
} | ||
} | ||
|
||
const files = process.argv.slice(2); | ||
|
||
if (files.length) { | ||
files.forEach(buildFile); | ||
} else { | ||
const packages = getPackages(); | ||
process.stdout.write(chalk.inverse(' Building packages \n')); | ||
packages.forEach(buildNodePackage); | ||
process.stdout.write('\n'); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
const fs = require('fs'); | ||
const path = require('path'); | ||
|
||
const PACKAGES_DIR = path.resolve(__dirname, '../packages'); | ||
|
||
function getPackages() { | ||
return fs | ||
.readdirSync(PACKAGES_DIR) | ||
.map(file => path.resolve(PACKAGES_DIR, file)) | ||
.filter(f => fs.lstatSync(path.resolve(f)).isDirectory()); | ||
} | ||
|
||
module.exports = { | ||
getPackages, | ||
PACKAGES_DIR, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/** | ||
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
|
||
/** | ||
* Watch files for changes and rebuild (copy from 'src/' to `build/`) if changed | ||
*/ | ||
|
||
const fs = require('fs'); | ||
const { execSync } = require('child_process'); | ||
const path = require('path'); | ||
const chalk = require('chalk'); | ||
const { getPackages } = require('./helpers'); | ||
|
||
const BUILD_CMD = `node ${path.resolve(__dirname, './build.js')}`; | ||
|
||
let filesToBuild = new Map(); | ||
|
||
const exists = filename => { | ||
try { | ||
return fs.statSync(filename).isFile(); | ||
} catch (e) { | ||
// omit | ||
} | ||
return false; | ||
}; | ||
const rebuild = filename => filesToBuild.set(filename, true); | ||
|
||
getPackages().forEach(p => { | ||
const srcDir = path.resolve(p, 'src'); | ||
try { | ||
fs.accessSync(srcDir, fs.F_OK); | ||
fs.watch(path.resolve(p, 'src'), { recursive: true }, (event, filename) => { | ||
const filePath = path.resolve(srcDir, filename); | ||
|
||
if ((event === 'change' || event === 'rename') && exists(filePath)) { | ||
console.log(chalk.green('->'), `${event}: ${filename}`); | ||
rebuild(filePath); | ||
} else { | ||
const buildFile = path.resolve(srcDir, '..', 'build', filename); | ||
try { | ||
fs.unlinkSync(buildFile); | ||
process.stdout.write( | ||
`${chalk.red(' \u2022 ') + | ||
path.relative( | ||
path.resolve(srcDir, '..', '..'), | ||
buildFile | ||
)} (deleted)\n` | ||
); | ||
} catch (e) { | ||
// omit | ||
} | ||
} | ||
}); | ||
} catch (e) { | ||
// doesn't exist | ||
} | ||
}); | ||
|
||
setInterval(() => { | ||
const files = Array.from(filesToBuild.keys()); | ||
if (files.length) { | ||
filesToBuild = new Map(); | ||
try { | ||
execSync(`${BUILD_CMD} ${files.join(' ')}`, { stdio: [0, 1, 2] }); | ||
} catch (e) { | ||
// omit | ||
} | ||
} | ||
}, 100); | ||
|
||
console.log(chalk.red('->'), chalk.cyan('Watching for changes...')); |
Oops, something went wrong.