UNPKG

@alilc/lowcode-editor-core

Version:

Core Api for Ali lowCode engine

371 lines (368 loc) 14 kB
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());