UNPKG

@typed/content-hash

Version:

Content hash a directory of HTML/JS/CSS files and other static assets

46 lines 3.23 kB
"use strict"; 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