95 lines
2.9 KiB
JavaScript
95 lines
2.9 KiB
JavaScript
![]() |
import path from "node:path";
|
||
|
import { normalizePath } from "vite";
|
||
|
const getConfigAlias = (settings) => {
|
||
|
const { tsConfig, tsConfigPath } = settings;
|
||
|
if (!tsConfig || !tsConfigPath || !tsConfig.compilerOptions)
|
||
|
return null;
|
||
|
const { baseUrl, paths } = tsConfig.compilerOptions;
|
||
|
if (!baseUrl)
|
||
|
return null;
|
||
|
const resolvedBaseUrl = path.resolve(path.dirname(tsConfigPath), baseUrl);
|
||
|
const aliases = [];
|
||
|
if (paths) {
|
||
|
for (const [alias, values] of Object.entries(paths)) {
|
||
|
const find = new RegExp(
|
||
|
`^${[...alias].map(
|
||
|
(segment) => segment === "*" ? "(.+)" : segment.replace(/[\\^$*+?.()|[\]{}]/, "\\$&")
|
||
|
).join("")}$`
|
||
|
);
|
||
|
let matchId = 0;
|
||
|
for (const value of values) {
|
||
|
const replacement = [...normalizePath(path.resolve(resolvedBaseUrl, value))].map((segment) => segment === "*" ? `$${++matchId}` : segment === "$" ? "$$" : segment).join("");
|
||
|
aliases.push({ find, replacement });
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
aliases.push({
|
||
|
find: /^(?!\.*\/|\.*$|\w:)(.+)$/,
|
||
|
replacement: `${[...normalizePath(resolvedBaseUrl)].map((segment) => segment === "$" ? "$$" : segment).join("")}/$1`
|
||
|
});
|
||
|
return aliases;
|
||
|
};
|
||
|
function configAliasVitePlugin({
|
||
|
settings
|
||
|
}) {
|
||
|
const configAlias = getConfigAlias(settings);
|
||
|
if (!configAlias)
|
||
|
return null;
|
||
|
const plugin = {
|
||
|
name: "astro:tsconfig-alias",
|
||
|
enforce: "pre",
|
||
|
configResolved(config) {
|
||
|
patchCreateResolver(config, plugin);
|
||
|
},
|
||
|
async resolveId(id, importer, options) {
|
||
|
if (isVirtualId(id))
|
||
|
return;
|
||
|
for (const alias of configAlias) {
|
||
|
if (alias.find.test(id)) {
|
||
|
const updatedId = id.replace(alias.find, alias.replacement);
|
||
|
const resolved = await this.resolve(updatedId, importer, { skipSelf: true, ...options });
|
||
|
if (resolved)
|
||
|
return resolved;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
return plugin;
|
||
|
}
|
||
|
function patchCreateResolver(config, prePlugin) {
|
||
|
const _createResolver = config.createResolver;
|
||
|
config.createResolver = function(...args1) {
|
||
|
const resolver = _createResolver.apply(config, args1);
|
||
|
return async function(...args2) {
|
||
|
const id = args2[0];
|
||
|
const importer = args2[1];
|
||
|
const ssr = args2[3];
|
||
|
if (importer == null ? void 0 : importer.includes("node_modules")) {
|
||
|
return resolver.apply(_createResolver, args2);
|
||
|
}
|
||
|
const fakePluginContext = {
|
||
|
resolve: (_id, _importer) => resolver(_id, _importer, false, ssr)
|
||
|
};
|
||
|
const fakeResolveIdOpts = {
|
||
|
assertions: {},
|
||
|
isEntry: false,
|
||
|
ssr
|
||
|
};
|
||
|
const resolved = await prePlugin.resolveId.apply(fakePluginContext, [
|
||
|
id,
|
||
|
importer,
|
||
|
fakeResolveIdOpts
|
||
|
]);
|
||
|
if (resolved)
|
||
|
return resolved;
|
||
|
return resolver.apply(_createResolver, args2);
|
||
|
};
|
||
|
};
|
||
|
}
|
||
|
function isVirtualId(id) {
|
||
|
return id.includes("\0") || id.startsWith("virtual:") || id.startsWith("astro:");
|
||
|
}
|
||
|
export {
|
||
|
configAliasVitePlugin as default
|
||
|
};
|