Skip to content

Commit

Permalink
Provide a CLI
Browse files Browse the repository at this point in the history
  • Loading branch information
moonglum committed Nov 22, 2018
1 parent 613f3c0 commit f51dc87
Show file tree
Hide file tree
Showing 12 changed files with 138 additions and 107 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
/.eslintcache

/example/dist
/example/node_modules
/example/package-lock.json
8 changes: 8 additions & 0 deletions bin/aiur
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/usr/bin/env node
"use strict";

let faucet = require("faucet-pipeline-core");
let parseCLI = require("../lib/cli");

let { referenceDir, config, options } = parseCLI();
faucet(referenceDir, config, options);
2 changes: 1 addition & 1 deletion example/pages.js → example/aiur.config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"use strict";

module.exports = {
exports.pages = {
"": "./components/welcome.md",
atoms: {
file: "./components/atoms.md",
Expand Down
32 changes: 0 additions & 32 deletions example/faucet.config.js

This file was deleted.

10 changes: 10 additions & 0 deletions example/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"scripts": {
"start": "aiur --watch",
"compile": "aiur --fingerprint --compact"
},
"dependencies": {
"aiur": "..",
"prismjs": "^1.15.0"
}
}
90 changes: 90 additions & 0 deletions lib/cli.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
let { abort } = require("faucet-pipeline-core/lib/util");
let parseArgs = require("minimist");
let aiur = require(".");

let HELP = `
Usage:
$ aiur [options]
Options:
-h, --help
display this help message
-w, --watch
monitor the file system for changes to recompile automatically
-s, --source
aiur configuration file (default: ./aiur.config.js)
-t, --target
put the generated files here (default: ./dist)
--fingerprint
add unique hash to file names
--sourcemaps
generate source maps (where supported)
--compact
reduce output size (where supported)
`.trim();

module.exports = function parseCLI(argv = process.argv.slice(2), help = HELP) {
argv = parseArgs(argv, {
boolean: ["watch", "fingerprint", "sourcemaps", "compact"],
alias: {
s: "source",
t: "target",
w: "watch",
h: "help"
},
default: {
source: "./aiur.config.js",
target: "./dist"
}
});

if(argv.help) {
abort(help, 0);
}

if(argv.watch && argv.fingerprint) { // for convenience
console.error("you might consider disabling fingerprinting in watch " +
"mode to avoid littering your file system with obsolete bundles");
}

let { source, target } = argv;
// TODO: allow users to overwrite this in a custom faucet.config.js
let baseURI = "/";
let config = {
aiur: [{
source,
target,
baseURI
}],

// TODO: make this configurable
sass: [{
source: "aiur/lib/style.scss",
target: `${target}/style.css`
}],

// TODO: allow users to overwrite this in a custom faucet.config.js
watchDirs: [source, "./components"],

manifest: {
baseURI,
webRoot: target
},

plugins: {
aiur: {
plugin: aiur,
bucket: "markup"
}
}
};

let options = {
watch: argv.watch,
fingerprint: argv.fingerprint,
sourcemaps: argv.sourcemaps,
compact: argv.compact
};

return { referenceDir: process.cwd(), config, options };
};
41 changes: 15 additions & 26 deletions lib/site.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
let generatePageTree = require("./tree");
let resolvePath = require("faucet-pipeline-core/lib/util/resolve");
let { abort, repr } = require("faucet-pipeline-core/lib/util");
let { abort } = require("faucet-pipeline-core/lib/util");
let mkdirp = require("mkdirp");
let fs = require("fs");
let path = require("path");
Expand All @@ -13,34 +13,30 @@ let writeFile = promisify(fs.writeFile);

let DEFAULTS = {
renderers: {
html: require("./html")
html: require("./html"),
jsx: require("./complate")
},
generateLayout: generateLayout,
assetPath: "assets",
baseURI: "/"
generateLayout
};

module.exports = class Site {
constructor(config, assetManager) {
// validate essential settings
let { source, target } = config;
if(!target) {
abort(`ERROR: missing ${repr("target", false)} configuration for styleguide`);
}

constructor({ source, target, baseURI }, assetManager) {
let { referenceDir } = assetManager;
Object.assign(this, {
source,
source: resolvePath(source, referenceDir),
target: resolvePath(target, referenceDir, { enforceRelative: true }),
assetPath: config.assetPath || DEFAULTS.assetPath,
baseURI: config.baseURI || DEFAULTS.baseURI,
renderers: config.renderers || DEFAULTS.renderers,
baseURI: baseURI,
// TODO: either make this configurable or autoload renderers on use
renderers: DEFAULTS.renderers,
// TODO: make this configurable, but first find a simpler contract
generateLayout: DEFAULTS.generateLayout,
assetManager
});
}

async generate(filepaths) {
// TODO: if filepaths contains source, load again and re-run all

if(filepaths) {
// TODO: no longer necessary when we can use nite-owl 4.0.0
filepaths = new Set(filepaths);
Expand Down Expand Up @@ -106,18 +102,11 @@ module.exports = class Site {
}
}

// generates a URI for a given slug or `/`-delimited sequence thereof
pageURI(slugs) {
return path.join(this.baseURI, `${slugs}.html`); // TODO: validate slugs?
}

assetURI(filepath) {
return path.join(this.baseURI, this.assetPath, filepath); // TODO: validate?
}

// TODO: rename to get tree()?
// loads page hierarchy
async load() {
this.tree = generatePageTree(this.source, this.assetManager.referenceDir);
let { pages } = require(this.source);
this.tree = generatePageTree(pages, this.assetManager.referenceDir);
return this.tree;
}
};
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
"version": "0.2.0",
"description": "styleguide generator",
"main": "lib/index.js",
"bin": {
"aiur": "bin/aiur"
},
"scripts": {
"test": "npm run lint && npm run test:unit",
"test:unit": "mocha test/test_*.js",
Expand All @@ -22,6 +25,7 @@
"faucet-pipeline-sass": "^1.1.0",
"faucet-pipeline-static": "^1.0.0",
"metacolon": "^1.0.0",
"minimist": "^1.2.0",
"mkdirp": "^0.5.1",
"prismjs": "^1.15.0",
"require-from-string": "^2.0.2"
Expand Down
2 changes: 1 addition & 1 deletion test/fixtures/pages.js → test/fixtures/aiur.config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"use strict";

module.exports = {
exports.pages = {
"": "./welcome.md",
atoms: {
file: "./atoms.md",
Expand Down
4 changes: 2 additions & 2 deletions test/test_navigation.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ let { assertSame, fixturesPath, fixturesDir } = require("./util");

describe("navigation", () => {
it("should generate a navigation", async () => {
let descriptors = require(fixturesPath("pages.js"));
let tree = generatePageTree(descriptors, fixturesDir);
let { pages } = require(fixturesPath("aiur.config.js"));
let tree = generatePageTree(pages, fixturesDir);
await Promise.all(tree.map(async page => page.load()));

let navigation = new Navigation({ baseURI: "/" });
Expand Down
46 changes: 3 additions & 43 deletions test/test_site.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
let Site = require("../lib/site");
let { assertSame, fixturesPath, fixturesDir, expectationsPath, MockAssetManager } = require("./util");
let fs = require("fs");
let assert = require("assert");
let { promisify } = require("util");
let rimraf = promisify(require("rimraf"));

Expand All @@ -24,8 +23,9 @@ describe("site model", () => {

it("generates HTML files", async () => {
let config = {
source: require(fixturesPath("./pages.js")),
target: "./dist"
source: fixturesPath("./aiur.config.js"),
target: "./dist",
baseURI: "/"
};

let site = new Site(config, assetManager);
Expand Down Expand Up @@ -53,44 +53,4 @@ describe("site model", () => {
assertSame(await readFile(fixturesPath("dist/atoms/strong/0.html"), "utf8"),
await readFile(expectationsPath("atoms/strong/0.html"), "utf8"));
});

it("enforces essential configuration", async () => {
let config = {};

let fn = () => new Site(config, assetManager);
assert.throws(fn, /exit 1/); // aborts due to missing `source` configuration

config.source = require(fixturesPath("./pages.js"));
assert.throws(fn, /exit 1/); // aborts due to missing `target` configuration

config.target = "dist";
assert.throws(fn, /exit 1/); // aborts due to non-relative `target` configuration

config.target = "./dist";
fn(); // does not abort
});

it("generates URIs", async () => {
let config = {
source: require(fixturesPath("./pages.js")),
target: "./dist"
};

let site = new Site(config, assetManager);
assertSame(site.pageURI("atoms/button"), "/atoms/button.html");
assertSame(site.assetURI("bundle.css"), "/assets/bundle.css");

config.baseURI = "/path/to";
site = new Site(config, assetManager);
assertSame(site.pageURI("atoms/button"), "/path/to/atoms/button.html");
assertSame(site.assetURI("styles/bundle.css"),
"/path/to/assets/styles/bundle.css");

config.baseURI += "/"; // trailing slash
config.assetPath = "/static/";
site = new Site(config, assetManager);
assertSame(site.pageURI("atoms/button"), "/path/to/atoms/button.html");
assertSame(site.assetURI("scripts/bundle.js"),
"/path/to/static/scripts/bundle.js");
});
});
4 changes: 2 additions & 2 deletions test/test_tree.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ let { repr } = require("faucet-pipeline-core/lib/util");

describe("page hierarchy", () => {
it("should turn page descriptors into a tree of pages", async () => {
let descriptors = require(fixturesPath("pages.js"));
let tree = generatePageTree(descriptors, fixturesDir);
let { pages } = require(fixturesPath("aiur.config.js"));
let tree = generatePageTree(pages, fixturesDir);

assertSame(tree.children.size, 2);
assertDeep(Array.from(tree.children.keys()), ["", "atoms"]);
Expand Down

0 comments on commit f51dc87

Please sign in to comment.