@lcap/nasl
Version:
NetEase Application Specific Language
236 lines • 12.1 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.upgrade = void 0;
const nasl = __importStar(require("@lcap/nasl"));
const excludedKeySet = new Set([
'parentNode',
'sourceMap',
'storageJSON',
'tsErrorDetail',
'NaslAnnotatedJSON',
'calledFrom',
'_events',
'_collectingList',
'_historyList',
]);
const _2_14_components_1 = require("./2.14-components");
/**
* 升级要点:
* - 补充前端全局变量
* - 迁移绑定事件
* - 处理 scope 后缀
* - 处理 H5 loginButton 的特殊情况
* @param json 升级前的 JSON
* @returns 升级后的 JSON
*/
function upgrade(json) {
nasl.utils.traverse((current) => {
if (current.node.concept === 'App') {
if (!current.node.frontendVariables) {
current.node.frontendVariables = [];
}
}
if (current.node.concept === 'View' || current.node.concept === 'ViewElement') {
if (current.node.name === 'loginButton') {
current.node.staticStyle = current.node.staticStyle.replace('width: 25.6vw;', '');
}
if (current.node.slotScope) {
// console.log(current.node.slotTarget);
if (current.node.slotTarget !== 'cell'
&& current.node.slotTarget !== 'item'
&& current.node.slotTarget !== 'default'
&& current.node.slotTarget !== 'expand-content'
&& current.node.slotTarget !== 'editcell')
current.node.slotScope = undefined;
}
const eventMap = {};
const bindEvents = current.node.bindEvents;
for (let i = 0; i < bindEvents.length; i++) {
const bindEvent = bindEvents[i];
const firstBindEvent = eventMap[bindEvent.name];
if (!firstBindEvent) {
eventMap[bindEvent.name] = bindEvent;
}
if (!bindEvent.logics) {
bindEvent.logics = [];
}
if (bindEvent.calleeName) {
let argStrs = [];
let args = [];
if (current.node.concept === 'ViewElement') {
argStrs = current.stack.filter((item) => item.tag === 'template' && item.slotScope === 'scope').map((item, index) => item.slotScope + (index || ''));
if (current.node.concept === 'ViewElement')
argStrs.unshift('event');
args = argStrs.map((name) => ({
concept: 'Argument',
expression: {
concept: 'Identifier',
name,
},
}));
if (bindEvent.calleeNamespace) {
args = [];
}
else {
const reversedStack = [...current.stack, current.node].reverse();
const view = reversedStack.find((item) => item.concept === 'View');
// console.log(current.stack.map((item) => `${item.concept}-${item.name}`).join(',') + '\n');
if (!view) {
throw new Error('找不到页面!' + reversedStack.map((item) => `${item.concept}-${item.name}`).join(','));
}
const logic = view.logics.find((logic) => logic.name === bindEvent.calleeName);
// if (bindEvent.calleeName === 'TaskDefList')
// console.log(bindEvent, view.name, view.logics.map((item) => item.name));
if (logic) {
args = args.slice(0, logic.params.length);
if (args.length < logic.params.length && logic.params.length === 2 && logic.params[1].name === 'scope') {
console.log('splice', logic.params[1].name);
logic.params.splice(1, 1);
}
// checkEventType
const logicParam = logic.params[0];
let shouldType = _2_14_components_1.components[current.node.tag] && _2_14_components_1.components[current.node.tag][bindEvent.name];
if (!shouldType)
shouldType = _2_14_components_1.commonEvents[bindEvent.name];
if (shouldType && logicParam && logicParam.typeAnnotation && logicParam.typeAnnotation.typeName !== shouldType.typeName) {
console.log(`事件类型修复:${logic.name}@${bindEvent.name} ${logicParam.typeAnnotation.typeName} -> ${shouldType.typeName}`);
logicParam.typeAnnotation = Object.assign({}, shouldType);
}
if (view.name === 'addRoleUser' && logic.name === 'remove') {
const logicParam1 = logic.params[1];
if (logicParam1?.typeAnnotation.typeArguments[0].typeName === 'LoadAddRoleUserTableViewStructure')
logicParam1.typeAnnotation.typeArguments[0].typeName = 'LoadURMTableViewStructure';
}
}
else {
// 处理登录组件没有onSuccess的logic的问题
if (current.node.tag === 'lcap-login' && bindEvent.calleeName === 'onSuccess') {
view.logics.push({
concept: 'Logic',
name: 'onSuccess',
typeParams: null,
params: [
{
concept: 'Param',
name: 'event',
typeAnnotation: {
concept: 'TypeAnnotation',
name: '',
typeKind: 'reference',
typeNamespace: 'nasl.ui',
typeName: 'BaseEvent',
typeArguments: null,
},
},
],
returns: [],
variables: [],
body: [
{
concept: 'Start',
name: '',
label: '开始',
folded: false,
},
{
concept: 'JSBlock',
name: '',
label: 'JS 代码块',
folded: false,
code: "location.href = '/';",
},
{
concept: 'End',
name: '',
label: '结束',
folded: false,
},
],
playground: [],
});
}
}
}
}
bindEvent.logics.push({
concept: 'Logic',
name: bindEvent.calleeName,
typeParams: null,
params: [],
returns: [],
variables: [],
body: [
{
concept: 'Start',
label: '开始',
folded: false,
},
{
concept: 'CallLogic',
label: '调用逻辑',
folded: false,
calleeNamespace: bindEvent.calleeNamespace,
calleeName: bindEvent.calleeName,
arguments: args,
},
{
concept: 'End',
label: '结束',
folded: false,
},
],
playground: [],
});
}
bindEvent.calleeNamespace = undefined;
bindEvent.calleeName = undefined;
bindEvent.arguments = [];
// 合并相同 Event
if (firstBindEvent) {
const newLogic = bindEvent.logics[0];
if (newLogic) {
const oldNames = new Set(firstBindEvent.logics.map((logic) => logic.name));
if (oldNames.has(newLogic.name))
newLogic.name = nasl.utils.unique(newLogic.name, oldNames);
firstBindEvent.logics.push(newLogic);
}
bindEvents.splice(i, 1);
i--;
}
}
}
if (current.node.concept === 'Identifier') {
if (current.node.name === 'scope') {
const scopeIndex = current.stack.filter((item) => item.tag === 'template' && item.slotScope === 'scope').length;
// 上面是有scope的长度,从1开始,下面是下标要减1
current.node.name = scopeIndex <= 1 ? 'scope' : `scope${scopeIndex - 1}`;
}
}
}, { node: json }, { mode: 'anyObject', depthFirst: true, excludedKeySet });
return json;
}
exports.upgrade = upgrade;
//# sourceMappingURL=2.14.js.map