| | |
| | | |
| | | "use strict"; |
| | | |
| | | const { cachedJoin } = require("./util/path"); |
| | | |
| | | /** @typedef {import("./Resolver")} Resolver */ |
| | | /** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */ |
| | | /** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */ |
| | | /** @typedef {import("./Resolver").ResolveContextYield} ResolveContextYield */ |
| | | /** @typedef {{ [k: string]: undefined | ResolveRequest | ResolveRequest[] }} Cache */ |
| | | |
| | | const RELATIVE_REQUEST_REGEXP = /^\.\.?(?:\/|$)/; |
| | | |
| | | /** |
| | | * @param {string} relativePath relative path from package root |
| | | * @param {string} request relative request |
| | | * @returns {string} normalized request with a preserved leading dot |
| | | */ |
| | | function joinRelativePreservingLeadingDot(relativePath, request) { |
| | | const normalized = cachedJoin(relativePath, request); |
| | | return RELATIVE_REQUEST_REGEXP.test(normalized) |
| | | ? normalized |
| | | : `./${normalized}`; |
| | | } |
| | | |
| | | /** |
| | | * @param {ResolveRequest} request request |
| | | * @returns {string | false | undefined} normalized path |
| | | */ |
| | | function getCachePath(request) { |
| | | if (request.descriptionFileRoot && !request.module) { |
| | | return request.descriptionFileRoot; |
| | | } |
| | | return request.path; |
| | | } |
| | | |
| | | /** |
| | | * @param {ResolveRequest} request request |
| | | * @returns {string | undefined} normalized request string |
| | | */ |
| | | function getCacheRequest(request) { |
| | | const requestString = request.request; |
| | | if ( |
| | | !requestString || |
| | | !request.relativePath || |
| | | !RELATIVE_REQUEST_REGEXP.test(requestString) |
| | | ) { |
| | | return requestString; |
| | | } |
| | | return joinRelativePreservingLeadingDot(request.relativePath, requestString); |
| | | } |
| | | |
| | | /** |
| | | * @param {string} type type of cache |
| | |
| | | return JSON.stringify({ |
| | | type, |
| | | context: withContext ? request.context : "", |
| | | path: request.path, |
| | | path: getCachePath(request), |
| | | query: request.query, |
| | | fragment: request.fragment, |
| | | request: request.request, |
| | | request: getCacheRequest(request), |
| | | }); |
| | | } |
| | | |
| | |
| | | resolver |
| | | .getHook(this.source) |
| | | .tapAsync("UnsafeCachePlugin", (request, resolveContext, callback) => { |
| | | if (!this.filterPredicate(request)) return callback(); |
| | | if (!this.filterPredicate(request)) { |
| | | return resolver.doResolve( |
| | | target, |
| | | request, |
| | | null, |
| | | resolveContext, |
| | | callback, |
| | | ); |
| | | } |
| | | const isYield = typeof resolveContext.yield === "function"; |
| | | const cacheId = getCacheId( |
| | | isYield ? "yield" : "default", |