esbuild-plugin-vue-iii
Version:
a esbuild plugin for vue 3 SFC files.
210 lines • 9.68 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.vue3Plugin = void 0;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
// import { createFilter } from '@rollup/pluginutils';
const compiler_sfc_1 = require("@vue/compiler-sfc");
const query_1 = require("../vite/packages/plugin-vue/src/utils/query");
const descriptorCache_1 = require("../vite/packages/plugin-vue/src/utils/descriptorCache");
const script_1 = require("../vite/packages/plugin-vue/src/script");
const main_1 = require("../vite/packages/plugin-vue/src/main");
// import { handleHotUpdate } from '../vite/packages/plugin-vue/src/handleHotUpdate';
const template_1 = require("../vite/packages/plugin-vue/src/template");
const style_1 = require("../vite/packages/plugin-vue/src/style");
const logger = {
log: process.env.NODE_ENV === 'dev' ? console.log : () => { },
};
const AbsolutePath = /^(?:\/|(?:[A-Za-z]:)?[\\|/])/;
const dummyContextFactory = () => {
const errors = [];
return {
resolve(src, importer) {
if (AbsolutePath.test(src)) {
logger.log('resolve abs:', src);
return { id: src };
}
else if (src[0] === '.') { // is relative path
logger.log('resolve rel:', importer ? path_1.default.resolve(importer, '..', src) : path_1.default.resolve(src));
return { id: importer ? path_1.default.resolve(importer, '..', src) : path_1.default.resolve(src) };
}
},
error(param) {
var _a, _b, _c;
errors.push({
location: {
file: ((_a = param.loc) === null || _a === void 0 ? void 0 : _a.file) || param.id,
column: (_b = param.loc) === null || _b === void 0 ? void 0 : _b.column,
line: (_c = param.loc) === null || _c === void 0 ? void 0 : _c.line,
},
text: param.message,
});
},
get errors() {
return errors;
},
};
};
// const filter = createFilter(
// rawOptions.include || /\.vue$/,
// rawOptions.exclude
// )
const createFilter = (include, exclude) => // eslint-disable-line @typescript-eslint/no-unused-vars
(name) => !!(include === null || include === void 0 ? void 0 : include.test(name));
const vue3Plugin = (rawOptions = {}) => {
// const {
// include = /\.vue$/,
// exclude,
// customElement = /\.ce\.vue$/,
// refTransform = false
// } = rawOptions;
const include = /\.vue$/;
const exclude = undefined;
const customElement = undefined;
const refTransform = undefined;
const filter = createFilter(include, exclude); // eslint-disable-line @typescript-eslint/no-unused-vars
const customElementFilter = // eslint-disable-line @typescript-eslint/no-unused-vars
typeof customElement === 'boolean'
? () => customElement
: createFilter(customElement);
const refTransformFilter = // eslint-disable-line @typescript-eslint/no-unused-vars
refTransform === false
? () => false
: refTransform === true
? createFilter(/\.(j|t)sx?$/, /node_modules/)
: createFilter(refTransform);
// compat for older verisons
const canUseRefTransform = typeof compiler_sfc_1.shouldTransformRef === 'function'; // eslint-disable-line @typescript-eslint/no-unused-vars
const options = {
isProduction: process.env.NODE_ENV === 'production',
...rawOptions,
include,
exclude,
customElement,
refTransform,
root: process.cwd(),
};
return {
name: 'vue-iii',
setup(build) {
// transform
build.onResolve({ filter: /\.vue$/ }, args => ({
path: args.importer ? path_1.default.resolve(args.importer, '..', args.path) : path_1.default.resolve(args.path),
namespace: 'vue-iii-transform',
}));
build.onLoad({ filter: /\.vue$/, namespace: 'vue-iii-transform' }, async (args) => {
const id = args.path;
const ssr = false;
const resolveDir = path_1.default.dirname(id);
logger.log('transform', id);
logger.log('resolveDir', resolveDir);
const { filename, query } = query_1.parseVueRequest(id);
if (query.raw) {
logger.log('transform 1 returned', id);
return;
}
// if (!filter(filename) && !query.vue) {
// if (!query.vue && refTransformFilter(filename)) {
// if (!canUseRefTransform) {
// this.warn('refTransform requires @vue/compiler-sfc@^3.2.5.')
// } else if (shouldTransformRef(code)) {
// return transformRef(code, {
// filename,
// sourceMap: true
// })
// }
// }
// return
// }
const code = await fs_1.default.promises.readFile(args.path, 'utf-8');
const dummyContext = dummyContextFactory();
if (!query.vue) {
// main request
const ret = await main_1.transformMain(code, filename, options, dummyContext, ssr,
// customElementFilter(filename)
false);
logger.log('transform 2 returned', ret);
return {
contents: ret === null || ret === void 0 ? void 0 : ret.code,
loader: 'ts',
resolveDir,
errors: dummyContext.errors
};
}
else {
// sub block request is done in the load section
}
});
// load
build.onResolve({ filter: /\.vue\?/ }, args => {
// serve subpart requests (*?vue) as virtual modules
if (query_1.parseVueRequest(args.path).query.vue) {
return {
path: args.importer ? path_1.default.resolve(args.importer, '..', args.path) : path_1.default.resolve(args.path),
namespace: 'vue-iii-load',
};
}
});
build.onLoad({ filter: /\.vue\?/, namespace: 'vue-iii-load' }, async (args) => {
const id = args.path;
const ssr = false;
const { filename, query } = query_1.parseVueRequest(id);
const resolveDir = path_1.default.dirname(id.split('?')[0]);
logger.log('resolveDir', resolveDir);
// select corresponding block for subpart virtual modules
if (query.vue) {
if (query.src) {
logger.log('load 1 returned', id);
return { contents: await fs_1.default.promises.readFile(filename, 'utf-8'), loader: 'ts', resolveDir };
}
const descriptor = descriptorCache_1.getDescriptor(filename, options.root, options.isProduction);
let block;
const loader = 'ts';
const dummyContext = dummyContextFactory();
if (query.type === 'script') {
// handle <scrip> + <script setup> merge via compileScript()
block = script_1.getResolvedScript(descriptor, ssr);
}
else if (query.type === 'template') {
block = descriptor.template;
const ret = template_1.transformTemplateAsModule(block.content, descriptor, options, dummyContext, ssr);
logger.log('transform 3 returned', ret);
return {
contents: ret === null || ret === void 0 ? void 0 : ret.code,
loader,
resolveDir,
errors: dummyContext.errors
};
}
else if (query.type === 'style') {
block = descriptor.styles[query.index];
const ret = await style_1.transformStyle(block.content, descriptor, Number(query.index), options, dummyContext);
logger.log('transform 4 returned', ret);
return {
contents: ret === null || ret === void 0 ? void 0 : ret.code,
loader: 'css',
resolveDir,
errors: dummyContext.errors
};
}
else if (query.index != null) {
block = descriptor.customBlocks[query.index];
}
if (block) {
logger.log('load 2 returned', id, block);
return {
contents: block.content,
loader,
resolveDir,
};
}
}
});
},
};
};
exports.vue3Plugin = vue3Plugin;
//# sourceMappingURL=index.js.map