@antmove/alipay-wx
Version:
transform alipay miniprogram to wx miniprogram tool.
205 lines (194 loc) • 6.48 kB
JavaScript
let data = require("./data.js");
function judgeType (data) {
if (data === undefined) return null;
if (typeof data === 'number') {
return Number;
}
if (typeof data === 'string') {
return String;
}
if (typeof data === 'boolean') {
return Boolean;
}
if (typeof data === 'function') {
return Function;
}
if (data === null) {
return null;
}
if (typeof data === 'object') {
if (Array.isArray(data)) {
return Array;
}
return Object;
}
}
function transformProps (props = {}) {
let properties = {};
let temp = Object.assign({}, props);
for (let i in temp) {
let type = judgeType(temp[i]);
if (type !== 'Function') {
properties = Object.assign(properties, {
[i]: {
type,
value: temp[i]
}
});
}
}
return properties;
}
function processCustomEvent (opts = {}) {
let props = opts.props || {};
let self = this;
let _props = Object.assign({}, props);
for (let i in _props) {
if (i.match(/on[A-Z]\w*/)) {
let eventName = i.substring(2);
eventName = eventName.toLowerCase();
this.props[i] = function (...params) {
self.triggerEvent(eventName, {...params}, {});
};
}
}
}
function makeLifes (_opts, options) {
if (options.deriveDataFromProps) {
console.warn("生命周期 deriveDataFromProps 不支持更新前触发情景");
}
const transformLife = [
{
original: 'onInit',
target: 'attached'
},
{
original: 'didUnmount',
target: 'detached'
},
{
original: 'didMount',
target: 'ready'
}
];
transformLife.forEach(obj => {
const oname = options[obj.original];
const tname = options[obj.target];
if (obj.target === "attached") {
_opts[obj.target] = function () {
this.props = this.data;
processCustomEvent.call(this, options);
_opts.props = Object.assign({}, this.props);
oname && oname.call(this);
tname && tname.call(this);
};
} else {
_opts[obj.target] = function () {
if (obj.target === 'ready') {
this.$id = this.__wxExparserNodeId__;
this.is = "";
this.$page = data.$page;
}
oname && oname.call(this);
tname && tname.call(this);
if (_opts.didUpdate) {
if (_opts.behaviorUpdate) {
Object.values(_opts.behaviorUpdate).forEach(item => {
item.call(this, _opts.props, _opts.data);
});
}
_opts.didUpdate.call(this, _opts.props, _opts.data);
}
};
}
delete options[obj.original];
delete options[obj.target];
});
}
function makeMixin (_opts) {
if (_opts.mixins) {
let behavours = [];
const arr = ['onInit', 'didMount', 'didUpdate', 'didUnmount', 'data', 'props', 'methods'];
const behavourMade = (mixins = []) => {
mixins.forEach(item => {
let behavour = {};
if (item.mixins) {
behavourMade(item.mixins);
}
if (item.deriveDataFromProps) {
console.warn("生命周期 deriveDataFromProps 不支持更新前触发情景");
}
Object.keys(item).forEach((key, index) => {
if (arr.includes(key)) {
if (key === 'props') {
const props = transformProps(item.props);
item.properties = item.properties || {};
behavour.properties = Object.assign(item.properties, props);
} else if (key === 'didUpdate') {
_opts.behaviorUpdate = {};
const funObj = { [key + index]: item[key] };
_opts.behaviorUpdate = Object.assign(_opts.behaviorUpdate, funObj);
} else {
behavour[key] = item[key];
}
}
});
behavours.push(Behavior(behavour));
});
};
behavourMade(_opts.mixins);
_opts.behaviors = behavours;
delete _opts.mixins;
}
}
function makeEventObj (_opts, options) {
if (options.methods) {
const methods = options.methods;
const newMethods = {};
Object.keys(methods).forEach(key => {
newMethods[key] = function (...res) {
if (res[0]&&res[0].target) {
res[0].target.dataset ={ ...res[0].currentTarget.dataset}||{};
return methods[key].call(this, res[0]);
}
return methods[key].apply(this, res);
};
});
_opts.methods = newMethods;
}
}
function makeProperties (opts) {
opts.properties = opts.properties || {};
const props = transformProps(opts.props);
opts.properties = Object.assign(opts.properties, props);
}
function addObserver (obj) {
if (!obj.didUpdate) {
return false;
}
obj.properties && Object.keys(obj.properties).map(key => {
const observer = function () {
const props = JSON.parse(JSON.stringify(obj.props));
if (obj.behaviorUpdate) {
Object.values(obj.behaviorUpdate).forEach(item => {
item.call(this, props, this.data);
});
}
obj.didUpdate.call(this, props, this.data);
};
if (obj.properties[key]) {
obj.properties[key].observer = observer;
}
});
}
module.exports = {
processTransformationComponent (_opts, options) {
makeLifes(_opts, options);
_opts = Object.assign(_opts, options);
makeEventObj(_opts, options);
makeMixin.call(_opts, _opts);
makeProperties(_opts);
addObserver (_opts);
return _opts;
}
};