Skip to content

Commit 1174e8a

Browse files
committed
cleaned up
This is a breaking change. * FileFinder is removed (pending based on the static/images work) * resolvePath is moved into util/index.js (this is a breaking change for aiur) * generateFingerprint is moved into lib/manager.js as it is the only place where it is used (the test is moved accordingly) * SerializedRunner is moved to lib, as it is only used in core
1 parent 2a19f94 commit 1174e8a

File tree

13 files changed

+82
-315
lines changed

13 files changed

+82
-315
lines changed

lib/cli.js

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"use strict";
22

3-
let { readConfig } = require("./config");
43
let { abort, repr } = require("./util");
54
let { parseArgs } = require("node:util");
5+
let path = require("node:path");
66

77
let HELP = `
88
Usage:
@@ -37,7 +37,8 @@ exports.parseCLI = async function parseCLI() {
3737
},
3838
config: {
3939
type: "string",
40-
short: "c"
40+
short: "c",
41+
default: "faucet.config.js"
4142
},
4243
watch: {
4344
type: "boolean",
@@ -69,21 +70,10 @@ exports.parseCLI = async function parseCLI() {
6970
abort(HELP, 0);
7071
}
7172

72-
let options = {
73-
watch: values.watch,
74-
fingerprint: values.fingerprint,
75-
sourcemaps: values.sourcemaps,
76-
compact: values.compact,
77-
serve: values.serve,
78-
liveserve: values.liveserve
73+
let configPath = path.resolve(process.cwd(), values.config);
74+
return {
75+
referenceDir: path.dirname(configPath),
76+
config: await require(configPath),
77+
options: values
7978
};
80-
81-
if(options.watch && options.fingerprint) { // for convenience
82-
console.error("you might consider disabling fingerprinting in watch " +
83-
"mode to avoid littering your file system with obsolete bundles");
84-
}
85-
86-
let rootDir = process.cwd();
87-
let { referenceDir, config } = await readConfig(rootDir, values.config);
88-
return { referenceDir, config, options };
8979
};

lib/config.js

Lines changed: 0 additions & 11 deletions
This file was deleted.

lib/index.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,12 @@
33
let server = require("./server");
44
let { pluginsByBucket } = require("./plugins");
55
let { AssetManager } = require("./manager");
6-
let { resolvePath } = require("./util/resolve");
7-
let { abort, repr } = require("./util");
8-
let { SerializedRunner } = require("./util/runner");
6+
let { abort, repr, resolvePath } = require("./util");
7+
let { SerializedRunner } = require("./runner");
98
let browserslist = require("browserslist");
109

1110
exports.faucetDispatch = async function faucetDispatch(referenceDir, config,
1211
{ watch, fingerprint, sourcemaps, compact, serve, liveserve }) {
13-
config = await config;
14-
1512
let assetManager = new AssetManager(referenceDir, {
1613
manifestConfig: config.manifest,
1714
fingerprint,
@@ -39,12 +36,14 @@ exports.faucetDispatch = async function faucetDispatch(referenceDir, config,
3936
let res = runner.run();
4037

4138
if(watch) {
42-
makeWatcher(config.watchDirs, referenceDir).
43-
then(watcher => {
44-
watcher.on("edit", filepaths => {
45-
runner.rerun(filepaths);
46-
});
47-
});
39+
if(fingerprint) {
40+
console.error("you might consider disabling fingerprinting in watch " +
41+
"mode to avoid littering your file system with obsolete bundles");
42+
}
43+
let watcher = await makeWatcher(config.watchDirs, referenceDir);
44+
watcher.on("edit", filepaths => {
45+
runner.rerun(filepaths);
46+
});
4847
}
4948

5049
if(serve && liveserve) {

lib/manager.js

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
let { Manifest } = require("./manifest");
44
let { createFile } = require("./util/files");
5-
let { resolvePath } = require("./util/resolve");
6-
let { reportFileStatus, abort, generateFingerprint } = require("./util");
5+
let { reportFileStatus, abort, resolvePath } = require("./util");
76
let path = require("path");
7+
let crypto = require("crypto");
88

99
exports.AssetManager = class AssetManager {
1010
constructor(referenceDir, { manifestConfig, fingerprint, exitOnError } = {}) {
@@ -43,18 +43,27 @@ exports.AssetManager = class AssetManager {
4343
});
4444
}
4545

46-
get packagesDir() {
47-
let memo = this._packagesDir;
48-
if(!memo) {
49-
memo = this._packagesDir = this.resolvePath("./node_modules");
50-
}
51-
return memo;
52-
}
53-
5446
_updateManifest(originalPath, actualPath, targetDir) {
5547
let { referenceDir } = this;
5648
originalPath = path.relative(referenceDir, originalPath);
5749
actualPath = path.relative(referenceDir, actualPath);
5850
return this.manifest.set(originalPath, actualPath, targetDir);
5951
}
6052
};
53+
54+
function generateFingerprint(filepath, data) {
55+
let filename = path.basename(filepath);
56+
let ext = filename.indexOf(".") === -1 ? "" : "." + filename.split(".").pop();
57+
let name = ext.length === 0 ? filename : path.basename(filepath, ext);
58+
let hash = generateHash(data);
59+
return path.join(path.dirname(filepath), `${name}-${hash}${ext}`);
60+
}
61+
62+
// exported for testing
63+
exports.generateFingerprint = generateFingerprint;
64+
65+
function generateHash(str) {
66+
let hash = crypto.createHash("md5");
67+
hash.update(str);
68+
return hash.digest("hex");
69+
}

lib/manifest.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
"use strict";
22

33
let { createFile } = require("./util/files");
4-
let { resolvePath } = require("./util/resolve");
5-
let { abort } = require("./util");
4+
let { abort, resolvePath } = require("./util");
65
let path = require("path");
76

87
exports.Manifest = class Manifest {

lib/util/runner.js renamed to lib/runner.js

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ exports.SerializedRunner = class SerializedRunner {
77

88
run(...args) {
99
if(!this._pending) { // prevent concurrent execution
10-
this._pending = augment(this.asyncOp(...args)).
10+
this._pending = this.asyncOp(...args).
1111
finally(() => {
1212
this._pending = null;
1313
});
@@ -24,7 +24,7 @@ exports.SerializedRunner = class SerializedRunner {
2424
let enqueue = this._pending;
2525
let res = this.run(...args);
2626
if(enqueue) {
27-
this._queued = res = augment(res).
27+
this._queued = res = res.
2828
finally(() => {
2929
this._queued = null;
3030
}).
@@ -33,20 +33,3 @@ exports.SerializedRunner = class SerializedRunner {
3333
return res;
3434
}
3535
};
36-
37-
function augment(promise) {
38-
promise.finally = always;
39-
return promise;
40-
}
41-
42-
// poor man's `Promise#finally` polyfill
43-
function always(fn) {
44-
return this.
45-
then(res => {
46-
fn();
47-
return res;
48-
}, err => {
49-
fn();
50-
throw err;
51-
});
52-
}
File renamed without changes.

