@alilc/lowcode-editor-core
Version:
Core Api for Ali lowCode engine
371 lines (368 loc) • 14 kB
JavaScript
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
import _extends from "@babel/runtime/helpers/extends";
import _initializerDefineProperty from "@babel/runtime/helpers/initializerDefineProperty";
import _createClass from "@babel/runtime/helpers/createClass";
import _inheritsLoose from "@babel/runtime/helpers/inheritsLoose";
import _applyDecoratedDescriptor from "@babel/runtime/helpers/applyDecoratedDescriptor";
import _initializerWarningHelper from "@babel/runtime/helpers/initializerWarningHelper";
var _dec, _class, _descriptor;
import _regeneratorRuntime from "@babel/runtime/regenerator";
/* eslint-disable no-console */
/* eslint-disable max-len */
import { EventEmitter } from 'events';
import { EventBus } from './event-bus';
import { engineConfig } from './config';
import { globalLocale } from './intl';
import { obx } from './utils';
import { AssetLoader } from '@alilc/lowcode-utils';
import { assetsTransform } from './utils/assets-transform';
EventEmitter.defaultMaxListeners = 100;
// inner instance keys which should not be stored in config
var keyBlacklist = ['designer', 'skeleton', 'currentDocument', 'simulator', 'plugins', 'setters', 'material', 'innerHotkey', 'innerPlugins'];
var AssetsCache = {};
// eslint-disable-next-line no-redeclare
export var Editor = (_dec = obx.shallow, _class = /*#__PURE__*/function (_EventEmitter) {
function Editor(viewName, workspaceMode) {
var _this;
if (viewName === void 0) {
viewName = 'global';
}
if (workspaceMode === void 0) {
workspaceMode = false;
}
// eslint-disable-next-line constructor-super
_this = _EventEmitter.call(this) || this;
// set global emitter maxListeners
_this.viewName = viewName;
_this.workspaceMode = workspaceMode;
/**
* Ioc Container
*/
_initializerDefineProperty(_this, "context", _descriptor, _this);
_this.config = void 0;
_this.eventBus = void 0;
_this.components = void 0;
// readonly utils = utils;
_this.hooks = [];
_this.waits = new Map();
_this.initHooks = function (hooks) {
_this.hooks = hooks.map(function (hook) {
return _extends({}, hook, {
// 指定第一个参数为 editor
handler: hook.handler.bind(_this, _this)
});
});
return _this.hooks;
};
_this.registerHooks = function (hooks) {
_this.initHooks(hooks).forEach(function (_ref) {
var message = _ref.message,
type = _ref.type,
handler = _ref.handler;
if (['on', 'once'].indexOf(type) !== -1) {
_this[type](message, handler);
}
});
};
_this.unregisterHooks = function () {
_this.hooks.forEach(function (_ref2) {
var message = _ref2.message,
handler = _ref2.handler;
_this.removeListener(message, handler);
});
};
_this.setMaxListeners(200);
_this.eventBus = new EventBus(_this);
return _this;
}
_inheritsLoose(Editor, _EventEmitter);
var _proto = Editor.prototype;
_proto.get = function get(keyOrType) {
return this.context.get(keyOrType);
};
_proto.has = function has(keyOrType) {
return this.context.has(keyOrType);
};
_proto.set = function set(key, data) {
if (key === 'assets') {
return this.setAssets(data);
}
// store the data to engineConfig while invoking editor.set()
if (!keyBlacklist.includes(key)) {
engineConfig.set(key, data);
}
this.context.set(key, data);
this.notifyGot(key);
};
_proto.setAssets = /*#__PURE__*/function () {
var _setAssets = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(assets) {
var components, componentDescriptions, remoteComponentDescriptions, innerAssets;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
components = assets.components;
if (!(components && components.length)) {
_context2.next = 10;
break;
}
componentDescriptions = [];
remoteComponentDescriptions = [];
components.forEach(function (component) {
if (!component) {
return;
}
if (component.exportName && component.url) {
remoteComponentDescriptions.push(component);
} else {
componentDescriptions.push(component);
}
});
assets.components = componentDescriptions;
assets.componentList = assets.componentList || [];
// 如果有远程组件描述协议,则自动加载并补充到资产包中,同时出发 designer.incrementalAssetsReady 通知组件面板更新数据
if (!(remoteComponentDescriptions && remoteComponentDescriptions.length)) {
_context2.next = 10;
break;
}
_context2.next = 10;
return Promise.all(remoteComponentDescriptions.map(/*#__PURE__*/function () {
var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(component) {
var _AssetsCache$exportNa;
var exportName, url, npm, setAssetsComponent, setArrayAssets;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
setArrayAssets = function _setArrayAssets(value, preExportName, preSubName) {
if (preExportName === void 0) {
preExportName = '';
}
if (preSubName === void 0) {
preSubName = '';
}
value.forEach(function (d, i) {
var exportName = [preExportName, i.toString()].filter(function (d) {
return !!d;
}).join('.');
var subName = [preSubName, i.toString()].filter(function (d) {
return !!d;
}).join('.');
Array.isArray(d) ? setArrayAssets(d, exportName, subName) : setAssetsComponent(d, {
exportName: exportName,
subName: subName
});
});
};
setAssetsComponent = function _setAssetsComponent(component, extraNpmInfo) {
var _assets$componentList;
if (extraNpmInfo === void 0) {
extraNpmInfo = {};
}
var components = component.components;
assets.componentList = (_assets$componentList = assets.componentList) === null || _assets$componentList === void 0 ? void 0 : _assets$componentList.concat(component.componentList || []);
if (Array.isArray(components)) {
components.forEach(function (d) {
assets.components = assets.components.concat(_extends({
npm: _extends({}, npm, extraNpmInfo)
}, d) || []);
});
return;
}
if (component.components) {
assets.components = assets.components.concat(_extends({
npm: _extends({}, npm, extraNpmInfo)
}, component.components) || []);
}
};
exportName = component.exportName, url = component.url, npm = component.npm;
if (!(!url || !exportName)) {
_context.next = 5;
break;
}
return _context.abrupt("return");
case 5:
if (!(!AssetsCache[exportName] || !(npm !== null && npm !== void 0 && npm.version) || ((_AssetsCache$exportNa = AssetsCache[exportName].npm) === null || _AssetsCache$exportNa === void 0 ? void 0 : _AssetsCache$exportNa.version) !== (npm === null || npm === void 0 ? void 0 : npm.version))) {
_context.next = 8;
break;
}
_context.next = 8;
return new AssetLoader().load(url);
case 8:
AssetsCache[exportName] = component;
if (window[exportName]) {
if (Array.isArray(window[exportName])) {
setArrayAssets(window[exportName]);
} else {
setAssetsComponent(window[exportName]);
}
}
return _context.abrupt("return", window[exportName]);
case 11:
case "end":
return _context.stop();
}
}, _callee);
}));
return function (_x2) {
return _ref3.apply(this, arguments);
};
}()));
case 10:
innerAssets = assetsTransform(assets);
this.context.set('assets', innerAssets);
this.notifyGot('assets');
case 13:
case "end":
return _context2.stop();
}
}, _callee2, this);
}));
function setAssets(_x) {
return _setAssets.apply(this, arguments);
}
return setAssets;
}();
_proto.onceGot = function onceGot(keyOrType) {
var _this2 = this;
var x = this.context.get(keyOrType);
if (x !== undefined) {
return Promise.resolve(x);
}
return new Promise(function (resolve) {
_this2.setWait(keyOrType, resolve, true);
});
};
_proto.onGot = function onGot(keyOrType, fn) {
var _this3 = this;
var x = this.context.get(keyOrType);
if (x !== undefined) {
fn(x);
}
this.setWait(keyOrType, fn);
return function () {
_this3.delWait(keyOrType, fn);
};
};
_proto.onChange = function onChange(keyOrType, fn) {
var _this4 = this;
this.setWait(keyOrType, fn);
return function () {
_this4.delWait(keyOrType, fn);
};
};
_proto.register = function register(data, key) {
this.context.set(key || data, data);
this.notifyGot(key || data);
};
_proto.init = /*#__PURE__*/function () {
var _init = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(config, components) {
var _this$config, _this$config$hooks, hooks, lifeCycles, init;
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
this.config = config || {};
this.components = components || {};
_this$config = this.config, _this$config$hooks = _this$config.hooks, hooks = _this$config$hooks === void 0 ? [] : _this$config$hooks, lifeCycles = _this$config.lifeCycles;
this.emit('editor.beforeInit');
init = lifeCycles && lifeCycles.init || function () {};
_context3.prev = 5;
_context3.next = 8;
return init(this);
case 8:
// 注册快捷键
// 注册 hooks
this.registerHooks(hooks);
this.emit('editor.afterInit');
return _context3.abrupt("return", true);
case 13:
_context3.prev = 13;
_context3.t0 = _context3["catch"](5);
console.error(_context3.t0);
case 16:
case "end":
return _context3.stop();
}
}, _callee3, this, [[5, 13]]);
}));
function init(_x3, _x4) {
return _init.apply(this, arguments);
}
return init;
}();
_proto.destroy = function destroy() {
if (!this.config) {
return;
}
try {
var _this$config$lifeCycl = this.config.lifeCycles,
lifeCycles = _this$config$lifeCycl === void 0 ? {} : _this$config$lifeCycl;
this.unregisterHooks();
if (lifeCycles.destroy) {
lifeCycles.destroy(this);
}
} catch (err) {
console.warn(err);
}
};
_proto.notifyGot = function notifyGot(key) {
var waits = this.waits.get(key);
if (!waits) {
return;
}
waits = waits.slice().reverse();
var i = waits.length;
while (i--) {
waits[i].resolve(this.get(key));
if (waits[i].once) {
waits.splice(i, 1);
}
}
if (waits.length > 0) {
this.waits.set(key, waits);
} else {
this.waits["delete"](key);
}
};
_proto.setWait = function setWait(key, resolve, once) {
var waits = this.waits.get(key);
if (waits) {
waits.push({
resolve: resolve,
once: once
});
} else {
this.waits.set(key, [{
resolve: resolve,
once: once
}]);
}
};
_proto.delWait = function delWait(key, fn) {
var waits = this.waits.get(key);
if (!waits) {
return;
}
var i = waits.length;
while (i--) {
if (waits[i].resolve === fn) {
waits.splice(i, 1);
}
}
if (waits.length < 1) {
this.waits["delete"](key);
}
};
return _createClass(Editor, [{
key: "locale",
get: function get() {
return globalLocale.getLocale();
}
}]);
}(EventEmitter), _descriptor = _applyDecoratedDescriptor(_class.prototype, "context", [_dec], {
configurable: true,
enumerable: true,
writable: true,
initializer: function initializer() {
return new Map();
}
}), _class);
export var commonEvent = new EventBus(new EventEmitter());