Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: setup monorepo with Lerna #109

Merged
merged 4 commits into from
Jan 23, 2019
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions babel.config.js
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')],
};
6 changes: 6 additions & 0 deletions lerna.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"lerna": "3.10.6",
"version": "independent",
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently packages are a bit disconnected (local cli at 1.1 and global at 2.0) so until we reach parity Lerna will ask you which version would you like to bump to

"npmClient": "yarn",
"useWorkspaces": true
}
28 changes: 24 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,33 @@
"packages/*"
],
"scripts": {
"build": "node ./scripts/build.js",
"build-clean": "rm -rf ./packages/*/build",
"test": "jest",
"lint": "eslint packages",
"flow-check": "flow check"
"flow-check": "flow check",
"postinstall": "yarn build",
"publish": "yarn build-clean && yarn build && lerna publish"
},
"devDependencies": {
"@babel/core": "^7.2.2",
"dependencies": {
"@babel/core": "^7.0.0",
"@babel/plugin-transform-strict-mode": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"@babel/preset-flow": "^7.0.0",
"@callstack/eslint-config": "^3.0.2",
"@commitlint/cli": "^7.2.1",
"@commitlint/config-conventional": "^7.1.2",
"chalk": "^2.4.2",
"eslint": "^5.10.0",
"flow-bin": "^0.87.0",
"glob": "^7.1.3",
"husky": "^1.3.1",
"jest": "^24.0.0-alpha.12"
"jest": "^24.0.0-alpha.12",
"lerna": "^3.10.6",
"micromatch": "^3.1.10",
"mkdirp": "^0.5.1",
"prettier": "^1.16.0",
"string-length": "^2.0.0"
},
"eslintConfig": {
"extends": "@callstack",
Expand All @@ -24,6 +39,11 @@
"no-console": 0
}
},
"prettier": {
"proseWrap": "never",
"singleQuote": true,
"trailingComma": "es5"
},
"husky": {
"hooks": {
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
Expand Down
15 changes: 0 additions & 15 deletions packages/cli/.babelrc.js

This file was deleted.

10 changes: 0 additions & 10 deletions packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@
"type": "git",
"url": "https://github.com/react-native-community/react-native-cli.git"
},
"scripts": {
"prepublish": "yarn build",
"build": "rm -rf build; babel src --copy-files --out-dir build --ignore '**/__tests__/**','**/__mocks__/**','**/__fixtures__/**'"
},
"jest": {
"displayName": "cli",
"testPathIgnorePatterns": [
Expand Down Expand Up @@ -66,12 +62,6 @@
"xmldoc": "^0.4.0"
},
"devDependencies": {
"@babel/cli": "^7.2.3",
"@babel/core": "^7.1.5",
"@babel/plugin-transform-strict-mode": "^7.2.0",
"@babel/preset-env": "^7.1.5",
"@babel/preset-flow": "^7.0.0",
"flow-bin": "0.87.0",
"react-native": "^0.57.0"
},
"peerDependencies": {
Expand Down
139 changes: 139 additions & 0 deletions scripts/build.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
/**
* 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 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 PACKAGES_DIR = path.resolve(__dirname, '../packages');

const transformOptions = require('../babel.config.js');

const prettierConfig = prettier.resolveConfig.sync(__filename);
prettierConfig.trailingComma = 'none';
prettierConfig.parser = 'babel';

function getPackages() {
return fs
.readdirSync(PACKAGES_DIR)
.map(file => path.resolve(PACKAGES_DIR, file))
.filter(f => fs.lstatSync(path.resolve(f)).isDirectory());
}

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');
}
Loading