@tanstack/router-plugin
Version:
Modern and scalable routing for React applications
83 lines (82 loc) • 2.54 kB
JavaScript
import { getConfig } from "./config.js";
import { routeHmrStatement } from "./route-hmr-statement.js";
import { compileCodeSplitReferenceRoute } from "./code-splitter/compilers.js";
import { debug, normalizePath } from "./utils.js";
import { getReferenceRouteCompilerPlugins } from "./code-splitter/plugins/framework-plugins.js";
import { generateFromAst, logDiff, parseAst } from "@tanstack/router-utils";
//#region src/core/router-hmr-plugin.ts
/**
* This plugin adds HMR support for file routes.
* It is only added to the composed plugin in dev when autoCodeSplitting is disabled, since the code splitting plugin
* handles HMR for code-split routes itself.
*/
var includeCode = [
"createFileRoute(",
"createRootRoute(",
"createRootRouteWithContext("
];
var unpluginRouterHmrFactory = (options = {}) => {
let ROOT = process.cwd();
let userConfig = options;
return {
name: "tanstack-router:hmr",
enforce: "pre",
transform: {
filter: {
id: /\.(m|c)?(j|t)sx?$/,
code: { include: includeCode }
},
handler(code, id) {
const normalizedId = normalizePath(id);
if (!globalThis.TSR_ROUTES_BY_ID_MAP?.has(normalizedId)) return null;
if (debug) console.info("Adding HMR handling to route ", normalizedId);
if (userConfig.target === "react") {
const compiled = compileCodeSplitReferenceRoute({
code,
filename: normalizedId,
id: normalizedId,
addHmr: true,
codeSplitGroupings: [],
targetFramework: "react",
compilerPlugins: getReferenceRouteCompilerPlugins({
targetFramework: "react",
addHmr: true
})
});
if (compiled) {
if (debug) {
logDiff(code, compiled.code);
console.log("Output:\n", compiled.code + "\n\n");
}
return compiled;
}
}
const ast = parseAst({ code });
ast.program.body.push(routeHmrStatement);
const result = generateFromAst(ast, {
sourceMaps: true,
filename: normalizedId,
sourceFileName: normalizedId
});
if (debug) {
logDiff(code, result.code);
console.log("Output:\n", result.code + "\n\n");
}
return result;
}
},
vite: {
configResolved(config) {
ROOT = config.root;
userConfig = getConfig(options, ROOT);
},
applyToEnvironment(environment) {
if (userConfig.plugin?.vite?.environmentName) return userConfig.plugin.vite.environmentName === environment.name;
return true;
}
}
};
};
//#endregion
export { unpluginRouterHmrFactory };
//# sourceMappingURL=router-hmr-plugin.js.map