You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
8.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.initFeatures = void 0;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const shared_1 = require("@vue/shared");
function initProjectFeature({ inputDir }) {
const features = {
i18nLocale: false,
i18nEn: true,
i18nEs: true,
i18nFr: true,
i18nZhHans: true,
i18nZhHant: true,
uniCloud: false,
};
const localesDir = path_1.default.resolve(inputDir, 'locale');
if (fs_1.default.existsSync(localesDir)) {
if (fs_1.default.readdirSync(localesDir).find((file) => path_1.default.extname(file) === '.json')) {
features.i18nLocale = true;
}
}
if (process.env.UNI_CLOUD_PROVIDER) {
try {
const providers = JSON.parse(process.env.UNI_CLOUD_PROVIDER);
if (providers.length) {
features.uniCloud = true;
}
}
catch (e) { }
}
return features;
}
function initPagesFeature({ pagesJson, command, inputDir, ssr, }) {
const features = {
nvue: true,
pages: true,
tabBar: true,
tabBarMidButton: true,
topWindow: false,
leftWindow: false,
rightWindow: false,
navigationBar: true,
pullDownRefresh: false,
navigationBarButtons: true,
navigationBarSearchInput: true,
navigationBarTransparent: true,
};
const { tabBar, pages, topWindow, leftWindow, rightWindow, globalStyle } = pagesJson;
// ssr 时强制启用多页面需要用到router
if (!ssr && pages && pages.length === 1) {
features.pages = false;
}
if (!(tabBar && tabBar.list && tabBar.list.length)) {
features.tabBar = false;
features.tabBarMidButton = false;
}
if (features.tabBar && !tabBar.midButton) {
features.tabBarMidButton = false;
}
if (topWindow && topWindow.path) {
features.topWindow = true;
}
if (leftWindow && leftWindow.path) {
features.leftWindow = true;
}
if (rightWindow && rightWindow.path) {
features.rightWindow = true;
}
if (globalStyle.enablePullDownRefresh) {
features.pullDownRefresh = true;
}
else {
if (pages.find((page) => page.style && page.style.enablePullDownRefresh)) {
features.pullDownRefresh = true;
}
}
if (command === 'build') {
if (!pages.find((page) => fs_1.default.existsSync(path_1.default.resolve(inputDir, page.path + '.nvue')))) {
features.nvue = false;
}
let isNavigationCustom = false;
if (globalStyle.navigationBar.style === 'custom') {
isNavigationCustom = true; // 全局custom
if (pages.find((page) => page.style.navigationBar.style === 'default')) {
isNavigationCustom = false;
}
}
else {
// 所有页面均custom
if (pages.every((page) => page.style.navigationBar.style === 'custom')) {
isNavigationCustom = true;
}
}
if (isNavigationCustom) {
features.navigationBar = false;
features.navigationBarButtons = false;
features.navigationBarSearchInput = false;
features.navigationBarTransparent = false;
}
else {
if (!pages.find((page) => (0, shared_1.isArray)(page.style.navigationBar.buttons) &&
page.style.navigationBar.buttons.length)) {
features.navigationBarButtons = false;
}
if (!globalStyle.navigationBar.searchInput &&
!pages.find((page) => page.style.navigationBar.searchInput)) {
features.navigationBarSearchInput = false;
}
if (globalStyle.navigationBar.type !== 'transparent' &&
!pages.find((page) => page.style.navigationBar.type === 'transparent')) {
features.navigationBarTransparent = false;
}
}
}
return features;
}
function initManifestFeature({ manifestJson, command, platform, }) {
const features = {
wx: false,
wxs: true,
rpx: true,
promise: false,
longpress: true,
routerMode: '"hash"',
vueOptionsApi: true,
vueProdDevTools: false,
vueProdHydrationMismatchDetails: false,
};
if (command === 'build') {
// TODO 需要预编译一遍?
// features.wxs = false
// features.longpress = false
}
const webManifest = manifestJson.web || manifestJson.h5;
if (webManifest &&
webManifest.router &&
webManifest.router.mode === 'history') {
features.routerMode = '"history"';
}
// TODO other features
return features;
}
function initFeatures(options) {
const { wx, wxs, rpx, nvue, uniCloud, i18nEn, i18nEs, i18nFr, i18nZhHans, i18nZhHant, i18nLocale, vueOptionsApi, vueProdDevTools, vueProdHydrationMismatchDetails, pages, tabBar, tabBarMidButton, promise, longpress, routerMode, topWindow, leftWindow, rightWindow, navigationBar, pullDownRefresh, navigationBarButtons, navigationBarSearchInput, navigationBarTransparent, } = (0, shared_1.extend)(initManifestFeature(options), initPagesFeature(options), initProjectFeature(options));
// uni-app-x运行时可调用$setPageStyle需启用相关特性方可支持。否则$setPageStyle无效果
const features = {
// vue
__VUE_OPTIONS_API__: vueOptionsApi, // enable/disable Options API support, default: true
__VUE_PROD_DEVTOOLS__: vueProdDevTools, // enable/disable devtools support in production, default: false
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: vueProdHydrationMismatchDetails,
// uni
__UNI_FEATURE_WX__: wx, // 是否启用小程序的组件实例 APIselectComponent 等uni-core/src/service/plugin/appConfig
__UNI_FEATURE_WXS__: wxs, // 是否启用 wxs 支持getComponentDescriptor 等uni-core/src/view/plugin/appConfig
__UNI_FEATURE_RPX__: rpx, // 是否启用运行时 rpx 支持
__UNI_FEATURE_PROMISE__: promise, // 是否启用旧版本的 promise 支持(即返回[err,res]的格式),默认返回标准
__UNI_FEATURE_LONGPRESS__: longpress, // 是否启用longpress
__UNI_FEATURE_I18N_EN__: i18nEn, // 是否启用en
__UNI_FEATURE_I18N_ES__: i18nEs, // 是否启用es
__UNI_FEATURE_I18N_FR__: i18nFr, // 是否启用fr
__UNI_FEATURE_I18N_ZH_HANS__: i18nZhHans, // 是否启用zh_Hans
__UNI_FEATURE_I18N_ZH_HANT__: i18nZhHant, // 是否启用zh_Hant
// 以下特性,编译器已自动识别是否需要启用
__UNI_FEATURE_UNI_CLOUD__: uniCloud, // 是否启用uniCloud
__UNI_FEATURE_I18N_LOCALE__: i18nLocale, // 是否启用i18n
__UNI_FEATURE_NVUE__: nvue, // 是否启用nvue
__UNI_FEATURE_ROUTER_MODE__: routerMode, // 路由模式
__UNI_FEATURE_PAGES__: pages, // 是否多页面
__UNI_FEATURE_TABBAR__: tabBar, // 是否包含tabBar
__UNI_FEATURE_TABBAR_MIDBUTTON__: tabBarMidButton, // 是否包含midButton
__UNI_FEATURE_TOPWINDOW__: topWindow, // 是否包含topWindow
__UNI_FEATURE_LEFTWINDOW__: leftWindow, // 是否包含leftWindow
__UNI_FEATURE_RIGHTWINDOW__: rightWindow, // 是否包含rightWindow
__UNI_FEATURE_RESPONSIVE__: topWindow || leftWindow || rightWindow, // 是否启用响应式
__UNI_FEATURE_NAVIGATIONBAR__: navigationBar, // 是否启用标题栏
__UNI_FEATURE_PULL_DOWN_REFRESH__: pullDownRefresh, // 是否启用下拉刷新
__UNI_FEATURE_NAVIGATIONBAR_BUTTONS__: navigationBarButtons, // 是否启用标题栏按钮
__UNI_FEATURE_NAVIGATIONBAR_SEARCHINPUT__: navigationBarSearchInput, // 是否启用标题栏搜索框
__UNI_FEATURE_NAVIGATIONBAR_TRANSPARENT__: navigationBarTransparent, // 是否启用透明标题栏
};
// ssr nodejs features
if (options.ssr) {
Object.keys(features).forEach((name) => {
const value = features[name];
(0, shared_1.extend)(globalThis, {
[name]: (0, shared_1.isString)(value) ? JSON.parse(value) : value,
});
});
}
return features;
}
exports.initFeatures = initFeatures;