lux-framework
Version:
Build scalable, Node.js-powered REST APIs with almost no code.
155 lines (134 loc) • 3.64 kB
JavaScript
// @flow
import os from 'os';
import path, { posix } from 'path';
import lux from 'rollup-plugin-lux';
import json from 'rollup-plugin-json';
import alias from 'rollup-plugin-alias';
import babel from 'rollup-plugin-babel';
import eslint from 'rollup-plugin-eslint';
import resolve from 'rollup-plugin-node-resolve';
import { rollup } from 'rollup';
import { rmrf, readdir, readdirRec, isJSFile } from '../fs';
import template from '../template';
import { NODE_ENV } from '../../constants';
import onwarn from './utils/handle-warning';
import isExternal from './utils/is-external';
import createManifest from './utils/create-manifest';
import createBootScript from './utils/create-boot-script';
/**
* @private
*/
type CompileOptions = {
useStrict?: boolean;
};
let cache;
/**
* @private
*/
export async function compile(
dir: string,
env: string,
opts: CompileOptions = {}
): Promise<void> {
const { useStrict = false } = opts;
const local = path.join(__dirname, '..', 'src', 'index.js');
const entry = path.join(dir, 'dist', 'index.js');
const external = isExternal(dir);
let banner;
const assets = await Promise.all([
readdir(path.join(dir, 'app', 'models')),
readdir(path.join(dir, 'db', 'migrate')),
readdirRec(path.join(dir, 'app', 'controllers')),
readdirRec(path.join(dir, 'app', 'serializers'))
]).then(types => {
let [
models,
migrations,
controllers,
serializers
] = types;
models = models.filter(isJSFile);
migrations = migrations.filter(isJSFile);
controllers = controllers.filter(isJSFile);
serializers = serializers.filter(isJSFile);
return new Map([
['Application', path.join('app', 'index.js')],
['config', path.join('config', 'environments', `${env}.js`)],
['controllers', controllers],
['database', path.join('config', 'database.js')],
['migrations', migrations],
['models', models],
['routes', path.join('app', 'routes.js')],
['seed', path.join('db', 'seed.js')],
['serializers', serializers]
]);
});
await Promise.all([
createManifest(dir, assets, {
useStrict
}),
createBootScript(dir, {
useStrict
})
]);
const aliases = {
app: posix.join('/', ...dir.split(path.sep), 'app'),
LUX_LOCAL: posix.join('/', ...local.split(path.sep))
};
if (os.platform() === 'win32') {
const [volume] = dir;
const prefix = `${volume}:/`;
Object.assign(aliases, {
app: aliases.app.replace(prefix, ''),
LUX_LOCAL: aliases.LUX_LOCAL.replace(prefix, '')
});
}
const bundle = await rollup({
entry,
onwarn,
external,
cache,
plugins: [
alias({
resolve: ['.js'],
...aliases
}),
json(),
resolve(),
eslint({
cwd: dir,
parser: 'babel-eslint',
useEslintrc: false,
include: [
path.join(dir, 'app', '**'),
],
exclude: [
path.join(dir, 'package.json'),
path.join(__dirname, '..', 'src', '**')
]
}),
babel(),
lux(path.resolve(path.sep, dir, 'app'))
]
});
if (NODE_ENV === 'development') {
cache = bundle;
}
await rmrf(entry);
banner = template`
const srcmap = require('source-map-support').install({
environment: 'node'
});
`;
if (useStrict) {
banner = `'use strict';\n\n${banner}`;
}
return bundle.write({
banner,
dest: path.join(dir, 'dist', 'bundle.js'),
format: 'cjs',
sourceMap: true,
useStrict: false
});
}
export { default as onwarn } from './utils/handle-warning';