esbuild-plugin-vue-iii
Version:
a esbuild plugin for vue 3 SFC files.
136 lines • 5.45 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveTemplateCompilerOptions = exports.compile = exports.transformTemplateInMain = exports.transformTemplateAsModule = void 0;
const path_1 = __importDefault(require("path"));
const slash_1 = __importDefault(require("slash"));
const compiler_sfc_1 = require("@vue/compiler-sfc");
const script_1 = require("./script");
const error_1 = require("./utils/error");
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function transformTemplateAsModule(code, descriptor, options, pluginContext, ssr) {
const result = compile(code, descriptor, options, pluginContext, ssr);
let returnCode = result.code;
if (options.devServer &&
options.devServer.config.server.hmr !== false &&
!ssr &&
!options.isProduction) {
returnCode += `\nimport.meta.hot.accept(({ render }) => {
__VUE_HMR_RUNTIME__.rerender(${JSON.stringify(descriptor.id)}, render)
})`;
}
return {
code: returnCode,
map: result.map
};
}
exports.transformTemplateAsModule = transformTemplateAsModule;
/**
* transform the template directly in the main SFC module
*/
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function transformTemplateInMain(code, descriptor, options, pluginContext, ssr) {
const result = compile(code, descriptor, options, pluginContext, ssr);
return {
...result,
code: result.code.replace(/\nexport (function|const) (render|ssrRender)/, '\n$1 _sfc_$2')
};
}
exports.transformTemplateInMain = transformTemplateInMain;
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
function compile(code, descriptor, options, pluginContext, ssr) {
const filename = descriptor.filename;
const result = compiler_sfc_1.compileTemplate({
...resolveTemplateCompilerOptions(descriptor, options, ssr),
source: code
});
if (result.errors.length) {
result.errors.forEach((error) => pluginContext.error(typeof error === 'string'
? { id: filename, message: error }
: error_1.createRollupError(filename, error)));
}
if (result.tips.length) {
result.tips.forEach((tip) => pluginContext.warn({
id: filename,
message: tip
}));
}
return result;
}
exports.compile = compile;
function resolveTemplateCompilerOptions(descriptor, options, ssr) {
var _a, _b, _c;
const block = descriptor.template;
if (!block) {
return;
}
const resolvedScript = script_1.getResolvedScript(descriptor, ssr);
const hasScoped = descriptor.styles.some((s) => s.scoped);
const { id, filename, cssVars } = descriptor;
let transformAssetUrls = (_a = options.template) === null || _a === void 0 ? void 0 : _a.transformAssetUrls;
// @vue/compiler-sfc/dist/compiler-sfc.d.ts should export `AssetURLOptions`
let assetUrlOptions; //: AssetURLOptions | undefined
if (options.devServer) {
// during dev, inject vite base so that @vue/compiler-sfc can transform
// relative paths directly to absolute paths without incurring an extra import
// request
if (filename.startsWith(options.root)) {
assetUrlOptions = {
base: options.devServer.config.base +
slash_1.default(path_1.default.relative(options.root, path_1.default.dirname(filename)))
};
}
}
else {
// build: force all asset urls into import requests so that they go through
// the assets plugin for asset registration
assetUrlOptions = {
includeAbsolute: true
};
}
if (transformAssetUrls && typeof transformAssetUrls === 'object') {
// presence of array fields means this is raw tags config
if (Object.keys(transformAssetUrls).some((key) => Array.isArray(transformAssetUrls[key]))) {
transformAssetUrls = {
...assetUrlOptions,
tags: transformAssetUrls
};
}
else {
transformAssetUrls = { ...transformAssetUrls, ...assetUrlOptions };
}
}
else {
transformAssetUrls = assetUrlOptions;
}
let preprocessOptions = block.lang && ((_b = options.template) === null || _b === void 0 ? void 0 : _b.preprocessOptions);
if (block.lang === 'pug') {
preprocessOptions = {
doctype: 'html',
...preprocessOptions
};
}
return {
...options.template,
id,
filename,
scoped: hasScoped,
slotted: descriptor.slotted,
isProd: options.isProduction,
inMap: block.src ? undefined : block.map,
ssr,
ssrCssVars: cssVars,
transformAssetUrls,
preprocessLang: block.lang,
preprocessOptions,
compilerOptions: {
...(_c = options.template) === null || _c === void 0 ? void 0 : _c.compilerOptions,
scopeId: hasScoped ? `data-v-${id}` : undefined,
bindingMetadata: resolvedScript ? resolvedScript.bindings : undefined
}
};
}
exports.resolveTemplateCompilerOptions = resolveTemplateCompilerOptions;
//# sourceMappingURL=template.js.map