@lcap/nasl
Version:
NetEase Application Specific Language
122 lines • 5.19 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;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.tryTransformBlock2Nasl = exports.tryTransformJSX2UI = void 0;
const parser = __importStar(require("@babel/parser"));
const generator_1 = __importDefault(require("@babel/generator"));
const nasl_concepts_1 = require("@lcap/nasl-concepts");
const jsx2nasl_1 = require("./jsx2nasl");
const transformTS2UI_1 = require("../../natural/transformTS2UI");
const transformTSCode_1 = require("../../natural/transformTSCode");
const traverse = require('@babel/traverse').default;
function tryTransformJSX2UI(tsCode) {
let naslViewElement = null;
const ast = parser.parse(tsCode, {
sourceType: 'module',
plugins: ['typescript', 'jsx'],
});
traverse(ast, {
JSXElement: (p) => {
try {
naslViewElement = (0, jsx2nasl_1.transformTSX2Nasl)(p.node);
}
catch (e) { }
p.parent.argument = null;
p.stop();
},
});
const result = (0, generator_1.default)(ast).code;
const tsCode1 = `\`\`\`ts
${result}
\`\`\``;
const { view } = (0, transformTS2UI_1.tryTransformTS2UI)(tsCode1, undefined, true);
view.elements = view.elements || [];
view.elements.push(naslViewElement);
return view;
}
exports.tryTransformJSX2UI = tryTransformJSX2UI;
function tryTransformBlock2Nasl(tsCode) {
// 适配新版Natural解析
tsCode = tsCode.replaceAll('ORDER_BY([sort, order])', 'ORDER_BY((resultItem)=>[[resultItem[sort], order]])');
const ast = parser.parse(tsCode, {
sourceType: 'module',
plugins: ['typescript', 'jsx'],
});
const result = {
json: {
logics: [],
},
view: null,
};
ast.program.body.forEach((node) => {
if (node.type === 'ExportNamedDeclaration') {
if (node.declaration?.id?.name === 'view') {
const viewCode = (0, generator_1.default)(node).code;
// 转jsx
result.view = tryTransformJSX2UI(viewCode);
}
else if (node.declaration?.type === 'TSModuleDeclaration') {
const jsonName = node.declaration?.body?.id?.name;
if (jsonName === 'logics') {
node.declaration?.body?.body?.body?.forEach((logicNode) => {
const logicCode = (0, generator_1.default)(logicNode).code;
const logicName = logicNode.declaration?.id?.name;
// 转后端逻辑
let logic = (0, transformTSCode_1.transformTSCode)(logicCode, logicName, true, false);
if (logic.toJSON) {
logic = logic.toJSON();
}
logic.name = logicName;
if (logic.body) {
if (logic.body[0]?.concept !== 'Start') {
logic.body.unshift(nasl_concepts_1.LogicItem.from({
concept: 'Start',
name: '',
label: '开始',
kind: 'Statement',
}));
}
if (logic.body[logic.body.length - 1]?.concept !== 'End') {
logic.body.push(nasl_concepts_1.LogicItem.from({
concept: 'End',
name: '',
label: '结束',
kind: 'Statement',
}));
}
}
result.json.logics.push(logic);
});
}
}
}
});
return result;
}
exports.tryTransformBlock2Nasl = tryTransformBlock2Nasl;
//# sourceMappingURL=transformBlock2Nasl.js.map