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

106 lines
4.1 KiB
JavaScript

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBuildAssetPlugin = exports.registerAssets = exports.resolveAsset = exports.injectAssetRe = void 0;
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const utils_1 = require("../utils");
const slash_1 = __importDefault(require("slash"));
const mime_types_1 = __importDefault(require("mime-types"));
const debug = require('debug')('vite:build:asset');
const assetResolveCache = new Map();
const publicDirRE = /^public(\/|\\)/;
exports.injectAssetRe = /import.meta.ROLLUP_FILE_URL_(\w+)/;
exports.resolveAsset = async (id, root, publicBase, assetsDir, inlineLimit) => {
id = utils_1.cleanUrl(id);
const cached = assetResolveCache.get(id);
if (cached) {
return cached;
}
let resolved;
const relativePath = path_1.default.relative(root, id);
if (!fs_extra_1.default.existsSync(id)) {
// try resolving from public dir
const publicDirPath = path_1.default.join(root, 'public', relativePath);
if (fs_extra_1.default.existsSync(publicDirPath)) {
// file is resolved from public dir, it will be copied verbatim so no
// need to read content here.
resolved = {
url: publicBase + slash_1.default(relativePath)
};
}
}
if (!resolved) {
if (publicDirRE.test(relativePath)) {
resolved = {
url: publicBase + slash_1.default(relativePath.replace(publicDirRE, ''))
};
}
}
if (!resolved) {
let url;
let content = await fs_extra_1.default.readFile(id);
if (!id.endsWith(`.svg`) && content.length < Number(inlineLimit)) {
url = `data:${mime_types_1.default.lookup(id)};base64,${content.toString('base64')}`;
content = undefined;
}
resolved = {
content,
fileName: path_1.default.basename(id),
url
};
}
assetResolveCache.set(id, resolved);
return resolved;
};
exports.registerAssets = (assets, bundle) => {
for (const [fileName, source] of assets) {
bundle[fileName] = {
name: fileName,
isAsset: true,
type: 'asset',
fileName,
source
};
}
};
exports.createBuildAssetPlugin = (root, resolver, publicBase, assetsDir, inlineLimit) => {
const handleToIdMap = new Map();
return {
name: 'vite:asset',
async load(id) {
if (resolver.isAssetRequest(id)) {
let { fileName, content, url } = await exports.resolveAsset(id, root, publicBase, assetsDir, inlineLimit);
if (!url && fileName && content) {
const fileHandle = this.emitFile({
name: fileName,
type: 'asset',
source: content
});
url = 'import.meta.ROLLUP_FILE_URL_' + fileHandle;
handleToIdMap.set(fileHandle, id);
}
else if (url && url.startsWith(`data:`)) {
debug(`${id} -> base64 inlined`);
}
return `export default ${JSON.stringify(url)}`;
}
},
async renderChunk(code) {
let match;
while ((match = exports.injectAssetRe.exec(code))) {
const fileHandle = match[1];
const outputFilepath = publicBase + slash_1.default(path_1.default.join(assetsDir, this.getFileName(fileHandle)));
code = code.replace(match[0], outputFilepath);
const originalId = handleToIdMap.get(fileHandle);
if (originalId) {
debug(`${originalId} -> ${outputFilepath}`);
}
}
return { code, map: null };
}
};
};
//# sourceMappingURL=buildPluginAsset.js.map