@typed/content-hash
Version:
Content hash a directory of HTML/JS/CSS files and other static assets
46 lines • 3.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.hashDirectory = void 0;
const Env_1 = require("@typed/fp/Env");
const FxEnv_1 = require("@typed/fp/FxEnv");
const string_1 = require("@typed/fp/string");
const Eq_1 = require("fp-ts/Eq");
const function_1 = require("fp-ts/function");
const Option_1 = require("fp-ts/Option");
const ReadonlyArray_1 = require("fp-ts/ReadonlyArray");
const logging_1 = require("./services/logging");
const readDependencies_1 = require("./services/readDependencies");
const readDirectory_1 = require("./services/readDirectory");
const readFilePath_1 = require("./services/readFilePath");
const rewriteDependencies_1 = require("./services/rewriteDependencies");
const rewriteSourceMapUrls_1 = require("./services/rewriteSourceMapUrls");
const toposortDocuments_1 = require("./services/toposortDocuments");
const uniqDocumentPaths = (0, function_1.pipe)(string_1.Eq, (0, Eq_1.contramap)((d) => d.filePath), ReadonlyArray_1.uniq);
const hashDirectory = (directory) => (0, FxEnv_1.Do)(function* (_) {
const { documentRegistry: initialDocumentRegistry } = yield* _((0, Env_1.ask)());
yield* _((0, logging_1.info)(`Hashing Directory ${directory}...`));
// Read all the documents we understand how to read dependencies from
const supportedDocuments = yield* _(readDocuments(directory));
const supportedDocumentRegistry = new Map([
...initialDocumentRegistry,
...supportedDocuments.map((d) => [d.filePath, d]),
]);
// Gather any dependencies that we don't support directly through a plugin so they can get hashes too.
const dependencies = yield* _((0, function_1.pipe)(supportedDocuments.map((doc) => (0, readDependencies_1.readDependencies)(directory, doc)), Env_1.zip, (0, Env_1.map)((docs) => uniqDocumentPaths(docs.flat())), (0, Env_1.useSome)({ documentRegistry: supportedDocumentRegistry })));
// Sort them all so we can rewrite hashes effectively
const sortedDocuments = yield* _((0, toposortDocuments_1.sortDocuments)([...supportedDocuments, ...dependencies.filter((d) => !supportedDocumentRegistry.has(d.filePath))]));
// Rewrite dependencies 1-by-1, recalculating file hashes incrementally to ensure cache-busting functionality.
yield* _((0, logging_1.info)(`Rewriting Hashes...`));
let documentRegistry = new Map([
...supportedDocumentRegistry,
...dependencies.map((d) => [d.filePath, d]),
]);
for (const documents of sortedDocuments) {
documentRegistry = yield* _((0, function_1.pipe)((0, rewriteDependencies_1.rewriteDependencies)(documents), (0, Env_1.useSome)({ documentRegistry })));
}
yield* _((0, logging_1.info)(`Remapping any source-map URLs...`));
return yield* _((0, function_1.pipe)(rewriteSourceMapUrls_1.rewriteSourceMapUrls, (0, Env_1.useSome)({ documentRegistry })));
});
exports.hashDirectory = hashDirectory;
const readDocuments = (directory) => (0, function_1.pipe)((0, readDirectory_1.readDirectory)(directory), (0, Env_1.chainW)((filePaths) => (0, Env_1.zip)(filePaths.map(readFilePath_1.readFilePath))), (0, Env_1.map)((options) => options.filter(Option_1.isSome).map((o) => o.value)));
//# sourceMappingURL=hashDirectory.js.map