UNPKG

@tanstack/start-server-core

Version:

Modern and scalable routing for React applications

126 lines (125 loc) 5.35 kB
import { buildManifest, resolveTransformAssetsConfig, transformManifestAssets } from "./transformAssetUrls.js"; import { getStaticHandlerInlineCssDefault, resolveInlineCssForRequest } from "./inlineCss.js"; //#region src/finalManifest.ts function createCachedBaseManifestLoader(loadBaseManifest) { let baseManifestPromise; return () => { if (!baseManifestPromise) baseManifestPromise = loadBaseManifest().catch((error) => { baseManifestPromise = void 0; throw error; }); return baseManifestPromise; }; } function createFinalManifestTransformResolver(transformAssets, opts) { const transformConfig = transformAssets !== void 0 ? resolveTransformAssetsConfig(transformAssets) : void 0; const cache = transformConfig ? transformConfig.cache : true; const warmup = !!transformAssets && typeof transformAssets === "object" && "warmup" in transformAssets && transformAssets.warmup === true; let cachedCreateTransformPromise; const clearCachedCreateTransform = () => { cachedCreateTransformPromise = void 0; }; return { cache, warmup, clearCachedCreateTransform, getTransformFn: async (ctx) => { if (!transformConfig) return void 0; if (transformConfig.type !== "createTransform") return transformConfig.transformFn; if (!cache || !opts.cacheCreateTransform) return transformConfig.createTransform(ctx); if (!cachedCreateTransformPromise) cachedCreateTransformPromise = Promise.resolve(transformConfig.createTransform(ctx)).catch((error) => { clearCachedCreateTransform(); throw error; }); return cachedCreateTransformPromise; } }; } function createFinalManifestResolver(opts) { const finalManifestCache = /* @__PURE__ */ new Map(); const transformResolver = createFinalManifestTransformResolver(opts.transformAssets, { cacheCreateTransform: opts.cacheCreateTransform }); const handlerDefaultInlineCss = getStaticHandlerInlineCssDefault(opts.inlineCss); const getRequestManifestOptions = async (requestOpts) => { const transformFn = await transformResolver.getTransformFn({ warmup: false, request: requestOpts.request }); const inlineCss = await resolveInlineCssForRequest({ request: requestOpts.request, handlerInlineCss: opts.inlineCss, requestInlineCss: requestOpts.requestInlineCss }); return { getBaseManifest: requestOpts.getBaseManifest, transformFn, cache: transformResolver.cache, inlineCss }; }; const resolveRequest = async (requestOpts, cache) => { return resolveFinalManifest({ ...await getRequestManifestOptions(requestOpts), finalManifestCache: cache }); }; return { warmup: ({ getBaseManifest }) => warmupFinalManifest({ enabled: transformResolver.warmup, handlerDefaultInlineCss, cache: transformResolver.cache, finalManifestCache, getBaseManifest, getTransformFn: () => transformResolver.getTransformFn({ warmup: true }), onError: transformResolver.clearCachedCreateTransform }), resolveCached: (requestOpts) => resolveRequest(requestOpts, finalManifestCache), resolveUncached: (requestOpts) => resolveRequest(requestOpts, void 0) }; } function getFinalManifestCacheKey(inlineCss) { return inlineCss ? "inline-css" : "linked-css"; } function cacheFinalManifestPromise(cachedFinalManifestPromises, cacheKey, promise) { const cachedFinalManifestPromise = promise.catch((error) => { if (cachedFinalManifestPromises.get(cacheKey) === cachedFinalManifestPromise) cachedFinalManifestPromises.delete(cacheKey); throw error; }); cachedFinalManifestPromises.set(cacheKey, cachedFinalManifestPromise); return cachedFinalManifestPromise; } function getOrCreateCachedFinalManifestPromise(cachedFinalManifestPromises, cacheKey, computeFinalManifest) { const cachedFinalManifestPromise = cachedFinalManifestPromises.get(cacheKey); if (cachedFinalManifestPromise) return cachedFinalManifestPromise; return cacheFinalManifestPromise(cachedFinalManifestPromises, cacheKey, Promise.resolve().then(computeFinalManifest)); } async function buildFinalManifest(opts) { return opts.transformFn ? await transformManifestAssets(opts.base, opts.transformFn, { inlineCss: opts.inlineCss }) : buildManifest(opts.base, { inlineCss: opts.inlineCss }); } async function resolveFinalManifest(opts) { const computeFinalManifest = async () => { return buildFinalManifest({ base: await opts.getBaseManifest(), transformFn: opts.transformFn, inlineCss: opts.inlineCss }); }; if (opts.finalManifestCache && (!opts.transformFn || opts.cache)) return getOrCreateCachedFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(opts.inlineCss), computeFinalManifest); return computeFinalManifest(); } function warmupFinalManifest(opts) { if (!opts.enabled || opts.handlerDefaultInlineCss === void 0 || !opts.cache) return; const inlineCss = opts.handlerDefaultInlineCss; const warmupPromise = getOrCreateCachedFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(inlineCss), async () => { const [base, transformFn] = await Promise.all([opts.getBaseManifest(), opts.getTransformFn()]); return buildFinalManifest({ base, transformFn, inlineCss }); }); if (opts.onError) warmupPromise.catch(opts.onError); return warmupPromise; } //#endregion export { createCachedBaseManifestLoader, createFinalManifestResolver }; //# sourceMappingURL=finalManifest.js.map