lib/util/files/finder.js

Lines changed: 0 additions & 59 deletions
This file was deleted.

lib/util/index.js

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
"use strict";
22

3+
let fs = require("fs");
34
let path = require("path");
4-
let crypto = require("crypto");
5-
6-
exports.abort = abort;
7-
exports.repr = repr;
85

96
// reports success or failure for a given file path (typically regarding
107
// compilation or write operations)
@@ -26,28 +23,39 @@ exports.loadExtension = async (pkg, errorMessage, supplier = pkg) => {
2623
}
2724
};
2825

29-
exports.generateFingerprint = (filepath, data) => {
30-
let filename = path.basename(filepath);
31-
let ext = filename.indexOf(".") === -1 ? "" : "." + filename.split(".").pop();
32-
let name = ext.length === 0 ? filename : path.basename(filepath, ext);
33-
let hash = generateHash(data);
34-
return path.join(path.dirname(filepath), `${name}-${hash}${ext}`);
35-
};
36-
3726
function abort(msg, code = 1) {
3827
console.error(msg);
3928
process.exit(code);
4029
}
30+
exports.abort = abort;
4131

4232
function repr(value, jsonify = true) {
4333
if(jsonify) {
4434
value = JSON.stringify(value);
4535
}
4636
return `\`${value}\``;
4737
}
38+
exports.repr = repr;
4839

49-
function generateHash(str) {
50-
let hash = crypto.createHash("md5");
51-
hash.update(str);
52-
return hash.digest("hex");
53-
}
40+
exports.resolvePath = (filepath, referenceDir, { enforceRelative } = {}) => {
41+
if(/^\.?\.\//.test(filepath)) { // starts with `./` or `../`
42+
return path.resolve(referenceDir, filepath);
43+
} else if(enforceRelative) {
44+
abort(`ERROR: path must be relative: ${repr(filepath)}`);
45+
} else { // attempt via Node resolution algorithm
46+
try {
47+
return require.resolve(filepath, { paths: [referenceDir] });
48+
} catch(err) {
49+
// attempt to resolve non-JavaScript package references by relying
50+
// on typical package paths (simplistic approximation of Node's
51+
// resolution algorithm)
52+
let resolved = path.resolve(referenceDir, "node_modules", filepath);
53+
try {
54+
fs.statSync(resolved); // ensures file/directory exists
55+
} catch(_err) {
56+
abort(`ERROR: could not resolve ${repr(filepath)}`);
57+
}
58+
return resolved;
59+
}
60+
}
61+
};

lib/util/resolve.js

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)