321 lines
10 KiB
JavaScript
321 lines
10 KiB
JavaScript
'use strict';
|
||
|
||
var initMiniProgramPlugin = require('@dcloudio/uni-mp-vite');
|
||
var shared = require('@vue/shared');
|
||
var path = require('path');
|
||
var fs = require('fs');
|
||
var uniCliShared = require('@dcloudio/uni-cli-shared');
|
||
var compilerCore = require('@vue/compiler-core');
|
||
|
||
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
||
|
||
var initMiniProgramPlugin__default = /*#__PURE__*/_interopDefault(initMiniProgramPlugin);
|
||
var path__default = /*#__PURE__*/_interopDefault(path);
|
||
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
||
|
||
var appid = "touristappid";
|
||
var component2 = true;
|
||
var enableAppxNg = true;
|
||
var enableNodeModuleBabelTransform = true;
|
||
var source = {
|
||
appid: appid,
|
||
component2: component2,
|
||
enableAppxNg: enableAppxNg,
|
||
enableNodeModuleBabelTransform: enableNodeModuleBabelTransform
|
||
};
|
||
|
||
function transformRef(node, context) {
|
||
if (!uniCliShared.isUserComponent(node, context)) {
|
||
return;
|
||
}
|
||
addVueRef(node, context);
|
||
}
|
||
function addVueRef(node, context) {
|
||
// 仅配置了 ref 属性的,才需要增补 vue-ref
|
||
const refProp = compilerCore.findProp(node, 'ref');
|
||
if (!refProp) {
|
||
return;
|
||
}
|
||
const dataRef = 'u-' +
|
||
(context.inVFor
|
||
? uniCliShared.VUE_REF_IN_FOR
|
||
: uniCliShared.VUE_REF);
|
||
if (refProp.type === 6 /* NodeTypes.ATTRIBUTE */) {
|
||
refProp.name = dataRef;
|
||
}
|
||
else {
|
||
refProp.arg.content = dataRef;
|
||
}
|
||
const { props } = node;
|
||
props.splice(props.indexOf(refProp), 0, uniCliShared.createAttributeNode('ref', '__r'));
|
||
}
|
||
|
||
const customizeRE = /:/g;
|
||
function customizeEvent(str) {
|
||
return shared.camelize(str.replace(customizeRE, '-'));
|
||
}
|
||
|
||
const event = {
|
||
format(name, { isCatch, isComponent }) {
|
||
if (!isComponent && name === 'click') {
|
||
name = 'tap';
|
||
}
|
||
name = eventMap[name] || name;
|
||
return `${isCatch ? 'catch' : 'on'}${shared.capitalize(customizeEvent(name))}`;
|
||
},
|
||
};
|
||
const eventMap = {
|
||
touchstart: 'touchStart',
|
||
touchmove: 'touchMove',
|
||
touchend: 'touchEnd',
|
||
touchcancel: 'touchCancel',
|
||
longtap: 'longTap',
|
||
longpress: 'longTap',
|
||
transitionend: 'transitionEnd',
|
||
animationstart: 'animationStart',
|
||
animationiteration: 'animationIteration',
|
||
animationend: 'animationEnd',
|
||
firstappear: 'firstAppear',
|
||
// map
|
||
markertap: 'markerTap',
|
||
callouttap: 'calloutTap',
|
||
controltap: 'controlTap',
|
||
regionchange: 'regionChange',
|
||
paneltap: 'panelTap',
|
||
// scroll-view
|
||
scrolltoupper: 'scrollToUpper',
|
||
scrolltolower: 'scrollToLower',
|
||
// movable-view
|
||
changeend: 'changeEnd',
|
||
// video
|
||
timeupdate: 'timeUpdate',
|
||
waiting: 'loading',
|
||
fullscreenchange: 'fullScreenChange',
|
||
useraction: 'userAction',
|
||
renderstart: 'renderStart',
|
||
loadedmetadata: 'renderStart',
|
||
// swiper
|
||
animationfinish: 'animationEnd',
|
||
};
|
||
|
||
function transformOpenType(node) {
|
||
var _a;
|
||
if (node.type !== 1 /* NodeTypes.ELEMENT */ || node.tag !== 'button') {
|
||
return;
|
||
}
|
||
const openTypeProp = compilerCore.findProp(node, 'open-type');
|
||
if (!openTypeProp) {
|
||
return;
|
||
}
|
||
if (openTypeProp.type !== 6 /* NodeTypes.ATTRIBUTE */ ||
|
||
((_a = openTypeProp.value) === null || _a === void 0 ? void 0 : _a.content) !== 'getPhoneNumber') {
|
||
return;
|
||
}
|
||
openTypeProp.value.content = 'getAuthorize';
|
||
const { props } = node;
|
||
props.splice(props.indexOf(openTypeProp) + 1, 0, uniCliShared.createAttributeNode('scope', 'phoneNumber'));
|
||
let getPhoneNumberMethodName = '';
|
||
const getPhoneNumberPropIndex = props.findIndex((prop) => {
|
||
if (prop.type === 7 /* NodeTypes.DIRECTIVE */ && prop.name === 'on') {
|
||
const { arg, exp } = prop;
|
||
if ((arg === null || arg === void 0 ? void 0 : arg.type) === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&
|
||
(exp === null || exp === void 0 ? void 0 : exp.type) === 4 /* NodeTypes.SIMPLE_EXPRESSION */ &&
|
||
arg.isStatic &&
|
||
arg.content === 'getphonenumber') {
|
||
getPhoneNumberMethodName = exp.content;
|
||
return true;
|
||
}
|
||
}
|
||
});
|
||
if (!getPhoneNumberMethodName) {
|
||
return;
|
||
}
|
||
props.splice(getPhoneNumberPropIndex, 1);
|
||
const method = compilerCore.isSimpleIdentifier(getPhoneNumberMethodName)
|
||
? getPhoneNumberMethodName
|
||
: `$event => { ${getPhoneNumberMethodName} }`;
|
||
props.push(uniCliShared.createOnDirectiveNode('getAuthorize', `$onAliGetAuthorize(${method},$event)`));
|
||
props.push(uniCliShared.createOnDirectiveNode('error', `$onAliAuthError(${method},$event)`));
|
||
}
|
||
|
||
const projectConfigFilename = 'mini.project.json';
|
||
const COMPONENTS_DIR = 'mycomponents';
|
||
const miniProgram = {
|
||
event,
|
||
class: {
|
||
array: false,
|
||
},
|
||
slot: {
|
||
$slots: false,
|
||
// 支付宝 fallback 有 bug,当多个带默认 slot 组件嵌套使用时,所有的默认slot均会显示,如uni-file-picker(image)
|
||
fallbackContent: true,
|
||
dynamicSlotNames: true,
|
||
},
|
||
directive: 'a:',
|
||
component: {
|
||
dir: COMPONENTS_DIR,
|
||
getPropertySync: true,
|
||
},
|
||
};
|
||
const nodeTransforms = [
|
||
transformRef,
|
||
transformOpenType,
|
||
uniCliShared.transformMatchMedia,
|
||
uniCliShared.createTransformComponentLink(uniCliShared.COMPONENT_ON_LINK, 6 /* NodeTypes.ATTRIBUTE */),
|
||
];
|
||
const compilerOptions = {
|
||
nodeTransforms,
|
||
};
|
||
const customElements = [
|
||
'lifestyle',
|
||
'life-follow',
|
||
'contact-button',
|
||
'spread',
|
||
'error-view',
|
||
'poster',
|
||
'cashier',
|
||
'ix-grid',
|
||
'ix-native-grid',
|
||
'ix-native-list',
|
||
'mkt',
|
||
'page-container',
|
||
'page-meta',
|
||
'lottie',
|
||
];
|
||
const options = {
|
||
cdn: 2,
|
||
vite: {
|
||
inject: {
|
||
uni: [path__default.default.resolve(__dirname, 'uni.api.esm.js'), 'default'],
|
||
},
|
||
alias: {
|
||
'uni-mp-runtime': path__default.default.resolve(__dirname, 'uni.mp.esm.js'),
|
||
},
|
||
copyOptions: {
|
||
assets: [COMPONENTS_DIR],
|
||
targets: [
|
||
...(process.env.UNI_MP_PLUGIN ? [uniCliShared.copyMiniProgramPluginJson] : []),
|
||
{
|
||
src: ['customize-tab-bar', 'ext.json', 'preload.json'],
|
||
get dest() {
|
||
return process.env.UNI_OUTPUT_DIR;
|
||
},
|
||
},
|
||
],
|
||
},
|
||
},
|
||
global: 'my',
|
||
json: {
|
||
windowOptionsMap: {
|
||
defaultTitle: 'navigationBarTitleText',
|
||
pullRefresh: 'enablePullDownRefresh',
|
||
allowsBounceVertical: 'allowsBounceVertical',
|
||
titleBarColor: 'navigationBarBackgroundColor',
|
||
optionMenu: 'optionMenu',
|
||
backgroundColor: 'backgroundColor',
|
||
usingComponents: 'usingComponents',
|
||
navigationBarShadow: 'navigationBarShadow',
|
||
titleImage: 'titleImage',
|
||
transparentTitle: 'transparentTitle',
|
||
titlePenetrate: 'titlePenetrate',
|
||
},
|
||
tabBarOptionsMap: {
|
||
customize: 'customize',
|
||
textColor: 'color',
|
||
selectedColor: 'selectedColor',
|
||
backgroundColor: 'backgroundColor',
|
||
items: 'list',
|
||
},
|
||
tabBarItemOptionsMap: {
|
||
pagePath: 'pagePath',
|
||
name: 'text',
|
||
icon: 'iconPath',
|
||
activeIcon: 'selectedIconPath',
|
||
},
|
||
},
|
||
app: {
|
||
darkmode: false,
|
||
subpackages: true,
|
||
plugins: true,
|
||
usingComponents: false,
|
||
normalize(appJson) {
|
||
// 支付宝小程序默认主包,分包 js 模块不共享,会导致 getCurrentInstance,setCurrentInstance 不一致
|
||
appJson.subPackageBuildType = 'shared';
|
||
return appJson;
|
||
},
|
||
},
|
||
project: {
|
||
filename: projectConfigFilename,
|
||
config: ['mini.project.json', 'project.my.json'],
|
||
source,
|
||
normalize(projectJson) {
|
||
var _a;
|
||
const miniprogram = (_a = projectJson.condition) === null || _a === void 0 ? void 0 : _a.miniprogram;
|
||
if (miniprogram && shared.isArray(miniprogram.list) && miniprogram.list.length) {
|
||
const compileModeJson = {
|
||
modes: [],
|
||
};
|
||
compileModeJson.modes = miniprogram.list.map((item) => {
|
||
return {
|
||
title: item.name,
|
||
page: item.pathName,
|
||
pageQuery: item.query,
|
||
};
|
||
});
|
||
const miniIdeDir = path__default.default.join(process.env.UNI_OUTPUT_DIR, '.mini-ide');
|
||
if (!fs__default.default.existsSync(miniIdeDir)) {
|
||
fs__default.default.mkdirSync(miniIdeDir, { recursive: true });
|
||
fs__default.default.writeFileSync(path__default.default.join(miniIdeDir, 'compileMode.json'), JSON.stringify(compileModeJson, null, 2));
|
||
}
|
||
delete projectJson.condition;
|
||
}
|
||
return projectJson;
|
||
},
|
||
},
|
||
template: Object.assign(Object.assign({}, miniProgram), { customElements, filter: {
|
||
extname: '.sjs',
|
||
lang: 'sjs',
|
||
generate(filter, filename) {
|
||
// TODO 标签内的 code 代码需要独立生成一个 sjs 文件
|
||
// 暂不处理,让开发者自己全部使用 src 引入
|
||
return `<import-sjs name="${filter.name}" from="${filename}.sjs"/>`;
|
||
},
|
||
}, extname: '.axml', compilerOptions }),
|
||
style: {
|
||
extname: '.acss',
|
||
},
|
||
};
|
||
|
||
const uniMiniProgramAlipayPlugin = {
|
||
name: 'uni:mp-alipay',
|
||
config() {
|
||
const buildOptions = {};
|
||
if (process.env.NODE_ENV === 'production') {
|
||
buildOptions.terserOptions = {
|
||
compress: false,
|
||
mangle: false,
|
||
};
|
||
}
|
||
return {
|
||
define: {
|
||
__VUE_CREATED_DEFERRED__: false,
|
||
},
|
||
build: shared.extend({
|
||
assetsInlineLimit: 0,
|
||
}, buildOptions),
|
||
};
|
||
},
|
||
// fix question/159362
|
||
transform(code, id) {
|
||
if (id.includes('@vue/shared') || id.includes('@vue\\shared')) {
|
||
return {
|
||
code: code.replace('//gs', '//g'),
|
||
map: { mappings: '' },
|
||
};
|
||
}
|
||
},
|
||
};
|
||
var index = [uniMiniProgramAlipayPlugin, ...initMiniProgramPlugin__default.default(options)];
|
||
|
||
module.exports = index;
|