UNPKG

@tanstack/start-server-core

Version:

Modern and scalable routing for React applications

136 lines (135 loc) • 5.58 kB
import { buildManifest, resolveTransformAssetsConfig, transformManifestAssets } from "./transformAssetUrls.js"; import { getStaticInlineCss, 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 = getStaticInlineCss(void 0, 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) => { const inlineCss = getStaticInlineCss(requestOpts.requestInlineCss, opts.inlineCss); if (transformResolver.cache && inlineCss !== void 0) { const cached = finalManifestCache.get(getFinalManifestCacheKey(inlineCss)); if (cached) return cached; } return resolveRequest(requestOpts, finalManifestCache); }, resolveUncached: (requestOpts) => resolveRequest(requestOpts, void 0) }; } function getFinalManifestCacheKey(inlineCss) { return inlineCss ? "inline-css" : "linked-css"; } function cacheFinalManifestPromise(finalManifestCache, cacheKey, promise) { const cachedPromise = promise.then((manifest) => { if (finalManifestCache.get(cacheKey) === cachedPromise) finalManifestCache.set(cacheKey, manifest); return manifest; }, (error) => { if (finalManifestCache.get(cacheKey) === cachedPromise) finalManifestCache.delete(cacheKey); throw error; }); finalManifestCache.set(cacheKey, cachedPromise); return cachedPromise; } function getOrCreateCachedFinalManifest(finalManifestCache, cacheKey, computeFinalManifest) { const cached = finalManifestCache.get(cacheKey); if (cached) return cached; return cacheFinalManifestPromise(finalManifestCache, 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 getOrCreateCachedFinalManifest(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 = cacheFinalManifestPromise(opts.finalManifestCache, getFinalManifestCacheKey(inlineCss), Promise.resolve().then(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