@tanstack/start-server-core
Version:
Modern and scalable routing for React applications
126 lines (125 loc) • 5.35 kB
JavaScript
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