interlockjs/interlock

View on GitHub
src/cli/ilk-server.js

Summary

Maintainability
A
1 hr
Test Coverage
import Interlock from "..";
import * as options from "../options";
import { createServer } from "../server/server";
import { assign, keys } from "lodash";


export const builder = yargs => {
  return options
    .buildArgs(yargs, options.server, options.compile)
    .epilogue("For more information, see http://www.interlockjs.com/docs/ilk-build.");
};

export const handler = argv => {
  const config = argv.config ? options.loadConfig(argv.config) : {};
  const logger = options.getLogger(argv.verbose);

  const compileOpts = options.getInterlockOpts(
    argv,
    options.compile,
    config
  );
  const sharedOpts = options.getInterlockOpts(
    argv,
    options.shared,
    config
  );
  const opts = assign({}, sharedOpts, compileOpts);

  let serverOpts = options.getInterlockOpts(argv, options.server);
  serverOpts = options.validate(serverOpts, options.server);

  const {
    setDynamicAssets,
    notify,
    pause
  } = createServer(serverOpts);

  try {
    const ilk = new Interlock(opts);

    let resume = pause();
    ilk.watch(buildEvent => {
      const { change, patchModules, compilation } = buildEvent;

      if (change) {
        resume = pause();
        notify("recompiling", { filename: buildEvent.change });
        return;
      }

      if (patchModules) {
        notify("update", { update: true });
      } else if (compilation) {
        const newAssets = keys(compilation.bundles).reduce((assets, filename) => {
          assets[`/${filename}`] = compilation.bundles[filename].raw;
          return assets;
        }, {});
        setDynamicAssets(newAssets);
        resume();
        notify("compilation", { compilation: true });
      }
    });
  } catch (err) {
    logger.warn(err.stack) || logger.error("Error:", err.message);
  }
};