Skip to content

Commit 17dfc2f

Browse files
committed
Clean up utils
1 parent dae1cd5 commit 17dfc2f

File tree

11 files changed

+64
-251
lines changed

11 files changed

+64
-251
lines changed

lib/index.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
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,

lib/manager.js

Lines changed: 19 additions & 2 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 } = {}) {
@@ -58,3 +58,20 @@ exports.AssetManager = class AssetManager {
5858
return this.manifest.set(originalPath, actualPath, targetDir);
5959
}
6060
};
61+
62+
function generateFingerprint(filepath, data) {
63+
let filename = path.basename(filepath);
64+
let ext = filename.indexOf(".") === -1 ? "" : "." + filename.split(".").pop();
65+
let name = ext.length === 0 ? filename : path.basename(filepath, ext);
66+
let hash = generateHash(data);
67+
return path.join(path.dirname(filepath), `${name}-${hash}${ext}`);
68+
}
69+
70+
// exported for testing
71+
exports.generateFingerprint = generateFingerprint;
72+
73+
function generateHash(str) {
74+
let hash = crypto.createHash("md5");
75+
hash.update(str);
76+
return hash.digest("hex");
77+
}

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 {
File renamed without changes.
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.

test/test_manager.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use strict";
22

3-
let { AssetManager } = require("../lib/manager");
3+
let { AssetManager, generateFingerprint } = require("../lib/manager");
44
let { describe, it, before, after } = require("node:test");
55
let path = require("path");
66
let assert = require("assert");
@@ -51,3 +51,18 @@ describe("asset manager", () => {
5151
}, /exit 1/);
5252
});
5353
});
54+
55+
describe("fingerprinting", () => {
56+
it("generates a content-dependent hash", () => {
57+
let fingerprint = generateFingerprint("/path/to/foo.js", "lorem ipsum");
58+
assertSame(fingerprint, "/path/to/foo-80a751fde577028640c419000e33eba6.js");
59+
60+
fingerprint = generateFingerprint("/path/to/bar.js", "dolor sit amet");
61+
assertSame(fingerprint, "/path/to/bar-7afed6210e0b8fce023f06abd4490fa0.js");
62+
});
63+
64+
it("supports files without extension", () => {
65+
let fingerprint = generateFingerprint("/path/to/baz", "lipsum");
66+
assertSame(fingerprint, "/path/to/baz-8047cfaac755e5c7f77af066123980a5");
67+
});
68+
});

test/test_runner.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use strict";
22

3-
let { SerializedRunner } = require("../lib/util/runner");
3+
let { SerializedRunner } = require("../lib/runner");
44
let { describe, it } = require("node:test");
55
let { strictEqual: assertSame, deepStrictEqual: assertDeep } = require("assert");
66

0 commit comments

Comments
 (0)