94 lines
3.5 KiB
JavaScript
94 lines
3.5 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.defineUniManifestJsonPlugin = exports.defineUniPagesJsonPlugin = void 0;
|
||
const fs_1 = __importDefault(require("fs"));
|
||
const path_1 = __importDefault(require("path"));
|
||
const constants_1 = require("../../constants");
|
||
const subpackage_1 = require("../../json/mp/subpackage");
|
||
const utils_1 = require("../../utils");
|
||
exports.defineUniPagesJsonPlugin = createDefineJsonJsPlugin('pages.json');
|
||
exports.defineUniManifestJsonPlugin = createDefineJsonJsPlugin('manifest.json');
|
||
function createDefineJsonJsPlugin(name) {
|
||
const JSON_JS = constants_1.JSON_JS_MAP[name];
|
||
// pages-json-js 仅允许独立分包 root query;manifest-json-js 仍保持 app 级。
|
||
const allowedQuery = name === 'pages.json' ? subpackage_1.MP_INDEPENDENT_ROOT_QUERY : '';
|
||
return function (createVitePlugin) {
|
||
const opts = {
|
||
resolvedConfig: {},
|
||
filter(id) {
|
||
return !!parseJsonJsRequest(id, JSON_JS, allowedQuery);
|
||
},
|
||
};
|
||
const plugin = createVitePlugin(opts);
|
||
const origLoad = plugin.load;
|
||
const origResolveId = plugin.resolveId;
|
||
const origConfigResolved = plugin.configResolved;
|
||
let jsonPath = '';
|
||
let jsonJsPath = '';
|
||
plugin.resolveId = function (id, importer, options) {
|
||
const res = origResolveId && origResolveId.call(this, id, importer, options);
|
||
if (res) {
|
||
return res;
|
||
}
|
||
const jsonJsRequest = parseJsonJsRequest(id, JSON_JS, allowedQuery);
|
||
if (jsonJsRequest) {
|
||
return jsonJsPath + jsonJsRequest.query;
|
||
}
|
||
};
|
||
plugin.configResolved = function (config) {
|
||
opts.resolvedConfig = config;
|
||
jsonPath = (0, utils_1.normalizePath)(path_1.default.join(process.env.UNI_INPUT_DIR, name));
|
||
jsonJsPath = (0, utils_1.normalizePath)(path_1.default.join(process.env.UNI_INPUT_DIR, JSON_JS));
|
||
return origConfigResolved && origConfigResolved(config);
|
||
};
|
||
plugin.load = function (id, ssr) {
|
||
const res = origLoad && origLoad.call(this, id, ssr);
|
||
if (res) {
|
||
return res;
|
||
}
|
||
if (!opts.filter(id)) {
|
||
return;
|
||
}
|
||
return fs_1.default.readFileSync(jsonPath, 'utf8');
|
||
};
|
||
return plugin;
|
||
};
|
||
}
|
||
function parseJsonJsRequest(id, jsonJs, allowedQuery) {
|
||
const queryIndex = id.indexOf('?');
|
||
const query = queryIndex === -1 ? '' : id.slice(queryIndex + 1);
|
||
if (query && !isAllowedJsonJsQuery(query, allowedQuery)) {
|
||
return;
|
||
}
|
||
if (queryIndex !== -1 && !query) {
|
||
return;
|
||
}
|
||
const filename = queryIndex === -1 ? id : id.slice(0, queryIndex);
|
||
if (!filename.endsWith(jsonJs)) {
|
||
return;
|
||
}
|
||
return {
|
||
filename,
|
||
query: queryIndex === -1 ? '' : id.slice(queryIndex),
|
||
};
|
||
}
|
||
function isAllowedJsonJsQuery(query, allowedQuery) {
|
||
if (!allowedQuery) {
|
||
return false;
|
||
}
|
||
const items = query.split('&');
|
||
if (items.length !== 1) {
|
||
return false;
|
||
}
|
||
const item = items[0];
|
||
const equalIndex = item.indexOf('=');
|
||
if (equalIndex === -1) {
|
||
return false;
|
||
}
|
||
return (item.slice(0, equalIndex) === allowedQuery &&
|
||
item.slice(equalIndex + 1).length > 0);
|
||
}
|