UNPKG

create-expo-cljs-app

Version:

Create a react native application with Expo and Shadow-CLJS!

118 lines (105 loc) 3.58 kB
/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @format */ /** * script to build (transpile) files. * * Based off of the build script from Metro, and tweaked to run in just one * package instead of in a monorepo. Just run `build.js` and the JS files in * `src/` will be built in `lib/`, and the original source files will be copied * over as `Example.js.flow`, so consumers of this module can still make use of * type checking. * * Call this script with the `--verbose` flag to show the full output of this * script. */ 'use strict'; const babel = require('@babel/core'); const chalk = require('chalk'); const fs = require('fs'); const glob = require('glob'); const micromatch = require('micromatch'); const mkdirp = require('mkdirp'); const path = require('path'); const prettier = require('prettier'); const prettierConfig = JSON.parse( fs.readFileSync(path.resolve(__dirname, '..', '.prettierrc'), 'utf8'), ); const SRC_DIR = 'src'; const BUILD_DIR = 'lib'; const JS_FILES_PATTERN = '**/*.js'; const IGNORE_PATTERN = '**/__tests__/**'; const PACKAGE_DIR = path.resolve(__dirname, '../'); const fixedWidth = str => { const WIDTH = 80; const strs = str.match(new RegExp(`(.{1,${WIDTH}})`, 'g')) || [str]; 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 getBuildPath(file, buildFolder) { const pkgSrcPath = path.resolve(PACKAGE_DIR, SRC_DIR); const pkgBuildPath = path.resolve(PACKAGE_DIR, BUILD_DIR); const relativeToSrcPath = path.relative(pkgSrcPath, file); return path.resolve(pkgBuildPath, relativeToSrcPath); } function buildFile(file, silent) { const destPath = getBuildPath(file, BUILD_DIR); mkdirp.sync(path.dirname(destPath)); if (micromatch.isMatch(file, IGNORE_PATTERN)) { silent || process.stdout.write( chalk.dim(' \u2022 ') + path.relative(PACKAGE_DIR, file) + ' (ignore)\n', ); } else if (!micromatch.isMatch(file, JS_FILES_PATTERN)) { fs.createReadStream(file).pipe(fs.createWriteStream(destPath)); silent || process.stdout.write( chalk.red(' \u2022 ') + path.relative(PACKAGE_DIR, file) + chalk.red(' \u21D2 ') + path.relative(PACKAGE_DIR, destPath) + ' (copy)' + '\n', ); } else { const transformed = prettier.format( babel.transformFileSync(file, {}).code, { ...prettierConfig, parser: 'babel', }, ); fs.writeFileSync(destPath, transformed); const source = fs.readFileSync(file).toString('utf-8'); if (/\@flow/.test(source)) { fs.createReadStream(file).pipe(fs.createWriteStream(destPath + '.flow')); } silent || process.stdout.write( chalk.green(' \u2022 ') + path.relative(PACKAGE_DIR, file) + chalk.green(' \u21D2 ') + path.relative(PACKAGE_DIR, destPath) + '\n', ); } } const srcDir = path.resolve(__dirname, '..', SRC_DIR); const pattern = path.resolve(srcDir, '**/*'); const files = glob.sync(pattern, {nodir: true}); process.stdout.write(fixedWidth(`${path.basename(PACKAGE_DIR)}\n`)); files.forEach(file => buildFile(file, !process.argv.includes('--verbose'))); process.stdout.write(`[ ${chalk.green('OK')} ]\n`);