2021-03-01 15:06:11 +08:00

138 lines
5.1 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBuildJsTransformPlugin = exports.createServerTransformPlugin = void 0;
const utils_1 = require("./utils");
const serverPluginSourceMap_1 = require("./server/serverPluginSourceMap");
function createServerTransformPlugin(transforms, customBlockTransforms, resolver) {
return ({ app }) => {
if (!transforms.length && !Object.keys(customBlockTransforms).length) {
return;
}
app.use(async (ctx, next) => {
await next();
if (!ctx.body ||
(ctx.type === 'text/html' && !utils_1.isImportRequest(ctx)) ||
resolver.isPublicRequest(ctx.path)) {
return;
}
let { url, path, query, __notModified } = ctx;
const id = resolver.requestToFile(url);
path = resolver.requestToFile(path);
const isImport = utils_1.isImportRequest(ctx);
const isBuild = false;
let code = '';
for (const t of transforms) {
const transformContext = {
id,
path,
query,
isImport,
isBuild
};
if (__notModified) {
transformContext.notModified = true;
}
if (t.test(transformContext)) {
code = code || (await utils_1.readBody(ctx.body));
const result = await t.transform({
...transformContext,
code
});
if (typeof result === 'string') {
code = result;
}
else {
code = result.code;
if (result.map) {
ctx.map = serverPluginSourceMap_1.mergeSourceMap(ctx.map, result.map);
}
}
ctx.type = 'js';
ctx.body = code;
}
}
// custom blocks
if (path.endsWith('vue') && query.type === 'custom') {
const t = customBlockTransforms[query.blockType];
if (t) {
ctx.type = 'js';
code = code || (await utils_1.readBody(ctx.body));
ctx.body = await t({
code,
id,
path,
query,
isImport,
isBuild
});
}
}
});
};
}
exports.createServerTransformPlugin = createServerTransformPlugin;
function createBuildJsTransformPlugin(transforms, customBlockTransforms) {
return {
name: 'vite:transforms',
async transform(code, id) {
const { path, query } = utils_1.parseWithQuery(id);
let transformed = code;
let map = null;
const runTransform = async (t, ctx) => {
const result = await t(ctx);
if (typeof result === 'string') {
transformed = result;
}
else {
transformed = result.code;
if (result.map) {
map = serverPluginSourceMap_1.mergeSourceMap(map, result.map);
}
}
};
for (const t of transforms) {
const transformContext = {
code: transformed,
id,
path,
query,
isImport: true,
isBuild: true
};
if (t.test(transformContext)) {
await runTransform(t.transform, transformContext);
}
}
// custom blocks
if (query.vue != null && typeof query.type === 'string') {
const t = customBlockTransforms[query.type];
if (t) {
// normalize lang since rollup-plugin-vue appends it as .xxx
const normalizedQuery = {};
for (const key in query) {
if (key.startsWith(`lang.`)) {
normalizedQuery.lang = key.slice(5);
}
else {
normalizedQuery[key] = query[key];
}
}
await runTransform(t, {
code: transformed,
id,
path,
query: normalizedQuery,
isImport: true,
isBuild: true
});
}
}
return {
code: transformed,
map
};
}
};
}
exports.createBuildJsTransformPlugin = createBuildJsTransformPlugin;
//# sourceMappingURL=transform.js.map