@arvin-shu/microcode-editor-core
Advanced tools
| export * from './di'; | ||
| export * from './config'; | ||
| export * from './utils'; | ||
| export * from './event-bus'; | ||
| export * from './editor'; | ||
| export * from './widgets'; | ||
| export * from './inti'; | ||
| export * from './hotkey'; |
+4
-4
| { | ||
| "name": "@arvin-shu/microcode-editor-core", | ||
| "version": "1.0.4", | ||
| "version": "1.0.5", | ||
| "description": "", | ||
| "main": "lib/index.js", | ||
| "module": "es/index.js", | ||
| "main": "src/index.ts", | ||
| "module": "src/index.ts", | ||
| "files": [ | ||
@@ -16,3 +16,3 @@ "lib", | ||
| "@arvin-shu/microcode-types": "^1.0.6", | ||
| "@arvin-shu/microcode-utils": "^1.0.5", | ||
| "@arvin-shu/microcode-utils": "^1.1.3", | ||
| "eventemitter2": "^6.4.9", | ||
@@ -19,0 +19,0 @@ "intl-messageformat": "^10.7.7", |
-102
| import { IPublicModelEngineConfig, IPublicModelPreference, IPublicTypeEngineOptions } from '@arvin-shu/microcode-types'; | ||
| export interface IEngineConfig extends IPublicModelEngineConfig { | ||
| /** | ||
| * if engineOptions.strictPluginMode === true, only accept propertied predefined in EngineOptions. | ||
| * | ||
| * @param {IPublicTypeEngineOptions} engineOptions | ||
| */ | ||
| setEngineOptions(engineOptions: IPublicTypeEngineOptions): void; | ||
| notifyGot(key: string): void; | ||
| setWait(key: string, resolve: (data: any) => void, once?: boolean): void; | ||
| delWait(key: string, fn: any): void; | ||
| } | ||
| /** | ||
| * 管理低代码引擎中的配置项,支持严格模式下的配置项校验, | ||
| * 且提供异步获取配置值的能力,非常适合复杂配置管理场景。 | ||
| */ | ||
| export declare class EngineConfig implements IEngineConfig { | ||
| /** | ||
| * 配置项 | ||
| */ | ||
| private config; | ||
| /** | ||
| * 这是一个等待队列,用于管理那些需要等待某个配置项赋值的回调。 | ||
| */ | ||
| private waits; | ||
| /** | ||
| * 存储 preference | ||
| */ | ||
| readonly preference: IPublicModelPreference; | ||
| constructor(config?: { | ||
| [key: string]: any; | ||
| }); | ||
| /** | ||
| * 设置引擎配置 | ||
| * | ||
| * @param engineOptions 引擎配置对象 | ||
| */ | ||
| setEngineOptions(engineOptions: IPublicTypeEngineOptions): void; | ||
| /** | ||
| * 判断指定 key 是否有值 | ||
| * @param key | ||
| */ | ||
| has(key: string): boolean; | ||
| /** | ||
| * 获取指定 key 的值 | ||
| * @param key | ||
| * @param defaultValue | ||
| */ | ||
| get(key: string, defaultValue?: any): any; | ||
| /** | ||
| * 设置指定 key 的值 | ||
| * @param key | ||
| * @param value | ||
| */ | ||
| set(key: string, value: any): void; | ||
| /** | ||
| * 批量设值,set 的对象版本 | ||
| * @param config | ||
| */ | ||
| setConfig(config: { | ||
| [key: string]: any; | ||
| }): void; | ||
| /** | ||
| * 获取指定 key 的值,若此时还未赋值,则等待,若已有值,则直接返回值 | ||
| * 注:此函数返回 Promise 实例,只会执行(fullfill)一次 | ||
| * @param key | ||
| * @returns | ||
| */ | ||
| onceGot(key: string): Promise<any>; | ||
| /** | ||
| * 获取指定 key 的值,函数回调模式,若多次被赋值,回调会被多次调用 | ||
| * | ||
| * @param key | ||
| * @param fn | ||
| * @returns | ||
| */ | ||
| onGot(key: string, fn: (data: any) => void): () => void; | ||
| /** | ||
| * 通知获取指定键的值 | ||
| * @param key 键 | ||
| */ | ||
| notifyGot(key: string): void; | ||
| /** | ||
| * 设置等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param resolve 回调函数 | ||
| * @param once 是否只执行一次 | ||
| */ | ||
| setWait(key: string, resolve: (data: any) => void, once?: boolean): void; | ||
| /** | ||
| * 删除等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param fn 回调函数 | ||
| */ | ||
| delWait(key: string, fn: any): void; | ||
| /** | ||
| * 获取偏好设置 | ||
| * @returns 偏好设置对象 | ||
| */ | ||
| getPreference(): IPublicModelPreference; | ||
| } | ||
| export declare const engineConfig: EngineConfig; |
-352
| import { getLogger, isPlainObject } from '@arvin-shu/microcode-utils'; | ||
| import { get } from 'lodash-es'; | ||
| import Preference from './utils/preference.js'; | ||
| "use strict"; | ||
| const STRICT_PLUGIN_MODE_DEFAULT = true; | ||
| const VALID_ENGINE_OPTIONS = { | ||
| enableCondition: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u5F00\u542F condition \u7684\u80FD\u529B\uFF0C\u9ED8\u8BA4\u5728\u8BBE\u8BA1\u5668\u4E2D\u4E0D\u7BA1 condition \u662F\u5565\u90FD\u6B63\u5E38\u5C55\u793A" | ||
| }, | ||
| designMode: { | ||
| type: "string", | ||
| enum: ["design", "live"], | ||
| default: "design", | ||
| description: "\u8BBE\u8BA1\u6A21\u5F0F\uFF0Clive \u6A21\u5F0F\u5C06\u4F1A\u5B9E\u65F6\u5C55\u793A\u53D8\u91CF\u503C" | ||
| }, | ||
| device: { | ||
| type: "string", | ||
| enum: ["default", "mobile", "any string value"], | ||
| default: "default", | ||
| description: "\u8BBE\u5907\u7C7B\u578B" | ||
| }, | ||
| deviceClassName: { | ||
| type: "string", | ||
| default: void 0, | ||
| description: "\u6307\u5B9A\u521D\u59CB\u5316\u7684 deviceClassName\uFF0C\u6302\u8F7D\u5230\u753B\u5E03\u7684\u9876\u5C42\u8282\u70B9\u4E0A" | ||
| }, | ||
| locale: { | ||
| type: "string", | ||
| default: "zh-CN", | ||
| description: "\u8BED\u8A00" | ||
| }, | ||
| renderEnv: { | ||
| type: "string", | ||
| enum: ["react", "any string value"], | ||
| default: "react", | ||
| description: "\u6E32\u67D3\u5668\u7C7B\u578B" | ||
| }, | ||
| deviceMapper: { | ||
| type: "object", | ||
| description: "\u8BBE\u5907\u7C7B\u578B\u6620\u5C04\u5668\uFF0C\u5904\u7406\u8BBE\u8BA1\u5668\u4E0E\u6E32\u67D3\u5668\u4E2D device \u7684\u6620\u5C04" | ||
| }, | ||
| enableStrictPluginMode: { | ||
| type: "boolean", | ||
| default: STRICT_PLUGIN_MODE_DEFAULT, | ||
| description: "\u5F00\u542F\u4E25\u683C\u63D2\u4EF6\u6A21\u5F0F\uFF0C\u9ED8\u8BA4\u503C\uFF1ASTRICT_PLUGIN_MODE_DEFAULT , \u4E25\u683C\u6A21\u5F0F\u4E0B\uFF0C\u63D2\u4EF6\u5C06\u65E0\u6CD5\u901A\u8FC7 engineOptions \u4F20\u9012\u81EA\u5B9A\u4E49\u914D\u7F6E\u9879" | ||
| }, | ||
| enableReactiveContainer: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5F00\u542F\u62D6\u62FD\u7EC4\u4EF6\u65F6\uFF0C\u5373\u5C06\u88AB\u653E\u5165\u7684\u5BB9\u5668\u662F\u5426\u6709\u89C6\u89C9\u53CD\u9988" | ||
| }, | ||
| disableAutoRender: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5173\u95ED\u753B\u5E03\u81EA\u52A8\u6E32\u67D3\uFF0C\u5728\u8D44\u4EA7\u5305\u591A\u91CD\u5F02\u6B65\u52A0\u8F7D\u7684\u573A\u666F\u6709\u6548" | ||
| }, | ||
| disableDetecting: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5173\u95ED\u62D6\u62FD\u7EC4\u4EF6\u65F6\u7684\u865A\u7EBF\u54CD\u5E94\uFF0C\u6027\u80FD\u8003\u8651" | ||
| }, | ||
| customizeIgnoreSelectors: { | ||
| type: "function", | ||
| default: void 0, | ||
| description: "\u5B9A\u5236\u753B\u5E03\u4E2D\u70B9\u51FB\u88AB\u5FFD\u7565\u7684 selectors, eg. (defaultIgnoreSelectors: string[], e: MouseEvent) => string[]" | ||
| }, | ||
| disableDefaultSettingPanel: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u7981\u6B62\u9ED8\u8BA4\u7684\u8BBE\u7F6E\u9762\u677F" | ||
| }, | ||
| disableDefaultSetters: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u7981\u6B62\u9ED8\u8BA4\u7684\u8BBE\u7F6E\u5668" | ||
| }, | ||
| enableCanvasLock: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u6253\u5F00\u753B\u5E03\u7684\u9501\u5B9A\u64CD\u4F5C" | ||
| }, | ||
| enableLockedNodeSetting: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5BB9\u5668\u9501\u5B9A\u540E\uFF0C\u5BB9\u5668\u672C\u8EAB\u662F\u5426\u53EF\u4EE5\u8BBE\u7F6E\u5C5E\u6027\uFF0C\u4EC5\u5F53\u753B\u5E03\u9501\u5B9A\u7279\u6027\u5F00\u542F\u65F6\u751F\u6548" | ||
| }, | ||
| stayOnTheSameSettingTab: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5F53\u9009\u4E2D\u8282\u70B9\u5207\u6362\u65F6\uFF0C\u662F\u5426\u505C\u7559\u5728\u76F8\u540C\u7684\u8BBE\u7F6E tab \u4E0A" | ||
| }, | ||
| hideSettingsTabsWhenOnlyOneItem: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u5728\u53EA\u6709\u4E00\u4E2A item \u7684\u65F6\u5019\u9690\u85CF\u8BBE\u7F6E tabs" | ||
| }, | ||
| loadingComponent: { | ||
| type: "ComponentType", | ||
| default: void 0, | ||
| description: "\u81EA\u5B9A\u4E49 loading \u7EC4\u4EF6" | ||
| }, | ||
| supportVariableGlobally: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u8BBE\u7F6E\u6240\u6709\u5C5E\u6027\u652F\u6301\u53D8\u91CF\u914D\u7F6E" | ||
| }, | ||
| visionSettings: { | ||
| type: "object", | ||
| description: "Vision-polyfill settings" | ||
| }, | ||
| simulatorUrl: { | ||
| type: "array", | ||
| description: "\u81EA\u5B9A\u4E49 simulatorUrl \u7684\u5730\u5740" | ||
| }, | ||
| appHelper: { | ||
| type: "object", | ||
| description: "\u5B9A\u4E49 utils \u548C constants \u7B49\u5BF9\u8C61" | ||
| }, | ||
| requestHandlersMap: { | ||
| type: "object", | ||
| description: "\u6570\u636E\u6E90\u5F15\u64CE\u7684\u8BF7\u6C42\u5904\u7406\u5668\u6620\u5C04" | ||
| }, | ||
| thisRequiredInJSE: { | ||
| type: "boolean", | ||
| description: "JSExpression \u662F\u5426\u53EA\u652F\u6301\u4F7F\u7528 this \u6765\u8BBF\u95EE\u4E0A\u4E0B\u6587\u53D8\u91CF" | ||
| }, | ||
| enableStrictNotFoundMode: { | ||
| type: "boolean", | ||
| description: "\u5F53\u5F00\u542F\u7EC4\u4EF6\u672A\u627E\u5230\u4E25\u683C\u6A21\u5F0F\u65F6\uFF0C\u6E32\u67D3\u6A21\u5757\u4E0D\u4F1A\u9ED8\u8BA4\u7ED9\u4E00\u4E2A\u5BB9\u5668\u7EC4\u4EF6" | ||
| }, | ||
| focusNodeSelector: { | ||
| type: "function", | ||
| description: "\u914D\u7F6E\u6307\u5B9A\u8282\u70B9\u4E3A\u6839\u7EC4\u4EF6" | ||
| }, | ||
| enableAutoOpenFirstWindow: { | ||
| type: "boolean", | ||
| description: "\u5E94\u7528\u7EA7\u8BBE\u8BA1\u6A21\u5F0F\u4E0B\uFF0C\u81EA\u52A8\u6253\u5F00\u7B2C\u4E00\u4E2A\u7A97\u53E3", | ||
| default: true | ||
| }, | ||
| enableWorkspaceMode: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u5F00\u542F\u5E94\u7528\u7EA7\u8BBE\u8BA1\u6A21\u5F0F", | ||
| default: false | ||
| }, | ||
| workspaceEmptyComponent: { | ||
| type: "function", | ||
| description: "\u5E94\u7528\u7EA7\u8BBE\u8BA1\u6A21\u5F0F\u4E0B\uFF0C\u7A97\u53E3\u4E3A\u7A7A\u65F6\u5C55\u793A\u7684\u5360\u4F4D\u7EC4\u4EF6" | ||
| }, | ||
| enableContextMenu: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u5F00\u542F\u53F3\u952E\u83DC\u5355", | ||
| default: false | ||
| }, | ||
| hideComponentAction: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u9690\u85CF\u8BBE\u8BA1\u5668\u8F85\u52A9\u5C42", | ||
| default: false | ||
| } | ||
| }; | ||
| const logger = getLogger({ level: "log", bizName: "config" }); | ||
| const getStrictModeValue = (engineOptions, defaultValue) => { | ||
| if (!engineOptions || !isPlainObject(engineOptions)) { | ||
| return defaultValue; | ||
| } | ||
| if (engineOptions.enableStrictPluginMode === void 0 || engineOptions.enableStrictPluginMode === null) { | ||
| return defaultValue; | ||
| } | ||
| return engineOptions.enableStrictPluginMode; | ||
| }; | ||
| class EngineConfig { | ||
| /** | ||
| * 配置项 | ||
| */ | ||
| config = {}; | ||
| /** | ||
| * 这是一个等待队列,用于管理那些需要等待某个配置项赋值的回调。 | ||
| */ | ||
| waits = /* @__PURE__ */ new Map(); | ||
| /** | ||
| * 存储 preference | ||
| */ | ||
| preference; | ||
| constructor(config) { | ||
| this.config = config || {}; | ||
| this.preference = new Preference(); | ||
| } | ||
| /** | ||
| * 设置引擎配置 | ||
| * | ||
| * @param engineOptions 引擎配置对象 | ||
| */ | ||
| setEngineOptions(engineOptions) { | ||
| if (!engineOptions || !isPlainObject(engineOptions)) { | ||
| return; | ||
| } | ||
| const strictMode = getStrictModeValue(engineOptions, STRICT_PLUGIN_MODE_DEFAULT) === true; | ||
| if (strictMode) { | ||
| const isValidKey = (key) => { | ||
| const result = VALID_ENGINE_OPTIONS[key]; | ||
| return !(result === void 0 || result === null); | ||
| }; | ||
| Object.keys(engineOptions).forEach((key) => { | ||
| if (isValidKey(key)) { | ||
| this.set(key, engineOptions[key]); | ||
| } else { | ||
| logger.warn( | ||
| `failed to config ${key} to engineConfig, only predefined options can be set under strict mode, predefined options: `, | ||
| VALID_ENGINE_OPTIONS | ||
| ); | ||
| } | ||
| }); | ||
| } else { | ||
| this.setConfig(engineOptions); | ||
| } | ||
| } | ||
| /** | ||
| * 判断指定 key 是否有值 | ||
| * @param key | ||
| */ | ||
| has(key) { | ||
| return this.config[key] !== void 0; | ||
| } | ||
| /** | ||
| * 获取指定 key 的值 | ||
| * @param key | ||
| * @param defaultValue | ||
| */ | ||
| get(key, defaultValue) { | ||
| return get(this.config, key, defaultValue); | ||
| } | ||
| /** | ||
| * 设置指定 key 的值 | ||
| * @param key | ||
| * @param value | ||
| */ | ||
| set(key, value) { | ||
| this.config[key] = value; | ||
| this.notifyGot(key); | ||
| } | ||
| /** | ||
| * 批量设值,set 的对象版本 | ||
| * @param config | ||
| */ | ||
| setConfig(config) { | ||
| if (config) { | ||
| Object.keys(config).forEach((key) => { | ||
| this.set(key, config[key]); | ||
| }); | ||
| } | ||
| } | ||
| /** | ||
| * 获取指定 key 的值,若此时还未赋值,则等待,若已有值,则直接返回值 | ||
| * 注:此函数返回 Promise 实例,只会执行(fullfill)一次 | ||
| * @param key | ||
| * @returns | ||
| */ | ||
| onceGot(key) { | ||
| const val = this.config[key]; | ||
| if (val !== void 0) { | ||
| return Promise.resolve(val); | ||
| } | ||
| return new Promise((resolve) => { | ||
| this.setWait(key, resolve, true); | ||
| }); | ||
| } | ||
| /** | ||
| * 获取指定 key 的值,函数回调模式,若多次被赋值,回调会被多次调用 | ||
| * | ||
| * @param key | ||
| * @param fn | ||
| * @returns | ||
| */ | ||
| onGot(key, fn) { | ||
| const val = this.config?.[key]; | ||
| if (val !== void 0) { | ||
| fn(val); | ||
| } | ||
| this.setWait(key, fn); | ||
| return () => { | ||
| this.delWait(key, fn); | ||
| }; | ||
| } | ||
| /** | ||
| * 通知获取指定键的值 | ||
| * @param key 键 | ||
| */ | ||
| notifyGot(key) { | ||
| let waits = this.waits.get(key); | ||
| if (!waits) { | ||
| return; | ||
| } | ||
| waits = waits.slice().reverse(); | ||
| let 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); | ||
| } | ||
| } | ||
| /** | ||
| * 设置等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param resolve 回调函数 | ||
| * @param once 是否只执行一次 | ||
| */ | ||
| setWait(key, resolve, once) { | ||
| const waits = this.waits.get(key); | ||
| if (waits) { | ||
| waits.push({ resolve, once }); | ||
| } else { | ||
| this.waits.set(key, [{ resolve, once }]); | ||
| } | ||
| } | ||
| /** | ||
| * 删除等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param fn 回调函数 | ||
| */ | ||
| delWait(key, fn) { | ||
| const waits = this.waits.get(key); | ||
| if (!waits) { | ||
| return; | ||
| } | ||
| let i = waits.length; | ||
| while (i--) { | ||
| if (waits[i].resolve === fn) { | ||
| waits.splice(i, 1); | ||
| } | ||
| } | ||
| if (waits.length < 1) { | ||
| this.waits.delete(key); | ||
| } | ||
| } | ||
| /** | ||
| * 获取偏好设置 | ||
| * @returns 偏好设置对象 | ||
| */ | ||
| getPreference() { | ||
| return this.preference; | ||
| } | ||
| } | ||
| const engineConfig = new EngineConfig(); | ||
| export { EngineConfig, engineConfig }; | ||
| //# sourceMappingURL=config.js.map |
| {"version":3,"file":"config.js","sources":["../../src/config.ts"],"sourcesContent":["import {\n\tIPublicModelEngineConfig,\n\tIPublicModelPreference,\n\tIPublicTypeEngineOptions,\n} from '@arvin-shu/microcode-types';\nimport { getLogger, isPlainObject } from '@arvin-shu/microcode-utils';\nimport { get as lodashGet } from 'lodash-es';\nimport Preference from './utils/preference';\n\nconst STRICT_PLUGIN_MODE_DEFAULT = true;\n\n// 在严格模式下使用,此时只能接受此VALID_ENGINE_OPTIONS中的选项\n// 类型和描述仅用于开发人员的帮助,不会影响运行时\nconst VALID_ENGINE_OPTIONS = {\n\tenableCondition: {\n\t\ttype: 'boolean',\n\t\tdescription:\n\t\t\t'是否开启 condition 的能力,默认在设计器中不管 condition 是啥都正常展示',\n\t},\n\tdesignMode: {\n\t\ttype: 'string',\n\t\tenum: ['design', 'live'],\n\t\tdefault: 'design',\n\t\tdescription: '设计模式,live 模式将会实时展示变量值',\n\t},\n\tdevice: {\n\t\ttype: 'string',\n\t\tenum: ['default', 'mobile', 'any string value'],\n\t\tdefault: 'default',\n\t\tdescription: '设备类型',\n\t},\n\tdeviceClassName: {\n\t\ttype: 'string',\n\t\tdefault: undefined,\n\t\tdescription: '指定初始化的 deviceClassName,挂载到画布的顶层节点上',\n\t},\n\tlocale: {\n\t\ttype: 'string',\n\t\tdefault: 'zh-CN',\n\t\tdescription: '语言',\n\t},\n\trenderEnv: {\n\t\ttype: 'string',\n\t\tenum: ['react', 'any string value'],\n\t\tdefault: 'react',\n\t\tdescription: '渲染器类型',\n\t},\n\tdeviceMapper: {\n\t\ttype: 'object',\n\t\tdescription: '设备类型映射器,处理设计器与渲染器中 device 的映射',\n\t},\n\tenableStrictPluginMode: {\n\t\ttype: 'boolean',\n\t\tdefault: STRICT_PLUGIN_MODE_DEFAULT,\n\t\tdescription:\n\t\t\t'开启严格插件模式,默认值:STRICT_PLUGIN_MODE_DEFAULT , 严格模式下,插件将无法通过 engineOptions 传递自定义配置项',\n\t},\n\tenableReactiveContainer: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '开启拖拽组件时,即将被放入的容器是否有视觉反馈',\n\t},\n\tdisableAutoRender: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '关闭画布自动渲染,在资产包多重异步加载的场景有效',\n\t},\n\tdisableDetecting: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '关闭拖拽组件时的虚线响应,性能考虑',\n\t},\n\tcustomizeIgnoreSelectors: {\n\t\ttype: 'function',\n\t\tdefault: undefined,\n\t\tdescription:\n\t\t\t'定制画布中点击被忽略的 selectors, eg. (defaultIgnoreSelectors: string[], e: MouseEvent) => string[]',\n\t},\n\tdisableDefaultSettingPanel: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '禁止默认的设置面板',\n\t},\n\tdisableDefaultSetters: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '禁止默认的设置器',\n\t},\n\tenableCanvasLock: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '打开画布的锁定操作',\n\t},\n\tenableLockedNodeSetting: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription:\n\t\t\t'容器锁定后,容器本身是否可以设置属性,仅当画布锁定特性开启时生效',\n\t},\n\tstayOnTheSameSettingTab: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '当选中节点切换时,是否停留在相同的设置 tab 上',\n\t},\n\thideSettingsTabsWhenOnlyOneItem: {\n\t\ttype: 'boolean',\n\t\tdescription: '是否在只有一个 item 的时候隐藏设置 tabs',\n\t},\n\tloadingComponent: {\n\t\ttype: 'ComponentType',\n\t\tdefault: undefined,\n\t\tdescription: '自定义 loading 组件',\n\t},\n\tsupportVariableGlobally: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '设置所有属性支持变量配置',\n\t},\n\tvisionSettings: {\n\t\ttype: 'object',\n\t\tdescription: 'Vision-polyfill settings',\n\t},\n\tsimulatorUrl: {\n\t\ttype: 'array',\n\t\tdescription: '自定义 simulatorUrl 的地址',\n\t},\n\tappHelper: {\n\t\ttype: 'object',\n\t\tdescription: '定义 utils 和 constants 等对象',\n\t},\n\trequestHandlersMap: {\n\t\ttype: 'object',\n\t\tdescription: '数据源引擎的请求处理器映射',\n\t},\n\tthisRequiredInJSE: {\n\t\ttype: 'boolean',\n\t\tdescription: 'JSExpression 是否只支持使用 this 来访问上下文变量',\n\t},\n\tenableStrictNotFoundMode: {\n\t\ttype: 'boolean',\n\t\tdescription: '当开启组件未找到严格模式时,渲染模块不会默认给一个容器组件',\n\t},\n\tfocusNodeSelector: {\n\t\ttype: 'function',\n\t\tdescription: '配置指定节点为根组件',\n\t},\n\tenableAutoOpenFirstWindow: {\n\t\ttype: 'boolean',\n\t\tdescription: '应用级设计模式下,自动打开第一个窗口',\n\t\tdefault: true,\n\t},\n\tenableWorkspaceMode: {\n\t\ttype: 'boolean',\n\t\tdescription: '是否开启应用级设计模式',\n\t\tdefault: false,\n\t},\n\tworkspaceEmptyComponent: {\n\t\ttype: 'function',\n\t\tdescription: '应用级设计模式下,窗口为空时展示的占位组件',\n\t},\n\tenableContextMenu: {\n\t\ttype: 'boolean',\n\t\tdescription: '是否开启右键菜单',\n\t\tdefault: false,\n\t},\n\thideComponentAction: {\n\t\ttype: 'boolean',\n\t\tdescription: '是否隐藏设计器辅助层',\n\t\tdefault: false,\n\t},\n};\n\nconst logger = getLogger({ level: 'log', bizName: 'config' });\n\nconst getStrictModeValue = (\n\tengineOptions: IPublicTypeEngineOptions,\n\tdefaultValue: boolean\n): boolean => {\n\tif (!engineOptions || !isPlainObject(engineOptions)) {\n\t\treturn defaultValue;\n\t}\n\tif (\n\t\tengineOptions.enableStrictPluginMode === undefined ||\n\t\tengineOptions.enableStrictPluginMode === null\n\t) {\n\t\treturn defaultValue;\n\t}\n\treturn engineOptions.enableStrictPluginMode;\n};\n\nexport interface IEngineConfig extends IPublicModelEngineConfig {\n\t/**\n\t * if engineOptions.strictPluginMode === true, only accept propertied predefined in EngineOptions.\n\t *\n\t * @param {IPublicTypeEngineOptions} engineOptions\n\t */\n\tsetEngineOptions(engineOptions: IPublicTypeEngineOptions): void;\n\n\tnotifyGot(key: string): void;\n\n\tsetWait(key: string, resolve: (data: any) => void, once?: boolean): void;\n\n\tdelWait(key: string, fn: any): void;\n}\n\n/**\n * 管理低代码引擎中的配置项,支持严格模式下的配置项校验,\n * 且提供异步获取配置值的能力,非常适合复杂配置管理场景。\n */\n\nexport class EngineConfig implements IEngineConfig {\n\t/**\n\t * 配置项\n\t */\n\tprivate config: { [key: string]: any } = {};\n\n\t/**\n\t * 这是一个等待队列,用于管理那些需要等待某个配置项赋值的回调。\n\t */\n\tprivate waits = new Map<\n\t\tstring,\n\t\tArray<{\n\t\t\tonce?: boolean;\n\t\t\tresolve: (data: any) => void;\n\t\t}>\n\t>();\n\n\t/**\n\t * 存储 preference\n\t */\n\treadonly preference: IPublicModelPreference;\n\n\tconstructor(config?: { [key: string]: any }) {\n\t\tthis.config = config || {};\n\t\tthis.preference = new Preference();\n\t}\n\n\t/**\n\t * 设置引擎配置\n\t *\n\t * @param engineOptions 引擎配置对象\n\t */\n\tsetEngineOptions(engineOptions: IPublicTypeEngineOptions): void {\n\t\t// 不是一个有效的纯对象\n\t\tif (!engineOptions || !isPlainObject(engineOptions)) {\n\t\t\treturn;\n\t\t}\n\t\tconst strictMode =\n\t\t\tgetStrictModeValue(engineOptions, STRICT_PLUGIN_MODE_DEFAULT) === true;\n\t\tif (strictMode) {\n\t\t\t// 严格模式\n\t\t\tconst isValidKey = (key: string) => {\n\t\t\t\tconst result = (VALID_ENGINE_OPTIONS as any)[key];\n\t\t\t\treturn !(result === undefined || result === null);\n\t\t\t};\n\t\t\tObject.keys(engineOptions).forEach((key) => {\n\t\t\t\tif (isValidKey(key)) {\n\t\t\t\t\tthis.set(key, (engineOptions as any)[key]);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`failed to config ${key} to engineConfig, only predefined options can be set under strict mode, predefined options: `,\n\t\t\t\t\t\tVALID_ENGINE_OPTIONS\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.setConfig(engineOptions);\n\t\t}\n\t}\n\n\t/**\n\t * 判断指定 key 是否有值\n\t * @param key\n\t */\n\thas(key: string): boolean {\n\t\treturn this.config[key] !== undefined;\n\t}\n\n\t/**\n\t * 获取指定 key 的值\n\t * @param key\n\t * @param defaultValue\n\t */\n\tget(key: string, defaultValue?: any): any {\n\t\treturn lodashGet(this.config, key, defaultValue);\n\t}\n\n\t/**\n\t * 设置指定 key 的值\n\t * @param key\n\t * @param value\n\t */\n\tset(key: string, value: any) {\n\t\tthis.config[key] = value;\n\t\tthis.notifyGot(key);\n\t}\n\n\t/**\n\t * 批量设值,set 的对象版本\n\t * @param config\n\t */\n\tsetConfig(config: { [key: string]: any }) {\n\t\tif (config) {\n\t\t\tObject.keys(config).forEach((key) => {\n\t\t\t\tthis.set(key, config[key]);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * 获取指定 key 的值,若此时还未赋值,则等待,若已有值,则直接返回值\n\t * 注:此函数返回 Promise 实例,只会执行(fullfill)一次\n\t * @param key\n\t * @returns\n\t */\n\tonceGot(key: string): Promise<any> {\n\t\tconst val = this.config[key];\n\t\tif (val !== undefined) {\n\t\t\treturn Promise.resolve(val);\n\t\t}\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.setWait(key, resolve, true);\n\t\t});\n\t}\n\n\t/**\n\t * 获取指定 key 的值,函数回调模式,若多次被赋值,回调会被多次调用\n\t *\n\t * @param key\n\t * @param fn\n\t * @returns\n\t */\n\tonGot(key: string, fn: (data: any) => void): () => void {\n\t\tconst val = this.config?.[key];\n\t\tif (val !== undefined) {\n\t\t\tfn(val);\n\t\t}\n\t\tthis.setWait(key, fn);\n\t\treturn () => {\n\t\t\tthis.delWait(key, fn);\n\t\t};\n\t}\n\n\t/**\n\t * 通知获取指定键的值\n\t * @param key 键\n\t */\n\tnotifyGot(key: string): void {\n\t\tlet waits = this.waits.get(key);\n\t\tif (!waits) {\n\t\t\treturn;\n\t\t}\n\t\twaits = waits.slice().reverse();\n\t\tlet i = waits.length;\n\t\twhile (i--) {\n\t\t\twaits[i].resolve(this.get(key));\n\t\t\tif (waits[i].once) {\n\t\t\t\twaits.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\tif (waits.length > 0) {\n\t\t\tthis.waits.set(key, waits);\n\t\t} else {\n\t\t\tthis.waits.delete(key);\n\t\t}\n\t}\n\n\t/**\n\t * 设置等待获取指定键的值\n\t * @param key 键\n\t * @param resolve 回调函数\n\t * @param once 是否只执行一次\n\t */\n\tsetWait(key: string, resolve: (data: any) => void, once?: boolean) {\n\t\tconst waits = this.waits.get(key);\n\t\tif (waits) {\n\t\t\twaits.push({ resolve, once });\n\t\t} else {\n\t\t\tthis.waits.set(key, [{ resolve, once }]);\n\t\t}\n\t}\n\n\t/**\n\t * 删除等待获取指定键的值\n\t * @param key 键\n\t * @param fn 回调函数\n\t */\n\tdelWait(key: string, fn: any) {\n\t\tconst waits = this.waits.get(key);\n\t\tif (!waits) {\n\t\t\treturn;\n\t\t}\n\t\tlet i = waits.length;\n\t\twhile (i--) {\n\t\t\tif (waits[i].resolve === fn) {\n\t\t\t\twaits.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\tif (waits.length < 1) {\n\t\t\tthis.waits.delete(key);\n\t\t}\n\t}\n\n\t/**\n\t * 获取偏好设置\n\t * @returns 偏好设置对象\n\t */\n\tgetPreference(): IPublicModelPreference {\n\t\treturn this.preference;\n\t}\n}\n\nexport const engineConfig = new EngineConfig();\n"],"names":["lodashGet"],"mappings":"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"} |
| export * from './ioc-context'; | ||
| export * from './setter'; |
| export { globalContext } from './ioc-context.js'; | ||
| export { Setters } from './setter.js'; | ||
| export * from 'power-di'; | ||
| "use strict"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"} |
| import { IocContext } from 'power-di'; | ||
| export * from 'power-di'; | ||
| /** | ||
| * ioc容器,全局的依赖注入上下文 | ||
| */ | ||
| export declare const globalContext: IocContext; |
| import { IocContext } from 'power-di'; | ||
| export * from 'power-di'; | ||
| "use strict"; | ||
| const globalContext = IocContext.DefaultInstance; | ||
| export { globalContext }; | ||
| //# sourceMappingURL=ioc-context.js.map |
| {"version":3,"file":"ioc-context.js","sources":["../../../src/di/ioc-context.ts"],"sourcesContent":["import { IocContext } from 'power-di';\n\nexport * from 'power-di';\n\n/**\n * ioc容器,全局的依赖注入上下文\n */\nexport const globalContext = IocContext.DefaultInstance;\n"],"names":[],"mappings":";;;;AAOO,MAAM,gBAAgB,UAAW,CAAA;;;;"} |
| import { IPublicApiSetters, IPublicTypeCustomView, IPublicTypeRegisteredSetter } from '@arvin-shu/microcode-types'; | ||
| import { VNode } from 'vue'; | ||
| export interface ISetters extends IPublicApiSetters { | ||
| } | ||
| export declare class Setters implements ISetters { | ||
| readonly viewName: string; | ||
| settersMap: Map<string, IPublicTypeRegisteredSetter & { | ||
| type: string; | ||
| }>; | ||
| constructor(viewName?: string); | ||
| getSetter: (type: string) => IPublicTypeRegisteredSetter | null; | ||
| registerSetter: (typeOrMaps: string | { | ||
| [key: string]: IPublicTypeCustomView | IPublicTypeRegisteredSetter; | ||
| }, setter?: IPublicTypeCustomView | IPublicTypeRegisteredSetter) => void; | ||
| getSettersMap: () => Map<string, IPublicTypeRegisteredSetter & { | ||
| type: string; | ||
| }>; | ||
| createSetterContent: (setter: any, props: Record<string, any>) => VNode | null; | ||
| } |
| import { isCustomView, createContent } from '@arvin-shu/microcode-utils'; | ||
| "use strict"; | ||
| class Setters { | ||
| // eslint-disable-next-line no-useless-constructor | ||
| constructor(viewName = "global") { | ||
| this.viewName = viewName; | ||
| } | ||
| settersMap = /* @__PURE__ */ new Map(); | ||
| getSetter = (type) => this.settersMap.get(type) || null; | ||
| registerSetter = (typeOrMaps, setter) => { | ||
| if (typeof typeOrMaps === "object") { | ||
| Object.keys(typeOrMaps).forEach((type) => { | ||
| this.registerSetter(type, typeOrMaps[type]); | ||
| }); | ||
| return; | ||
| } | ||
| if (!setter) { | ||
| return; | ||
| } | ||
| if (isCustomView(setter)) { | ||
| setter = { | ||
| component: setter, | ||
| title: setter.displayName || setter.name || "CustomSetter" | ||
| }; | ||
| } | ||
| if (!setter.initialValue) { | ||
| const initial = getInitialFromSetter(setter.component); | ||
| if (initial) { | ||
| setter.initialValue = (field) => initial.call(field, field.getValue()); | ||
| } | ||
| } | ||
| this.settersMap.set(typeOrMaps, { type: typeOrMaps, ...setter }); | ||
| }; | ||
| getSettersMap = () => this.settersMap; | ||
| createSetterContent = (setter, props) => { | ||
| if (typeof setter === "string") { | ||
| setter = this.getSetter(setter); | ||
| if (!setter) { | ||
| return null; | ||
| } | ||
| if (setter.defaultProps) { | ||
| props = { | ||
| ...setter.defaultProps, | ||
| ...props | ||
| }; | ||
| } | ||
| setter = setter.component; | ||
| } | ||
| if ("value" in props && typeof props.value === "undefined") { | ||
| delete props.value; | ||
| } | ||
| return createContent(setter, props); | ||
| }; | ||
| } | ||
| function getInitialFromSetter(setter) { | ||
| return setter && (setter.initial || setter.Initial || setter.type && (setter.type.initial || setter.type.Initial)) || null; | ||
| } | ||
| export { Setters }; | ||
| //# sourceMappingURL=setter.js.map |
| {"version":3,"file":"setter.js","sources":["../../../src/di/setter.ts"],"sourcesContent":["import {\n\tIPublicApiSetters,\n\tIPublicModelSettingField,\n\tIPublicTypeCustomView,\n\tIPublicTypeRegisteredSetter,\n} from '@arvin-shu/microcode-types';\nimport { createContent, isCustomView } from '@arvin-shu/microcode-utils';\nimport { VNode } from 'vue';\n\nexport interface ISetters extends IPublicApiSetters {}\n\nexport class Setters implements ISetters {\n\tsettersMap = new Map<\n\t\tstring,\n\t\tIPublicTypeRegisteredSetter & {\n\t\t\ttype: string;\n\t\t}\n\t>();\n\n\t// eslint-disable-next-line no-useless-constructor\n\tconstructor(readonly viewName: string = 'global') {\n\t\t//\n\t}\n\n\tgetSetter = (type: string): IPublicTypeRegisteredSetter | null =>\n\t\tthis.settersMap.get(type) || null;\n\n\tregisterSetter = (\n\t\ttypeOrMaps:\n\t\t\t| string\n\t\t\t| { [key: string]: IPublicTypeCustomView | IPublicTypeRegisteredSetter },\n\t\tsetter?: IPublicTypeCustomView | IPublicTypeRegisteredSetter\n\t) => {\n\t\tif (typeof typeOrMaps === 'object') {\n\t\t\tObject.keys(typeOrMaps).forEach((type) => {\n\t\t\t\tthis.registerSetter(type, typeOrMaps[type]);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (!setter) {\n\t\t\treturn;\n\t\t}\n\t\tif (isCustomView(setter)) {\n\t\t\tsetter = {\n\t\t\t\tcomponent: setter,\n\t\t\t\ttitle:\n\t\t\t\t\t(setter as any).displayName || (setter as any).name || 'CustomSetter',\n\t\t\t};\n\t\t}\n\n\t\tif (!setter.initialValue) {\n\t\t\tconst initial = getInitialFromSetter(setter.component);\n\t\t\tif (initial) {\n\t\t\t\tsetter.initialValue = (field: IPublicModelSettingField) =>\n\t\t\t\t\tinitial.call(field, field.getValue());\n\t\t\t}\n\t\t}\n\t\t// @ts-ignore\n\t\tthis.settersMap.set(typeOrMaps, { type: typeOrMaps, ...setter });\n\t};\n\n\tgetSettersMap = () => this.settersMap;\n\n\tcreateSetterContent = (\n\t\tsetter: any,\n\t\tprops: Record<string, any>\n\t): VNode | null => {\n\t\tif (typeof setter === 'string') {\n\t\t\tsetter = this.getSetter(setter);\n\t\t\tif (!setter) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (setter.defaultProps) {\n\t\t\t\tprops = {\n\t\t\t\t\t...setter.defaultProps,\n\t\t\t\t\t...props,\n\t\t\t\t};\n\t\t\t}\n\t\t\tsetter = setter.component;\n\t\t}\n\n\t\tif ('value' in props && typeof props.value === 'undefined') {\n\t\t\tdelete props.value;\n\t\t}\n\n\t\treturn createContent(setter, props);\n\t};\n}\n/**\n * 从 setter 中获取初始值函数\n * @param setter setter 组件或配置\n * @returns 返回初始值函数,如果没有找到则返回 null\n *\n * 查找顺序:\n * 1. setter.initial\n * 2. setter.Initial\n * 3. setter.type.initial\n * 4. setter.type.Initial\n */\nfunction getInitialFromSetter(setter: any) {\n\treturn (\n\t\t(setter &&\n\t\t\t(setter.initial ||\n\t\t\t\tsetter.Initial ||\n\t\t\t\t(setter.type && (setter.type.initial || setter.type.Initial)))) ||\n\t\tnull\n\t);\n}\n"],"names":[],"mappings":";;;AAWO,MAAM,OAA4B,CAAA;AAAA;AAAA,EASxC,WAAA,CAAqB,WAAmB,QAAU,EAAA;AAA7B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA;AAErB,EAVA,UAAA,uBAAiB,GAKf,EAAA;AAAA,EAOF,YAAY,CAAC,IAAA,KACZ,KAAK,UAAW,CAAA,GAAA,CAAI,IAAI,CAAK,IAAA,IAAA;AAAA,EAE9B,cAAA,GAAiB,CAChB,UAAA,EAGA,MACI,KAAA;AACJ,IAAI,IAAA,OAAO,eAAe,QAAU,EAAA;AACnC,MAAA,MAAA,CAAO,IAAK,CAAA,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,IAAS,KAAA;AACzC,QAAA,IAAA,CAAK,cAAe,CAAA,IAAA,EAAM,UAAW,CAAA,IAAI,CAAC,CAAA;AAAA,OAC1C,CAAA;AACD,MAAA;AAAA;AAED,IAAA,IAAI,CAAC,MAAQ,EAAA;AACZ,MAAA;AAAA;AAED,IAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACzB,MAAS,MAAA,GAAA;AAAA,QACR,SAAW,EAAA,MAAA;AAAA,QACX,KACE,EAAA,MAAA,CAAe,WAAgB,IAAA,MAAA,CAAe,IAAQ,IAAA;AAAA,OACzD;AAAA;AAGD,IAAI,IAAA,CAAC,OAAO,YAAc,EAAA;AACzB,MAAM,MAAA,OAAA,GAAU,oBAAqB,CAAA,MAAA,CAAO,SAAS,CAAA;AACrD,MAAA,IAAI,OAAS,EAAA;AACZ,QAAO,MAAA,CAAA,YAAA,GAAe,CAAC,KACtB,KAAA,OAAA,CAAQ,KAAK,KAAO,EAAA,KAAA,CAAM,UAAU,CAAA;AAAA;AACtC;AAGD,IAAK,IAAA,CAAA,UAAA,CAAW,IAAI,UAAY,EAAA,EAAE,MAAM,UAAY,EAAA,GAAG,QAAQ,CAAA;AAAA,GAChE;AAAA,EAEA,aAAA,GAAgB,MAAM,IAAK,CAAA,UAAA;AAAA,EAE3B,mBAAA,GAAsB,CACrB,MAAA,EACA,KACkB,KAAA;AAClB,IAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC/B,MAAS,MAAA,GAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9B,MAAA,IAAI,CAAC,MAAQ,EAAA;AACZ,QAAO,OAAA,IAAA;AAAA;AAER,MAAA,IAAI,OAAO,YAAc,EAAA;AACxB,QAAQ,KAAA,GAAA;AAAA,UACP,GAAG,MAAO,CAAA,YAAA;AAAA,UACV,GAAG;AAAA,SACJ;AAAA;AAED,MAAA,MAAA,GAAS,MAAO,CAAA,SAAA;AAAA;AAGjB,IAAA,IAAI,OAAW,IAAA,KAAA,IAAS,OAAO,KAAA,CAAM,UAAU,WAAa,EAAA;AAC3D,MAAA,OAAO,KAAM,CAAA,KAAA;AAAA;AAGd,IAAO,OAAA,aAAA,CAAc,QAAQ,KAAK,CAAA;AAAA,GACnC;AACD;AAYA,SAAS,qBAAqB,MAAa,EAAA;AAC1C,EAAA,OACE,MACC,KAAA,MAAA,CAAO,OACP,IAAA,MAAA,CAAO,OACN,IAAA,MAAA,CAAO,IAAS,KAAA,MAAA,CAAO,IAAK,CAAA,OAAA,IAAW,MAAO,CAAA,IAAA,CAAK,OACtD,CAAA,CAAA,IAAA,IAAA;AAEF;;;;"} |
-133
| import EventEmitter from 'eventemitter2'; | ||
| import { EditorConfig, HookConfig, IPublicModelEditor, IPublicTypeAssetsJson, IPublicTypeEditorGetResult, IPublicTypeEditorValueKey, PluginClassSet } from '@arvin-shu/microcode-types'; | ||
| import { EventBus, IEventBus } from './event-bus'; | ||
| export interface IEditor extends IPublicModelEditor { | ||
| config?: EditorConfig; | ||
| components?: PluginClassSet; | ||
| eventBus: IEventBus; | ||
| init(config?: EditorConfig, components?: PluginClassSet): Promise<any>; | ||
| } | ||
| export declare class Editor extends EventEmitter implements IEditor { | ||
| readonly viewName: string; | ||
| readonly workspaceMode: boolean; | ||
| /** | ||
| * 存储全局状态和资源 | ||
| */ | ||
| private context; | ||
| /** | ||
| * 获取当前语言 | ||
| */ | ||
| get locale(): any; | ||
| /** | ||
| * 编辑器配置 | ||
| */ | ||
| config?: EditorConfig; | ||
| /** | ||
| * 事件总线 | ||
| */ | ||
| eventBus: EventBus; | ||
| /** | ||
| * 插件集合 | ||
| */ | ||
| components?: PluginClassSet; | ||
| /** | ||
| * 钩子集合 | ||
| */ | ||
| private hooks; | ||
| /** | ||
| * 等待集合 | ||
| */ | ||
| private waits; | ||
| constructor(viewName?: string, workspaceMode?: boolean); | ||
| /** | ||
| * 获取指定键的值 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 获取到的值 | ||
| */ | ||
| get<T = undefined, KeyOrType = any>(keyOrType: KeyOrType): IPublicTypeEditorGetResult<T, KeyOrType> | undefined; | ||
| /** | ||
| * 检查指定键是否存在 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 是否存在 | ||
| */ | ||
| has(keyOrType: IPublicTypeEditorValueKey): boolean; | ||
| /** | ||
| * 设置指定键的值 | ||
| * @param key 键 | ||
| * @param data 值 | ||
| */ | ||
| set(key: IPublicTypeEditorValueKey, data: any): void | Promise<void>; | ||
| /** | ||
| * 设置资源配置 | ||
| * @param assets 资源配置对象 | ||
| */ | ||
| setAssets(assets: IPublicTypeAssetsJson): Promise<void>; | ||
| /** | ||
| * 用于监听某个键的数据变化,并在数据变化时调用回调函数。 | ||
| * | ||
| * @param keyOrType | ||
| * @param fn | ||
| * @returns | ||
| */ | ||
| onChange<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(keyOrType: KeyOrType, fn: (data: IPublicTypeEditorGetResult<T, KeyOrType>) => void): () => void; | ||
| register(data: any, key?: IPublicTypeEditorValueKey): void; | ||
| /** | ||
| * 初始化编辑器 | ||
| * | ||
| * @param config 编辑器配置项,包含生命周期和钩子函数等 | ||
| * @param components 组件集合 | ||
| * @returns Promise<boolean> 初始化是否成功 | ||
| */ | ||
| init(config?: EditorConfig, components?: PluginClassSet): Promise<any>; | ||
| /** | ||
| * 初始化钩子函数 | ||
| * @param hooks 钩子函数配置 | ||
| * @returns 钩子函数集合 | ||
| */ | ||
| initHooks: (hooks: HookConfig[]) => HookConfig[]; | ||
| /** | ||
| * 注册钩子函数 | ||
| * @param hooks 钩子函数配置 | ||
| * @returns 钩子函数集合 | ||
| */ | ||
| registerHooks: (hooks: HookConfig[]) => void; | ||
| /** | ||
| * 注销钩子函数 | ||
| */ | ||
| unregisterHooks: () => void; | ||
| /** | ||
| * 获取指定键的值,如果值不存在则等待获取 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 获取到的值 | ||
| */ | ||
| onceGot<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(keyOrType: KeyOrType): Promise<IPublicTypeEditorGetResult<T, KeyOrType>>; | ||
| /** | ||
| * 获取指定键的值,如果值不存在则等待获取 | ||
| * @param keyOrType 键或类型 | ||
| * @param fn 回调函数 | ||
| * @returns 注销函数 | ||
| */ | ||
| onGot<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(keyOrType: KeyOrType, fn: (data: IPublicTypeEditorGetResult<T, KeyOrType>) => void): () => void; | ||
| /** | ||
| * 通知获取指定键的值 | ||
| * @param key 键 | ||
| */ | ||
| private notifyGot; | ||
| /** | ||
| * 设置等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param resolve 回调函数 | ||
| * @param once 是否只执行一次 | ||
| */ | ||
| private setWait; | ||
| /** | ||
| * 删除等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param fn 回调函数 | ||
| */ | ||
| private delWait; | ||
| } | ||
| /** | ||
| * 全局事件总线 | ||
| */ | ||
| export declare const commonEvent: EventBus; |
-344
| import EventEmitter from 'eventemitter2'; | ||
| import { shallowReactive } from 'vue'; | ||
| import { AssetLoader } from '@arvin-shu/microcode-utils'; | ||
| import { EventBus } from './event-bus.js'; | ||
| import { engineConfig } from './config.js'; | ||
| import { globalLocale } from './inti/global-locale.js'; | ||
| import './utils/index.js'; | ||
| import { assetsTransform } from './utils/assets-transform.js'; | ||
| "use strict"; | ||
| const keyBlacklist = [ | ||
| "designer", | ||
| "skeleton", | ||
| "currentDocument", | ||
| "simulator", | ||
| "plugins", | ||
| "setters", | ||
| "material", | ||
| "innerHotkey", | ||
| "innerPlugins" | ||
| ]; | ||
| const AssetsCache = {}; | ||
| class Editor extends EventEmitter { | ||
| constructor(viewName = "global", workspaceMode = false) { | ||
| super(); | ||
| this.viewName = viewName; | ||
| this.workspaceMode = workspaceMode; | ||
| this.setMaxListeners(200); | ||
| this.eventBus = new EventBus(this); | ||
| } | ||
| /** | ||
| * 存储全局状态和资源 | ||
| */ | ||
| context = shallowReactive( | ||
| /* @__PURE__ */ new Map() | ||
| ); | ||
| /** | ||
| * 获取当前语言 | ||
| */ | ||
| get locale() { | ||
| return globalLocale.getLocale(); | ||
| } | ||
| /** | ||
| * 编辑器配置 | ||
| */ | ||
| config; | ||
| /** | ||
| * 事件总线 | ||
| */ | ||
| eventBus; | ||
| /** | ||
| * 插件集合 | ||
| */ | ||
| components; | ||
| /** | ||
| * 钩子集合 | ||
| */ | ||
| hooks = []; | ||
| /** | ||
| * 等待集合 | ||
| */ | ||
| waits = /* @__PURE__ */ new Map(); | ||
| /** | ||
| * 获取指定键的值 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 获取到的值 | ||
| */ | ||
| get(keyOrType) { | ||
| return this.context.get(keyOrType); | ||
| } | ||
| /** | ||
| * 检查指定键是否存在 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 是否存在 | ||
| */ | ||
| has(keyOrType) { | ||
| return this.context.has(keyOrType); | ||
| } | ||
| /** | ||
| * 设置指定键的值 | ||
| * @param key 键 | ||
| * @param data 值 | ||
| */ | ||
| set(key, data) { | ||
| if (key === "assets") { | ||
| return this.setAssets(data); | ||
| } | ||
| this.context.set(key, data); | ||
| if (!keyBlacklist.includes(key)) { | ||
| engineConfig.set(key, data); | ||
| } | ||
| this.context.set(key, data); | ||
| this.notifyGot(key); | ||
| } | ||
| /** | ||
| * 设置资源配置 | ||
| * @param assets 资源配置对象 | ||
| */ | ||
| async setAssets(assets) { | ||
| const { components } = assets; | ||
| if (components && components.length) { | ||
| const componentDescriptions = []; | ||
| const remoteComponentDescriptions = []; | ||
| components.forEach((component) => { | ||
| if (!component) { | ||
| return; | ||
| } | ||
| if (component.exportName && component.url) { | ||
| remoteComponentDescriptions.push(component); | ||
| } else { | ||
| componentDescriptions.push( | ||
| component | ||
| ); | ||
| } | ||
| }); | ||
| assets.components = componentDescriptions; | ||
| if (remoteComponentDescriptions && remoteComponentDescriptions.length) { | ||
| await Promise.all( | ||
| remoteComponentDescriptions.map( | ||
| async (component) => { | ||
| const { exportName, url, npm } = component; | ||
| if (!url || !exportName) { | ||
| return; | ||
| } | ||
| if (!AssetsCache[exportName] || !npm?.version || AssetsCache[exportName].npm?.version !== npm.version) { | ||
| await new AssetLoader().load(url); | ||
| } | ||
| AssetsCache[exportName] = component; | ||
| function setAssetsComponent(component2, extraNpmInfo = {}) { | ||
| const { components: components2 } = component2; | ||
| if (Array.isArray(components2)) { | ||
| components2.forEach((d) => { | ||
| assets.components = assets.components.concat({ | ||
| npm: { | ||
| ...npm, | ||
| ...extraNpmInfo | ||
| }, | ||
| ...d | ||
| }); | ||
| }); | ||
| return; | ||
| } | ||
| if (component2.components) { | ||
| assets.components = assets.components.concat({ | ||
| npm: { | ||
| ...npm, | ||
| ...extraNpmInfo | ||
| }, | ||
| ...component2.components | ||
| }); | ||
| } | ||
| } | ||
| function setArrayAssets(value, preExportName = "", preSubName = "") { | ||
| value.forEach((d, i) => { | ||
| const exportName2 = [preExportName, i.toString()].filter((d2) => !!d2).join("."); | ||
| const subName = [preSubName, i.toString()].filter((d2) => !!d2).join("."); | ||
| Array.isArray(d) ? setArrayAssets(d, exportName2, subName) : setAssetsComponent(d, { | ||
| exportName: exportName2, | ||
| subName | ||
| }); | ||
| }); | ||
| } | ||
| if (window[exportName]) { | ||
| if (Array.isArray(window[exportName])) { | ||
| setArrayAssets(window[exportName]); | ||
| } else { | ||
| setAssetsComponent(window[exportName]); | ||
| } | ||
| } | ||
| return window[exportName]; | ||
| } | ||
| ) | ||
| ); | ||
| } | ||
| } | ||
| const innerAssets = assetsTransform(assets); | ||
| this.context.set("assets", innerAssets); | ||
| this.notifyGot("assets"); | ||
| } | ||
| /** | ||
| * 用于监听某个键的数据变化,并在数据变化时调用回调函数。 | ||
| * | ||
| * @param keyOrType | ||
| * @param fn | ||
| * @returns | ||
| */ | ||
| onChange(keyOrType, fn) { | ||
| this.setWait(keyOrType, fn); | ||
| return () => { | ||
| this.delWait(keyOrType, fn); | ||
| }; | ||
| } | ||
| register(data, key) { | ||
| this.context.set(key || data, data); | ||
| this.notifyGot(key || data); | ||
| } | ||
| /** | ||
| * 初始化编辑器 | ||
| * | ||
| * @param config 编辑器配置项,包含生命周期和钩子函数等 | ||
| * @param components 组件集合 | ||
| * @returns Promise<boolean> 初始化是否成功 | ||
| */ | ||
| async init(config, components) { | ||
| this.config = config || {}; | ||
| this.components = components || {}; | ||
| const { hooks = [], lifeCycles } = this.config; | ||
| this.emit("editor.beforeInit"); | ||
| const init = lifeCycles && lifeCycles.init || (() => { | ||
| }); | ||
| try { | ||
| await init(this); | ||
| this.registerHooks(hooks); | ||
| this.emit("editor.afterInit"); | ||
| return true; | ||
| } catch (e) { | ||
| console.error(e); | ||
| } | ||
| } | ||
| /** | ||
| * 初始化钩子函数 | ||
| * @param hooks 钩子函数配置 | ||
| * @returns 钩子函数集合 | ||
| */ | ||
| initHooks = (hooks) => { | ||
| this.hooks = hooks.map((hook) => ({ | ||
| ...hook, | ||
| // 指定第一个参数为 editor | ||
| handler: hook.handler.bind(this, this) | ||
| })); | ||
| return this.hooks; | ||
| }; | ||
| /** | ||
| * 注册钩子函数 | ||
| * @param hooks 钩子函数配置 | ||
| * @returns 钩子函数集合 | ||
| */ | ||
| registerHooks = (hooks) => { | ||
| this.initHooks(hooks).forEach(({ message, type, handler }) => { | ||
| if (["on", "once"].indexOf(type) !== -1) { | ||
| this[type](message, handler); | ||
| } | ||
| }); | ||
| }; | ||
| /** | ||
| * 注销钩子函数 | ||
| */ | ||
| unregisterHooks = () => { | ||
| this.hooks.forEach(({ message, handler }) => { | ||
| this.removeListener(message, handler); | ||
| }); | ||
| }; | ||
| /** | ||
| * 获取指定键的值,如果值不存在则等待获取 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 获取到的值 | ||
| */ | ||
| onceGot(keyOrType) { | ||
| const x = this.context.get(keyOrType); | ||
| if (x !== void 0) { | ||
| return Promise.resolve(x); | ||
| } | ||
| return new Promise((resolve) => { | ||
| this.setWait(keyOrType, resolve, true); | ||
| }); | ||
| } | ||
| /** | ||
| * 获取指定键的值,如果值不存在则等待获取 | ||
| * @param keyOrType 键或类型 | ||
| * @param fn 回调函数 | ||
| * @returns 注销函数 | ||
| */ | ||
| onGot(keyOrType, fn) { | ||
| const x = this.context.get(keyOrType); | ||
| if (x !== void 0) { | ||
| fn(x); | ||
| } | ||
| this.setWait(keyOrType, fn); | ||
| return () => { | ||
| this.delWait(keyOrType, fn); | ||
| }; | ||
| } | ||
| /** | ||
| * 通知获取指定键的值 | ||
| * @param key 键 | ||
| */ | ||
| notifyGot(key) { | ||
| let waits = this.waits.get(key); | ||
| if (!waits) { | ||
| return; | ||
| } | ||
| waits = waits.slice().reverse(); | ||
| let 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); | ||
| } | ||
| } | ||
| /** | ||
| * 设置等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param resolve 回调函数 | ||
| * @param once 是否只执行一次 | ||
| */ | ||
| setWait(key, resolve, once) { | ||
| const waits = this.waits.get(key); | ||
| if (waits) { | ||
| waits.push({ resolve, once }); | ||
| } else { | ||
| this.waits.set(key, [{ resolve, once }]); | ||
| } | ||
| } | ||
| /** | ||
| * 删除等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param fn 回调函数 | ||
| */ | ||
| delWait(key, fn) { | ||
| const waits = this.waits.get(key); | ||
| if (!waits) { | ||
| return; | ||
| } | ||
| let i = waits.length; | ||
| while (i--) { | ||
| if (waits[i].resolve === fn) { | ||
| waits.splice(i, 1); | ||
| } | ||
| } | ||
| if (waits.length < 1) { | ||
| this.waits.delete(key); | ||
| } | ||
| } | ||
| } | ||
| const commonEvent = new EventBus(new EventEmitter()); | ||
| export { Editor, commonEvent }; | ||
| //# sourceMappingURL=editor.js.map |
| {"version":3,"file":"editor.js","sources":["../../src/editor.ts"],"sourcesContent":["import EventEmitter from 'eventemitter2';\nimport {\n\tEditorConfig,\n\tHookConfig,\n\tIPublicModelEditor,\n\tIPublicTypeAssetsJson,\n\tIPublicTypeComponentDescription,\n\tIPublicTypeEditorGetResult,\n\tIPublicTypeEditorValueKey,\n\tIPublicTypeRemoteComponentDescription,\n\tPluginClassSet,\n} from '@arvin-shu/microcode-types';\nimport { shallowReactive } from 'vue';\nimport { AssetLoader } from '@arvin-shu/microcode-utils';\nimport { EventBus, IEventBus } from './event-bus';\nimport { engineConfig } from './config';\nimport { globalLocale } from './inti/global-locale';\nimport { assetsTransform } from './utils';\n\nconst keyBlacklist = [\n\t'designer',\n\t'skeleton',\n\t'currentDocument',\n\t'simulator',\n\t'plugins',\n\t'setters',\n\t'material',\n\t'innerHotkey',\n\t'innerPlugins',\n];\n\nconst AssetsCache: {\n\t[key: string]: IPublicTypeRemoteComponentDescription;\n} = {};\n\nexport interface IEditor extends IPublicModelEditor {\n\tconfig?: EditorConfig;\n\tcomponents?: PluginClassSet;\n\teventBus: IEventBus;\n\tinit(config?: EditorConfig, components?: PluginClassSet): Promise<any>;\n}\nexport class Editor extends EventEmitter implements IEditor {\n\t/**\n\t * 存储全局状态和资源\n\t */\n\tprivate context = shallowReactive<Map<IPublicTypeEditorValueKey, any>>(\n\t\tnew Map<IPublicTypeEditorValueKey, any>()\n\t);\n\n\t/**\n\t * 获取当前语言\n\t */\n\tget locale() {\n\t\treturn globalLocale.getLocale();\n\t}\n\n\t/**\n\t * 编辑器配置\n\t */\n\tconfig?: EditorConfig;\n\n\t/**\n\t * 事件总线\n\t */\n\teventBus: EventBus;\n\n\t/**\n\t * 插件集合\n\t */\n\tcomponents?: PluginClassSet;\n\n\t/**\n\t * 钩子集合\n\t */\n\tprivate hooks: HookConfig[] = [];\n\n\t/**\n\t * 等待集合\n\t */\n\tprivate waits = new Map<\n\t\tIPublicTypeEditorValueKey,\n\t\tArray<{\n\t\t\tonce?: boolean;\n\t\t\tresolve: (data: any) => void;\n\t\t}>\n\t>();\n\n\tconstructor(\n\t\treadonly viewName: string = 'global',\n\t\treadonly workspaceMode: boolean = false\n\t) {\n\t\tsuper();\n\t\tthis.setMaxListeners(200);\n\t\tthis.eventBus = new EventBus(this);\n\t}\n\n\t/**\n\t * 获取指定键的值\n\t * @param keyOrType 键或类型\n\t * @returns 获取到的值\n\t */\n\tget<T = undefined, KeyOrType = any>(\n\t\tkeyOrType: KeyOrType\n\t): IPublicTypeEditorGetResult<T, KeyOrType> | undefined {\n\t\treturn this.context.get(keyOrType as any);\n\t}\n\n\t/**\n\t * 检查指定键是否存在\n\t * @param keyOrType 键或类型\n\t * @returns 是否存在\n\t */\n\thas(keyOrType: IPublicTypeEditorValueKey): boolean {\n\t\treturn this.context.has(keyOrType);\n\t}\n\n\t/**\n\t * 设置指定键的值\n\t * @param key 键\n\t * @param data 值\n\t */\n\tset(key: IPublicTypeEditorValueKey, data: any): void | Promise<void> {\n\t\tif (key === 'assets') {\n\t\t\treturn this.setAssets(data);\n\t\t}\n\t\tthis.context.set(key, data);\n\t\t// 不应存储在配置中的内部实例\n\t\tif (!keyBlacklist.includes(key as string)) {\n\t\t\tengineConfig.set(key as string, data);\n\t\t}\n\t\tthis.context.set(key, data);\n\t\tthis.notifyGot(key);\n\t}\n\n\t/**\n\t * 设置资源配置\n\t * @param assets 资源配置对象\n\t */\n\tasync setAssets(assets: IPublicTypeAssetsJson) {\n\t\tconst { components } = assets;\n\t\t// 如果存在组件配置\n\t\tif (components && components.length) {\n\t\t\t// 用于存储本地组件和远程组件的数组\n\t\t\tconst componentDescriptions: IPublicTypeComponentDescription[] = [];\n\t\t\tconst remoteComponentDescriptions: IPublicTypeRemoteComponentDescription[] =\n\t\t\t\t[];\n\t\t\t// 遍历组件配置,区分本地组件和远程组件\n\t\t\tcomponents.forEach((component) => {\n\t\t\t\tif (!component) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 如果有 exportName 和 url 则为远程组件\n\t\t\t\tif (component.exportName && component.url) {\n\t\t\t\t\tremoteComponentDescriptions.push(component);\n\t\t\t\t} else {\n\t\t\t\t\t// 否则为本地组件\n\t\t\t\t\tcomponentDescriptions.push(\n\t\t\t\t\t\tcomponent as IPublicTypeComponentDescription\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tassets.components = componentDescriptions;\n\n\t\t\t// 处理远程组件\n\t\t\tif (remoteComponentDescriptions && remoteComponentDescriptions.length) {\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tremoteComponentDescriptions.map(\n\t\t\t\t\t\tasync (component: IPublicTypeRemoteComponentDescription) => {\n\t\t\t\t\t\t\tconst { exportName, url, npm } = component;\n\t\t\t\t\t\t\tif (!url || !exportName) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 检查缓存,如果组件不在缓存中或版本不一致,则重新加载\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!AssetsCache[exportName] ||\n\t\t\t\t\t\t\t\t!npm?.version ||\n\t\t\t\t\t\t\t\tAssetsCache[exportName].npm?.version !== npm.version\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tawait new AssetLoader().load(url);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tAssetsCache[exportName] = component;\n\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * 设置资源组件\n\t\t\t\t\t\t\t * @param component 组件配置\n\t\t\t\t\t\t\t * @param extraNpmInfo 额外的 npm 信息\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tfunction setAssetsComponent(\n\t\t\t\t\t\t\t\tcomponent: any,\n\t\t\t\t\t\t\t\textraNpmInfo: any = {}\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconst { components } = component;\n\t\t\t\t\t\t\t\t// 处理组件数组\n\t\t\t\t\t\t\t\tif (Array.isArray(components)) {\n\t\t\t\t\t\t\t\t\tcomponents.forEach((d) => {\n\t\t\t\t\t\t\t\t\t\tassets.components = assets.components.concat({\n\t\t\t\t\t\t\t\t\t\t\tnpm: {\n\t\t\t\t\t\t\t\t\t\t\t\t...npm,\n\t\t\t\t\t\t\t\t\t\t\t\t...extraNpmInfo,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t...d,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 处理单个组件\n\t\t\t\t\t\t\t\tif (component.components) {\n\t\t\t\t\t\t\t\t\tassets.components = assets.components.concat({\n\t\t\t\t\t\t\t\t\t\tnpm: {\n\t\t\t\t\t\t\t\t\t\t\t...npm,\n\t\t\t\t\t\t\t\t\t\t\t...extraNpmInfo,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t...component.components,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * 设置数组类型的资源\n\t\t\t\t\t\t\t * @param value 资源数组\n\t\t\t\t\t\t\t * @param preExportName 前缀导出名\n\t\t\t\t\t\t\t * @param preSubName 前缀子名\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tfunction setArrayAssets(\n\t\t\t\t\t\t\t\tvalue: any[],\n\t\t\t\t\t\t\t\tpreExportName: string = '',\n\t\t\t\t\t\t\t\tpreSubName: string = ''\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tvalue.forEach((d: any, i: number) => {\n\t\t\t\t\t\t\t\t\tconst exportName = [preExportName, i.toString()]\n\t\t\t\t\t\t\t\t\t\t.filter((d) => !!d)\n\t\t\t\t\t\t\t\t\t\t.join('.');\n\t\t\t\t\t\t\t\t\tconst subName = [preSubName, i.toString()]\n\t\t\t\t\t\t\t\t\t\t.filter((d) => !!d)\n\t\t\t\t\t\t\t\t\t\t.join('.');\n\t\t\t\t\t\t\t\t\t// 递归处理数组\n\t\t\t\t\t\t\t\t\tArray.isArray(d)\n\t\t\t\t\t\t\t\t\t\t? setArrayAssets(d, exportName, subName)\n\t\t\t\t\t\t\t\t\t\t: setAssetsComponent(d, {\n\t\t\t\t\t\t\t\t\t\t\t\texportName,\n\t\t\t\t\t\t\t\t\t\t\t\tsubName,\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// 处理全局导出的组件\n\t\t\t\t\t\t\tif ((window as any)[exportName]) {\n\t\t\t\t\t\t\t\tif (Array.isArray((window as any)[exportName])) {\n\t\t\t\t\t\t\t\t\tsetArrayAssets((window as any)[exportName] as any);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tsetAssetsComponent((window as any)[exportName] as any);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (window as any)[exportName];\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst innerAssets = assetsTransform(assets);\n\t\t// 设置资源到上下文\n\t\tthis.context.set('assets', innerAssets);\n\t\t// 通知资源更新\n\t\tthis.notifyGot('assets');\n\t}\n\n\t/**\n\t * 用于监听某个键的数据变化,并在数据变化时调用回调函数。\n\t *\n\t * @param keyOrType\n\t * @param fn\n\t * @returns\n\t */\n\tonChange<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(\n\t\tkeyOrType: KeyOrType,\n\t\tfn: (data: IPublicTypeEditorGetResult<T, KeyOrType>) => void\n\t): () => void {\n\t\tthis.setWait(keyOrType, fn);\n\t\treturn () => {\n\t\t\tthis.delWait(keyOrType, fn);\n\t\t};\n\t}\n\n\tregister(data: any, key?: IPublicTypeEditorValueKey): void {\n\t\tthis.context.set(key || data, data);\n\t\tthis.notifyGot(key || data);\n\t}\n\n\t/**\n\t * 初始化编辑器\n\t *\n\t * @param config 编辑器配置项,包含生命周期和钩子函数等\n\t * @param components 组件集合\n\t * @returns Promise<boolean> 初始化是否成功\n\t */\n\tasync init(config?: EditorConfig, components?: PluginClassSet): Promise<any> {\n\t\t// 初始化配置和组件\n\t\tthis.config = config || {};\n\t\tthis.components = components || {};\n\n\t\t// 从配置中获取钩子函数和生命周期函数\n\t\tconst { hooks = [], lifeCycles } = this.config;\n\n\t\t// 触发初始化前事件\n\t\tthis.emit('editor.beforeInit');\n\t\t// 获取初始化生命周期函数,如果没有则使用空函数\n\t\tconst init = (lifeCycles && lifeCycles.init) || ((): void => {});\n\t\ttry {\n\t\t\t// 执行初始化函数\n\t\t\tawait init(this);\n\t\t\t// 注册快捷键\n\t\t\t// 注册钩子函数\n\t\t\tthis.registerHooks(hooks);\n\t\t\t// 触发初始化完成事件\n\t\t\tthis.emit('editor.afterInit');\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\n\t/**\n\t * 初始化钩子函数\n\t * @param hooks 钩子函数配置\n\t * @returns 钩子函数集合\n\t */\n\tinitHooks = (hooks: HookConfig[]) => {\n\t\tthis.hooks = hooks.map((hook) => ({\n\t\t\t...hook,\n\t\t\t// 指定第一个参数为 editor\n\t\t\thandler: hook.handler.bind(this, this),\n\t\t}));\n\t\treturn this.hooks;\n\t};\n\n\t/**\n\t * 注册钩子函数\n\t * @param hooks 钩子函数配置\n\t * @returns 钩子函数集合\n\t */\n\tregisterHooks = (hooks: HookConfig[]) => {\n\t\tthis.initHooks(hooks).forEach(({ message, type, handler }) => {\n\t\t\t// 调用eventemitter2的on和once方法注册事件\n\t\t\tif (['on', 'once'].indexOf(type) !== -1) {\n\t\t\t\t// 注册一下hook的监听\n\t\t\t\tthis[type](message as any, handler);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * 注销钩子函数\n\t */\n\tunregisterHooks = () => {\n\t\tthis.hooks.forEach(({ message, handler }) => {\n\t\t\tthis.removeListener(message, handler);\n\t\t});\n\t};\n\n\t/**\n\t * 获取指定键的值,如果值不存在则等待获取\n\t * @param keyOrType 键或类型\n\t * @returns 获取到的值\n\t */\n\tonceGot<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(\n\t\tkeyOrType: KeyOrType\n\t): Promise<IPublicTypeEditorGetResult<T, KeyOrType>> {\n\t\tconst x = this.context.get(keyOrType);\n\t\tif (x !== undefined) {\n\t\t\treturn Promise.resolve(x);\n\t\t}\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.setWait(keyOrType, resolve, true);\n\t\t});\n\t}\n\n\t/**\n\t * 获取指定键的值,如果值不存在则等待获取\n\t * @param keyOrType 键或类型\n\t * @param fn 回调函数\n\t * @returns 注销函数\n\t */\n\tonGot<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(\n\t\tkeyOrType: KeyOrType,\n\t\tfn: (data: IPublicTypeEditorGetResult<T, KeyOrType>) => void\n\t): () => void {\n\t\tconst x = this.context.get(keyOrType);\n\t\tif (x !== undefined) {\n\t\t\tfn(x);\n\t\t}\n\t\tthis.setWait(keyOrType, fn);\n\t\treturn () => {\n\t\t\tthis.delWait(keyOrType, fn);\n\t\t};\n\t}\n\n\t/**\n\t * 通知获取指定键的值\n\t * @param key 键\n\t */\n\tprivate notifyGot(key: IPublicTypeEditorValueKey) {\n\t\tlet waits = this.waits.get(key);\n\t\tif (!waits) {\n\t\t\treturn;\n\t\t}\n\t\twaits = waits.slice().reverse();\n\t\tlet i = waits.length;\n\t\twhile (i--) {\n\t\t\twaits[i].resolve(this.get(key));\n\t\t\tif (waits[i].once) {\n\t\t\t\twaits.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\tif (waits.length > 0) {\n\t\t\tthis.waits.set(key, waits);\n\t\t} else {\n\t\t\tthis.waits.delete(key);\n\t\t}\n\t}\n\n\t/**\n\t * 设置等待获取指定键的值\n\t * @param key 键\n\t * @param resolve 回调函数\n\t * @param once 是否只执行一次\n\t */\n\tprivate setWait(\n\t\tkey: IPublicTypeEditorValueKey,\n\t\tresolve: (data: any) => void,\n\t\tonce?: boolean\n\t) {\n\t\tconst waits = this.waits.get(key);\n\t\tif (waits) {\n\t\t\twaits.push({ resolve, once });\n\t\t} else {\n\t\t\tthis.waits.set(key, [{ resolve, once }]);\n\t\t}\n\t}\n\n\t/**\n\t * 删除等待获取指定键的值\n\t * @param key 键\n\t * @param fn 回调函数\n\t */\n\tprivate delWait(key: IPublicTypeEditorValueKey, fn: any) {\n\t\tconst waits = this.waits.get(key);\n\t\tif (!waits) {\n\t\t\treturn;\n\t\t}\n\t\tlet i = waits.length;\n\t\twhile (i--) {\n\t\t\tif (waits[i].resolve === fn) {\n\t\t\t\twaits.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\tif (waits.length < 1) {\n\t\t\tthis.waits.delete(key);\n\t\t}\n\t}\n}\n\n/**\n * 全局事件总线\n */\nexport const commonEvent = new EventBus(new EventEmitter());\n"],"names":["component","components","exportName","d"],"mappings":"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"} |
| import { IPublicApiEvent, IPublicTypeDisposable } from '@arvin-shu/microcode-types'; | ||
| import EventEmitter from 'eventemitter2'; | ||
| export interface IEventBus extends IPublicApiEvent { | ||
| removeListener(event: string | symbol, listener: (...args: any[]) => void): any; | ||
| addListener(event: string | symbol, listener: (...args: any[]) => void): any; | ||
| setMaxListeners(n: number): any; | ||
| removeAllListeners(event?: string | symbol): any; | ||
| } | ||
| /** | ||
| * 事件总线 | ||
| */ | ||
| export declare class EventBus implements IEventBus { | ||
| private readonly eventEmitter; | ||
| private readonly name?; | ||
| constructor(emitter: EventEmitter, name?: string); | ||
| /** | ||
| * 监听事件 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| on(event: string, listener: (...args: any[]) => void): IPublicTypeDisposable; | ||
| /** | ||
| * 监听事件,会在其他回调函数之前执行 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| prependListener(event: string, listener: (...args: any[]) => void): () => void; | ||
| /** | ||
| * 取消监听事件 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| off(event: string, listener: (...args: any[]) => void): void; | ||
| /** | ||
| * 触发事件 | ||
| * @param event 事件名称 | ||
| * @param args 事件参数 | ||
| * @returns | ||
| */ | ||
| emit(event: string, ...args: any[]): void; | ||
| /** | ||
| * 移除事件监听 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| removeListener(event: string | symbol, listener: (...args: any[]) => void): any; | ||
| /** | ||
| * 添加事件监听 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| addListener(event: string | symbol, listener: (...args: any[]) => void): any; | ||
| /** | ||
| * 设置事件监听的最大数量 | ||
| * @param n 最大数量 | ||
| */ | ||
| setMaxListeners(n: number): any; | ||
| /** | ||
| * 移除所有事件监听 | ||
| * @param event 事件名称 | ||
| */ | ||
| removeAllListeners(event?: string | symbol): any; | ||
| /** | ||
| * 获取消息前缀 | ||
| * @param type 类型 | ||
| * @returns 消息前缀 | ||
| */ | ||
| private getMsgPrefix; | ||
| /** | ||
| * 获取日志器 | ||
| * @returns 日志器 | ||
| */ | ||
| private getLogger; | ||
| } | ||
| /** | ||
| * 创建模块事件总线 | ||
| * @param moduleName 模块名称 | ||
| * @param maxListeners 最大监听数量 | ||
| * @returns 事件总线 | ||
| */ | ||
| export declare const createModuleEventBus: (moduleName: string, maxListeners?: number) => IEventBus; |
-123
| import { Logger } from '@arvin-shu/microcode-utils'; | ||
| import EventEmitter from 'eventemitter2'; | ||
| "use strict"; | ||
| const logger = new Logger({ level: "warn", bizName: "event-bus" }); | ||
| const moduleLogger = new Logger({ level: "warn", bizName: "module-event-bus" }); | ||
| class EventBus { | ||
| // 事件发射器 | ||
| eventEmitter; | ||
| // 模块名称 | ||
| name; | ||
| constructor(emitter, name) { | ||
| this.eventEmitter = emitter; | ||
| this.name = name; | ||
| } | ||
| /** | ||
| * 监听事件 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| on(event, listener) { | ||
| this.eventEmitter.on(event, listener); | ||
| this.getLogger().debug(`${this.getMsgPrefix("on")} ${event}`); | ||
| return () => { | ||
| this.off(event, listener); | ||
| }; | ||
| } | ||
| /** | ||
| * 监听事件,会在其他回调函数之前执行 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| prependListener(event, listener) { | ||
| this.eventEmitter.prependListener(event, listener); | ||
| this.getLogger().debug(`${this.getMsgPrefix("prependListener")} ${event}`); | ||
| return () => { | ||
| this.off(event, listener); | ||
| }; | ||
| } | ||
| /** | ||
| * 取消监听事件 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| off(event, listener) { | ||
| this.eventEmitter.off(event, listener); | ||
| this.getLogger().debug(`${this.getMsgPrefix("off")} ${event}`); | ||
| } | ||
| /** | ||
| * 触发事件 | ||
| * @param event 事件名称 | ||
| * @param args 事件参数 | ||
| * @returns | ||
| */ | ||
| emit(event, ...args) { | ||
| this.eventEmitter.emit(event, ...args); | ||
| this.getLogger().debug( | ||
| `${this.getMsgPrefix("emit")} name: ${event}, args: `, | ||
| ...args | ||
| ); | ||
| } | ||
| /** | ||
| * 移除事件监听 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| removeListener(event, listener) { | ||
| return this.eventEmitter.removeListener(event, listener); | ||
| } | ||
| /** | ||
| * 添加事件监听 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| addListener(event, listener) { | ||
| return this.eventEmitter.addListener(event, listener); | ||
| } | ||
| /** | ||
| * 设置事件监听的最大数量 | ||
| * @param n 最大数量 | ||
| */ | ||
| setMaxListeners(n) { | ||
| return this.eventEmitter.setMaxListeners(n); | ||
| } | ||
| /** | ||
| * 移除所有事件监听 | ||
| * @param event 事件名称 | ||
| */ | ||
| removeAllListeners(event) { | ||
| return this.eventEmitter.removeAllListeners(event); | ||
| } | ||
| /** | ||
| * 获取消息前缀 | ||
| * @param type 类型 | ||
| * @returns 消息前缀 | ||
| */ | ||
| getMsgPrefix(type) { | ||
| if (this.name && this.name.length > 0) { | ||
| return `[${this.name}][event-${type}]`; | ||
| } | ||
| return `[*][event-${type}]`; | ||
| } | ||
| /** | ||
| * 获取日志器 | ||
| * @returns 日志器 | ||
| */ | ||
| getLogger() { | ||
| if (this.name && this.name.length > 0) { | ||
| return moduleLogger; | ||
| } | ||
| return logger; | ||
| } | ||
| } | ||
| const createModuleEventBus = (moduleName, maxListeners = 200) => { | ||
| const emitter = new EventEmitter(); | ||
| if (maxListeners) { | ||
| emitter.setMaxListeners(maxListeners); | ||
| } | ||
| return new EventBus(emitter, moduleName); | ||
| }; | ||
| export { EventBus, createModuleEventBus }; | ||
| //# sourceMappingURL=event-bus.js.map |
| {"version":3,"file":"event-bus.js","sources":["../../src/event-bus.ts"],"sourcesContent":["import {\n\tIPublicApiEvent,\n\tIPublicTypeDisposable,\n} from '@arvin-shu/microcode-types';\nimport { Logger } from '@arvin-shu/microcode-utils';\nimport EventEmitter from 'eventemitter2';\n\nconst logger = new Logger({ level: 'warn', bizName: 'event-bus' });\nconst moduleLogger = new Logger({ level: 'warn', bizName: 'module-event-bus' });\n\nexport interface IEventBus extends IPublicApiEvent {\n\tremoveListener(\n\t\tevent: string | symbol,\n\t\tlistener: (...args: any[]) => void\n\t): any;\n\taddListener(event: string | symbol, listener: (...args: any[]) => void): any;\n\tsetMaxListeners(n: number): any;\n\tremoveAllListeners(event?: string | symbol): any;\n}\n\n/**\n * 事件总线\n */\nexport class EventBus implements IEventBus {\n\t// 事件发射器\n\tprivate readonly eventEmitter: EventEmitter;\n\n\t// 模块名称\n\tprivate readonly name?: string;\n\n\tconstructor(emitter: EventEmitter, name?: string) {\n\t\tthis.eventEmitter = emitter;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * 监听事件\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\ton(event: string, listener: (...args: any[]) => void): IPublicTypeDisposable {\n\t\tthis.eventEmitter.on(event, listener);\n\t\tthis.getLogger().debug(`${this.getMsgPrefix('on')} ${event}`);\n\t\treturn () => {\n\t\t\tthis.off(event, listener);\n\t\t};\n\t}\n\n\t/**\n\t * 监听事件,会在其他回调函数之前执行\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\tprependListener(\n\t\tevent: string,\n\t\tlistener: (...args: any[]) => void\n\t): () => void {\n\t\tthis.eventEmitter.prependListener(event, listener);\n\t\tthis.getLogger().debug(`${this.getMsgPrefix('prependListener')} ${event}`);\n\t\treturn () => {\n\t\t\tthis.off(event, listener);\n\t\t};\n\t}\n\n\t/**\n\t * 取消监听事件\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\toff(event: string, listener: (...args: any[]) => void) {\n\t\tthis.eventEmitter.off(event, listener);\n\t\tthis.getLogger().debug(`${this.getMsgPrefix('off')} ${event}`);\n\t}\n\n\t/**\n\t * 触发事件\n\t * @param event 事件名称\n\t * @param args 事件参数\n\t * @returns\n\t */\n\temit(event: string, ...args: any[]) {\n\t\tthis.eventEmitter.emit(event, ...args);\n\t\tthis.getLogger().debug(\n\t\t\t`${this.getMsgPrefix('emit')} name: ${event}, args: `,\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * 移除事件监听\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\tremoveListener(\n\t\tevent: string | symbol,\n\t\tlistener: (...args: any[]) => void\n\t): any {\n\t\treturn this.eventEmitter.removeListener(event, listener);\n\t}\n\n\t/**\n\t * 添加事件监听\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\taddListener(event: string | symbol, listener: (...args: any[]) => void): any {\n\t\treturn this.eventEmitter.addListener(event, listener);\n\t}\n\n\t/**\n\t * 设置事件监听的最大数量\n\t * @param n 最大数量\n\t */\n\tsetMaxListeners(n: number): any {\n\t\treturn this.eventEmitter.setMaxListeners(n);\n\t}\n\n\t/**\n\t * 移除所有事件监听\n\t * @param event 事件名称\n\t */\n\tremoveAllListeners(event?: string | symbol): any {\n\t\treturn this.eventEmitter.removeAllListeners(event);\n\t}\n\n\t/**\n\t * 获取消息前缀\n\t * @param type 类型\n\t * @returns 消息前缀\n\t */\n\tprivate getMsgPrefix(type: string): string {\n\t\tif (this.name && this.name.length > 0) {\n\t\t\treturn `[${this.name}][event-${type}]`;\n\t\t}\n\t\treturn `[*][event-${type}]`;\n\t}\n\n\t/**\n\t * 获取日志器\n\t * @returns 日志器\n\t */\n\tprivate getLogger(): Logger {\n\t\tif (this.name && this.name.length > 0) {\n\t\t\treturn moduleLogger;\n\t\t}\n\t\treturn logger;\n\t}\n}\n\n/**\n * 创建模块事件总线\n * @param moduleName 模块名称\n * @param maxListeners 最大监听数量\n * @returns 事件总线\n */\nexport const createModuleEventBus = (\n\tmoduleName: string,\n\tmaxListeners: number = 200\n): IEventBus => {\n\tconst emitter = new EventEmitter();\n\tif (maxListeners) {\n\t\temitter.setMaxListeners(maxListeners);\n\t}\n\treturn new EventBus(emitter, moduleName);\n};\n"],"names":[],"mappings":"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"} |
| import { IPublicApiHotkey, IPublicTypeHotkeyCallback, IPublicTypeHotkeyCallbacks } from '@arvin-shu/microcode-types'; | ||
| export interface IHotKey extends Omit<IPublicApiHotkey, 'bind' | 'callbacks'> { | ||
| activate(activate: boolean): void; | ||
| } | ||
| /** | ||
| * 热键管理类 | ||
| */ | ||
| export declare class Hotkey implements IHotKey { | ||
| readonly viewName: string; | ||
| callBacks: IPublicTypeHotkeyCallbacks; | ||
| private directMap; | ||
| private sequenceLevels; | ||
| private resetTimer; | ||
| private ignoreNextKeyup; | ||
| private ignoreNextKeypress; | ||
| private nextExpectedAction; | ||
| private isActivate; | ||
| constructor(viewName?: string); | ||
| activate(activate: boolean): void; | ||
| mount(window: Window): () => void; | ||
| bind(combos: string[] | string, callback: IPublicTypeHotkeyCallback, action?: string): Hotkey; | ||
| unbind(combos: string[] | string, callback: IPublicTypeHotkeyCallback, action?: string): void; | ||
| /** | ||
| * 重置除指定序列外的所有序列计数器 | ||
| */ | ||
| private resetSequences; | ||
| /** | ||
| * 根据按键码、修饰键和事件类型查找匹配的回调函数 | ||
| */ | ||
| private getMatches; | ||
| /** | ||
| * 处理按键事件 | ||
| */ | ||
| private handleKey; | ||
| /** | ||
| * 处理键盘事件 | ||
| */ | ||
| private handleKeyEvent; | ||
| /** | ||
| * 重置序列计时器 | ||
| */ | ||
| private resetSequenceTimer; | ||
| /** | ||
| * 绑定按键序列 | ||
| */ | ||
| private bindSequence; | ||
| /** | ||
| * 绑定单个按键组合 | ||
| */ | ||
| private bindSingle; | ||
| /** | ||
| * 绑定多个按键组合 | ||
| */ | ||
| private bindMultiple; | ||
| } |
-437
| import { isEqual } from 'lodash-es'; | ||
| import './di/index.js'; | ||
| import { globalContext } from './di/ioc-context.js'; | ||
| "use strict"; | ||
| const MAP = { | ||
| 8: "backspace", | ||
| 9: "tab", | ||
| 13: "enter", | ||
| 16: "shift", | ||
| 17: "ctrl", | ||
| 18: "alt", | ||
| 20: "capslock", | ||
| 27: "esc", | ||
| 32: "space", | ||
| 33: "pageup", | ||
| 34: "pagedown", | ||
| 35: "end", | ||
| 36: "home", | ||
| 37: "left", | ||
| 38: "up", | ||
| 39: "right", | ||
| 40: "down", | ||
| 45: "ins", | ||
| 46: "del", | ||
| 91: "meta", | ||
| 93: "meta", | ||
| 224: "meta" | ||
| }; | ||
| const KEYCODE_MAP = { | ||
| 106: "*", | ||
| 107: "+", | ||
| 109: "-", | ||
| 110: ".", | ||
| 111: "/", | ||
| 186: ";", | ||
| 187: "=", | ||
| 188: ",", | ||
| 189: "-", | ||
| 190: ".", | ||
| 191: "/", | ||
| 192: "`", | ||
| 219: "[", | ||
| 220: "\\", | ||
| 221: "]", | ||
| 222: "'" | ||
| }; | ||
| const SHIFT_MAP = { | ||
| "~": "`", | ||
| "!": "1", | ||
| "@": "2", | ||
| "#": "3", | ||
| $: "4", | ||
| "%": "5", | ||
| "^": "6", | ||
| "&": "7", | ||
| "*": "8", | ||
| "(": "9", | ||
| ")": "0", | ||
| _: "-", | ||
| "+": "=", | ||
| ":": ";", | ||
| '"': "'", | ||
| "<": ",", | ||
| ">": ".", | ||
| "?": "/", | ||
| "|": "\\" | ||
| }; | ||
| const SPECIAL_ALIASES = { | ||
| option: "alt", | ||
| command: "meta", | ||
| return: "enter", | ||
| escape: "esc", | ||
| plus: "+", | ||
| mod: /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? "meta" : "ctrl" | ||
| }; | ||
| let REVERSE_MAP; | ||
| for (let i = 1; i < 20; ++i) { | ||
| MAP[111 + i] = `f${i}`; | ||
| } | ||
| for (let i = 0; i <= 9; ++i) { | ||
| MAP[i + 96] = String(i); | ||
| } | ||
| function characterFromEvent(e) { | ||
| const keyCode = e.keyCode || e.which; | ||
| if (e.type === "keypress") { | ||
| let character = String.fromCharCode(keyCode); | ||
| if (!e.shiftKey) { | ||
| character = character.toLowerCase(); | ||
| } | ||
| return character; | ||
| } | ||
| if (MAP[keyCode]) { | ||
| return MAP[keyCode]; | ||
| } | ||
| if (KEYCODE_MAP[keyCode]) { | ||
| return KEYCODE_MAP[keyCode]; | ||
| } | ||
| return String.fromCharCode(keyCode).toLowerCase(); | ||
| } | ||
| function isPressEvent(e) { | ||
| return e.type === "keypress"; | ||
| } | ||
| function modifiersMatch(modifiers1, modifiers2) { | ||
| return modifiers1.sort().join(",") === modifiers2.sort().join(","); | ||
| } | ||
| function eventModifiers(e) { | ||
| const modifiers = []; | ||
| if (e.shiftKey) { | ||
| modifiers.push("shift"); | ||
| } | ||
| if (e.altKey) { | ||
| modifiers.push("alt"); | ||
| } | ||
| if (e.ctrlKey) { | ||
| modifiers.push("ctrl"); | ||
| } | ||
| if (e.metaKey) { | ||
| modifiers.push("meta"); | ||
| } | ||
| return modifiers; | ||
| } | ||
| function isModifier(key) { | ||
| return key === "shift" || key === "ctrl" || key === "alt" || key === "meta"; | ||
| } | ||
| function getReverseMap() { | ||
| if (!REVERSE_MAP) { | ||
| REVERSE_MAP = {}; | ||
| for (const key in MAP) { | ||
| if (Number(key) > 95 && Number(key) < 112) { | ||
| continue; | ||
| } | ||
| if (MAP.hasOwnProperty(key)) { | ||
| REVERSE_MAP[MAP[key]] = key; | ||
| } | ||
| } | ||
| } | ||
| return REVERSE_MAP; | ||
| } | ||
| function pickBestAction(key, modifiers, action) { | ||
| if (!action) { | ||
| action = getReverseMap()[key] ? "keydown" : "keypress"; | ||
| } | ||
| if (action === "keypress" && modifiers.length) { | ||
| action = "keydown"; | ||
| } | ||
| return action; | ||
| } | ||
| function keysFromString(combination) { | ||
| if (combination === "+") { | ||
| return ["+"]; | ||
| } | ||
| combination = combination.replace(/\+{2}/g, "+plus"); | ||
| return combination.split("+"); | ||
| } | ||
| function getKeyInfo(combination, action) { | ||
| let keys = []; | ||
| let key = ""; | ||
| let i; | ||
| const modifiers = []; | ||
| keys = keysFromString(combination); | ||
| for (i = 0; i < keys.length; ++i) { | ||
| key = keys[i]; | ||
| if (SPECIAL_ALIASES[key]) { | ||
| key = SPECIAL_ALIASES[key]; | ||
| } | ||
| if (action && action !== "keypress" && SHIFT_MAP[key]) { | ||
| key = SHIFT_MAP[key]; | ||
| modifiers.push("shift"); | ||
| } | ||
| if (isModifier(key)) { | ||
| modifiers.push(key); | ||
| } | ||
| } | ||
| action = pickBestAction(key, modifiers, action); | ||
| return { | ||
| key, | ||
| modifiers, | ||
| action | ||
| }; | ||
| } | ||
| function fireCallback(callback, e, combo, sequence) { | ||
| try { | ||
| const workspace = globalContext.get("workspace"); | ||
| const editor = workspace.isActive ? workspace.window?.editor : globalContext.get("editor"); | ||
| const designer = editor?.get("designer"); | ||
| const node = designer?.currentSelection?.getNodes()?.[0]; | ||
| const npm = node?.componentMeta?.npm; | ||
| const selected = [npm?.package, npm?.componentName].filter((item) => !!item).join("-") || node?.componentMeta?.componentName || ""; | ||
| if (callback(e, combo) === false) { | ||
| e.preventDefault(); | ||
| e.stopPropagation(); | ||
| } | ||
| editor?.eventBus.emit("hotkey.callback.call", { | ||
| callback, | ||
| e, | ||
| combo, | ||
| sequence, | ||
| selected | ||
| }); | ||
| } catch (err) { | ||
| console.error(err.message); | ||
| } | ||
| } | ||
| class Hotkey { | ||
| constructor(viewName = "global") { | ||
| this.viewName = viewName; | ||
| this.mount(window); | ||
| } | ||
| callBacks = {}; | ||
| directMap = {}; | ||
| sequenceLevels = {}; | ||
| resetTimer = 0; | ||
| ignoreNextKeyup = false; | ||
| ignoreNextKeypress = false; | ||
| nextExpectedAction = false; | ||
| isActivate = true; | ||
| activate(activate) { | ||
| this.isActivate = activate; | ||
| } | ||
| mount(window2) { | ||
| const { document } = window2; | ||
| const handleKeyEvent = this.handleKeyEvent.bind(this); | ||
| document.addEventListener("keypress", handleKeyEvent, false); | ||
| document.addEventListener("keydown", handleKeyEvent, false); | ||
| document.addEventListener("keyup", handleKeyEvent, false); | ||
| return () => { | ||
| document.removeEventListener("keypress", handleKeyEvent, false); | ||
| document.removeEventListener("keydown", handleKeyEvent, false); | ||
| document.removeEventListener("keyup", handleKeyEvent, false); | ||
| }; | ||
| } | ||
| bind(combos, callback, action) { | ||
| this.bindMultiple( | ||
| Array.isArray(combos) ? combos : [combos], | ||
| callback, | ||
| action | ||
| ); | ||
| return this; | ||
| } | ||
| unbind(combos, callback, action) { | ||
| const combinations = Array.isArray(combos) ? combos : [combos]; | ||
| combinations.forEach((combination) => { | ||
| const info = getKeyInfo(combination, action); | ||
| const { key, modifiers } = info; | ||
| const idx = this.callBacks[key].findIndex( | ||
| (info2) => isEqual(info2.modifiers, modifiers) && info2.callback === callback | ||
| ); | ||
| if (idx !== -1) { | ||
| this.callBacks[key].splice(idx, 1); | ||
| } | ||
| }); | ||
| } | ||
| /** | ||
| * 重置除指定序列外的所有序列计数器 | ||
| */ | ||
| resetSequences(doNotReset) { | ||
| let activeSequences = false; | ||
| let key = ""; | ||
| for (key in this.sequenceLevels) { | ||
| if (doNotReset && doNotReset[key]) { | ||
| activeSequences = true; | ||
| } else { | ||
| this.sequenceLevels[key] = 0; | ||
| } | ||
| } | ||
| if (!activeSequences) { | ||
| this.nextExpectedAction = false; | ||
| } | ||
| } | ||
| /** | ||
| * 根据按键码、修饰键和事件类型查找匹配的回调函数 | ||
| */ | ||
| getMatches(character, modifiers, e, sequenceName, combination, level) { | ||
| let i; | ||
| let callback; | ||
| const matches = []; | ||
| const action = e.type; | ||
| if (!this.callBacks[character]) { | ||
| return []; | ||
| } | ||
| if (action === "keyup" && isModifier(character)) { | ||
| modifiers = [character]; | ||
| } | ||
| for (i = 0; i < this.callBacks[character].length; ++i) { | ||
| callback = this.callBacks[character][i]; | ||
| if (!sequenceName && callback.seq && this.sequenceLevels[callback.seq] !== callback.level) { | ||
| continue; | ||
| } | ||
| if (action !== callback.action) { | ||
| continue; | ||
| } | ||
| if (isPressEvent(e) && !e.metaKey && !e.ctrlKey || modifiersMatch(modifiers, callback.modifiers)) { | ||
| const deleteCombo = !sequenceName && callback.combo === combination; | ||
| const deleteSequence = sequenceName && callback.seq === sequenceName && callback.level === level; | ||
| if (deleteCombo || deleteSequence) { | ||
| this.callBacks[character].splice(i, 1); | ||
| } | ||
| matches.push(callback); | ||
| } | ||
| } | ||
| return matches; | ||
| } | ||
| /** | ||
| * 处理按键事件 | ||
| */ | ||
| handleKey(character, modifiers, e) { | ||
| const callbacks = this.getMatches( | ||
| character, | ||
| modifiers, | ||
| e | ||
| ); | ||
| let i; | ||
| const doNotReset = {}; | ||
| let maxLevel = 0; | ||
| let processedSequenceCallback = false; | ||
| for (i = 0; i < callbacks.length; ++i) { | ||
| if (callbacks[i].seq) { | ||
| maxLevel = Math.max(maxLevel, callbacks[i].level || 0); | ||
| } | ||
| } | ||
| for (i = 0; i < callbacks.length; ++i) { | ||
| if (callbacks[i].seq) { | ||
| if (callbacks[i].level !== maxLevel) { | ||
| continue; | ||
| } | ||
| processedSequenceCallback = true; | ||
| doNotReset[callbacks[i].seq || ""] = 1; | ||
| fireCallback( | ||
| callbacks[i].callback, | ||
| e, | ||
| callbacks[i].combo, | ||
| callbacks[i].seq | ||
| ); | ||
| continue; | ||
| } | ||
| if (!processedSequenceCallback) { | ||
| fireCallback(callbacks[i].callback, e, callbacks[i].combo); | ||
| } | ||
| } | ||
| const ignoreThisKeypress = e.type === "keypress" && this.ignoreNextKeypress; | ||
| if (e.type === this.nextExpectedAction && !isModifier(character) && !ignoreThisKeypress) { | ||
| this.resetSequences(doNotReset); | ||
| } | ||
| this.ignoreNextKeypress = processedSequenceCallback && e.type === "keydown"; | ||
| } | ||
| /** | ||
| * 处理键盘事件 | ||
| */ | ||
| handleKeyEvent(e) { | ||
| if (!this.isActivate) { | ||
| return; | ||
| } | ||
| const character = characterFromEvent(e); | ||
| if (!character) { | ||
| return; | ||
| } | ||
| if (e.type === "keyup" && this.ignoreNextKeyup === character) { | ||
| this.ignoreNextKeyup = false; | ||
| return; | ||
| } | ||
| this.handleKey(character, eventModifiers(e), e); | ||
| } | ||
| /** | ||
| * 重置序列计时器 | ||
| */ | ||
| resetSequenceTimer() { | ||
| if (this.resetTimer) { | ||
| clearTimeout(this.resetTimer); | ||
| } | ||
| this.resetTimer = window.setTimeout(this.resetSequences, 1e3); | ||
| } | ||
| /** | ||
| * 绑定按键序列 | ||
| */ | ||
| bindSequence(combo, keys, callback, action) { | ||
| this.sequenceLevels[combo] = 0; | ||
| const increaseSequence = (nextAction) => () => { | ||
| this.nextExpectedAction = nextAction; | ||
| ++this.sequenceLevels[combo]; | ||
| this.resetSequenceTimer(); | ||
| }; | ||
| const callbackAndReset = (e) => { | ||
| fireCallback(callback, e, combo); | ||
| if (action !== "keyup") { | ||
| this.ignoreNextKeyup = characterFromEvent(e); | ||
| } | ||
| setTimeout(this.resetSequences, 10); | ||
| }; | ||
| for (let i = 0; i < keys.length; ++i) { | ||
| const isFinal = i + 1 === keys.length; | ||
| const wrappedCallback = isFinal ? callbackAndReset : increaseSequence(action || getKeyInfo(keys[i + 1]).action); | ||
| this.bindSingle(keys[i], wrappedCallback, action, combo, i); | ||
| } | ||
| } | ||
| /** | ||
| * 绑定单个按键组合 | ||
| */ | ||
| bindSingle(combination, callback, action, sequenceName, level) { | ||
| this.directMap[`${combination}:${action}`] = callback; | ||
| combination = combination.replace(/\s+/g, " "); | ||
| const sequence = combination.split(" "); | ||
| if (sequence.length > 1) { | ||
| this.bindSequence(combination, sequence, callback, action); | ||
| return; | ||
| } | ||
| const info = getKeyInfo(combination, action); | ||
| this.callBacks[info.key] = this.callBacks[info.key] || []; | ||
| this.getMatches( | ||
| info.key, | ||
| info.modifiers, | ||
| { type: info.action }, | ||
| sequenceName, | ||
| combination, | ||
| level | ||
| ); | ||
| this.callBacks[info.key][sequenceName ? "unshift" : "push"]({ | ||
| callback, | ||
| modifiers: info.modifiers, | ||
| action: info.action, | ||
| seq: sequenceName, | ||
| level, | ||
| combo: combination | ||
| }); | ||
| } | ||
| /** | ||
| * 绑定多个按键组合 | ||
| */ | ||
| bindMultiple(combinations, callback, action) { | ||
| for (const item of combinations) { | ||
| this.bindSingle(item, callback, action); | ||
| } | ||
| } | ||
| } | ||
| export { Hotkey }; | ||
| //# sourceMappingURL=hotkey.js.map |
| {"version":3,"file":"hotkey.js","sources":["../../src/hotkey.ts"],"sourcesContent":["import { isEqual } from 'lodash-es';\nimport {\n\tIPublicApiHotkey,\n\tIPublicTypeHotkeyCallback,\n\tIPublicTypeHotkeyCallbackConfig,\n\tIPublicTypeHotkeyCallbacks,\n} from '@arvin-shu/microcode-types';\nimport { globalContext } from './di';\n\n/**\n * 键盘按键映射接口,用于存储键码到按键名的映射\n */\ninterface KeyMap {\n\t[key: number]: string;\n}\n\n/**\n * Ctrl组合键映射接口\n */\ninterface CtrlKeyMap {\n\t[key: string]: string;\n}\n\n/**\n * 按键事件接口\n */\ninterface ActionEvent {\n\ttype: string;\n}\n\n/**\n * 热键直接映射接口,用于存储组合键到回调函数的映射\n */\ninterface HotkeyDirectMap {\n\t[key: string]: IPublicTypeHotkeyCallback;\n}\n\n/**\n * 按键信息接口,包含按键、修饰键和动作类型\n */\ninterface KeyInfo {\n\tkey: string;\n\tmodifiers: string[];\n\taction: string;\n}\n\n/**\n * 按键序列等级接口\n */\ninterface SequenceLevels {\n\t[key: string]: number;\n}\n\n/**\n * 基础按键映射表,包含常用功能键的键码映射\n */\nconst MAP: KeyMap = {\n\t8: 'backspace',\n\t9: 'tab',\n\t13: 'enter',\n\t16: 'shift',\n\t17: 'ctrl',\n\t18: 'alt',\n\t20: 'capslock',\n\t27: 'esc',\n\t32: 'space',\n\t33: 'pageup',\n\t34: 'pagedown',\n\t35: 'end',\n\t36: 'home',\n\t37: 'left',\n\t38: 'up',\n\t39: 'right',\n\t40: 'down',\n\t45: 'ins',\n\t46: 'del',\n\t91: 'meta',\n\t93: 'meta',\n\t224: 'meta',\n};\n\n/**\n * 特殊字符键码映射表\n */\nconst KEYCODE_MAP: KeyMap = {\n\t106: '*',\n\t107: '+',\n\t109: '-',\n\t110: '.',\n\t111: '/',\n\t186: ';',\n\t187: '=',\n\t188: ',',\n\t189: '-',\n\t190: '.',\n\t191: '/',\n\t192: '`',\n\t219: '[',\n\t220: '\\\\',\n\t221: ']',\n\t222: \"'\",\n};\n\n/**\n * Shift组合键映射表,用于处理大写字符和特殊符号\n */\nconst SHIFT_MAP: CtrlKeyMap = {\n\t'~': '`',\n\t'!': '1',\n\t'@': '2',\n\t'#': '3',\n\t$: '4',\n\t'%': '5',\n\t'^': '6',\n\t'&': '7',\n\t'*': '8',\n\t'(': '9',\n\t')': '0',\n\t_: '-',\n\t'+': '=',\n\t':': ';',\n\t'\"': \"'\",\n\t'<': ',',\n\t'>': '.',\n\t'?': '/',\n\t'|': '\\\\',\n};\n\n/**\n * 特殊按键别名映射表\n */\nconst SPECIAL_ALIASES: CtrlKeyMap = {\n\toption: 'alt',\n\tcommand: 'meta',\n\treturn: 'enter',\n\tescape: 'esc',\n\tplus: '+',\n\tmod: /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl',\n};\n\nlet REVERSE_MAP: CtrlKeyMap;\n\n/**\n * 添加F1-F19功能键到映射表\n */\nfor (let i = 1; i < 20; ++i) {\n\tMAP[111 + i] = `f${i}`;\n}\n\n/**\n * 添加数字键盘0-9的映射\n */\nfor (let i = 0; i <= 9; ++i) {\n\tMAP[i + 96] = String(i);\n}\n\n/**\n * 从键盘事件中获取按键字符\n * @param e 键盘事件对象\n * @returns 按键字符\n */\nfunction characterFromEvent(e: KeyboardEvent): string {\n\tconst keyCode = e.keyCode || e.which;\n\t// 对于keypress事件,直接返回字符\n\tif (e.type === 'keypress') {\n\t\tlet character = String.fromCharCode(keyCode);\n\t\t// 如果没有按下shift键,则转换为小写\n\t\tif (!e.shiftKey) {\n\t\t\tcharacter = character.toLowerCase();\n\t\t}\n\t\treturn character;\n\t}\n\t// 对于非keypress事件,需要使用特殊映射表\n\tif (MAP[keyCode]) {\n\t\treturn MAP[keyCode];\n\t}\n\tif (KEYCODE_MAP[keyCode]) {\n\t\treturn KEYCODE_MAP[keyCode];\n\t}\n\t// 如果不在特殊映射表中,转换为小写字符返回\n\treturn String.fromCharCode(keyCode).toLowerCase();\n}\n\ninterface KeypressEvent extends KeyboardEvent {\n\ttype: 'keypress';\n}\n\n/**\n * 判断是否为keypress事件\n */\nfunction isPressEvent(e: KeyboardEvent | ActionEvent): e is KeypressEvent {\n\treturn e.type === 'keypress';\n}\n\n/**\n * 检查两个修饰键数组是否相等\n */\nfunction modifiersMatch(modifiers1: string[], modifiers2: string[]): boolean {\n\treturn modifiers1.sort().join(',') === modifiers2.sort().join(',');\n}\n\n/**\n * 从键盘事件中获取按下的修饰键列表\n */\nfunction eventModifiers(e: KeyboardEvent): string[] {\n\tconst modifiers = [];\n\n\tif (e.shiftKey) {\n\t\tmodifiers.push('shift');\n\t}\n\n\tif (e.altKey) {\n\t\tmodifiers.push('alt');\n\t}\n\n\tif (e.ctrlKey) {\n\t\tmodifiers.push('ctrl');\n\t}\n\n\tif (e.metaKey) {\n\t\tmodifiers.push('meta');\n\t}\n\n\treturn modifiers;\n}\n\n/**\n * 判断按键是否为修饰键\n */\nfunction isModifier(key: string): boolean {\n\treturn key === 'shift' || key === 'ctrl' || key === 'alt' || key === 'meta';\n}\n\n/**\n * 生成反向映射表,用于查找特定按键\n */\nfunction getReverseMap(): CtrlKeyMap {\n\tif (!REVERSE_MAP) {\n\t\tREVERSE_MAP = {};\n\t\tfor (const key in MAP) {\n\t\t\t// 排除数字键盘的按键\n\t\t\tif (Number(key) > 95 && Number(key) < 112) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (MAP.hasOwnProperty(key)) {\n\t\t\t\tREVERSE_MAP[MAP[key]] = key;\n\t\t\t}\n\t\t}\n\t}\n\treturn REVERSE_MAP;\n}\n\n/**\n * 根据按键组合选择最佳的事件类型\n */\nfunction pickBestAction(\n\tkey: string,\n\tmodifiers: string[],\n\taction?: string\n): string {\n\t// 如果没有指定action,根据按键选择合适的事件类型\n\tif (!action) {\n\t\taction = getReverseMap()[key] ? 'keydown' : 'keypress';\n\t}\n\t// 对于有修饰键的组合,使用keydown而不是keypress\n\tif (action === 'keypress' && modifiers.length) {\n\t\taction = 'keydown';\n\t}\n\treturn action;\n}\n\n/**\n * 将组合键字符串转换为按键数组\n * @param combination 组合键字符串,如 \"command+shift+l\"\n */\nfunction keysFromString(combination: string): string[] {\n\tif (combination === '+') {\n\t\treturn ['+'];\n\t}\n\n\tcombination = combination.replace(/\\+{2}/g, '+plus');\n\treturn combination.split('+');\n}\n\n/**\n * 获取组合键的详细信息\n * @param combination 组合键字符串\n * @param action 事件类型\n */\nfunction getKeyInfo(combination: string, action?: string): KeyInfo {\n\tlet keys: string[] = [];\n\tlet key = '';\n\tlet i: number;\n\tconst modifiers: string[] = [];\n\n\t// 解析组合键字符串\n\tkeys = keysFromString(combination);\n\n\tfor (i = 0; i < keys.length; ++i) {\n\t\tkey = keys[i];\n\n\t\t// 处理按键别名\n\t\tif (SPECIAL_ALIASES[key]) {\n\t\t\tkey = SPECIAL_ALIASES[key];\n\t\t}\n\n\t\t// 处理shift组合键\n\t\tif (action && action !== 'keypress' && SHIFT_MAP[key]) {\n\t\t\tkey = SHIFT_MAP[key];\n\t\t\tmodifiers.push('shift');\n\t\t}\n\n\t\t// 如果是修饰键,添加到修饰键列表\n\t\tif (isModifier(key)) {\n\t\t\tmodifiers.push(key);\n\t\t}\n\t}\n\n\t// 选择最佳的事件类型\n\taction = pickBestAction(key, modifiers, action);\n\n\treturn {\n\t\tkey,\n\t\tmodifiers,\n\t\taction,\n\t};\n}\n\n/**\n * 执行回调函数\n * 如果回调返回false,则阻止事件默认行为和冒泡\n */\nfunction fireCallback(\n\tcallback: IPublicTypeHotkeyCallback,\n\te: KeyboardEvent,\n\tcombo?: string,\n\tsequence?: string\n): void {\n\ttry {\n\t\tconst workspace = globalContext.get('workspace');\n\t\tconst editor = workspace.isActive\n\t\t\t? workspace.window?.editor\n\t\t\t: globalContext.get('editor');\n\t\tconst designer = editor?.get('designer');\n\t\tconst node = designer?.currentSelection?.getNodes()?.[0];\n\t\tconst npm = node?.componentMeta?.npm;\n\t\tconst selected =\n\t\t\t[npm?.package, npm?.componentName].filter((item) => !!item).join('-') ||\n\t\t\tnode?.componentMeta?.componentName ||\n\t\t\t'';\n\t\tif (callback(e, combo) === false) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\t\teditor?.eventBus.emit('hotkey.callback.call', {\n\t\t\tcallback,\n\t\t\te,\n\t\t\tcombo,\n\t\t\tsequence,\n\t\t\tselected,\n\t\t});\n\t} catch (err: any) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(err.message);\n\t}\n}\n\nexport interface IHotKey extends Omit<IPublicApiHotkey, 'bind' | 'callbacks'> {\n\tactivate(activate: boolean): void;\n}\n\n/**\n * 热键管理类\n */\nexport class Hotkey implements IHotKey {\n\tcallBacks: IPublicTypeHotkeyCallbacks = {};\n\n\tprivate directMap: HotkeyDirectMap = {};\n\n\tprivate sequenceLevels: SequenceLevels = {};\n\n\tprivate resetTimer = 0;\n\n\tprivate ignoreNextKeyup: boolean | string = false;\n\n\tprivate ignoreNextKeypress = false;\n\n\tprivate nextExpectedAction: boolean | string = false;\n\n\tprivate isActivate = true;\n\n\tconstructor(readonly viewName: string = 'global') {\n\t\tthis.mount(window);\n\t}\n\n\tactivate(activate: boolean): void {\n\t\tthis.isActivate = activate;\n\t}\n\n\tmount(window: Window) {\n\t\tconst { document } = window;\n\t\tconst handleKeyEvent = this.handleKeyEvent.bind(this);\n\t\tdocument.addEventListener('keypress', handleKeyEvent, false);\n\t\tdocument.addEventListener('keydown', handleKeyEvent, false);\n\t\tdocument.addEventListener('keyup', handleKeyEvent, false);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keypress', handleKeyEvent, false);\n\t\t\tdocument.removeEventListener('keydown', handleKeyEvent, false);\n\t\t\tdocument.removeEventListener('keyup', handleKeyEvent, false);\n\t\t};\n\t}\n\n\tbind(\n\t\tcombos: string[] | string,\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string\n\t): Hotkey {\n\t\tthis.bindMultiple(\n\t\t\tArray.isArray(combos) ? combos : [combos],\n\t\t\tcallback,\n\t\t\taction\n\t\t);\n\t\treturn this;\n\t}\n\n\tunbind(\n\t\tcombos: string[] | string,\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string\n\t) {\n\t\tconst combinations = Array.isArray(combos) ? combos : [combos];\n\n\t\tcombinations.forEach((combination) => {\n\t\t\tconst info: KeyInfo = getKeyInfo(combination, action);\n\t\t\tconst { key, modifiers } = info;\n\t\t\tconst idx = this.callBacks[key].findIndex(\n\t\t\t\t(info) =>\n\t\t\t\t\tisEqual(info.modifiers, modifiers) && info.callback === callback\n\t\t\t);\n\t\t\tif (idx !== -1) {\n\t\t\t\tthis.callBacks[key].splice(idx, 1);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * 重置除指定序列外的所有序列计数器\n\t */\n\tprivate resetSequences(doNotReset?: SequenceLevels): void {\n\t\tlet activeSequences = false;\n\t\tlet key = '';\n\t\tfor (key in this.sequenceLevels) {\n\t\t\tif (doNotReset && doNotReset[key]) {\n\t\t\t\tactiveSequences = true;\n\t\t\t} else {\n\t\t\t\tthis.sequenceLevels[key] = 0;\n\t\t\t}\n\t\t}\n\t\tif (!activeSequences) {\n\t\t\tthis.nextExpectedAction = false;\n\t\t}\n\t}\n\n\t/**\n\t * 根据按键码、修饰键和事件类型查找匹配的回调函数\n\t */\n\tprivate getMatches(\n\t\tcharacter: string,\n\t\tmodifiers: string[],\n\t\te: KeyboardEvent | ActionEvent,\n\t\tsequenceName?: string,\n\t\tcombination?: string,\n\t\tlevel?: number\n\t): IPublicTypeHotkeyCallbackConfig[] {\n\t\tlet i: number;\n\t\tlet callback: IPublicTypeHotkeyCallbackConfig;\n\t\tconst matches: IPublicTypeHotkeyCallbackConfig[] = [];\n\t\tconst action: string = e.type;\n\n\t\tif (!this.callBacks[character]) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (action === 'keyup' && isModifier(character)) {\n\t\t\tmodifiers = [character];\n\t\t}\n\n\t\tfor (i = 0; i < this.callBacks[character].length; ++i) {\n\t\t\tcallback = this.callBacks[character][i];\n\n\t\t\tif (\n\t\t\t\t!sequenceName &&\n\t\t\t\tcallback.seq &&\n\t\t\t\tthis.sequenceLevels[callback.seq] !== callback.level\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (action !== callback.action) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(isPressEvent(e) && !e.metaKey && !e.ctrlKey) ||\n\t\t\t\tmodifiersMatch(modifiers, callback.modifiers)\n\t\t\t) {\n\t\t\t\tconst deleteCombo = !sequenceName && callback.combo === combination;\n\t\t\t\tconst deleteSequence =\n\t\t\t\t\tsequenceName &&\n\t\t\t\t\tcallback.seq === sequenceName &&\n\t\t\t\t\tcallback.level === level;\n\t\t\t\tif (deleteCombo || deleteSequence) {\n\t\t\t\t\tthis.callBacks[character].splice(i, 1);\n\t\t\t\t}\n\n\t\t\t\tmatches.push(callback);\n\t\t\t}\n\t\t}\n\t\treturn matches;\n\t}\n\n\t/**\n\t * 处理按键事件\n\t */\n\tprivate handleKey(\n\t\tcharacter: string,\n\t\tmodifiers: string[],\n\t\te: KeyboardEvent\n\t): void {\n\t\tconst callbacks: IPublicTypeHotkeyCallbackConfig[] = this.getMatches(\n\t\t\tcharacter,\n\t\t\tmodifiers,\n\t\t\te\n\t\t);\n\t\tlet i: number;\n\t\tconst doNotReset: SequenceLevels = {};\n\t\tlet maxLevel = 0;\n\t\tlet processedSequenceCallback = false;\n\n\t\t// 计算序列的最大等级\n\t\tfor (i = 0; i < callbacks.length; ++i) {\n\t\t\tif (callbacks[i].seq) {\n\t\t\t\tmaxLevel = Math.max(maxLevel, callbacks[i].level || 0);\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < callbacks.length; ++i) {\n\t\t\tif (callbacks[i].seq) {\n\t\t\t\tif (callbacks[i].level !== maxLevel) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tprocessedSequenceCallback = true;\n\n\t\t\t\tdoNotReset[callbacks[i].seq || ''] = 1;\n\t\t\t\tfireCallback(\n\t\t\t\t\tcallbacks[i].callback,\n\t\t\t\t\te,\n\t\t\t\t\tcallbacks[i].combo,\n\t\t\t\t\tcallbacks[i].seq\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!processedSequenceCallback) {\n\t\t\t\tfireCallback(callbacks[i].callback, e, callbacks[i].combo);\n\t\t\t}\n\t\t}\n\n\t\tconst ignoreThisKeypress = e.type === 'keypress' && this.ignoreNextKeypress;\n\t\tif (\n\t\t\te.type === this.nextExpectedAction &&\n\t\t\t!isModifier(character) &&\n\t\t\t!ignoreThisKeypress\n\t\t) {\n\t\t\tthis.resetSequences(doNotReset);\n\t\t}\n\n\t\tthis.ignoreNextKeypress = processedSequenceCallback && e.type === 'keydown';\n\t}\n\n\t/**\n\t * 处理键盘事件\n\t */\n\tprivate handleKeyEvent(e: KeyboardEvent): void {\n\t\tif (!this.isActivate) {\n\t\t\treturn;\n\t\t}\n\t\tconst character = characterFromEvent(e);\n\n\t\tif (!character) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.type === 'keyup' && this.ignoreNextKeyup === character) {\n\t\t\tthis.ignoreNextKeyup = false;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.handleKey(character, eventModifiers(e), e);\n\t}\n\n\t/**\n\t * 重置序列计时器\n\t */\n\tprivate resetSequenceTimer(): void {\n\t\tif (this.resetTimer) {\n\t\t\tclearTimeout(this.resetTimer);\n\t\t}\n\t\tthis.resetTimer = window.setTimeout(this.resetSequences, 1000);\n\t}\n\n\t/**\n\t * 绑定按键序列\n\t */\n\tprivate bindSequence(\n\t\tcombo: string,\n\t\tkeys: string[],\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string\n\t): void {\n\t\tthis.sequenceLevels[combo] = 0;\n\t\tconst increaseSequence = (nextAction: string) => () => {\n\t\t\tthis.nextExpectedAction = nextAction;\n\t\t\t++this.sequenceLevels[combo];\n\t\t\tthis.resetSequenceTimer();\n\t\t};\n\t\tconst callbackAndReset = (e: KeyboardEvent): void => {\n\t\t\tfireCallback(callback, e, combo);\n\n\t\t\tif (action !== 'keyup') {\n\t\t\t\tthis.ignoreNextKeyup = characterFromEvent(e);\n\t\t\t}\n\n\t\t\tsetTimeout(this.resetSequences, 10);\n\t\t};\n\t\tfor (let i = 0; i < keys.length; ++i) {\n\t\t\tconst isFinal = i + 1 === keys.length;\n\t\t\tconst wrappedCallback = isFinal\n\t\t\t\t? callbackAndReset\n\t\t\t\t: increaseSequence(action || getKeyInfo(keys[i + 1]).action);\n\t\t\tthis.bindSingle(keys[i], wrappedCallback, action, combo, i);\n\t\t}\n\t}\n\n\t/**\n\t * 绑定单个按键组合\n\t */\n\tprivate bindSingle(\n\t\tcombination: string,\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string,\n\t\tsequenceName?: string,\n\t\tlevel?: number\n\t): void {\n\t\tthis.directMap[`${combination}:${action}`] = callback;\n\n\t\tcombination = combination.replace(/\\s+/g, ' ');\n\n\t\tconst sequence: string[] = combination.split(' ');\n\n\t\tif (sequence.length > 1) {\n\t\t\tthis.bindSequence(combination, sequence, callback, action);\n\t\t\treturn;\n\t\t}\n\n\t\tconst info: KeyInfo = getKeyInfo(combination, action);\n\n\t\tthis.callBacks[info.key] = this.callBacks[info.key] || [];\n\n\t\tthis.getMatches(\n\t\t\tinfo.key,\n\t\t\tinfo.modifiers,\n\t\t\t{ type: info.action },\n\t\t\tsequenceName,\n\t\t\tcombination,\n\t\t\tlevel\n\t\t);\n\n\t\tthis.callBacks[info.key][sequenceName ? 'unshift' : 'push']({\n\t\t\tcallback,\n\t\t\tmodifiers: info.modifiers,\n\t\t\taction: info.action,\n\t\t\tseq: sequenceName,\n\t\t\tlevel,\n\t\t\tcombo: combination,\n\t\t});\n\t}\n\n\t/**\n\t * 绑定多个按键组合\n\t */\n\tprivate bindMultiple(\n\t\tcombinations: string[],\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string\n\t) {\n\t\tfor (const item of combinations) {\n\t\t\tthis.bindSingle(item, callback, action);\n\t\t}\n\t}\n}\n"],"names":["window","info"],"mappings":"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"} |
| export * from './di'; | ||
| export * from './config'; | ||
| export * from './utils'; | ||
| export * from './event-bus'; | ||
| export * from './editor'; | ||
| export * from './widgets'; | ||
| export * from './inti'; | ||
| export * from './hotkey'; |
-23
| import './di/index.js'; | ||
| export { EngineConfig, engineConfig } from './config.js'; | ||
| import './utils/index.js'; | ||
| export { EventBus, createModuleEventBus } from './event-bus.js'; | ||
| export { Editor, commonEvent } from './editor.js'; | ||
| import './widgets/index.js'; | ||
| export { createIntl, intl, shallowIntl } from './inti/index.js'; | ||
| export { Hotkey } from './hotkey.js'; | ||
| export * from 'power-di'; | ||
| export { globalContext } from './di/ioc-context.js'; | ||
| export { Setters } from './di/setter.js'; | ||
| export { FocusTracker, Focusable } from './utils/focus-tracker.js'; | ||
| export { assetsTransform } from './utils/assets-transform.js'; | ||
| export { isGlobalEventOn, runWithGlobalEventOff, setGlobalEventFlag, switchGlobalEventOff, switchGlobalEventOn, wrapWithEventSwitch } from './utils/control.js'; | ||
| export { getPublicPath } from './utils/get-public-path.js'; | ||
| export { Title } from './widgets/title/index.js'; | ||
| export { Tip } from './widgets/tip/tip.js'; | ||
| export { TipContainer, TipItem } from './widgets/tip/tip-container.js'; | ||
| export { HelpTip } from './widgets/tip/help-tips.js'; | ||
| export { globalLocale } from './inti/global-locale.js'; | ||
| "use strict"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"} |
| /** | ||
| * 全局国际化标准 | ||
| */ | ||
| declare class GlobalLocale { | ||
| private emitter; | ||
| private _locale; | ||
| locale: import("vue").ComputedRef<any>; | ||
| constructor(); | ||
| setLocale(locale: string): void; | ||
| getLocale(): any; | ||
| onChangeLocale(fn: (locale: string) => void): () => void; | ||
| } | ||
| declare const globalLocale: GlobalLocale; | ||
| export { globalLocale }; |
| import { ref, computed } from 'vue'; | ||
| import { Logger } from '@arvin-shu/microcode-utils'; | ||
| import { createModuleEventBus } from '../event-bus.js'; | ||
| "use strict"; | ||
| const languageMap = { | ||
| en: "en-US", | ||
| zh: "zh-CN", | ||
| zt: "zh-TW", | ||
| es: "es-ES", | ||
| pt: "pt-PT", | ||
| fr: "fr-FR", | ||
| de: "de-DE", | ||
| it: "it-IT", | ||
| ru: "ru-RU", | ||
| ja: "ja-JP", | ||
| ko: "ko-KR", | ||
| ar: "ar-SA", | ||
| tr: "tr-TR", | ||
| th: "th-TH", | ||
| vi: "vi-VN", | ||
| nl: "nl-NL", | ||
| he: "iw-IL", | ||
| id: "in-ID", | ||
| pl: "pl-PL", | ||
| hi: "hi-IN", | ||
| uk: "uk-UA", | ||
| ms: "ms-MY", | ||
| tl: "tl-PH" | ||
| }; | ||
| const logger = new Logger({ level: "warn", bizName: "globalLocale" }); | ||
| const MicrocodeConfigKey = "arvin-microcode-config"; | ||
| class GlobalLocale { | ||
| emitter = createModuleEventBus("GlobalLocale"); | ||
| _locale = ref(); | ||
| locale = computed(() => { | ||
| if (this._locale.value != null) { | ||
| return this._locale.value; | ||
| } | ||
| let result = null; | ||
| if (hasLocalStorage(window)) { | ||
| const store = window.localStorage; | ||
| let config; | ||
| try { | ||
| config = JSON.parse(store.getItem(MicrocodeConfigKey) || ""); | ||
| } catch (e) { | ||
| logger.error(`get locale:${e}`); | ||
| } | ||
| if (config?.locale) { | ||
| result = (config.locale || "").replace("_", "-"); | ||
| logger.debug(`getting locale from localStorage: ${result}`); | ||
| } | ||
| } | ||
| if (!result) { | ||
| const localeFromConfig = getConfig("locale"); | ||
| if (localeFromConfig) { | ||
| result = languageMap[localeFromConfig] || localeFromConfig.replace("_", "-"); | ||
| logger.debug(`getting locale from config: ${result}`); | ||
| } | ||
| } | ||
| if (!result) { | ||
| const { navigator } = window; | ||
| if (navigator.language) { | ||
| const lang = navigator.language; | ||
| return languageMap[lang] || lang.replace("_", "-"); | ||
| } | ||
| if (navigator.browserLanguage) { | ||
| const it = navigator.browserLanguage.split("-"); | ||
| let localeFromSystem = it[0]; | ||
| if (it[1]) { | ||
| localeFromSystem += `-${it[1].toUpperCase()}`; | ||
| } | ||
| result = localeFromSystem; | ||
| logger.debug(`getting locale from system: ${result}`); | ||
| } | ||
| } | ||
| if (!result) { | ||
| logger.warn( | ||
| "something went wrong when trying to get locale, use zh-CN as default, please check it out!" | ||
| ); | ||
| result = "zh-CN"; | ||
| } | ||
| this._locale.value = result; | ||
| return result; | ||
| }); | ||
| constructor() { | ||
| this.emitter.setMaxListeners(200); | ||
| } | ||
| setLocale(locale) { | ||
| logger.info(`setting locale to ${locale}`); | ||
| if (locale === this.locale.value) { | ||
| return; | ||
| } | ||
| this._locale.value = locale; | ||
| if (hasLocalStorage(window)) { | ||
| const store = window.localStorage; | ||
| let config; | ||
| try { | ||
| config = JSON.parse(store.getItem(MicrocodeConfigKey) || ""); | ||
| } catch (e) { | ||
| logger.error(`set locale:${e}`); | ||
| } | ||
| if (config && typeof config === "object") { | ||
| config.locale = locale; | ||
| } else { | ||
| config = { locale }; | ||
| } | ||
| store.setItem(MicrocodeConfigKey, JSON.stringify(config)); | ||
| } | ||
| this.emitter.emit("localechange", locale); | ||
| } | ||
| getLocale() { | ||
| return this.locale.value; | ||
| } | ||
| onChangeLocale(fn) { | ||
| this.emitter.on("localechange", fn); | ||
| return () => { | ||
| this.emitter.removeListener("localechange", fn); | ||
| }; | ||
| } | ||
| } | ||
| function hasLocalStorage(obj) { | ||
| return obj.localStorage; | ||
| } | ||
| function getConfig(name) { | ||
| const win = window; | ||
| return win[name] || (win.g_config || {})[name] || (win.pageConfig || {})[name]; | ||
| } | ||
| const globalLocale = new GlobalLocale(); | ||
| export { globalLocale }; | ||
| //# sourceMappingURL=global-locale.js.map |
| {"version":3,"file":"global-locale.js","sources":["../../../src/inti/global-locale.ts"],"sourcesContent":["import { computed, ref, Ref } from 'vue';\nimport { Logger } from '@arvin-shu/microcode-utils';\nimport { createModuleEventBus, IEventBus } from '../event-bus';\n\nconst languageMap: { [key: string]: string } = {\n\ten: 'en-US',\n\tzh: 'zh-CN',\n\tzt: 'zh-TW',\n\tes: 'es-ES',\n\tpt: 'pt-PT',\n\tfr: 'fr-FR',\n\tde: 'de-DE',\n\tit: 'it-IT',\n\tru: 'ru-RU',\n\tja: 'ja-JP',\n\tko: 'ko-KR',\n\tar: 'ar-SA',\n\ttr: 'tr-TR',\n\tth: 'th-TH',\n\tvi: 'vi-VN',\n\tnl: 'nl-NL',\n\the: 'iw-IL',\n\tid: 'in-ID',\n\tpl: 'pl-PL',\n\thi: 'hi-IN',\n\tuk: 'uk-UA',\n\tms: 'ms-MY',\n\ttl: 'tl-PH',\n};\n\nconst logger = new Logger({ level: 'warn', bizName: 'globalLocale' });\n\nconst MicrocodeConfigKey = 'arvin-microcode-config';\n\n/**\n * 全局国际化标准\n */\nclass GlobalLocale {\n\tprivate emitter: IEventBus = createModuleEventBus('GlobalLocale');\n\n\tprivate _locale: Ref<string | undefined> = ref();\n\n\tlocale = computed(() => {\n\t\tif (this._locale.value != null) {\n\t\t\treturn this._locale.value;\n\t\t}\n\n\t\t// store 1: 从 localStorage 中获取配置\n\t\tlet result = null;\n\t\tif (hasLocalStorage(window)) {\n\t\t\tconst store = window.localStorage;\n\t\t\tlet config: any;\n\t\t\ttry {\n\t\t\t\tconfig = JSON.parse(store.getItem(MicrocodeConfigKey) || '');\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(`get locale:${e}`);\n\t\t\t}\n\t\t\tif (config?.locale) {\n\t\t\t\tresult = (config.locale || '').replace('_', '-');\n\t\t\t\tlogger.debug(`getting locale from localStorage: ${result}`);\n\t\t\t}\n\t\t}\n\n\t\t// store 2: 从 window 配置中获取\n\t\tif (!result) {\n\t\t\tconst localeFromConfig: string = getConfig('locale');\n\t\t\tif (localeFromConfig) {\n\t\t\t\tresult =\n\t\t\t\t\tlanguageMap[localeFromConfig] || localeFromConfig.replace('_', '-');\n\t\t\t\tlogger.debug(`getting locale from config: ${result}`);\n\t\t\t}\n\t\t}\n\t\t// store 3: 从系统语言获取\n\t\tif (!result) {\n\t\t\tconst { navigator } = window as any;\n\t\t\tif (navigator.language) {\n\t\t\t\tconst lang = navigator.language as string;\n\t\t\t\treturn languageMap[lang] || lang.replace('_', '-');\n\t\t\t}\n\t\t\tif (navigator.browserLanguage) {\n\t\t\t\tconst it = navigator.browserLanguage.split('-');\n\t\t\t\tlet localeFromSystem = it[0];\n\t\t\t\tif (it[1]) {\n\t\t\t\t\tlocaleFromSystem += `-${it[1].toUpperCase()}`;\n\t\t\t\t}\n\t\t\t\tresult = localeFromSystem;\n\t\t\t\tlogger.debug(`getting locale from system: ${result}`);\n\t\t\t}\n\t\t}\n\t\t// 默认值\n\t\tif (!result) {\n\t\t\tlogger.warn(\n\t\t\t\t'something went wrong when trying to get locale, use zh-CN as default, please check it out!'\n\t\t\t);\n\t\t\tresult = 'zh-CN';\n\t\t}\n\n\t\tthis._locale.value = result;\n\t\treturn result;\n\t});\n\n\tconstructor() {\n\t\tthis.emitter.setMaxListeners(200);\n\t}\n\n\tsetLocale(locale: string) {\n\t\tlogger.info(`setting locale to ${locale}`);\n\t\tif (locale === this.locale.value) {\n\t\t\treturn;\n\t\t}\n\t\tthis._locale.value = locale;\n\t\tif (hasLocalStorage(window)) {\n\t\t\tconst store = window.localStorage;\n\t\t\tlet config: any;\n\t\t\ttry {\n\t\t\t\tconfig = JSON.parse(store.getItem(MicrocodeConfigKey) || '');\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(`set locale:${e}`);\n\t\t\t}\n\t\t\tif (config && typeof config === 'object') {\n\t\t\t\tconfig.locale = locale;\n\t\t\t} else {\n\t\t\t\tconfig = { locale };\n\t\t\t}\n\t\t\tstore.setItem(MicrocodeConfigKey, JSON.stringify(config));\n\t\t}\n\t\tthis.emitter.emit('localechange', locale);\n\t}\n\n\tgetLocale() {\n\t\treturn this.locale.value;\n\t}\n\n\tonChangeLocale(fn: (locale: string) => void): () => void {\n\t\tthis.emitter.on('localechange', fn);\n\t\treturn () => {\n\t\t\tthis.emitter.removeListener('localechange', fn);\n\t\t};\n\t}\n}\n\nfunction hasLocalStorage(obj: any): obj is WindowLocalStorage {\n\treturn obj.localStorage;\n}\n\nfunction getConfig(name: string) {\n\tconst win: any = window;\n\treturn (\n\t\twin[name] || (win.g_config || {})[name] || (win.pageConfig || {})[name]\n\t);\n}\n\nconst globalLocale = new GlobalLocale();\n\nexport { globalLocale };\n"],"names":[],"mappings":"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"} |
| import { IPublicTypeI18nData } from '@arvin-shu/microcode-types'; | ||
| import { VNode } from 'vue'; | ||
| import { globalLocale } from './global-locale'; | ||
| export declare function shallowIntl(data: any): any; | ||
| export declare function intl(data: IPublicTypeI18nData | string, params?: object): string | VNode<import("vue").RendererNode, import("vue").RendererElement, { | ||
| [key: string]: any; | ||
| }>; | ||
| export declare function createIntl(instance: string | object): { | ||
| intlNode(id: string, params?: object): VNode; | ||
| intl(id: string, params?: object): string; | ||
| getLocale(): string; | ||
| setLocale(locale: string): void; | ||
| }; | ||
| export { globalLocale }; |
-107
| import { isI18nData } from '@arvin-shu/microcode-utils'; | ||
| import { IntlMessageFormat } from 'intl-messageformat'; | ||
| import { defineComponent, h } from 'vue'; | ||
| import { globalLocale } from './global-locale.js'; | ||
| "use strict"; | ||
| function generateTryLocales(locale) { | ||
| const tries = [locale, locale.replace("-", "_")]; | ||
| if (locale === "zh-TW" || locale === "en-US") { | ||
| tries.push("zh-CN"); | ||
| tries.push("zh_CN"); | ||
| } else { | ||
| tries.push("en-US"); | ||
| tries.push("en_US"); | ||
| if (locale !== "zh-CN") { | ||
| tries.push("zh-CN"); | ||
| tries.push("zh_CN"); | ||
| } | ||
| } | ||
| return tries; | ||
| } | ||
| function shallowIntl(data) { | ||
| if (!data || typeof data !== "object") { | ||
| return data; | ||
| } | ||
| const maps = {}; | ||
| Object.keys(data).forEach((key) => { | ||
| maps[key] = intl(data[key]); | ||
| }); | ||
| return maps; | ||
| } | ||
| function injectVars(msg, params, locale) { | ||
| if (!msg || !params) { | ||
| return msg; | ||
| } | ||
| const formater = new IntlMessageFormat(msg, locale); | ||
| return formater.format(params); | ||
| } | ||
| function intl(data, params) { | ||
| if (!isI18nData(data)) { | ||
| return data; | ||
| } | ||
| if (data.intl) { | ||
| return data.intl; | ||
| } | ||
| const locale = globalLocale.getLocale(); | ||
| const tries = generateTryLocales(locale); | ||
| let msg; | ||
| for (const lan of tries) { | ||
| msg = data[lan]; | ||
| if (msg != null) { | ||
| break; | ||
| } | ||
| } | ||
| if (msg == null) { | ||
| return `##intl@${locale}##`; | ||
| } | ||
| return injectVars(msg, params, locale); | ||
| } | ||
| function createIntl(instance) { | ||
| const data = (() => { | ||
| const locale = globalLocale.getLocale(); | ||
| if (typeof instance === "string") { | ||
| if (window[instance]) { | ||
| return window[instance][locale] || {}; | ||
| } | ||
| const key = `${instance}_${locale.toLocaleLowerCase()}`; | ||
| return window[key] || {}; | ||
| } | ||
| if (instance && typeof instance === "object") { | ||
| return instance[locale] || {}; | ||
| } | ||
| return {}; | ||
| })(); | ||
| function intl2(key, params) { | ||
| const str = data[key]; | ||
| if (str == null) { | ||
| return `##intl@${key}##`; | ||
| } | ||
| return injectVars(str, params, globalLocale.getLocale()); | ||
| } | ||
| const IntlElement = defineComponent({ | ||
| props: { | ||
| id: String, | ||
| params: Object | ||
| }, | ||
| render() { | ||
| const { id, params } = this; | ||
| return intl2(id, params); | ||
| } | ||
| }); | ||
| return { | ||
| intlNode(id, params) { | ||
| return h(IntlElement, { id, params }); | ||
| }, | ||
| intl: intl2, | ||
| getLocale() { | ||
| return globalLocale.getLocale(); | ||
| }, | ||
| setLocale(locale) { | ||
| globalLocale.setLocale(locale); | ||
| } | ||
| }; | ||
| } | ||
| export { createIntl, globalLocale, intl, shallowIntl }; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":["../../../src/inti/index.ts"],"sourcesContent":["import { isI18nData } from '@arvin-shu/microcode-utils';\nimport { IPublicTypeI18nData } from '@arvin-shu/microcode-types';\nimport { IntlMessageFormat } from 'intl-messageformat';\nimport { defineComponent, h, VNode } from 'vue';\nimport { globalLocale } from './global-locale';\n\nfunction generateTryLocales(locale: string) {\n\tconst tries = [locale, locale.replace('-', '_')];\n\tif (locale === 'zh-TW' || locale === 'en-US') {\n\t\ttries.push('zh-CN');\n\t\ttries.push('zh_CN');\n\t} else {\n\t\ttries.push('en-US');\n\t\ttries.push('en_US');\n\t\tif (locale !== 'zh-CN') {\n\t\t\ttries.push('zh-CN');\n\t\t\ttries.push('zh_CN');\n\t\t}\n\t}\n\treturn tries;\n}\n\nexport function shallowIntl(data: any): any {\n\tif (!data || typeof data !== 'object') {\n\t\treturn data;\n\t}\n\tconst maps: any = {};\n\tObject.keys(data).forEach((key) => {\n\t\tmaps[key] = intl(data[key]);\n\t});\n\treturn maps;\n}\n\nfunction injectVars(msg: string, params: any, locale: string): string {\n\tif (!msg || !params) {\n\t\treturn msg;\n\t}\n\tconst formater = new IntlMessageFormat(msg, locale);\n\treturn formater.format(params as any) as string;\n}\n\nexport function intl(data: IPublicTypeI18nData | string, params?: object) {\n\tif (!isI18nData(data)) {\n\t\treturn data;\n\t}\n\tif (data.intl) {\n\t\treturn data.intl;\n\t}\n\tconst locale = globalLocale.getLocale();\n\tconst tries = generateTryLocales(locale);\n\tlet msg: string | undefined;\n\tfor (const lan of tries) {\n\t\tmsg = data[lan];\n\t\tif (msg != null) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (msg == null) {\n\t\treturn `##intl@${locale}##`;\n\t}\n\n\treturn injectVars(msg, params, locale);\n}\n\nexport function createIntl(instance: string | object): {\n\tintlNode(id: string, params?: object): VNode;\n\tintl(id: string, params?: object): string;\n\tgetLocale(): string;\n\tsetLocale(locale: string): void;\n} {\n\tconst data = (() => {\n\t\tconst locale = globalLocale.getLocale();\n\t\tif (typeof instance === 'string') {\n\t\t\tif ((window as any)[instance]) {\n\t\t\t\treturn (window as any)[instance][locale] || {};\n\t\t\t}\n\t\t\tconst key = `${instance}_${locale.toLocaleLowerCase()}`;\n\t\t\treturn (window as any)[key] || {};\n\t\t}\n\t\tif (instance && typeof instance === 'object') {\n\t\t\treturn (instance as any)[locale] || {};\n\t\t}\n\t\treturn {};\n\t})();\n\n\tfunction intl(key: string, params?: object): string {\n\t\tconst str = data[key];\n\n\t\tif (str == null) {\n\t\t\treturn `##intl@${key}##`;\n\t\t}\n\n\t\treturn injectVars(str, params, globalLocale.getLocale());\n\t}\n\n\tconst IntlElement = defineComponent({\n\t\tprops: {\n\t\t\tid: String,\n\t\t\tparams: Object,\n\t\t},\n\t\trender() {\n\t\t\tconst { id, params } = this;\n\t\t\treturn intl(id!, params);\n\t\t},\n\t});\n\n\treturn {\n\t\tintlNode(id: string, params?: object) {\n\t\t\treturn h(IntlElement, { id, params });\n\t\t},\n\t\tintl,\n\t\tgetLocale() {\n\t\t\treturn globalLocale.getLocale();\n\t\t},\n\t\tsetLocale(locale: string) {\n\t\t\tglobalLocale.setLocale(locale);\n\t\t},\n\t};\n}\n\nexport { globalLocale };\n"],"names":["intl"],"mappings":"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"} |
| declare global { | ||
| interface Window { | ||
| __isDebug?: boolean; | ||
| __newFunc?: (funcStr: string) => (...args: any[]) => any; | ||
| } | ||
| } | ||
| export {}; |
| import store from 'store'; | ||
| "use strict"; | ||
| const debugRegRes = /_?debug=(.*?)(&|$)/.exec(location.search); | ||
| if (debugRegRes && debugRegRes[1]) { | ||
| window.__isDebug = true; | ||
| store.storage.write( | ||
| "debug", | ||
| debugRegRes[1] === "true" ? "*" : debugRegRes[1] | ||
| ); | ||
| } else { | ||
| window.__isDebug = false; | ||
| store.remove("debug"); | ||
| } | ||
| window.__newFunc = (funContext) => { | ||
| return new Function(funContext); | ||
| }; | ||
| window.onbeforeunload = function(e) { | ||
| const ev = e || window.event; | ||
| if (location.href.indexOf("localhost") > 0) { | ||
| return ""; | ||
| } | ||
| const msg = "\u60A8\u786E\u5B9A\u8981\u79BB\u5F00\u6B64\u9875\u9762\u5417\uFF1F"; | ||
| ev.cancelBubble = true; | ||
| ev.returnValue = true; | ||
| if (e.stopPropagation) { | ||
| e.stopPropagation(); | ||
| e.preventDefault(); | ||
| } | ||
| return msg; | ||
| }; | ||
| //# sourceMappingURL=app-preset.js.map |
| {"version":3,"file":"app-preset.js","sources":["../../../src/utils/app-preset.ts"],"sourcesContent":["import store from 'store';\n\ndeclare global {\n\tinterface Window {\n\t\t__isDebug?: boolean;\n\t\t__newFunc?: (funcStr: string) => (...args: any[]) => any;\n\t}\n}\n\n// 根据 url 参数设置 debug 选项\n// eslint-disable-next-line no-restricted-globals\nconst debugRegRes = /_?debug=(.*?)(&|$)/.exec(location.search);\nif (debugRegRes && debugRegRes[1]) {\n\t// eslint-disable-next-line no-underscore-dangle\n\twindow.__isDebug = true;\n\t// @ts-ignore\n\tstore.storage.write(\n\t\t'debug',\n\t\tdebugRegRes[1] === 'true' ? '*' : debugRegRes[1]\n\t);\n} else {\n\t// eslint-disable-next-line no-underscore-dangle\n\twindow.__isDebug = false;\n\tstore.remove('debug');\n}\n\n// 重要,用于矫正画布执行 new Function 的 window 对象上下文\n// eslint-disable-next-line arrow-body-style\nwindow.__newFunc = (funContext: string): ((...args: any[]) => any) => {\n\t// eslint-disable-next-line no-new-func\n\treturn new Function(funContext) as (...args: any[]) => any;\n};\n\n// 关闭浏览器前提醒,只有产生过交互才会生效\n// eslint-disable-next-line func-names\nwindow.onbeforeunload = function (e: Event): string {\n\tconst ev = e || window.event;\n\t// 本地调试不生效\n\t// eslint-disable-next-line no-restricted-globals\n\tif (location.href.indexOf('localhost') > 0) {\n\t\treturn '';\n\t}\n\tconst msg = '您确定要离开此页面吗?';\n\tev.cancelBubble = true;\n\tev.returnValue = true;\n\tif (e.stopPropagation) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t}\n\treturn msg;\n};\n"],"names":[],"mappings":";;;AAWA,MAAM,WAAc,GAAA,oBAAA,CAAqB,IAAK,CAAA,QAAA,CAAS,MAAM,CAAA;AAC7D,IAAI,WAAA,IAAe,WAAY,CAAA,CAAC,CAAG,EAAA;AAElC,EAAA,MAAA,CAAO,SAAY,GAAA,IAAA;AAEnB,EAAA,KAAA,CAAM,OAAQ,CAAA,KAAA;AAAA,IACb,OAAA;AAAA,IACA,YAAY,CAAC,CAAA,KAAM,MAAS,GAAA,GAAA,GAAM,YAAY,CAAC;AAAA,GAChD;AACD,CAAO,MAAA;AAEN,EAAA,MAAA,CAAO,SAAY,GAAA,KAAA;AACnB,EAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AACrB;AAIA,MAAO,CAAA,SAAA,GAAY,CAAC,UAAkD,KAAA;AAErE,EAAO,OAAA,IAAI,SAAS,UAAU,CAAA;AAC/B,CAAA;AAIA,MAAO,CAAA,cAAA,GAAiB,SAAU,CAAkB,EAAA;AACnD,EAAM,MAAA,EAAA,GAAK,KAAK,MAAO,CAAA,KAAA;AAGvB,EAAA,IAAI,QAAS,CAAA,IAAA,CAAK,OAAQ,CAAA,WAAW,IAAI,CAAG,EAAA;AAC3C,IAAO,OAAA,EAAA;AAAA;AAER,EAAA,MAAM,GAAM,GAAA,oEAAA;AACZ,EAAA,EAAA,CAAG,YAAe,GAAA,IAAA;AAClB,EAAA,EAAA,CAAG,WAAc,GAAA,IAAA;AACjB,EAAA,IAAI,EAAE,eAAiB,EAAA;AACtB,IAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,IAAA,CAAA,CAAE,cAAe,EAAA;AAAA;AAElB,EAAO,OAAA,GAAA;AACR,CAAA"} |
| import { IPublicTypeAssetsJson } from '@arvin-shu/microcode-types'; | ||
| export declare function assetsTransform(assets: IPublicTypeAssetsJson): IPublicTypeAssetsJson; |
| "use strict"; | ||
| function assetsTransform(assets) { | ||
| const { components, packages } = assets; | ||
| const packageMaps = (packages || []).reduce( | ||
| (acc, cur) => { | ||
| const key = cur.id || cur.package || ""; | ||
| acc[key] = cur; | ||
| return acc; | ||
| }, | ||
| {} | ||
| ); | ||
| components.forEach( | ||
| (componentDesc) => { | ||
| let { devMode } = componentDesc; | ||
| const { schema, reference } = componentDesc; | ||
| if (devMode === "microCode") { | ||
| devMode = "microCode"; | ||
| } else if (devMode === "proCode") { | ||
| devMode = "proCode"; | ||
| } | ||
| if (devMode) { | ||
| componentDesc.devMode = devMode; | ||
| } | ||
| if (devMode === "microCode" && !schema && reference) { | ||
| const referenceId = reference.id || ""; | ||
| componentDesc.schema = packageMaps[referenceId].schema; | ||
| } | ||
| } | ||
| ); | ||
| return assets; | ||
| } | ||
| export { assetsTransform }; | ||
| //# sourceMappingURL=assets-transform.js.map |
| {"version":3,"file":"assets-transform.js","sources":["../../../src/utils/assets-transform.ts"],"sourcesContent":["import {\n\tIPublicTypeAssetsJson,\n\tIPublicTypeComponentDescription,\n\tIPublicTypePackage,\n\tIPublicTypeRemoteComponentDescription,\n} from '@arvin-shu/microcode-types';\n\nexport function assetsTransform(assets: IPublicTypeAssetsJson) {\n\tconst { components, packages } = assets;\n\tconst packageMaps = (packages || []).reduce(\n\t\t(acc: Record<string, IPublicTypePackage>, cur: IPublicTypePackage) => {\n\t\t\tconst key = cur.id || cur.package || '';\n\t\t\tacc[key] = cur;\n\t\t\treturn acc;\n\t\t},\n\t\t{} as any\n\t);\n\tcomponents.forEach(\n\t\t(\n\t\t\tcomponentDesc:\n\t\t\t\t| IPublicTypeComponentDescription\n\t\t\t\t| IPublicTypeRemoteComponentDescription\n\t\t) => {\n\t\t\tlet { devMode } = componentDesc;\n\t\t\tconst { schema, reference } = componentDesc;\n\t\t\tif ((devMode as string) === 'microCode') {\n\t\t\t\tdevMode = 'microCode';\n\t\t\t} else if (devMode === 'proCode') {\n\t\t\t\tdevMode = 'proCode';\n\t\t\t}\n\t\t\tif (devMode) {\n\t\t\t\tcomponentDesc.devMode = devMode;\n\t\t\t}\n\t\t\tif (devMode === 'microCode' && !schema && reference) {\n\t\t\t\tconst referenceId = reference.id || '';\n\t\t\t\tcomponentDesc.schema = packageMaps[referenceId].schema as any;\n\t\t\t}\n\t\t}\n\t);\n\treturn assets;\n}\n"],"names":[],"mappings":";AAOO,SAAS,gBAAgB,MAA+B,EAAA;AAC9D,EAAM,MAAA,EAAE,UAAY,EAAA,QAAA,EAAa,GAAA,MAAA;AACjC,EAAM,MAAA,WAAA,GAAA,CAAe,QAAY,IAAA,EAAI,EAAA,MAAA;AAAA,IACpC,CAAC,KAAyC,GAA4B,KAAA;AACrE,MAAA,MAAM,GAAM,GAAA,GAAA,CAAI,EAAM,IAAA,GAAA,CAAI,OAAW,IAAA,EAAA;AACrC,MAAA,GAAA,CAAI,GAAG,CAAI,GAAA,GAAA;AACX,MAAO,OAAA,GAAA;AAAA,KACR;AAAA,IACA;AAAC,GACF;AACA,EAAW,UAAA,CAAA,OAAA;AAAA,IACV,CACC,aAGI,KAAA;AACJ,MAAI,IAAA,EAAE,SAAY,GAAA,aAAA;AAClB,MAAM,MAAA,EAAE,MAAQ,EAAA,SAAA,EAAc,GAAA,aAAA;AAC9B,MAAA,IAAK,YAAuB,WAAa,EAAA;AACxC,QAAU,OAAA,GAAA,WAAA;AAAA,OACX,MAAA,IAAW,YAAY,SAAW,EAAA;AACjC,QAAU,OAAA,GAAA,SAAA;AAAA;AAEX,MAAA,IAAI,OAAS,EAAA;AACZ,QAAA,aAAA,CAAc,OAAU,GAAA,OAAA;AAAA;AAEzB,MAAA,IAAI,OAAY,KAAA,WAAA,IAAe,CAAC,MAAA,IAAU,SAAW,EAAA;AACpD,QAAM,MAAA,WAAA,GAAc,UAAU,EAAM,IAAA,EAAA;AACpC,QAAc,aAAA,CAAA,MAAA,GAAS,WAAY,CAAA,WAAW,CAAE,CAAA,MAAA;AAAA;AACjD;AACD,GACD;AACA,EAAO,OAAA,MAAA;AACR;;;;"} |
| /** | ||
| * 设置全局事件开关状态 | ||
| * @param flag 开关状态,true 为开启,false 为关闭 | ||
| */ | ||
| export declare function setGlobalEventFlag(flag: boolean): void; | ||
| /** | ||
| * 打开全局事件开关 | ||
| */ | ||
| export declare function switchGlobalEventOn(): void; | ||
| /** | ||
| * 关闭全局事件开关 | ||
| */ | ||
| export declare function switchGlobalEventOff(): void; | ||
| /** | ||
| * 获取全局事件开关状态 | ||
| * @returns 当前开关状态 | ||
| */ | ||
| export declare function isGlobalEventOn(): boolean; | ||
| /** | ||
| * 在关闭全局事件的情况下执行函数 | ||
| * @param fn 需要执行的函数 | ||
| */ | ||
| export declare function runWithGlobalEventOff(fn: Function): void; | ||
| type ListenerFunc = (...args: any[]) => void; | ||
| /** | ||
| * 包装事件监听函数,只在全局事件开启时执行 | ||
| * @param fn 原始监听函数 | ||
| * @returns 包装后的监听函数 | ||
| */ | ||
| export declare function wrapWithEventSwitch(fn: ListenerFunc): ListenerFunc; | ||
| export {}; |
| "use strict"; | ||
| let globalEventOn = true; | ||
| function setGlobalEventFlag(flag) { | ||
| globalEventOn = flag; | ||
| } | ||
| function switchGlobalEventOn() { | ||
| setGlobalEventFlag(true); | ||
| } | ||
| function switchGlobalEventOff() { | ||
| setGlobalEventFlag(false); | ||
| } | ||
| function isGlobalEventOn() { | ||
| return globalEventOn; | ||
| } | ||
| function runWithGlobalEventOff(fn) { | ||
| switchGlobalEventOff(); | ||
| fn(); | ||
| switchGlobalEventOn(); | ||
| } | ||
| function wrapWithEventSwitch(fn) { | ||
| return (...args) => { | ||
| if (isGlobalEventOn()) fn(...args); | ||
| }; | ||
| } | ||
| export { isGlobalEventOn, runWithGlobalEventOff, setGlobalEventFlag, switchGlobalEventOff, switchGlobalEventOn, wrapWithEventSwitch }; | ||
| //# sourceMappingURL=control.js.map |
| {"version":3,"file":"control.js","sources":["../../../src/utils/control.ts"],"sourcesContent":["// 全局事件开关标志\nlet globalEventOn = true;\n\n/**\n * 设置全局事件开关状态\n * @param flag 开关状态,true 为开启,false 为关闭\n */\nexport function setGlobalEventFlag(flag: boolean) {\n\tglobalEventOn = flag;\n}\n\n/**\n * 打开全局事件开关\n */\nexport function switchGlobalEventOn() {\n\tsetGlobalEventFlag(true);\n}\n\n/**\n * 关闭全局事件开关\n */\nexport function switchGlobalEventOff() {\n\tsetGlobalEventFlag(false);\n}\n\n/**\n * 获取全局事件开关状态\n * @returns 当前开关状态\n */\nexport function isGlobalEventOn() {\n\treturn globalEventOn;\n}\n\n/**\n * 在关闭全局事件的情况下执行函数\n * @param fn 需要执行的函数\n */\nexport function runWithGlobalEventOff(fn: Function) {\n\tswitchGlobalEventOff();\n\tfn();\n\tswitchGlobalEventOn();\n}\n\ntype ListenerFunc = (...args: any[]) => void;\n/**\n * 包装事件监听函数,只在全局事件开启时执行\n * @param fn 原始监听函数\n * @returns 包装后的监听函数\n */\nexport function wrapWithEventSwitch(fn: ListenerFunc): ListenerFunc {\n\treturn (...args: any[]) => {\n\t\tif (isGlobalEventOn()) fn(...args);\n\t};\n}\n"],"names":[],"mappings":";AACA,IAAI,aAAgB,GAAA,IAAA;AAMb,SAAS,mBAAmB,IAAe,EAAA;AACjD,EAAgB,aAAA,GAAA,IAAA;AACjB;AAKO,SAAS,mBAAsB,GAAA;AACrC,EAAA,kBAAA,CAAmB,IAAI,CAAA;AACxB;AAKO,SAAS,oBAAuB,GAAA;AACtC,EAAA,kBAAA,CAAmB,KAAK,CAAA;AACzB;AAMO,SAAS,eAAkB,GAAA;AACjC,EAAO,OAAA,aAAA;AACR;AAMO,SAAS,sBAAsB,EAAc,EAAA;AACnD,EAAqB,oBAAA,EAAA;AACrB,EAAG,EAAA,EAAA;AACH,EAAoB,mBAAA,EAAA;AACrB;AAQO,SAAS,oBAAoB,EAAgC,EAAA;AACnE,EAAA,OAAO,IAAI,IAAgB,KAAA;AAC1B,IAAA,IAAI,eAAgB,EAAA,EAAM,EAAA,CAAA,GAAG,IAAI,CAAA;AAAA,GAClC;AACD;;;;"} |
| export declare class FocusTracker { | ||
| private actives; | ||
| private modals; | ||
| get first(): Focusable; | ||
| addModal(checkDown: (e: MouseEvent) => boolean, checkOpen: () => boolean): void; | ||
| private checkModalOpen; | ||
| private checkModalDown; | ||
| execSave(): void; | ||
| execEsc(): void; | ||
| mount(win: Window): () => void; | ||
| /** | ||
| * 创建一个新的 Focusable 实例,并将其注册到 FocusTracker 中。 | ||
| * @param config | ||
| * @returns | ||
| */ | ||
| create(config: FocusableConfig): Focusable; | ||
| /** | ||
| * 将传入的 Focusable 设置为活跃项,并触发当前活跃项的 onBlur 回调(如果有)。 | ||
| * @param item 当前活跃的 | ||
| */ | ||
| internalActiveItem(item: Focusable): void; | ||
| internalSuspenseItem(item: Focusable): void; | ||
| } | ||
| export interface FocusableConfig { | ||
| range: HTMLElement | ((e: MouseEvent) => boolean); | ||
| modal?: boolean; | ||
| onEsc?: () => void; | ||
| onBlur?: () => void; | ||
| onSave?: () => void; | ||
| onActive?: () => void; | ||
| } | ||
| export declare class Focusable { | ||
| private tracker; | ||
| private config; | ||
| readonly isModal?: boolean; | ||
| constructor(tracker: FocusTracker, config: FocusableConfig); | ||
| active(): void; | ||
| suspense(): void; | ||
| purge(): void; | ||
| internalCheckInRange(e: MouseEvent): boolean; | ||
| internalTriggerBlur(): void; | ||
| internalTriggerSave(): boolean; | ||
| internalTriggerEsc(): void; | ||
| internalTriggerActive(): void; | ||
| } |
| "use strict"; | ||
| class FocusTracker { | ||
| // 存储当前活跃的 Focusable 实例(处于焦点中的元素)。 | ||
| actives = []; | ||
| modals = []; | ||
| get first() { | ||
| return this.actives[0]; | ||
| } | ||
| addModal(checkDown, checkOpen) { | ||
| this.modals.push({ | ||
| checkDown, | ||
| checkOpen | ||
| }); | ||
| } | ||
| checkModalOpen() { | ||
| return this.modals.some((item) => item.checkOpen()); | ||
| } | ||
| checkModalDown(e) { | ||
| return this.modals.some((item) => item.checkDown(e)); | ||
| } | ||
| execSave() { | ||
| if (this.checkModalOpen()) { | ||
| return; | ||
| } | ||
| if (this.first) { | ||
| this.first.internalTriggerSave(); | ||
| } | ||
| } | ||
| execEsc() { | ||
| const { first } = this; | ||
| if (first) { | ||
| this.internalSuspenseItem(first); | ||
| first.internalTriggerEsc(); | ||
| } | ||
| } | ||
| mount(win) { | ||
| const checkDown = (e) => { | ||
| const { first } = this; | ||
| if (first && !first.internalCheckInRange(e)) { | ||
| this.internalSuspenseItem(first); | ||
| first.internalTriggerBlur(); | ||
| } | ||
| }; | ||
| win.document.addEventListener("click", checkDown, true); | ||
| return () => { | ||
| win.removeEventListener("click", checkDown, true); | ||
| }; | ||
| } | ||
| /** | ||
| * 创建一个新的 Focusable 实例,并将其注册到 FocusTracker 中。 | ||
| * @param config | ||
| * @returns | ||
| */ | ||
| create(config) { | ||
| return new Focusable(this, config); | ||
| } | ||
| /** | ||
| * 将传入的 Focusable 设置为活跃项,并触发当前活跃项的 onBlur 回调(如果有)。 | ||
| * @param item 当前活跃的 | ||
| */ | ||
| internalActiveItem(item) { | ||
| const first = this.actives[0]; | ||
| if (first === item) { | ||
| return; | ||
| } | ||
| const i = this.actives.indexOf(item); | ||
| if (i > -1) { | ||
| this.actives.splice(i, 1); | ||
| } | ||
| this.actives.unshift(item); | ||
| if (!item.isModal && first) { | ||
| first.internalTriggerBlur(); | ||
| } | ||
| item.internalTriggerActive(); | ||
| } | ||
| internalSuspenseItem(item) { | ||
| const i = this.actives.indexOf(item); | ||
| if (i > -1) { | ||
| this.actives.splice(i, 1); | ||
| this.first?.internalTriggerActive(); | ||
| } | ||
| } | ||
| } | ||
| class Focusable { | ||
| constructor(tracker, config) { | ||
| this.tracker = tracker; | ||
| this.config = config; | ||
| this.isModal = config.modal === null ? false : config.modal; | ||
| } | ||
| isModal; | ||
| active() { | ||
| this.tracker.internalActiveItem(this); | ||
| } | ||
| suspense() { | ||
| this.tracker.internalSuspenseItem(this); | ||
| } | ||
| purge() { | ||
| this.tracker.internalSuspenseItem(this); | ||
| } | ||
| internalCheckInRange(e) { | ||
| const { range } = this.config; | ||
| if (!range) { | ||
| return false; | ||
| } | ||
| if (typeof range === "function") { | ||
| return range(e); | ||
| } | ||
| return range.contains(e.target); | ||
| } | ||
| internalTriggerBlur() { | ||
| if (this.config.onBlur) { | ||
| this.config.onBlur(); | ||
| } | ||
| } | ||
| internalTriggerSave() { | ||
| if (this.config.onSave) { | ||
| this.config.onSave(); | ||
| return true; | ||
| } | ||
| return false; | ||
| } | ||
| internalTriggerEsc() { | ||
| if (this.config.onEsc) { | ||
| this.config.onEsc(); | ||
| } | ||
| } | ||
| internalTriggerActive() { | ||
| if (this.config.onActive) { | ||
| this.config.onActive(); | ||
| } | ||
| } | ||
| } | ||
| export { FocusTracker, Focusable }; | ||
| //# sourceMappingURL=focus-tracker.js.map |
| {"version":3,"file":"focus-tracker.js","sources":["../../../src/utils/focus-tracker.ts"],"sourcesContent":["export class FocusTracker {\n\t// 存储当前活跃的 Focusable 实例(处于焦点中的元素)。\n\tprivate actives: Focusable[] = [];\n\n\tprivate modals: Array<{\n\t\tcheckDown: (e: MouseEvent) => boolean;\n\t\tcheckOpen: () => boolean;\n\t}> = [];\n\n\tget first() {\n\t\treturn this.actives[0];\n\t}\n\n\taddModal(checkDown: (e: MouseEvent) => boolean, checkOpen: () => boolean) {\n\t\tthis.modals.push({\n\t\t\tcheckDown,\n\t\t\tcheckOpen,\n\t\t});\n\t}\n\n\tprivate checkModalOpen(): boolean {\n\t\treturn this.modals.some((item) => item.checkOpen());\n\t}\n\n\tprivate checkModalDown(e: MouseEvent): boolean {\n\t\treturn this.modals.some((item) => item.checkDown(e));\n\t}\n\n\texecSave() {\n\t\t// has Modal return;\n\t\tif (this.checkModalOpen()) {\n\t\t\treturn;\n\t\t}\n\t\t// catch\n\t\tif (this.first) {\n\t\t\tthis.first.internalTriggerSave();\n\t\t}\n\t}\n\n\texecEsc() {\n\t\tconst { first } = this;\n\t\tif (first) {\n\t\t\tthis.internalSuspenseItem(first);\n\t\t\tfirst.internalTriggerEsc();\n\t\t}\n\t}\n\n\tmount(win: Window) {\n\t\tconst checkDown = (e: MouseEvent) => {\n\t\t\tconst { first } = this;\n\t\t\tif (first && !first.internalCheckInRange(e)) {\n\t\t\t\t// 失去焦点\n\t\t\t\tthis.internalSuspenseItem(first);\n\t\t\t\tfirst.internalTriggerBlur();\n\t\t\t}\n\t\t};\n\t\twin.document.addEventListener('click', checkDown, true);\n\n\t\treturn () => {\n\t\t\twin.removeEventListener('click', checkDown, true);\n\t\t};\n\t}\n\n\t/**\n\t * 创建一个新的 Focusable 实例,并将其注册到 FocusTracker 中。\n\t * @param config\n\t * @returns\n\t */\n\tcreate(config: FocusableConfig) {\n\t\treturn new Focusable(this, config);\n\t}\n\n\t/**\n\t * 将传入的 Focusable 设置为活跃项,并触发当前活跃项的 onBlur 回调(如果有)。\n\t * @param item 当前活跃的\n\t */\n\tinternalActiveItem(item: Focusable) {\n\t\t// 获取当前活跃的元素,判断当前激活的元素是否已经活跃\n\t\tconst first = this.actives[0];\n\t\tif (first === item) {\n\t\t\treturn;\n\t\t}\n\t\t// 从 actives 中移除当前激活的 item(如果存在):\n\t\tconst i = this.actives.indexOf(item);\n\t\tif (i > -1) {\n\t\t\tthis.actives.splice(i, 1);\n\t\t}\n\t\t// 将当前激活的 item 添加到 actives 数组的第一个位置,以更新它为当前的焦点元素。\n\t\tthis.actives.unshift(item);\n\t\t// 如果当前激活的 item 不是模态窗口 (!item.isModal) 且存在之前的焦点元素 first,\n\t\t// 则触发 first 的 internalTriggerBlur() 方法,使之前的焦点元素失去焦点。\n\t\t// 这可以确保在非模态窗口间切换时,焦点变化能够触发 blur 事件。\n\t\tif (!item.isModal && first) {\n\t\t\tfirst.internalTriggerBlur();\n\t\t}\n\t\t// 调用 item 的 internalTriggerActive 方法,以触发激活状态的回调或执行激活事件。\n\t\t// 这一方法可以用于更新 UI 或执行一些焦点激活时的逻辑。\n\t\titem.internalTriggerActive();\n\t}\n\n\tinternalSuspenseItem(item: Focusable) {\n\t\tconst i = this.actives.indexOf(item);\n\t\tif (i > -1) {\n\t\t\tthis.actives.splice(i, 1);\n\t\t\t// 触发新的首个活跃元素的激活事件\n\t\t\tthis.first?.internalTriggerActive();\n\t\t}\n\t}\n}\n\nexport interface FocusableConfig {\n\t// 用于指定一个可聚焦元素的点击范围。\n\trange: HTMLElement | ((e: MouseEvent) => boolean);\n\tmodal?: boolean; // 模态窗口级别\n\tonEsc?: () => void;\n\tonBlur?: () => void;\n\tonSave?: () => void;\n\tonActive?: () => void;\n}\n\nexport class Focusable {\n\treadonly isModal?: boolean;\n\n\tconstructor(\n\t\tprivate tracker: FocusTracker,\n\t\tprivate config: FocusableConfig\n\t) {\n\t\tthis.isModal = config.modal === null ? false : config.modal;\n\t}\n\n\tactive() {\n\t\tthis.tracker.internalActiveItem(this);\n\t}\n\n\tsuspense() {\n\t\tthis.tracker.internalSuspenseItem(this);\n\t}\n\n\tpurge() {\n\t\tthis.tracker.internalSuspenseItem(this);\n\t}\n\n\tinternalCheckInRange(e: MouseEvent) {\n\t\tconst { range } = this.config;\n\t\tif (!range) {\n\t\t\treturn false;\n\t\t}\n\t\tif (typeof range === 'function') {\n\t\t\treturn range(e);\n\t\t}\n\n\t\treturn range.contains(e.target as HTMLElement);\n\t}\n\n\tinternalTriggerBlur() {\n\t\tif (this.config.onBlur) {\n\t\t\tthis.config.onBlur();\n\t\t}\n\t}\n\n\tinternalTriggerSave() {\n\t\tif (this.config.onSave) {\n\t\t\tthis.config.onSave();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tinternalTriggerEsc() {\n\t\tif (this.config.onEsc) {\n\t\t\tthis.config.onEsc();\n\t\t}\n\t}\n\n\tinternalTriggerActive() {\n\t\tif (this.config.onActive) {\n\t\t\tthis.config.onActive();\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"} |
| /** | ||
| * 获取当前脚本文件所在的公共路径 | ||
| * @returns 返回脚本文件所在目录的URL路径,如果获取失败则返回空字符串 | ||
| */ | ||
| export declare function getPublicPath(): string; |
| "use strict"; | ||
| const publicPath = document.currentScript?.src.replace( | ||
| /^(.*\/)[^/]+$/, | ||
| "$1" | ||
| ); | ||
| function getPublicPath() { | ||
| return publicPath || ""; | ||
| } | ||
| export { getPublicPath }; | ||
| //# sourceMappingURL=get-public-path.js.map |
| {"version":3,"file":"get-public-path.js","sources":["../../../src/utils/get-public-path.ts"],"sourcesContent":["// 获取当前脚本文件所在的目录路径\n// 例如: 如果脚本文件路径是 https://example.com/assets/script.js\n// 则返回 https://example.com/assets/\nconst publicPath = (document.currentScript as HTMLScriptElement)?.src.replace(\n\t/^(.*\\/)[^/]+$/,\n\t'$1'\n);\n\n/**\n * 获取当前脚本文件所在的公共路径\n * @returns 返回脚本文件所在目录的URL路径,如果获取失败则返回空字符串\n */\nexport function getPublicPath(): string {\n\treturn publicPath || '';\n}\n"],"names":[],"mappings":";AAGA,MAAM,UAAA,GAAc,QAAS,CAAA,aAAA,EAAqC,GAAI,CAAA,OAAA;AAAA,EACrE,eAAA;AAAA,EACA;AACD,CAAA;AAMO,SAAS,aAAwB,GAAA;AACvC,EAAA,OAAO,UAAc,IAAA,EAAA;AACtB;;;;"} |
| export * from './preference'; | ||
| export * from './focus-tracker'; | ||
| export * from './assets-transform'; | ||
| export * from './control'; | ||
| export * from './get-public-path'; |
| import './preference.js'; | ||
| export { FocusTracker, Focusable } from './focus-tracker.js'; | ||
| export { assetsTransform } from './assets-transform.js'; | ||
| export { isGlobalEventOn, runWithGlobalEventOff, setGlobalEventFlag, switchGlobalEventOff, switchGlobalEventOn, wrapWithEventSwitch } from './control.js'; | ||
| export { getPublicPath } from './get-public-path.js'; | ||
| "use strict"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"} |
| import { IPublicModelPreference } from '@arvin-shu/microcode-types'; | ||
| export default class Preference implements IPublicModelPreference { | ||
| getStorageKey(key: string, module?: string): string; | ||
| set(key: string, value: any, module?: string): void; | ||
| get(key: string, module: string): any; | ||
| /** | ||
| * 检查本地存储是否包含特定密钥 | ||
| * | ||
| * @param key | ||
| * @param module | ||
| * @returns | ||
| */ | ||
| contains(key: string, module: string): boolean; | ||
| } |
| import { getLogger } from '@arvin-shu/microcode-utils'; | ||
| import store from 'store'; | ||
| "use strict"; | ||
| const logger = getLogger({ level: "warn", bizName: "Preference" }); | ||
| const STORAGE_KEY_PREFIX = "arvin"; | ||
| class Preference { | ||
| getStorageKey(key, module) { | ||
| const moduleKey = module || "__inner__"; | ||
| return `${STORAGE_KEY_PREFIX}_${moduleKey}.${key}`; | ||
| } | ||
| set(key, value, module) { | ||
| if (!key || typeof key !== "string" || key.length === 0) { | ||
| logger.error("Invalid key when setting preference", key); | ||
| return; | ||
| } | ||
| const storageKey = this.getStorageKey(key, module); | ||
| logger.debug("storageKey:", storageKey, "set with value:", value); | ||
| store.set(storageKey, value); | ||
| } | ||
| get(key, module) { | ||
| if (!key || typeof key !== "string" || key.length === 0) { | ||
| logger.error("Invalid key when getting from preference", key); | ||
| return; | ||
| } | ||
| const storageKey = this.getStorageKey(key, module); | ||
| const result = store.get(storageKey); | ||
| logger.debug("storageKey:", storageKey, "get with result:", result); | ||
| return result; | ||
| } | ||
| /** | ||
| * 检查本地存储是否包含特定密钥 | ||
| * | ||
| * @param key | ||
| * @param module | ||
| * @returns | ||
| */ | ||
| contains(key, module) { | ||
| if (!key || typeof key !== "string" || key.length === 0) { | ||
| logger.error("Invalid key when getting from preference", key); | ||
| return false; | ||
| } | ||
| const storageKey = this.getStorageKey(key, module); | ||
| const result = store.get(storageKey); | ||
| return !(result === void 0 || result === null); | ||
| } | ||
| } | ||
| export { Preference as default }; | ||
| //# sourceMappingURL=preference.js.map |
| {"version":3,"file":"preference.js","sources":["../../../src/utils/preference.ts"],"sourcesContent":["import { IPublicModelPreference } from '@arvin-shu/microcode-types';\nimport { getLogger } from '@arvin-shu/microcode-utils';\nimport store from 'store';\n\nconst logger = getLogger({ level: 'warn', bizName: 'Preference' });\nconst STORAGE_KEY_PREFIX = 'arvin';\n\nexport default class Preference implements IPublicModelPreference {\n\tgetStorageKey(key: string, module?: string): string {\n\t\tconst moduleKey = module || '__inner__';\n\t\treturn `${STORAGE_KEY_PREFIX}_${moduleKey}.${key}`;\n\t}\n\n\tset(key: string, value: any, module?: string): void {\n\t\tif (!key || typeof key !== 'string' || key.length === 0) {\n\t\t\tlogger.error('Invalid key when setting preference', key);\n\t\t\treturn;\n\t\t}\n\t\tconst storageKey = this.getStorageKey(key, module);\n\t\tlogger.debug('storageKey:', storageKey, 'set with value:', value);\n\t\tstore.set(storageKey, value);\n\t}\n\n\tget(key: string, module: string): any {\n\t\tif (!key || typeof key !== 'string' || key.length === 0) {\n\t\t\tlogger.error('Invalid key when getting from preference', key);\n\t\t\treturn;\n\t\t}\n\t\tconst storageKey = this.getStorageKey(key, module);\n\t\tconst result = store.get(storageKey);\n\t\tlogger.debug('storageKey:', storageKey, 'get with result:', result);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 检查本地存储是否包含特定密钥\n\t *\n\t * @param key\n\t * @param module\n\t * @returns\n\t */\n\tcontains(key: string, module: string): boolean {\n\t\tif (!key || typeof key !== 'string' || key.length === 0) {\n\t\t\tlogger.error('Invalid key when getting from preference', key);\n\t\t\treturn false;\n\t\t}\n\t\tconst storageKey = this.getStorageKey(key, module);\n\t\tconst result = store.get(storageKey);\n\n\t\treturn !(result === undefined || result === null);\n\t}\n}\n"],"names":[],"mappings":";;;;AAIA,MAAM,SAAS,SAAU,CAAA,EAAE,OAAO,MAAQ,EAAA,OAAA,EAAS,cAAc,CAAA;AACjE,MAAM,kBAAqB,GAAA,OAAA;AAE3B,MAAqB,UAA6C,CAAA;AAAA,EACjE,aAAA,CAAc,KAAa,MAAyB,EAAA;AACnD,IAAA,MAAM,YAAY,MAAU,IAAA,WAAA;AAC5B,IAAA,OAAO,CAAG,EAAA,kBAAkB,CAAI,CAAA,EAAA,SAAS,IAAI,GAAG,CAAA,CAAA;AAAA;AACjD,EAEA,GAAA,CAAI,GAAa,EAAA,KAAA,EAAY,MAAuB,EAAA;AACnD,IAAA,IAAI,CAAC,GAAO,IAAA,OAAO,QAAQ,QAAY,IAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACxD,MAAO,MAAA,CAAA,KAAA,CAAM,uCAAuC,GAAG,CAAA;AACvD,MAAA;AAAA;AAED,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,EAAK,MAAM,CAAA;AACjD,IAAA,MAAA,CAAO,KAAM,CAAA,aAAA,EAAe,UAAY,EAAA,iBAAA,EAAmB,KAAK,CAAA;AAChE,IAAM,KAAA,CAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AAAA;AAC5B,EAEA,GAAA,CAAI,KAAa,MAAqB,EAAA;AACrC,IAAA,IAAI,CAAC,GAAO,IAAA,OAAO,QAAQ,QAAY,IAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACxD,MAAO,MAAA,CAAA,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAC5D,MAAA;AAAA;AAED,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,EAAK,MAAM,CAAA;AACjD,IAAM,MAAA,MAAA,GAAS,KAAM,CAAA,GAAA,CAAI,UAAU,CAAA;AACnC,IAAA,MAAA,CAAO,KAAM,CAAA,aAAA,EAAe,UAAY,EAAA,kBAAA,EAAoB,MAAM,CAAA;AAClE,IAAO,OAAA,MAAA;AAAA;AACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAA,CAAS,KAAa,MAAyB,EAAA;AAC9C,IAAA,IAAI,CAAC,GAAO,IAAA,OAAO,QAAQ,QAAY,IAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACxD,MAAO,MAAA,CAAA,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAC5D,MAAO,OAAA,KAAA;AAAA;AAER,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,EAAK,MAAM,CAAA;AACjD,IAAM,MAAA,MAAA,GAAS,KAAM,CAAA,GAAA,CAAI,UAAU,CAAA;AAEnC,IAAO,OAAA,EAAE,MAAW,KAAA,KAAA,CAAA,IAAa,MAAW,KAAA,IAAA,CAAA;AAAA;AAE9C;;;;"} |
| export * from './title'; | ||
| export * from './tip'; |
| export { Title } from './title/index.js'; | ||
| import './tip/index.js'; | ||
| export { Tip } from './tip/tip.js'; | ||
| export { TipContainer, TipItem } from './tip/tip-container.js'; | ||
| export { HelpTip } from './tip/help-tips.js'; | ||
| "use strict"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"} |
| import { IPublicTypeHelpTipConfig, IPublicTypeTipConfig } from '@arvin-shu/microcode-types'; | ||
| export declare function HelpTip({ help, direction, size, }: { | ||
| help: IPublicTypeHelpTipConfig; | ||
| direction?: IPublicTypeTipConfig['direction']; | ||
| size?: Number; | ||
| }): VNode; |
| import { createVNode } from 'vue'; | ||
| import { Tip } from './tip.js'; | ||
| import { InfoIcon } from './info-icon.js'; | ||
| "use strict"; | ||
| function HelpTip({ | ||
| help, | ||
| direction = "left", | ||
| size = 16 | ||
| }) { | ||
| if (typeof help === "string") { | ||
| return createVNode("div", null, [createVNode("div", null, [createVNode(InfoIcon, { | ||
| "style": { | ||
| width: `${size}px`, | ||
| height: `${size}px`, | ||
| verticalAlign: "middle" | ||
| }, | ||
| "class": "mtc-help-tip" | ||
| }, null)]), createVNode(Tip, { | ||
| "direction": direction, | ||
| "children": help | ||
| }, null)]); | ||
| } | ||
| if (typeof help === "object" && help.url) { | ||
| return createVNode("div", null, [createVNode("a", { | ||
| "href": help.url, | ||
| "target": "_blank", | ||
| "rel": "noopener noreferrer" | ||
| }, [createVNode(InfoIcon, { | ||
| "style": { | ||
| width: `${size}px`, | ||
| height: `${size}px`, | ||
| verticalAlign: "middle" | ||
| } | ||
| }, null)]), createVNode(Tip, { | ||
| "direction": direction, | ||
| "children": help | ||
| }, null)]); | ||
| } | ||
| return createVNode("div", null, [createVNode(InfoIcon, { | ||
| "style": { | ||
| width: `${size}px`, | ||
| height: `${size}px`, | ||
| verticalAlign: "middle" | ||
| }, | ||
| "class": "mtc-help-tip" | ||
| }, null), createVNode(Tip, { | ||
| "direction": direction, | ||
| "children": help | ||
| }, null)]); | ||
| } | ||
| export { HelpTip }; | ||
| //# sourceMappingURL=help-tips.js.map |
| {"version":3,"file":"help-tips.js","sources":["../../../../src/widgets/tip/help-tips.tsx"],"sourcesContent":["import {\n\tIPublicTypeHelpTipConfig,\n\tIPublicTypeTipConfig,\n} from '@arvin-shu/microcode-types';\nimport { Tip } from './tip';\nimport { InfoIcon } from './info-icon';\n\nexport function HelpTip({\n\thelp,\n\tdirection = 'left',\n\tsize = 16,\n}: {\n\thelp: IPublicTypeHelpTipConfig;\n\tdirection?: IPublicTypeTipConfig['direction'];\n\tsize?: Number;\n}) {\n\tif (typeof help === 'string') {\n\t\treturn (\n\t\t\t<div>\n\t\t\t\t<div>\n\t\t\t\t\t<InfoIcon\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: `${size}px`,\n\t\t\t\t\t\t\theight: `${size}px`,\n\t\t\t\t\t\t\tverticalAlign: 'middle',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclass=\"mtc-help-tip\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<Tip direction={direction} children={help as any}></Tip>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (typeof help === 'object' && help.url) {\n\t\treturn (\n\t\t\t<div>\n\t\t\t\t<a href={help.url} target=\"_blank\" rel=\"noopener noreferrer\">\n\t\t\t\t\t<InfoIcon\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: `${size}px`,\n\t\t\t\t\t\t\theight: `${size}px`,\n\t\t\t\t\t\t\tverticalAlign: 'middle',\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</a>\n\t\t\t\t<Tip direction={direction} children={help as any}></Tip>\n\t\t\t</div>\n\t\t);\n\t}\n\treturn (\n\t\t<div>\n\t\t\t<InfoIcon\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: `${size}px`,\n\t\t\t\t\theight: `${size}px`,\n\t\t\t\t\tverticalAlign: 'middle',\n\t\t\t\t}}\n\t\t\t\tclass=\"mtc-help-tip\"\n\t\t\t/>\n\t\t\t<Tip direction={direction} children={help as any}></Tip>\n\t\t</div>\n\t);\n}\n"],"names":["HelpTip","help","direction","size","_createVNode","InfoIcon","width","height","verticalAlign","Tip","url"],"mappings":";;;;;AAOO,SAASA,OAAQ,CAAA;AAAA,EACvBC,IAAAA;AAAAA,EACAC,SAAY,GAAA,MAAA;AAAA,EACZC,IAAO,GAAA;AAKR,CAAG,EAAA;AACF,EAAI,IAAA,OAAOF,SAAS,QAAU,EAAA;AAC7B,IAAAG,OAAAA,WAAAA,CAAAA,OAAAA,IAAAA,EAAAA,CAAAA,YAAAA,KAAAA,EAAAA,IAAAA,EAAAA,CAAAA,WAAAA,CAAAC,QAAA,EAAA;AAAA,MAAA,OAIW,EAAA;AAAA,QACNC,KAAAA,EAAO,GAAGH,IAAI,CAAA,EAAA,CAAA;AAAA,QACdI,MAAAA,EAAQ,GAAGJ,IAAI,CAAA,EAAA,CAAA;AAAA,QACfK,aAAe,EAAA;AAAA,OAChB;AAAA,MAAC,OAAA,EAAA;AAAA,OAAAJ,IAAAA,CAAAA,CAAAA,CAAAA,EAAAA,YAAAK,GAAA,EAAA;AAAA,MAAA,WAKaP,EAAAA,SAAAA;AAAAA,MAAS,UAAYD,EAAAA;AAAAA,KAAI,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA;AAK5C,EAAA,IAAI,OAAOA,IAAAA,KAAS,QAAYA,IAAAA,IAAAA,CAAKS,GAAK,EAAA;AACzC,IAAA,OAAAN,0BAAAA,YAAA,GAAA,EAAA;AAAA,MAAA,QAEWH,IAAKS,CAAAA,GAAAA;AAAAA,MAAG,QAAA,EAAA,QAAA;AAAA,MAAA,KAAA,EAAA;AAAA,KAAA,EAAAN,CAAAA,WAAAA,CAAAC,QAAA,EAAA;AAAA,MAAA,OAER,EAAA;AAAA,QACNC,KAAAA,EAAO,GAAGH,IAAI,CAAA,EAAA,CAAA;AAAA,QACdI,MAAAA,EAAQ,GAAGJ,IAAI,CAAA,EAAA,CAAA;AAAA,QACfK,aAAe,EAAA;AAAA;AAChB,OAACJ,IAAAA,CAAAA,CAAAA,CAAAA,EAAAA,YAAAK,GAAA,EAAA;AAAA,MAAA,WAGaP,EAAAA,SAAAA;AAAAA,MAAS,UAAYD,EAAAA;AAAAA,KAAI,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA;AAI5C,EAAA,OAAAG,WAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAAA,YAAAC,QAAA,EAAA;AAAA,IAAA,OAGU,EAAA;AAAA,MACNC,KAAAA,EAAO,GAAGH,IAAI,CAAA,EAAA,CAAA;AAAA,MACdI,MAAAA,EAAQ,GAAGJ,IAAI,CAAA,EAAA,CAAA;AAAA,MACfK,aAAe,EAAA;AAAA,KAChB;AAAA,IAAC,OAAA,EAAA;AAAA,GAAAJ,EAAAA,IAAAA,CAAAA,EAAAA,WAAAA,CAAAK,GAAA,EAAA;AAAA,IAAA,WAGcP,EAAAA,SAAAA;AAAAA,IAAS,UAAYD,EAAAA;AAAAA,GAAI,EAAA,IAAA,CAAA,CAAA,CAAA;AAG5C;;;;"} |
| export * from './tip'; | ||
| export * from './tip-container'; | ||
| export * from './help-tips'; |
| export { Tip } from './tip.js'; | ||
| export { TipContainer, TipItem } from './tip-container.js'; | ||
| export { HelpTip } from './help-tips.js'; | ||
| "use strict"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"} |
| export declare const InfoIcon: import("vue").DefineComponent<{}, () => VNode, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; |
| import { defineComponent, createVNode } from 'vue'; | ||
| "use strict"; | ||
| const InfoIcon = /* @__PURE__ */ defineComponent({ | ||
| name: "InfoIcon", | ||
| setup() { | ||
| return () => createVNode("svg", { | ||
| "xmlns": "http://www.w3.org/2000/svg", | ||
| "width": "24", | ||
| "height": "24", | ||
| "viewBox": "0 0 24 24" | ||
| }, [createVNode("path", { | ||
| "fill": "currentColor", | ||
| "d": "M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8" | ||
| }, null)]); | ||
| } | ||
| }); | ||
| export { InfoIcon }; | ||
| //# sourceMappingURL=info-icon.js.map |
| {"version":3,"file":"info-icon.js","sources":["../../../../src/widgets/tip/info-icon.tsx"],"sourcesContent":["import { defineComponent } from 'vue';\n\nexport const InfoIcon = defineComponent({\n\tname: 'InfoIcon',\n\tsetup() {\n\t\treturn () => (\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\twidth=\"24\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\td=\"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t);\n\t},\n});\n"],"names":["InfoIcon","name","setup","_createVNode"],"mappings":";;;AAEO,MAAMA,2BAA2B,eAAA,CAAA;AAAA,EACvCC,IAAM,EAAA,UAAA;AAAA,EACNC,KAAQ,GAAA;AACP,IAAO,OAAA,MAAAC,YAAA,KAAA,EAAA;AAAA,MAAA,OAAA,EAAA,4BAAA;AAAA,MAAA,OAAA,EAAA,IAAA;AAAA,MAAA,QAAA,EAAA,IAAA;AAAA,MAAA,SAAA,EAAA;AAAA,KAAA,EAAA,CAAAA,WAAAA,CAAA,MAAA,EAAA;AAAA,MAAA,MAAA,EAAA,cAAA;AAAA,MAAA,GAAA,EAAA;AAAA,KAAA,EAYN,IAAA,CAAA,CAAA,CAAA;AAAA;AAEH,CAAC;;;;"} |
| export declare const TipContainer: import("vue").DefineComponent<{}, () => VNode, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; | ||
| export declare const TipItem: import("vue").DefineComponent<{}, () => VNode, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; |
| import { defineComponent, onMounted, onBeforeUnmount, createVNode, Teleport, ref, onUpdated } from 'vue'; | ||
| import { tipHandler } from './tip-handler.js'; | ||
| import { resolvePosition } from './utils.js'; | ||
| import { intl } from '../../inti/index.js'; | ||
| "use strict"; | ||
| const TipContainer = /* @__PURE__ */ defineComponent({ | ||
| name: "TipContainer", | ||
| setup() { | ||
| let dispose; | ||
| onMounted(() => { | ||
| const over = (e) => tipHandler.setTarget(e.target); | ||
| const down = () => tipHandler.hideImmediately(); | ||
| document.addEventListener("mouseover", over, false); | ||
| document.addEventListener("mousedown", down, true); | ||
| dispose = () => { | ||
| document.removeEventListener("mouseover", over, false); | ||
| document.removeEventListener("mousedown", down, true); | ||
| }; | ||
| }); | ||
| onBeforeUnmount(() => { | ||
| if (dispose) { | ||
| dispose(); | ||
| } | ||
| }); | ||
| return () => createVNode(Teleport, { | ||
| "to": "body" | ||
| }, { | ||
| default: () => [createVNode("div", { | ||
| "class": "mtc-tips-container" | ||
| }, [createVNode(TipItem, null, null)])] | ||
| }); | ||
| } | ||
| }); | ||
| const TipItem = /* @__PURE__ */ defineComponent({ | ||
| name: "TipItem", | ||
| setup() { | ||
| const dispose = tipHandler.onChange(() => { | ||
| updateTip(); | ||
| }); | ||
| const shell = ref(); | ||
| const updateTip = () => { | ||
| if (!shell.value) { | ||
| return; | ||
| } | ||
| const arrow = shell.value.querySelector(".mtc-arrow"); | ||
| shell.value.className = getClass(); | ||
| shell.value.style.cssText = ""; | ||
| arrow.style.cssText = ""; | ||
| clearTimer(); | ||
| const { | ||
| tip | ||
| } = tipHandler; | ||
| if (!tip) { | ||
| return; | ||
| } | ||
| const { | ||
| target, | ||
| direction, | ||
| children | ||
| } = tip; | ||
| text.value = children; | ||
| const targetRect = target.getBoundingClientRect(); | ||
| if (targetRect.width === 0 || targetRect.height === 0) { | ||
| return; | ||
| } | ||
| const shellRect = shell.value.getBoundingClientRect(); | ||
| const bounds = { | ||
| left: 1, | ||
| top: 1, | ||
| right: document.documentElement.clientWidth - 1, | ||
| bottom: document.documentElement.clientHeight - 1 | ||
| }; | ||
| const arrowRect = arrow.getBoundingClientRect(); | ||
| const { | ||
| dir, | ||
| left, | ||
| top, | ||
| arrowLeft, | ||
| arrowTop | ||
| } = resolvePosition(shellRect, targetRect, arrowRect, bounds, direction); | ||
| shell.value.classList.add(`mtc-align-${dir}`); | ||
| shell.value.style.top = `${top}px`; | ||
| shell.value.style.left = `${left}px`; | ||
| shell.value.style.width = `${shellRect.width}px`; | ||
| shell.value.style.height = `${shellRect.height}px`; | ||
| if (dir === "top" || dir === "bottom") { | ||
| arrow.style.left = `${arrowLeft}px`; | ||
| } else { | ||
| arrow.style.top = `${arrowTop}px`; | ||
| } | ||
| timer = window.setTimeout(() => { | ||
| if (shell.value) { | ||
| shell.value.classList.add("mtc-visible-animate"); | ||
| shell.value.style.transform = "none"; | ||
| } | ||
| }, 10); | ||
| }; | ||
| onMounted(() => { | ||
| updateTip(); | ||
| }); | ||
| onUpdated(() => { | ||
| updateTip(); | ||
| }); | ||
| onBeforeUnmount(() => { | ||
| if (dispose) { | ||
| dispose(); | ||
| } | ||
| clearTimer(); | ||
| }); | ||
| let timer = null; | ||
| function clearTimer() { | ||
| if (timer) { | ||
| clearTimeout(timer); | ||
| timer = null; | ||
| } | ||
| } | ||
| function getClass() { | ||
| const classes = ["mtc-tip"]; | ||
| if (tipHandler.tip?.className) { | ||
| classes.push(tipHandler.tip?.className); | ||
| } | ||
| if (tipHandler.tip && tipHandler.tip.theme) { | ||
| classes.push(`mtc-theme-${tipHandler.tip.theme}`); | ||
| } | ||
| return classes.join(" "); | ||
| } | ||
| const text = ref(); | ||
| return () => createVNode("div", { | ||
| "class": getClass(), | ||
| "ref": shell | ||
| }, [createVNode("i", { | ||
| "class": "mtc-arrow" | ||
| }, null), createVNode("div", { | ||
| "class": "mtc-tip-content" | ||
| }, [intl(text.value)])]); | ||
| } | ||
| }); | ||
| export { TipContainer, TipItem }; | ||
| //# sourceMappingURL=tip-container.js.map |
| {"version":3,"file":"tip-container.js","sources":["../../../../src/widgets/tip/tip-container.tsx"],"sourcesContent":["import {\n\tdefineComponent,\n\tonBeforeUnmount,\n\tonMounted,\n\tonUpdated,\n\tref,\n\tTeleport,\n} from 'vue';\nimport { tipHandler } from './tip-handler';\nimport { resolvePosition } from './utils';\nimport { intl } from '../../inti';\n\nexport const TipContainer = defineComponent({\n\tname: 'TipContainer',\n\tsetup() {\n\t\tlet dispose: (() => void) | undefined;\n\n\t\tonMounted(() => {\n\t\t\tconst over = (e: MouseEvent) => tipHandler.setTarget(e.target as any);\n\t\t\tconst down = () => tipHandler.hideImmediately();\n\n\t\t\tdocument.addEventListener('mouseover', over, false);\n\t\t\tdocument.addEventListener('mousedown', down, true);\n\n\t\t\tdispose = () => {\n\t\t\t\tdocument.removeEventListener('mouseover', over, false);\n\t\t\t\tdocument.removeEventListener('mousedown', down, true);\n\t\t\t};\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tif (dispose) {\n\t\t\t\tdispose();\n\t\t\t}\n\t\t});\n\t\treturn () => (\n\t\t\t<Teleport to=\"body\">\n\t\t\t\t<div class=\"mtc-tips-container\">\n\t\t\t\t\t<TipItem></TipItem>\n\t\t\t\t</div>\n\t\t\t</Teleport>\n\t\t);\n\t},\n});\n\nexport const TipItem = defineComponent({\n\tname: 'TipItem',\n\tsetup() {\n\t\tconst dispose = tipHandler.onChange(() => {\n\t\t\tupdateTip();\n\t\t});\n\n\t\tconst shell = ref<HTMLDivElement>();\n\n\t\tconst updateTip = () => {\n\t\t\tif (!shell.value) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst arrow = shell.value.querySelector('.mtc-arrow') as HTMLElement;\n\n\t\t\tshell.value.className = getClass();\n\t\t\tshell.value.style.cssText = '';\n\t\t\tarrow.style.cssText = '';\n\t\t\tclearTimer();\n\n\t\t\tconst { tip } = tipHandler;\n\t\t\tif (!tip) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { target, direction, children } = tip;\n\t\t\ttext.value = children;\n\t\t\tconst targetRect = target.getBoundingClientRect();\n\n\t\t\tif (targetRect.width === 0 || targetRect.height === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst shellRect = shell.value.getBoundingClientRect();\n\t\t\tconst bounds = {\n\t\t\t\tleft: 1,\n\t\t\t\ttop: 1,\n\t\t\t\tright: document.documentElement.clientWidth - 1,\n\t\t\t\tbottom: document.documentElement.clientHeight - 1,\n\t\t\t};\n\t\t\tconst arrowRect = arrow.getBoundingClientRect();\n\t\t\tconst { dir, left, top, arrowLeft, arrowTop } = resolvePosition(\n\t\t\t\tshellRect,\n\t\t\t\ttargetRect,\n\t\t\t\tarrowRect,\n\t\t\t\tbounds,\n\t\t\t\tdirection\n\t\t\t);\n\n\t\t\tshell.value.classList.add(`mtc-align-${dir}`);\n\t\t\tshell.value.style.top = `${top}px`;\n\t\t\tshell.value.style.left = `${left}px`;\n\t\t\tshell.value.style.width = `${shellRect.width}px`;\n\t\t\tshell.value.style.height = `${shellRect.height}px`;\n\n\t\t\tif (dir === 'top' || dir === 'bottom') {\n\t\t\t\tarrow.style.left = `${arrowLeft}px`;\n\t\t\t} else {\n\t\t\t\tarrow.style.top = `${arrowTop}px`;\n\t\t\t}\n\n\t\t\ttimer = window.setTimeout(() => {\n\t\t\t\tif (shell.value) {\n\t\t\t\t\tshell.value.classList.add('mtc-visible-animate');\n\t\t\t\t\tshell.value.style.transform = 'none';\n\t\t\t\t}\n\t\t\t}, 10);\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tupdateTip();\n\t\t});\n\n\t\tonUpdated(() => {\n\t\t\tupdateTip();\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tif (dispose) {\n\t\t\t\tdispose();\n\t\t\t}\n\t\t\tclearTimer();\n\t\t});\n\n\t\tlet timer: number | null = null;\n\n\t\tfunction clearTimer() {\n\t\t\tif (timer) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimer = null;\n\t\t\t}\n\t\t}\n\n\t\tfunction getClass() {\n\t\t\tconst classes = ['mtc-tip'];\n\t\t\tif (tipHandler.tip?.className) {\n\t\t\t\tclasses.push(tipHandler.tip?.className);\n\t\t\t}\n\t\t\tif (tipHandler.tip && tipHandler.tip.theme) {\n\t\t\t\tclasses.push(`mtc-theme-${tipHandler.tip.theme}`);\n\t\t\t}\n\t\t\treturn classes.join(' ');\n\t\t}\n\n\t\tconst text = ref();\n\t\treturn () => (\n\t\t\t<div class={getClass()} ref={shell}>\n\t\t\t\t<i class=\"mtc-arrow\" />\n\t\t\t\t<div class=\"mtc-tip-content\">{intl(text.value)}</div>\n\t\t\t</div>\n\t\t);\n\t},\n});\n"],"names":["TipContainer","name","setup","dispose","onMounted","over","e","tipHandler","setTarget","target","down","hideImmediately","document","addEventListener","removeEventListener","onBeforeUnmount","_createVNode","Teleport","default","TipItem","onChange","updateTip","shell","ref","value","arrow","querySelector","className","getClass","style","cssText","clearTimer","tip","direction","children","text","targetRect","getBoundingClientRect","width","height","shellRect","bounds","left","top","right","documentElement","clientWidth","bottom","clientHeight","arrowRect","dir","arrowLeft","arrowTop","resolvePosition","classList","add","timer","window","setTimeout","transform","onUpdated","clearTimeout","classes","push","theme","join","intl"],"mappings":"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"} |
| import { IPublicTypeTipConfig } from '@arvin-shu/microcode-types'; | ||
| export interface TipOptions extends IPublicTypeTipConfig { | ||
| target: HTMLElement; | ||
| } | ||
| declare class TipHandler { | ||
| tip: TipOptions | null; | ||
| private showDelay; | ||
| private hideDelay; | ||
| private emitter; | ||
| setTarget(target: HTMLElement): void; | ||
| hideImmediately(): void; | ||
| onChange(func: () => void): () => void; | ||
| } | ||
| export declare const tipHandler: TipHandler; | ||
| export declare function postTip(id: string, props: IPublicTypeTipConfig | null): void; | ||
| export {}; |
| import { createModuleEventBus } from '../../event-bus.js'; | ||
| "use strict"; | ||
| class TipHandler { | ||
| tip = null; | ||
| showDelay = null; | ||
| hideDelay = null; | ||
| emitter = createModuleEventBus("TipHandler"); | ||
| setTarget(target) { | ||
| const tip = findTip(target); | ||
| if (tip) { | ||
| if (this.tip) { | ||
| if (this.tip.target === tip.target) { | ||
| this.tip = tip; | ||
| return; | ||
| } | ||
| if (this.showDelay) { | ||
| clearTimeout(this.showDelay); | ||
| this.showDelay = null; | ||
| this.tip = null; | ||
| } else { | ||
| if (this.hideDelay) { | ||
| clearTimeout(this.hideDelay); | ||
| this.hideDelay = null; | ||
| } | ||
| this.tip = tip; | ||
| this.emitter.emit("tipchange"); | ||
| return; | ||
| } | ||
| } | ||
| this.tip = tip; | ||
| if (this.hideDelay) { | ||
| clearTimeout(this.hideDelay); | ||
| this.hideDelay = null; | ||
| this.emitter.emit("tipchange"); | ||
| } else { | ||
| this.showDelay = setTimeout(() => { | ||
| this.showDelay = null; | ||
| this.emitter.emit("tipchange"); | ||
| }, 350); | ||
| } | ||
| } else { | ||
| if (this.showDelay) { | ||
| clearTimeout(this.showDelay); | ||
| this.showDelay = null; | ||
| } else { | ||
| this.hideDelay = setTimeout(() => { | ||
| this.hideDelay = null; | ||
| }, 100); | ||
| } | ||
| this.tip = null; | ||
| this.emitter.emit("tipchange"); | ||
| } | ||
| } | ||
| hideImmediately() { | ||
| if (this.hideDelay) { | ||
| clearTimeout(this.hideDelay); | ||
| this.hideDelay = null; | ||
| } | ||
| if (this.showDelay) { | ||
| clearTimeout(this.showDelay); | ||
| this.showDelay = null; | ||
| } | ||
| this.tip = null; | ||
| this.emitter.emit("tipchange"); | ||
| } | ||
| onChange(func) { | ||
| this.emitter.on("tipchange", func); | ||
| return () => { | ||
| this.emitter.removeListener("tipchange", func); | ||
| }; | ||
| } | ||
| } | ||
| const tipHandler = new TipHandler(); | ||
| function findTip(target) { | ||
| if (!target) { | ||
| return null; | ||
| } | ||
| let loopupLimit = 10; | ||
| while (target && loopupLimit-- > 0) { | ||
| if (target.dataset && target.dataset.tip) { | ||
| return { | ||
| children: target.dataset.tip, | ||
| direction: target.dataset.direction || target.dataset.dir, | ||
| theme: target.dataset.theme, | ||
| target | ||
| }; | ||
| } | ||
| let child = target.lastElementChild; | ||
| while (child) { | ||
| if (child.dataset && child.dataset.role === "tip") { | ||
| const { tipId } = child.dataset; | ||
| if (!tipId) { | ||
| return null; | ||
| } | ||
| const tipProps = tipsMap.get(tipId); | ||
| if (!tipProps) { | ||
| return null; | ||
| } | ||
| return { | ||
| ...tipProps, | ||
| target | ||
| }; | ||
| } | ||
| child = child.previousElementSibling; | ||
| } | ||
| target = target.parentNode; | ||
| } | ||
| return null; | ||
| } | ||
| const tipsMap = /* @__PURE__ */ new Map(); | ||
| function postTip(id, props) { | ||
| if (props) { | ||
| tipsMap.set(id, props); | ||
| } else { | ||
| tipsMap.delete(id); | ||
| } | ||
| } | ||
| export { postTip, tipHandler }; | ||
| //# sourceMappingURL=tip-handler.js.map |
| {"version":3,"file":"tip-handler.js","sources":["../../../../src/widgets/tip/tip-handler.ts"],"sourcesContent":["import { IPublicTypeTipConfig } from '@arvin-shu/microcode-types';\nimport { createModuleEventBus, IEventBus } from '../../event-bus';\n\nexport interface TipOptions extends IPublicTypeTipConfig {\n\ttarget: HTMLElement;\n}\n\nclass TipHandler {\n\ttip: TipOptions | null = null;\n\n\tprivate showDelay: number | null = null;\n\n\tprivate hideDelay: number | null = null;\n\n\tprivate emitter: IEventBus = createModuleEventBus('TipHandler');\n\n\tsetTarget(target: HTMLElement) {\n\t\tconst tip = findTip(target);\n\t\tif (tip) {\n\t\t\tif (this.tip) {\n\t\t\t\t// the some target should return\n\t\t\t\tif ((this.tip as any).target === (tip as any).target) {\n\t\t\t\t\tthis.tip = tip;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// not show already, reset show delay\n\t\t\t\tif (this.showDelay) {\n\t\t\t\t\tclearTimeout(this.showDelay);\n\t\t\t\t\tthis.showDelay = null;\n\t\t\t\t\tthis.tip = null;\n\t\t\t\t} else {\n\t\t\t\t\tif (this.hideDelay) {\n\t\t\t\t\t\tclearTimeout(this.hideDelay);\n\t\t\t\t\t\tthis.hideDelay = null;\n\t\t\t\t\t}\n\t\t\t\t\tthis.tip = tip;\n\t\t\t\t\tthis.emitter.emit('tipchange');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.tip = tip;\n\t\t\tif (this.hideDelay) {\n\t\t\t\tclearTimeout(this.hideDelay);\n\t\t\t\tthis.hideDelay = null;\n\t\t\t\tthis.emitter.emit('tipchange');\n\t\t\t} else {\n\t\t\t\tthis.showDelay = setTimeout(() => {\n\t\t\t\t\tthis.showDelay = null;\n\t\t\t\t\tthis.emitter.emit('tipchange');\n\t\t\t\t}, 350) as any;\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.showDelay) {\n\t\t\t\tclearTimeout(this.showDelay);\n\t\t\t\tthis.showDelay = null;\n\t\t\t} else {\n\t\t\t\tthis.hideDelay = setTimeout(() => {\n\t\t\t\t\tthis.hideDelay = null;\n\t\t\t\t}, 100) as any;\n\t\t\t}\n\t\t\tthis.tip = null;\n\n\t\t\tthis.emitter.emit('tipchange');\n\t\t}\n\t}\n\n\thideImmediately() {\n\t\tif (this.hideDelay) {\n\t\t\tclearTimeout(this.hideDelay);\n\t\t\tthis.hideDelay = null;\n\t\t}\n\t\tif (this.showDelay) {\n\t\t\tclearTimeout(this.showDelay);\n\t\t\tthis.showDelay = null;\n\t\t}\n\t\tthis.tip = null;\n\t\tthis.emitter.emit('tipchange');\n\t}\n\n\tonChange(func: () => void) {\n\t\tthis.emitter.on('tipchange', func);\n\t\treturn () => {\n\t\t\tthis.emitter.removeListener('tipchange', func);\n\t\t};\n\t}\n}\n\nexport const tipHandler = new TipHandler();\n\nfunction findTip(target: HTMLElement | null): TipOptions | null {\n\tif (!target) {\n\t\treturn null;\n\t}\n\t// optimize deep finding on mouseover\n\tlet loopupLimit = 10;\n\twhile (target && loopupLimit-- > 0) {\n\t\t// get tip from target node\n\t\tif (target.dataset && target.dataset.tip) {\n\t\t\treturn {\n\t\t\t\tchildren: target.dataset.tip as any,\n\t\t\t\tdirection: (target.dataset.direction || target.dataset.dir) as any,\n\t\t\t\ttheme: target.dataset.theme,\n\t\t\t\ttarget,\n\t\t\t};\n\t\t}\n\n\t\t// or get tip from child nodes\n\t\tlet child: HTMLElement | null = target.lastElementChild as HTMLElement;\n\n\t\twhile (child) {\n\t\t\tif (child.dataset && child.dataset.role === 'tip') {\n\t\t\t\tconst { tipId } = child.dataset;\n\t\t\t\tif (!tipId) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst tipProps = tipsMap.get(tipId);\n\n\t\t\t\tif (!tipProps) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...tipProps,\n\t\t\t\t\ttarget,\n\t\t\t\t};\n\t\t\t}\n\t\t\tchild = child.previousElementSibling as HTMLElement;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n\n\treturn null;\n}\n\nconst tipsMap = new Map<string, IPublicTypeTipConfig>();\nexport function postTip(id: string, props: IPublicTypeTipConfig | null) {\n\tif (props) {\n\t\ttipsMap.set(id, props);\n\t} else {\n\t\ttipsMap.delete(id);\n\t}\n}\n"],"names":[],"mappings":"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"} |
| import { IPublicTypeI18nData } from '@arvin-shu/microcode-types'; | ||
| import { VNode } from 'vue'; | ||
| export declare const Tip: import("vue").DefineComponent<{ | ||
| className?: string | undefined; | ||
| children?: (IPublicTypeI18nData | VNode | string) | undefined; | ||
| theme?: string | undefined; | ||
| direction?: ("top" | "bottom" | "left" | "right") | undefined; | ||
| }, () => VNode, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{ | ||
| className?: string | undefined; | ||
| children?: (IPublicTypeI18nData | VNode | string) | undefined; | ||
| theme?: string | undefined; | ||
| direction?: ("top" | "bottom" | "left" | "right") | undefined; | ||
| }> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; |
| import { defineComponent, onUnmounted, createVNode } from 'vue'; | ||
| import { uniqueId } from '@arvin-shu/microcode-utils'; | ||
| import { postTip } from './tip-handler.js'; | ||
| "use strict"; | ||
| const Tip = /* @__PURE__ */ defineComponent({ | ||
| name: "Tip", | ||
| props: { | ||
| className: String, | ||
| children: [Object, String], | ||
| theme: String, | ||
| direction: String | ||
| }, | ||
| setup(props, { | ||
| slots | ||
| }) { | ||
| const id = uniqueId("tips$"); | ||
| onUnmounted(() => { | ||
| postTip(id, null); | ||
| }); | ||
| return () => { | ||
| postTip(id, { | ||
| ...props, | ||
| children: props.children ? props.children : slots.default?.() | ||
| }); | ||
| return createVNode("meta", { | ||
| "data-role": "tip", | ||
| "data-tip-id": id | ||
| }, null); | ||
| }; | ||
| } | ||
| }); | ||
| export { Tip }; | ||
| //# sourceMappingURL=tip.js.map |
| {"version":3,"file":"tip.js","sources":["../../../../src/widgets/tip/tip.tsx"],"sourcesContent":["import {\n\tIPublicTypeI18nData,\n\tIPublicTypeTipConfig,\n} from '@arvin-shu/microcode-types';\nimport { uniqueId } from '@arvin-shu/microcode-utils';\nimport { defineComponent, onUnmounted, PropType, VNode } from 'vue';\nimport { postTip } from './tip-handler';\n\nexport const Tip = defineComponent({\n\tname: 'Tip',\n\tprops: {\n\t\tclassName: String,\n\t\tchildren: [Object, String] as PropType<\n\t\t\tIPublicTypeI18nData | VNode | string\n\t\t>,\n\t\ttheme: String,\n\t\tdirection: String as PropType<'top' | 'bottom' | 'left' | 'right'>,\n\t},\n\tsetup(props: IPublicTypeTipConfig, { slots }) {\n\t\tconst id = uniqueId('tips$');\n\t\tonUnmounted(() => {\n\t\t\tpostTip(id, null);\n\t\t});\n\n\t\treturn () => {\n\t\t\tpostTip(id, {\n\t\t\t\t...props,\n\t\t\t\tchildren: props.children ? props.children : (slots.default?.() as any),\n\t\t\t});\n\t\t\treturn <meta data-role=\"tip\" data-tip-id={id}></meta>;\n\t\t};\n\t},\n});\n"],"names":["Tip","name","props","className","String","children","Object","theme","direction","setup","slots","id","uniqueId","onUnmounted","postTip","default","_createVNode"],"mappings":";;;;;AAQO,MAAMA,sBAAsB,eAAA,CAAA;AAAA,EAClCC,IAAM,EAAA,KAAA;AAAA,EACNC,KAAO,EAAA;AAAA,IACNC,SAAWC,EAAAA,MAAAA;AAAAA,IACXC,QAAAA,EAAU,CAACC,MAAAA,EAAQF,MAAM,CAAA;AAAA,IAGzBG,KAAOH,EAAAA,MAAAA;AAAAA,IACPI,SAAWJ,EAAAA;AAAAA,GACZ;AAAA,EACAK,MAAMP,KAA6B,EAAA;AAAA,IAAEQ;AAAAA,GAAS,EAAA;AAC7C,IAAMC,MAAAA,EAAAA,GAAKC,SAAS,OAAO,CAAA;AAC3BC,IAAAA,WAAAA,CAAY,MAAM;AACjBC,MAAAA,OAAAA,CAAQH,IAAI,IAAI,CAAA;AAAA,KAChB,CAAA;AAED,IAAA,OAAO,MAAM;AACZG,MAAAA,OAAAA,CAAQH,EAAI,EAAA;AAAA,QACX,GAAGT,KAAAA;AAAAA,QACHG,UAAUH,KAAMG,CAAAA,QAAAA,GAAWH,KAAMG,CAAAA,QAAAA,GAAYK,MAAMK,OAAU;AAAA,OAC7D,CAAA;AACD,MAAA,OAAAC,YAAA,MAAA,EAAA;AAAA,QAAA,WAAA,EAAA,KAAA;AAAA,QAAA,aAA0CL,EAAAA;AAAAA,SAAE,IAAA,CAAA;AAAA,KAC7C;AAAA;AAEF,CAAC;;;;"} |
| export declare function resolvePosition(popup: any, target: any, arrow: any, bounds: any, prefer: any): { | ||
| dir: any; | ||
| left: any; | ||
| top: any; | ||
| arrowLeft: number | undefined; | ||
| arrowTop: number | undefined; | ||
| }; | ||
| export declare function resolveRelativePosition(align: any, popup: any, bounds: any): { | ||
| top: string; | ||
| left: string; | ||
| }; |
| import { isNaN } from 'lodash-es'; | ||
| "use strict"; | ||
| function resolveEdge(popup, target, arrow, bounds) { | ||
| const sx = arrow.width > target.width ? (arrow.width - target.width) / 2 : 0; | ||
| const sy = arrow.width > target.height ? (arrow.width - target.height) / 2 : 0; | ||
| const top = Math.max( | ||
| target.top - popup.height + arrow.width - sy, | ||
| bounds.top | ||
| ); | ||
| const right = Math.min( | ||
| target.right + popup.width - arrow.width + sx, | ||
| bounds.right | ||
| ); | ||
| const bottom = Math.min( | ||
| target.bottom + popup.height - arrow.width + sy, | ||
| bounds.bottom | ||
| ); | ||
| const left = Math.max( | ||
| target.left - popup.width + arrow.width - sx, | ||
| bounds.left | ||
| ); | ||
| return { top, right, bottom, left }; | ||
| } | ||
| function resolveDirection(popup, target, edge, bounds, prefers) { | ||
| if (prefers.forceDirection) { | ||
| return prefers.dir; | ||
| } | ||
| const extendWidth = popup.width + popup.extraOffset; | ||
| const extendHeight = popup.height + popup.extraOffset; | ||
| const SY = popup.width * extendHeight; | ||
| const SX = popup.height * extendWidth; | ||
| const mw = Math.min(edge.right - edge.left, popup.width); | ||
| const mh = Math.min(edge.bottom - edge.top, popup.height); | ||
| const mat = { | ||
| top: () => { | ||
| const s = mw * Math.min(target.top - bounds.top, extendHeight); | ||
| return { s, enough: s >= SY }; | ||
| }, | ||
| bottom: () => { | ||
| const s = mw * Math.min(bounds.bottom - target.bottom, extendHeight); | ||
| return { s, enough: s >= SY }; | ||
| }, | ||
| left: () => { | ||
| const s = mh * Math.min(target.left - bounds.left, extendWidth); | ||
| return { s, enough: s >= SX }; | ||
| }, | ||
| right: () => { | ||
| const s = mh * Math.min(bounds.right - target.right, extendWidth); | ||
| return { s, enough: s >= SX }; | ||
| } | ||
| }; | ||
| const orders = ["top", "right", "bottom", "left"]; | ||
| if (prefers.dir) { | ||
| const i = orders.indexOf(prefers.dir); | ||
| if (i > -1) { | ||
| orders.splice(i, 1); | ||
| orders.unshift(prefers.dir); | ||
| } | ||
| } | ||
| let ms = 0; | ||
| let prefer = orders[0]; | ||
| for (let i = 0, l = orders.length; i < l; i++) { | ||
| const dir = orders[i]; | ||
| const { s, enough } = mat[dir](); | ||
| if (enough) { | ||
| return dir; | ||
| } | ||
| if (s > ms) { | ||
| ms = s; | ||
| prefer = dir; | ||
| } | ||
| } | ||
| return prefer; | ||
| } | ||
| function resolvePrefer(prefer, targetRect, bounds) { | ||
| if (!prefer) { | ||
| if (targetRect.left - bounds.left < 10) { | ||
| return { dir: "right" }; | ||
| } | ||
| if (targetRect.top - bounds.top < 10) { | ||
| return { dir: "bottom" }; | ||
| } | ||
| if (bounds.bottom - targetRect.bottom < 10) { | ||
| return { dir: "top" }; | ||
| } | ||
| if (bounds.right - targetRect.right < 10) { | ||
| return { dir: "left" }; | ||
| } | ||
| return {}; | ||
| } | ||
| const force = prefer[0] === "!"; | ||
| if (force) { | ||
| prefer = prefer.slice(1); | ||
| } | ||
| let [dir, offset] = prefer.split(/\s+/); | ||
| let forceDirection = false; | ||
| let forceOffset = false; | ||
| if (dir === "center") { | ||
| dir = "auto"; | ||
| if (!offset) { | ||
| offset = "center"; | ||
| } | ||
| } | ||
| if (force) { | ||
| if (dir && dir !== "auto") { | ||
| forceDirection = true; | ||
| } | ||
| if (offset && offset !== "auto") { | ||
| forceOffset = true; | ||
| } | ||
| } | ||
| return { dir, offset, forceDirection, forceOffset }; | ||
| } | ||
| function resolvePosition(popup, target, arrow, bounds, prefer) { | ||
| popup = { | ||
| extraOffset: arrow.height, | ||
| top: popup.top, | ||
| right: popup.right, | ||
| left: popup.left, | ||
| bottom: popup.bottom, | ||
| height: popup.height, | ||
| width: popup.width | ||
| }; | ||
| const prefers = resolvePrefer(prefer, target, bounds); | ||
| const edge = resolveEdge(popup, target, arrow, bounds); | ||
| const dir = resolveDirection(popup, target, edge, bounds, prefers); | ||
| let top; | ||
| let left; | ||
| let arrowTop; | ||
| let arrowLeft; | ||
| if (dir === "top" || dir === "bottom") { | ||
| if (dir === "top") { | ||
| top = target.top - popup.extraOffset - popup.height; | ||
| } else { | ||
| top = target.bottom + popup.extraOffset; | ||
| } | ||
| const offset = arrow.width > target.width ? (arrow.width - target.width) / 2 : 0; | ||
| const minLeft = target.left + arrow.width - offset - popup.width; | ||
| const maxLeft = target.right - arrow.width + offset; | ||
| const centerLeft = target.left - (popup.width - target.width) / 2; | ||
| if (prefers.offset === "left") { | ||
| left = minLeft; | ||
| } else if (prefers.offset === "right") { | ||
| left = maxLeft; | ||
| } else { | ||
| left = centerLeft; | ||
| } | ||
| if (!prefers.forceOffset) { | ||
| left = Math.max(Math.min(edge.right - popup.width, left), minLeft); | ||
| left = Math.min(Math.max(edge.left, left), maxLeft); | ||
| } | ||
| arrowLeft = Math.min( | ||
| popup.width - arrow.width, | ||
| Math.max(target.left - (arrow.width - target.width) / 2 - left, 0) | ||
| ); | ||
| } else { | ||
| if (dir === "left") { | ||
| left = target.left - popup.extraOffset - popup.width; | ||
| } else { | ||
| left = target.right + popup.extraOffset; | ||
| } | ||
| const offset = arrow.width > target.height ? (arrow.width - target.height) / 2 : 0; | ||
| const minTop = target.top + arrow.width - offset - popup.height; | ||
| const maxTop = target.bottom - arrow.width + offset; | ||
| const centerTop = target.top - (popup.height - target.height) / 2; | ||
| if (prefers.offset === "top") { | ||
| top = minTop; | ||
| } else if (prefers.offset === "bottom") { | ||
| top = maxTop; | ||
| } else { | ||
| top = centerTop; | ||
| } | ||
| if (!prefers.forceOffset) { | ||
| top = Math.max(Math.min(edge.bottom - popup.height, top), minTop); | ||
| top = Math.min(Math.max(edge.top, top), maxTop); | ||
| } | ||
| arrowTop = Math.min( | ||
| popup.height - arrow.height, | ||
| Math.max(target.top - (arrow.width - target.height) / 2 - top, 0) | ||
| ); | ||
| } | ||
| return { dir, left, top, arrowLeft, arrowTop }; | ||
| } | ||
| const percentPresets = { | ||
| right: 1, | ||
| left: 0, | ||
| top: 0, | ||
| bottom: 1, | ||
| center: 0.5 | ||
| }; | ||
| function isPercent(val) { | ||
| return /^[\d.]+%$/.test(val); | ||
| } | ||
| function resolveRelativeValue(val, offset, total) { | ||
| if (!val) { | ||
| val = 0; | ||
| } else if (isPercent(val)) { | ||
| val = parseFloat(val) / 100 * total; | ||
| } else if (percentPresets.hasOwnProperty(val)) { | ||
| val = percentPresets[val] * total; | ||
| } else { | ||
| val = parseFloat(val); | ||
| if (isNaN(val)) { | ||
| val = 0; | ||
| } | ||
| } | ||
| return `${val + offset}px`; | ||
| } | ||
| function resolveRelativePosition(align, popup, bounds) { | ||
| if (!align) { | ||
| return { | ||
| top: "38.2%", | ||
| left: "calc(50% - 110px)" | ||
| }; | ||
| } | ||
| let [xAlign, yAlign] = align.trim().split(/\s+/); | ||
| if (xAlign === "top" || xAlign === "bottom" || yAlign === "left" || yAlign === "right") { | ||
| const tmp = xAlign; | ||
| xAlign = yAlign; | ||
| yAlign = tmp; | ||
| } | ||
| if (xAlign === "center" && !yAlign) { | ||
| yAlign = "center"; | ||
| } | ||
| return { | ||
| left: resolveRelativeValue( | ||
| xAlign, | ||
| 0, | ||
| bounds.right - bounds.left - popup.width | ||
| ), | ||
| top: resolveRelativeValue( | ||
| yAlign, | ||
| 0, | ||
| bounds.bottom - bounds.top - popup.height | ||
| ) | ||
| }; | ||
| } | ||
| export { resolvePosition, resolveRelativePosition }; | ||
| //# sourceMappingURL=utils.js.map |
| {"version":3,"file":"utils.js","sources":["../../../../src/widgets/tip/utils.ts"],"sourcesContent":["import { isNaN } from 'lodash-es';\n\nfunction resolveEdge(popup: any, target: any, arrow: any, bounds: any) {\n\tconst sx = arrow.width > target.width ? (arrow.width - target.width) / 2 : 0;\n\tconst sy =\n\t\tarrow.width > target.height ? (arrow.width - target.height) / 2 : 0;\n\n\tconst top = Math.max(\n\t\ttarget.top - popup.height + arrow.width - sy,\n\t\tbounds.top\n\t);\n\tconst right = Math.min(\n\t\ttarget.right + popup.width - arrow.width + sx,\n\t\tbounds.right\n\t);\n\tconst bottom = Math.min(\n\t\ttarget.bottom + popup.height - arrow.width + sy,\n\t\tbounds.bottom\n\t);\n\tconst left = Math.max(\n\t\ttarget.left - popup.width + arrow.width - sx,\n\t\tbounds.left\n\t);\n\n\treturn { top, right, bottom, left };\n}\n\nfunction resolveDirection(\n\tpopup: any,\n\ttarget: any,\n\tedge: any,\n\tbounds: any,\n\tprefers: any\n) {\n\tif (prefers.forceDirection) {\n\t\treturn prefers.dir;\n\t}\n\tconst extendWidth = popup.width + popup.extraOffset;\n\tconst extendHeight = popup.height + popup.extraOffset;\n\tconst SY = popup.width * extendHeight;\n\tconst SX = popup.height * extendWidth;\n\tconst mw = Math.min(edge.right - edge.left, popup.width);\n\tconst mh = Math.min(edge.bottom - edge.top, popup.height);\n\n\tconst mat: any = {\n\t\ttop: () => {\n\t\t\tconst s = mw * Math.min(target.top - bounds.top, extendHeight);\n\t\t\treturn { s, enough: s >= SY };\n\t\t},\n\t\tbottom: () => {\n\t\t\tconst s = mw * Math.min(bounds.bottom - target.bottom, extendHeight);\n\t\t\treturn { s, enough: s >= SY };\n\t\t},\n\t\tleft: () => {\n\t\t\tconst s = mh * Math.min(target.left - bounds.left, extendWidth);\n\t\t\treturn { s, enough: s >= SX };\n\t\t},\n\t\tright: () => {\n\t\t\tconst s = mh * Math.min(bounds.right - target.right, extendWidth);\n\t\t\treturn { s, enough: s >= SX };\n\t\t},\n\t};\n\n\tconst orders = ['top', 'right', 'bottom', 'left'];\n\tif (prefers.dir) {\n\t\tconst i = orders.indexOf(prefers.dir);\n\t\tif (i > -1) {\n\t\t\torders.splice(i, 1);\n\t\t\torders.unshift(prefers.dir);\n\t\t}\n\t}\n\tlet ms = 0;\n\tlet prefer = orders[0];\n\tfor (let i = 0, l = orders.length; i < l; i++) {\n\t\tconst dir = orders[i];\n\t\tconst { s, enough } = mat[dir]();\n\t\tif (enough) {\n\t\t\treturn dir;\n\t\t}\n\t\tif (s > ms) {\n\t\t\tms = s;\n\t\t\tprefer = dir;\n\t\t}\n\t}\n\treturn prefer;\n}\n\nfunction resolvePrefer(prefer: any, targetRect: any, bounds: any) {\n\tif (!prefer) {\n\t\tif (targetRect.left - bounds.left < 10) {\n\t\t\treturn { dir: 'right' };\n\t\t}\n\t\tif (targetRect.top - bounds.top < 10) {\n\t\t\treturn { dir: 'bottom' };\n\t\t}\n\t\tif (bounds.bottom - targetRect.bottom < 10) {\n\t\t\treturn { dir: 'top' };\n\t\t}\n\t\tif (bounds.right - targetRect.right < 10) {\n\t\t\treturn { dir: 'left' };\n\t\t}\n\t\treturn {};\n\t}\n\tconst force = prefer[0] === '!';\n\tif (force) {\n\t\tprefer = prefer.slice(1);\n\t}\n\tlet [dir, offset] = prefer.split(/\\s+/);\n\tlet forceDirection = false;\n\tlet forceOffset = false;\n\tif (dir === 'center') {\n\t\tdir = 'auto';\n\t\tif (!offset) {\n\t\t\toffset = 'center';\n\t\t}\n\t}\n\n\tif (force) {\n\t\tif (dir && dir !== 'auto') {\n\t\t\tforceDirection = true;\n\t\t}\n\t\tif (offset && offset !== 'auto') {\n\t\t\tforceOffset = true;\n\t\t}\n\t}\n\n\treturn { dir, offset, forceDirection, forceOffset };\n}\n\nexport function resolvePosition(\n\tpopup: any,\n\ttarget: any,\n\tarrow: any,\n\tbounds: any,\n\tprefer: any\n) {\n\tpopup = {\n\t\textraOffset: arrow.height,\n\t\ttop: popup.top,\n\t\tright: popup.right,\n\t\tleft: popup.left,\n\t\tbottom: popup.bottom,\n\t\theight: popup.height,\n\t\twidth: popup.width,\n\t};\n\n\tconst prefers = resolvePrefer(prefer, target, bounds);\n\n\tconst edge = resolveEdge(popup, target, arrow, bounds);\n\n\t// 选择方向\n\tconst dir = resolveDirection(popup, target, edge, bounds, prefers);\n\n\tlet top;\n\tlet left;\n\tlet arrowTop;\n\tlet arrowLeft;\n\n\t// 或得该方位上横向 或 纵向的 偏移\n\tif (dir === 'top' || dir === 'bottom') {\n\t\tif (dir === 'top') {\n\t\t\ttop = target.top - popup.extraOffset - popup.height;\n\t\t} else {\n\t\t\ttop = target.bottom + popup.extraOffset;\n\t\t}\n\n\t\t// 解决横向偏移\n\t\tconst offset =\n\t\t\tarrow.width > target.width ? (arrow.width - target.width) / 2 : 0;\n\t\tconst minLeft = target.left + arrow.width - offset - popup.width;\n\t\tconst maxLeft = target.right - arrow.width + offset;\n\t\tconst centerLeft = target.left - (popup.width - target.width) / 2;\n\n\t\tif (prefers.offset === 'left') {\n\t\t\tleft = minLeft;\n\t\t} else if (prefers.offset === 'right') {\n\t\t\tleft = maxLeft;\n\t\t} else {\n\t\t\tleft = centerLeft;\n\t\t}\n\n\t\tif (!prefers.forceOffset) {\n\t\t\tleft = Math.max(Math.min(edge.right - popup.width, left), minLeft);\n\t\t\tleft = Math.min(Math.max(edge.left, left), maxLeft);\n\t\t}\n\n\t\tarrowLeft = Math.min(\n\t\t\tpopup.width - arrow.width,\n\t\t\tMath.max(target.left - (arrow.width - target.width) / 2 - left, 0)\n\t\t);\n\t} else {\n\t\tif (dir === 'left') {\n\t\t\tleft = target.left - popup.extraOffset - popup.width;\n\t\t} else {\n\t\t\tleft = target.right + popup.extraOffset;\n\t\t}\n\n\t\t// 解决纵向偏移\n\t\tconst offset =\n\t\t\tarrow.width > target.height ? (arrow.width - target.height) / 2 : 0;\n\t\tconst minTop = target.top + arrow.width - offset - popup.height;\n\t\tconst maxTop = target.bottom - arrow.width + offset;\n\t\tconst centerTop = target.top - (popup.height - target.height) / 2;\n\n\t\tif (prefers.offset === 'top') {\n\t\t\ttop = minTop;\n\t\t} else if (prefers.offset === 'bottom') {\n\t\t\ttop = maxTop;\n\t\t} else {\n\t\t\ttop = centerTop;\n\t\t}\n\n\t\tif (!prefers.forceOffset) {\n\t\t\ttop = Math.max(Math.min(edge.bottom - popup.height, top), minTop);\n\t\t\ttop = Math.min(Math.max(edge.top, top), maxTop);\n\t\t}\n\n\t\tarrowTop = Math.min(\n\t\t\tpopup.height - arrow.height,\n\t\t\tMath.max(target.top - (arrow.width - target.height) / 2 - top, 0)\n\t\t);\n\t}\n\n\treturn { dir, left, top, arrowLeft, arrowTop };\n}\n\nconst percentPresets: any = {\n\tright: 1,\n\tleft: 0,\n\ttop: 0,\n\tbottom: 1,\n\tcenter: 0.5,\n};\n\nfunction isPercent(val: any) {\n\treturn /^[\\d.]+%$/.test(val);\n}\n\nfunction resolveRelativeValue(val: any, offset: any, total: any) {\n\tif (!val) {\n\t\tval = 0;\n\t} else if (isPercent(val)) {\n\t\tval = (parseFloat(val) / 100) * total;\n\t} else if (percentPresets.hasOwnProperty(val)) {\n\t\tval = percentPresets[val] * total;\n\t} else {\n\t\tval = parseFloat(val);\n\t\tif (isNaN(val)) {\n\t\t\tval = 0;\n\t\t}\n\t}\n\n\treturn `${val + offset}px`;\n}\n\nexport function resolveRelativePosition(align: any, popup: any, bounds: any) {\n\tif (!align) {\n\t\t// return default position\n\t\treturn {\n\t\t\ttop: '38.2%',\n\t\t\tleft: 'calc(50% - 110px)',\n\t\t};\n\t}\n\n\tlet [xAlign, yAlign] = align.trim().split(/\\s+/);\n\n\tif (\n\t\txAlign === 'top' ||\n\t\txAlign === 'bottom' ||\n\t\tyAlign === 'left' ||\n\t\tyAlign === 'right'\n\t) {\n\t\tconst tmp = xAlign;\n\t\txAlign = yAlign;\n\t\tyAlign = tmp;\n\t}\n\n\tif (xAlign === 'center' && !yAlign) {\n\t\tyAlign = 'center';\n\t}\n\n\treturn {\n\t\tleft: resolveRelativeValue(\n\t\t\txAlign,\n\t\t\t0,\n\t\t\tbounds.right - bounds.left - popup.width\n\t\t),\n\t\ttop: resolveRelativeValue(\n\t\t\tyAlign,\n\t\t\t0,\n\t\t\tbounds.bottom - bounds.top - popup.height\n\t\t),\n\t};\n}\n"],"names":[],"mappings":"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"} |
| export declare const Title: import("vue").DefineComponent<import("vue").ExtractPropTypes<{ | ||
| title: (ObjectConstructor | StringConstructor | FunctionConstructor)[]; | ||
| className: StringConstructor; | ||
| match: BooleanConstructor; | ||
| keywords: StringConstructor; | ||
| onClick: FunctionConstructor; | ||
| }>, () => any, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{ | ||
| title: (ObjectConstructor | StringConstructor | FunctionConstructor)[]; | ||
| className: StringConstructor; | ||
| match: BooleanConstructor; | ||
| keywords: StringConstructor; | ||
| onClick: FunctionConstructor; | ||
| }>> & Readonly<{}>, { | ||
| match: boolean; | ||
| }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; |
| import { defineComponent, createVNode, isVNode, h } from 'vue'; | ||
| import { isI18nData, isTitleConfig, createIcon } from '@arvin-shu/microcode-utils'; | ||
| import { intl } from '../../inti/index.js'; | ||
| import '../tip/index.js'; | ||
| import { Tip } from '../tip/tip.js'; | ||
| "use strict"; | ||
| function splitLabelByKeywords(label, keywords) { | ||
| const len = keywords.length; | ||
| const fragments = []; | ||
| let str = label; | ||
| while (str.length > 0) { | ||
| const index = str.indexOf(keywords); | ||
| if (index === 0) { | ||
| fragments.push(keywords); | ||
| str = str.slice(len); | ||
| } else if (index < 0) { | ||
| fragments.push(str); | ||
| str = ""; | ||
| } else { | ||
| fragments.push(str.slice(0, index)); | ||
| str = str.slice(index); | ||
| } | ||
| } | ||
| return fragments; | ||
| } | ||
| const Title = /* @__PURE__ */ defineComponent({ | ||
| name: "CustomTitle", | ||
| props: { | ||
| title: [String, Object, Function], | ||
| className: String, | ||
| match: Boolean, | ||
| keywords: String, | ||
| onClick: Function | ||
| }, | ||
| setup(props) { | ||
| const handleClick = (e) => { | ||
| const { | ||
| onClick, | ||
| title | ||
| } = props; | ||
| const url = title?.docUrl || title?.url; | ||
| if (url) { | ||
| window.open(url); | ||
| e.stopPropagation(); | ||
| } | ||
| onClick && onClick(e); | ||
| }; | ||
| const renderLabel = (label) => { | ||
| const { | ||
| match, | ||
| keywords | ||
| } = props; | ||
| if (!label) { | ||
| return null; | ||
| } | ||
| const intlLabel = intl(label); | ||
| if (typeof intlLabel !== "string") { | ||
| return createVNode("span", { | ||
| "class": "mtc-title-txt" | ||
| }, [intlLabel]); | ||
| } | ||
| let labelToRender = intlLabel; | ||
| if (match && keywords) { | ||
| const fragments = splitLabelByKeywords(intlLabel, keywords); | ||
| labelToRender = fragments.map((f) => createVNode("span", { | ||
| "style": { | ||
| color: f === keywords ? "red" : "inherit" | ||
| } | ||
| }, [f])); | ||
| } | ||
| return createVNode("span", { | ||
| "class": "mtc-title-txt" | ||
| }, [labelToRender]); | ||
| }; | ||
| return () => { | ||
| const { | ||
| className, | ||
| title | ||
| } = props; | ||
| let _title; | ||
| if (title == null) { | ||
| return null; | ||
| } | ||
| if (isVNode(title)) { | ||
| return title; | ||
| } | ||
| if (typeof title === "string" || isI18nData(title)) { | ||
| _title = { | ||
| label: title | ||
| }; | ||
| } else if (isTitleConfig(title)) { | ||
| _title = title; | ||
| } else { | ||
| _title = { | ||
| label: title | ||
| }; | ||
| } | ||
| const icon = _title.icon ? createIcon(_title.icon, { | ||
| style: { | ||
| fontSize: "20px" | ||
| } | ||
| }) : null; | ||
| let tip = null; | ||
| if (_title.tip) { | ||
| if (isVNode(_title.tip) && _title.tip.type === Tip) { | ||
| tip = _title.tip; | ||
| } else { | ||
| const tipProps = typeof _title.tip === "object" && !(isVNode(_title.tip) || isI18nData(_title.tip)) ? _title.tip : { | ||
| children: _title.tip | ||
| }; | ||
| tip = h(Tip, { | ||
| ...tipProps | ||
| }); | ||
| } | ||
| } | ||
| return createVNode("span", { | ||
| "class": { | ||
| "mtc-title": true, | ||
| [className || ""]: !!className, | ||
| "has-tip": !!tip, | ||
| "only-icon": !_title.label | ||
| }, | ||
| "onClick": handleClick | ||
| }, [icon ? createVNode("b", { | ||
| "class": "mtc-title-icon" | ||
| }, [icon]) : null, renderLabel(_title.label), tip]); | ||
| }; | ||
| } | ||
| }); | ||
| export { Title }; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":["../../../../src/widgets/title/index.tsx"],"sourcesContent":["import {\n\tIPublicTypeI18nData,\n\tIPublicTypeTitleConfig,\n} from '@arvin-shu/microcode-types';\nimport {\n\tcreateIcon,\n\tisI18nData,\n\tisTitleConfig,\n} from '@arvin-shu/microcode-utils';\nimport { defineComponent, h, isVNode, VNode } from 'vue';\nimport { intl } from '../../inti';\nimport { Tip } from '../tip';\n\n/**\n * 根据 keywords 将 label 分割成文字片段\n * 示例:title = '自定义页面布局',keywords = '页面',返回结果为 ['自定义', '页面', '布局']\n * @param label title\n * @param keywords 关键字\n * @returns 文字片段列表\n */\nfunction splitLabelByKeywords(label: string, keywords: string): string[] {\n\tconst len = keywords.length;\n\tconst fragments = [];\n\tlet str = label;\n\n\twhile (str.length > 0) {\n\t\tconst index = str.indexOf(keywords);\n\n\t\tif (index === 0) {\n\t\t\tfragments.push(keywords);\n\t\t\tstr = str.slice(len);\n\t\t} else if (index < 0) {\n\t\t\tfragments.push(str);\n\t\t\tstr = '';\n\t\t} else {\n\t\t\tfragments.push(str.slice(0, index));\n\t\t\tstr = str.slice(index);\n\t\t}\n\t}\n\treturn fragments;\n}\n\nexport const Title = defineComponent({\n\tname: 'CustomTitle',\n\tprops: {\n\t\ttitle: [String, Object, Function],\n\t\tclassName: String,\n\t\tmatch: Boolean,\n\t\tkeywords: String,\n\t\tonClick: Function,\n\t},\n\tsetup(props) {\n\t\tconst handleClick = (e: MouseEvent) => {\n\t\t\tconst { onClick, title } = props;\n\t\t\tconst url = (title as any)?.docUrl || (title as any)?.url;\n\t\t\tif (url) {\n\t\t\t\twindow.open(url);\n\t\t\t\te.stopPropagation(); // 防止触发行操作(如折叠面板)\n\t\t\t}\n\t\t\tonClick && onClick(e);\n\t\t};\n\n\t\tconst renderLabel = (label: string | IPublicTypeI18nData | VNode) => {\n\t\t\tconst { match, keywords } = props;\n\n\t\t\tif (!label) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst intlLabel = intl(label as any);\n\n\t\t\tif (typeof intlLabel !== 'string') {\n\t\t\t\treturn <span class=\"mtc-title-txt\">{intlLabel}</span>;\n\t\t\t}\n\n\t\t\tlet labelToRender = intlLabel;\n\n\t\t\tif (match && keywords) {\n\t\t\t\tconst fragments = splitLabelByKeywords(intlLabel as string, keywords);\n\n\t\t\t\tlabelToRender = fragments.map((f) => (\n\t\t\t\t\t<span style={{ color: f === keywords ? 'red' : 'inherit' }}>{f}</span>\n\t\t\t\t)) as any;\n\t\t\t}\n\n\t\t\treturn <span class=\"mtc-title-txt\">{labelToRender}</span>;\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst { className, title } = props;\n\t\t\tlet _title: IPublicTypeTitleConfig;\n\t\t\tif (title == null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (isVNode(title)) {\n\t\t\t\treturn title;\n\t\t\t}\n\t\t\tif (typeof title === 'string' || isI18nData(title)) {\n\t\t\t\t_title = { label: title } as IPublicTypeTitleConfig;\n\t\t\t} else if (isTitleConfig(title)) {\n\t\t\t\t_title = title;\n\t\t\t} else {\n\t\t\t\t_title = {\n\t\t\t\t\tlabel: title,\n\t\t\t\t} as IPublicTypeTitleConfig;\n\t\t\t}\n\n\t\t\tconst icon = _title.icon\n\t\t\t\t? createIcon(_title.icon, {\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tfontSize: '20px',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t: null;\n\n\t\t\tlet tip: any = null;\n\t\t\tif (_title.tip) {\n\t\t\t\tif (isVNode(_title.tip) && _title.tip.type === Tip) {\n\t\t\t\t\ttip = _title.tip;\n\t\t\t\t} else {\n\t\t\t\t\tconst tipProps =\n\t\t\t\t\t\ttypeof _title.tip === 'object' &&\n\t\t\t\t\t\t!(isVNode(_title.tip) || isI18nData(_title.tip))\n\t\t\t\t\t\t\t? _title.tip\n\t\t\t\t\t\t\t: { children: _title.tip };\n\t\t\t\t\ttip = h(Tip, {\n\t\t\t\t\t\t...tipProps,\n\t\t\t\t\t} as any);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<span\n\t\t\t\t\tclass={{\n\t\t\t\t\t\t'mtc-title': true,\n\t\t\t\t\t\t[className || '']: !!className,\n\t\t\t\t\t\t'has-tip': !!tip,\n\t\t\t\t\t\t'only-icon': !_title.label,\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t>\n\t\t\t\t\t{icon ? <b class=\"mtc-title-icon\">{icon}</b> : null}\n\t\t\t\t\t{renderLabel(_title.label as any)}\n\t\t\t\t\t{tip}\n\t\t\t\t</span>\n\t\t\t);\n\t\t};\n\t},\n});\n"],"names":["splitLabelByKeywords","label","keywords","len","length","fragments","str","index","indexOf","push","slice","Title","name","props","title","String","Object","Function","className","match","Boolean","onClick","setup","handleClick","e","url","docUrl","window","open","stopPropagation","renderLabel","intlLabel","intl","_createVNode","labelToRender","map","f","color","_title","isVNode","isI18nData","isTitleConfig","icon","createIcon","style","fontSize","tip","type","Tip","tipProps","children","h"],"mappings":"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"} |
-102
| import { IPublicModelEngineConfig, IPublicModelPreference, IPublicTypeEngineOptions } from '@arvin-shu/microcode-types'; | ||
| export interface IEngineConfig extends IPublicModelEngineConfig { | ||
| /** | ||
| * if engineOptions.strictPluginMode === true, only accept propertied predefined in EngineOptions. | ||
| * | ||
| * @param {IPublicTypeEngineOptions} engineOptions | ||
| */ | ||
| setEngineOptions(engineOptions: IPublicTypeEngineOptions): void; | ||
| notifyGot(key: string): void; | ||
| setWait(key: string, resolve: (data: any) => void, once?: boolean): void; | ||
| delWait(key: string, fn: any): void; | ||
| } | ||
| /** | ||
| * 管理低代码引擎中的配置项,支持严格模式下的配置项校验, | ||
| * 且提供异步获取配置值的能力,非常适合复杂配置管理场景。 | ||
| */ | ||
| export declare class EngineConfig implements IEngineConfig { | ||
| /** | ||
| * 配置项 | ||
| */ | ||
| private config; | ||
| /** | ||
| * 这是一个等待队列,用于管理那些需要等待某个配置项赋值的回调。 | ||
| */ | ||
| private waits; | ||
| /** | ||
| * 存储 preference | ||
| */ | ||
| readonly preference: IPublicModelPreference; | ||
| constructor(config?: { | ||
| [key: string]: any; | ||
| }); | ||
| /** | ||
| * 设置引擎配置 | ||
| * | ||
| * @param engineOptions 引擎配置对象 | ||
| */ | ||
| setEngineOptions(engineOptions: IPublicTypeEngineOptions): void; | ||
| /** | ||
| * 判断指定 key 是否有值 | ||
| * @param key | ||
| */ | ||
| has(key: string): boolean; | ||
| /** | ||
| * 获取指定 key 的值 | ||
| * @param key | ||
| * @param defaultValue | ||
| */ | ||
| get(key: string, defaultValue?: any): any; | ||
| /** | ||
| * 设置指定 key 的值 | ||
| * @param key | ||
| * @param value | ||
| */ | ||
| set(key: string, value: any): void; | ||
| /** | ||
| * 批量设值,set 的对象版本 | ||
| * @param config | ||
| */ | ||
| setConfig(config: { | ||
| [key: string]: any; | ||
| }): void; | ||
| /** | ||
| * 获取指定 key 的值,若此时还未赋值,则等待,若已有值,则直接返回值 | ||
| * 注:此函数返回 Promise 实例,只会执行(fullfill)一次 | ||
| * @param key | ||
| * @returns | ||
| */ | ||
| onceGot(key: string): Promise<any>; | ||
| /** | ||
| * 获取指定 key 的值,函数回调模式,若多次被赋值,回调会被多次调用 | ||
| * | ||
| * @param key | ||
| * @param fn | ||
| * @returns | ||
| */ | ||
| onGot(key: string, fn: (data: any) => void): () => void; | ||
| /** | ||
| * 通知获取指定键的值 | ||
| * @param key 键 | ||
| */ | ||
| notifyGot(key: string): void; | ||
| /** | ||
| * 设置等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param resolve 回调函数 | ||
| * @param once 是否只执行一次 | ||
| */ | ||
| setWait(key: string, resolve: (data: any) => void, once?: boolean): void; | ||
| /** | ||
| * 删除等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param fn 回调函数 | ||
| */ | ||
| delWait(key: string, fn: any): void; | ||
| /** | ||
| * 获取偏好设置 | ||
| * @returns 偏好设置对象 | ||
| */ | ||
| getPreference(): IPublicModelPreference; | ||
| } | ||
| export declare const engineConfig: EngineConfig; |
-355
| 'use strict'; | ||
| var microcodeUtils = require('@arvin-shu/microcode-utils'); | ||
| var lodashEs = require('lodash-es'); | ||
| var preference = require('./utils/preference.js'); | ||
| "use strict"; | ||
| const STRICT_PLUGIN_MODE_DEFAULT = true; | ||
| const VALID_ENGINE_OPTIONS = { | ||
| enableCondition: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u5F00\u542F condition \u7684\u80FD\u529B\uFF0C\u9ED8\u8BA4\u5728\u8BBE\u8BA1\u5668\u4E2D\u4E0D\u7BA1 condition \u662F\u5565\u90FD\u6B63\u5E38\u5C55\u793A" | ||
| }, | ||
| designMode: { | ||
| type: "string", | ||
| enum: ["design", "live"], | ||
| default: "design", | ||
| description: "\u8BBE\u8BA1\u6A21\u5F0F\uFF0Clive \u6A21\u5F0F\u5C06\u4F1A\u5B9E\u65F6\u5C55\u793A\u53D8\u91CF\u503C" | ||
| }, | ||
| device: { | ||
| type: "string", | ||
| enum: ["default", "mobile", "any string value"], | ||
| default: "default", | ||
| description: "\u8BBE\u5907\u7C7B\u578B" | ||
| }, | ||
| deviceClassName: { | ||
| type: "string", | ||
| default: void 0, | ||
| description: "\u6307\u5B9A\u521D\u59CB\u5316\u7684 deviceClassName\uFF0C\u6302\u8F7D\u5230\u753B\u5E03\u7684\u9876\u5C42\u8282\u70B9\u4E0A" | ||
| }, | ||
| locale: { | ||
| type: "string", | ||
| default: "zh-CN", | ||
| description: "\u8BED\u8A00" | ||
| }, | ||
| renderEnv: { | ||
| type: "string", | ||
| enum: ["react", "any string value"], | ||
| default: "react", | ||
| description: "\u6E32\u67D3\u5668\u7C7B\u578B" | ||
| }, | ||
| deviceMapper: { | ||
| type: "object", | ||
| description: "\u8BBE\u5907\u7C7B\u578B\u6620\u5C04\u5668\uFF0C\u5904\u7406\u8BBE\u8BA1\u5668\u4E0E\u6E32\u67D3\u5668\u4E2D device \u7684\u6620\u5C04" | ||
| }, | ||
| enableStrictPluginMode: { | ||
| type: "boolean", | ||
| default: STRICT_PLUGIN_MODE_DEFAULT, | ||
| description: "\u5F00\u542F\u4E25\u683C\u63D2\u4EF6\u6A21\u5F0F\uFF0C\u9ED8\u8BA4\u503C\uFF1ASTRICT_PLUGIN_MODE_DEFAULT , \u4E25\u683C\u6A21\u5F0F\u4E0B\uFF0C\u63D2\u4EF6\u5C06\u65E0\u6CD5\u901A\u8FC7 engineOptions \u4F20\u9012\u81EA\u5B9A\u4E49\u914D\u7F6E\u9879" | ||
| }, | ||
| enableReactiveContainer: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5F00\u542F\u62D6\u62FD\u7EC4\u4EF6\u65F6\uFF0C\u5373\u5C06\u88AB\u653E\u5165\u7684\u5BB9\u5668\u662F\u5426\u6709\u89C6\u89C9\u53CD\u9988" | ||
| }, | ||
| disableAutoRender: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5173\u95ED\u753B\u5E03\u81EA\u52A8\u6E32\u67D3\uFF0C\u5728\u8D44\u4EA7\u5305\u591A\u91CD\u5F02\u6B65\u52A0\u8F7D\u7684\u573A\u666F\u6709\u6548" | ||
| }, | ||
| disableDetecting: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5173\u95ED\u62D6\u62FD\u7EC4\u4EF6\u65F6\u7684\u865A\u7EBF\u54CD\u5E94\uFF0C\u6027\u80FD\u8003\u8651" | ||
| }, | ||
| customizeIgnoreSelectors: { | ||
| type: "function", | ||
| default: void 0, | ||
| description: "\u5B9A\u5236\u753B\u5E03\u4E2D\u70B9\u51FB\u88AB\u5FFD\u7565\u7684 selectors, eg. (defaultIgnoreSelectors: string[], e: MouseEvent) => string[]" | ||
| }, | ||
| disableDefaultSettingPanel: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u7981\u6B62\u9ED8\u8BA4\u7684\u8BBE\u7F6E\u9762\u677F" | ||
| }, | ||
| disableDefaultSetters: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u7981\u6B62\u9ED8\u8BA4\u7684\u8BBE\u7F6E\u5668" | ||
| }, | ||
| enableCanvasLock: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u6253\u5F00\u753B\u5E03\u7684\u9501\u5B9A\u64CD\u4F5C" | ||
| }, | ||
| enableLockedNodeSetting: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5BB9\u5668\u9501\u5B9A\u540E\uFF0C\u5BB9\u5668\u672C\u8EAB\u662F\u5426\u53EF\u4EE5\u8BBE\u7F6E\u5C5E\u6027\uFF0C\u4EC5\u5F53\u753B\u5E03\u9501\u5B9A\u7279\u6027\u5F00\u542F\u65F6\u751F\u6548" | ||
| }, | ||
| stayOnTheSameSettingTab: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u5F53\u9009\u4E2D\u8282\u70B9\u5207\u6362\u65F6\uFF0C\u662F\u5426\u505C\u7559\u5728\u76F8\u540C\u7684\u8BBE\u7F6E tab \u4E0A" | ||
| }, | ||
| hideSettingsTabsWhenOnlyOneItem: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u5728\u53EA\u6709\u4E00\u4E2A item \u7684\u65F6\u5019\u9690\u85CF\u8BBE\u7F6E tabs" | ||
| }, | ||
| loadingComponent: { | ||
| type: "ComponentType", | ||
| default: void 0, | ||
| description: "\u81EA\u5B9A\u4E49 loading \u7EC4\u4EF6" | ||
| }, | ||
| supportVariableGlobally: { | ||
| type: "boolean", | ||
| default: false, | ||
| description: "\u8BBE\u7F6E\u6240\u6709\u5C5E\u6027\u652F\u6301\u53D8\u91CF\u914D\u7F6E" | ||
| }, | ||
| visionSettings: { | ||
| type: "object", | ||
| description: "Vision-polyfill settings" | ||
| }, | ||
| simulatorUrl: { | ||
| type: "array", | ||
| description: "\u81EA\u5B9A\u4E49 simulatorUrl \u7684\u5730\u5740" | ||
| }, | ||
| appHelper: { | ||
| type: "object", | ||
| description: "\u5B9A\u4E49 utils \u548C constants \u7B49\u5BF9\u8C61" | ||
| }, | ||
| requestHandlersMap: { | ||
| type: "object", | ||
| description: "\u6570\u636E\u6E90\u5F15\u64CE\u7684\u8BF7\u6C42\u5904\u7406\u5668\u6620\u5C04" | ||
| }, | ||
| thisRequiredInJSE: { | ||
| type: "boolean", | ||
| description: "JSExpression \u662F\u5426\u53EA\u652F\u6301\u4F7F\u7528 this \u6765\u8BBF\u95EE\u4E0A\u4E0B\u6587\u53D8\u91CF" | ||
| }, | ||
| enableStrictNotFoundMode: { | ||
| type: "boolean", | ||
| description: "\u5F53\u5F00\u542F\u7EC4\u4EF6\u672A\u627E\u5230\u4E25\u683C\u6A21\u5F0F\u65F6\uFF0C\u6E32\u67D3\u6A21\u5757\u4E0D\u4F1A\u9ED8\u8BA4\u7ED9\u4E00\u4E2A\u5BB9\u5668\u7EC4\u4EF6" | ||
| }, | ||
| focusNodeSelector: { | ||
| type: "function", | ||
| description: "\u914D\u7F6E\u6307\u5B9A\u8282\u70B9\u4E3A\u6839\u7EC4\u4EF6" | ||
| }, | ||
| enableAutoOpenFirstWindow: { | ||
| type: "boolean", | ||
| description: "\u5E94\u7528\u7EA7\u8BBE\u8BA1\u6A21\u5F0F\u4E0B\uFF0C\u81EA\u52A8\u6253\u5F00\u7B2C\u4E00\u4E2A\u7A97\u53E3", | ||
| default: true | ||
| }, | ||
| enableWorkspaceMode: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u5F00\u542F\u5E94\u7528\u7EA7\u8BBE\u8BA1\u6A21\u5F0F", | ||
| default: false | ||
| }, | ||
| workspaceEmptyComponent: { | ||
| type: "function", | ||
| description: "\u5E94\u7528\u7EA7\u8BBE\u8BA1\u6A21\u5F0F\u4E0B\uFF0C\u7A97\u53E3\u4E3A\u7A7A\u65F6\u5C55\u793A\u7684\u5360\u4F4D\u7EC4\u4EF6" | ||
| }, | ||
| enableContextMenu: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u5F00\u542F\u53F3\u952E\u83DC\u5355", | ||
| default: false | ||
| }, | ||
| hideComponentAction: { | ||
| type: "boolean", | ||
| description: "\u662F\u5426\u9690\u85CF\u8BBE\u8BA1\u5668\u8F85\u52A9\u5C42", | ||
| default: false | ||
| } | ||
| }; | ||
| const logger = microcodeUtils.getLogger({ level: "log", bizName: "config" }); | ||
| const getStrictModeValue = (engineOptions, defaultValue) => { | ||
| if (!engineOptions || !microcodeUtils.isPlainObject(engineOptions)) { | ||
| return defaultValue; | ||
| } | ||
| if (engineOptions.enableStrictPluginMode === void 0 || engineOptions.enableStrictPluginMode === null) { | ||
| return defaultValue; | ||
| } | ||
| return engineOptions.enableStrictPluginMode; | ||
| }; | ||
| class EngineConfig { | ||
| /** | ||
| * 配置项 | ||
| */ | ||
| config = {}; | ||
| /** | ||
| * 这是一个等待队列,用于管理那些需要等待某个配置项赋值的回调。 | ||
| */ | ||
| waits = /* @__PURE__ */ new Map(); | ||
| /** | ||
| * 存储 preference | ||
| */ | ||
| preference; | ||
| constructor(config) { | ||
| this.config = config || {}; | ||
| this.preference = new preference(); | ||
| } | ||
| /** | ||
| * 设置引擎配置 | ||
| * | ||
| * @param engineOptions 引擎配置对象 | ||
| */ | ||
| setEngineOptions(engineOptions) { | ||
| if (!engineOptions || !microcodeUtils.isPlainObject(engineOptions)) { | ||
| return; | ||
| } | ||
| const strictMode = getStrictModeValue(engineOptions, STRICT_PLUGIN_MODE_DEFAULT) === true; | ||
| if (strictMode) { | ||
| const isValidKey = (key) => { | ||
| const result = VALID_ENGINE_OPTIONS[key]; | ||
| return !(result === void 0 || result === null); | ||
| }; | ||
| Object.keys(engineOptions).forEach((key) => { | ||
| if (isValidKey(key)) { | ||
| this.set(key, engineOptions[key]); | ||
| } else { | ||
| logger.warn( | ||
| `failed to config ${key} to engineConfig, only predefined options can be set under strict mode, predefined options: `, | ||
| VALID_ENGINE_OPTIONS | ||
| ); | ||
| } | ||
| }); | ||
| } else { | ||
| this.setConfig(engineOptions); | ||
| } | ||
| } | ||
| /** | ||
| * 判断指定 key 是否有值 | ||
| * @param key | ||
| */ | ||
| has(key) { | ||
| return this.config[key] !== void 0; | ||
| } | ||
| /** | ||
| * 获取指定 key 的值 | ||
| * @param key | ||
| * @param defaultValue | ||
| */ | ||
| get(key, defaultValue) { | ||
| return lodashEs.get(this.config, key, defaultValue); | ||
| } | ||
| /** | ||
| * 设置指定 key 的值 | ||
| * @param key | ||
| * @param value | ||
| */ | ||
| set(key, value) { | ||
| this.config[key] = value; | ||
| this.notifyGot(key); | ||
| } | ||
| /** | ||
| * 批量设值,set 的对象版本 | ||
| * @param config | ||
| */ | ||
| setConfig(config) { | ||
| if (config) { | ||
| Object.keys(config).forEach((key) => { | ||
| this.set(key, config[key]); | ||
| }); | ||
| } | ||
| } | ||
| /** | ||
| * 获取指定 key 的值,若此时还未赋值,则等待,若已有值,则直接返回值 | ||
| * 注:此函数返回 Promise 实例,只会执行(fullfill)一次 | ||
| * @param key | ||
| * @returns | ||
| */ | ||
| onceGot(key) { | ||
| const val = this.config[key]; | ||
| if (val !== void 0) { | ||
| return Promise.resolve(val); | ||
| } | ||
| return new Promise((resolve) => { | ||
| this.setWait(key, resolve, true); | ||
| }); | ||
| } | ||
| /** | ||
| * 获取指定 key 的值,函数回调模式,若多次被赋值,回调会被多次调用 | ||
| * | ||
| * @param key | ||
| * @param fn | ||
| * @returns | ||
| */ | ||
| onGot(key, fn) { | ||
| const val = this.config?.[key]; | ||
| if (val !== void 0) { | ||
| fn(val); | ||
| } | ||
| this.setWait(key, fn); | ||
| return () => { | ||
| this.delWait(key, fn); | ||
| }; | ||
| } | ||
| /** | ||
| * 通知获取指定键的值 | ||
| * @param key 键 | ||
| */ | ||
| notifyGot(key) { | ||
| let waits = this.waits.get(key); | ||
| if (!waits) { | ||
| return; | ||
| } | ||
| waits = waits.slice().reverse(); | ||
| let 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); | ||
| } | ||
| } | ||
| /** | ||
| * 设置等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param resolve 回调函数 | ||
| * @param once 是否只执行一次 | ||
| */ | ||
| setWait(key, resolve, once) { | ||
| const waits = this.waits.get(key); | ||
| if (waits) { | ||
| waits.push({ resolve, once }); | ||
| } else { | ||
| this.waits.set(key, [{ resolve, once }]); | ||
| } | ||
| } | ||
| /** | ||
| * 删除等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param fn 回调函数 | ||
| */ | ||
| delWait(key, fn) { | ||
| const waits = this.waits.get(key); | ||
| if (!waits) { | ||
| return; | ||
| } | ||
| let i = waits.length; | ||
| while (i--) { | ||
| if (waits[i].resolve === fn) { | ||
| waits.splice(i, 1); | ||
| } | ||
| } | ||
| if (waits.length < 1) { | ||
| this.waits.delete(key); | ||
| } | ||
| } | ||
| /** | ||
| * 获取偏好设置 | ||
| * @returns 偏好设置对象 | ||
| */ | ||
| getPreference() { | ||
| return this.preference; | ||
| } | ||
| } | ||
| const engineConfig = new EngineConfig(); | ||
| exports.EngineConfig = EngineConfig; | ||
| exports.engineConfig = engineConfig; | ||
| //# sourceMappingURL=config.js.map |
| {"version":3,"file":"config.js","sources":["../../src/config.ts"],"sourcesContent":["import {\n\tIPublicModelEngineConfig,\n\tIPublicModelPreference,\n\tIPublicTypeEngineOptions,\n} from '@arvin-shu/microcode-types';\nimport { getLogger, isPlainObject } from '@arvin-shu/microcode-utils';\nimport { get as lodashGet } from 'lodash-es';\nimport Preference from './utils/preference';\n\nconst STRICT_PLUGIN_MODE_DEFAULT = true;\n\n// 在严格模式下使用,此时只能接受此VALID_ENGINE_OPTIONS中的选项\n// 类型和描述仅用于开发人员的帮助,不会影响运行时\nconst VALID_ENGINE_OPTIONS = {\n\tenableCondition: {\n\t\ttype: 'boolean',\n\t\tdescription:\n\t\t\t'是否开启 condition 的能力,默认在设计器中不管 condition 是啥都正常展示',\n\t},\n\tdesignMode: {\n\t\ttype: 'string',\n\t\tenum: ['design', 'live'],\n\t\tdefault: 'design',\n\t\tdescription: '设计模式,live 模式将会实时展示变量值',\n\t},\n\tdevice: {\n\t\ttype: 'string',\n\t\tenum: ['default', 'mobile', 'any string value'],\n\t\tdefault: 'default',\n\t\tdescription: '设备类型',\n\t},\n\tdeviceClassName: {\n\t\ttype: 'string',\n\t\tdefault: undefined,\n\t\tdescription: '指定初始化的 deviceClassName,挂载到画布的顶层节点上',\n\t},\n\tlocale: {\n\t\ttype: 'string',\n\t\tdefault: 'zh-CN',\n\t\tdescription: '语言',\n\t},\n\trenderEnv: {\n\t\ttype: 'string',\n\t\tenum: ['react', 'any string value'],\n\t\tdefault: 'react',\n\t\tdescription: '渲染器类型',\n\t},\n\tdeviceMapper: {\n\t\ttype: 'object',\n\t\tdescription: '设备类型映射器,处理设计器与渲染器中 device 的映射',\n\t},\n\tenableStrictPluginMode: {\n\t\ttype: 'boolean',\n\t\tdefault: STRICT_PLUGIN_MODE_DEFAULT,\n\t\tdescription:\n\t\t\t'开启严格插件模式,默认值:STRICT_PLUGIN_MODE_DEFAULT , 严格模式下,插件将无法通过 engineOptions 传递自定义配置项',\n\t},\n\tenableReactiveContainer: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '开启拖拽组件时,即将被放入的容器是否有视觉反馈',\n\t},\n\tdisableAutoRender: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '关闭画布自动渲染,在资产包多重异步加载的场景有效',\n\t},\n\tdisableDetecting: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '关闭拖拽组件时的虚线响应,性能考虑',\n\t},\n\tcustomizeIgnoreSelectors: {\n\t\ttype: 'function',\n\t\tdefault: undefined,\n\t\tdescription:\n\t\t\t'定制画布中点击被忽略的 selectors, eg. (defaultIgnoreSelectors: string[], e: MouseEvent) => string[]',\n\t},\n\tdisableDefaultSettingPanel: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '禁止默认的设置面板',\n\t},\n\tdisableDefaultSetters: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '禁止默认的设置器',\n\t},\n\tenableCanvasLock: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '打开画布的锁定操作',\n\t},\n\tenableLockedNodeSetting: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription:\n\t\t\t'容器锁定后,容器本身是否可以设置属性,仅当画布锁定特性开启时生效',\n\t},\n\tstayOnTheSameSettingTab: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '当选中节点切换时,是否停留在相同的设置 tab 上',\n\t},\n\thideSettingsTabsWhenOnlyOneItem: {\n\t\ttype: 'boolean',\n\t\tdescription: '是否在只有一个 item 的时候隐藏设置 tabs',\n\t},\n\tloadingComponent: {\n\t\ttype: 'ComponentType',\n\t\tdefault: undefined,\n\t\tdescription: '自定义 loading 组件',\n\t},\n\tsupportVariableGlobally: {\n\t\ttype: 'boolean',\n\t\tdefault: false,\n\t\tdescription: '设置所有属性支持变量配置',\n\t},\n\tvisionSettings: {\n\t\ttype: 'object',\n\t\tdescription: 'Vision-polyfill settings',\n\t},\n\tsimulatorUrl: {\n\t\ttype: 'array',\n\t\tdescription: '自定义 simulatorUrl 的地址',\n\t},\n\tappHelper: {\n\t\ttype: 'object',\n\t\tdescription: '定义 utils 和 constants 等对象',\n\t},\n\trequestHandlersMap: {\n\t\ttype: 'object',\n\t\tdescription: '数据源引擎的请求处理器映射',\n\t},\n\tthisRequiredInJSE: {\n\t\ttype: 'boolean',\n\t\tdescription: 'JSExpression 是否只支持使用 this 来访问上下文变量',\n\t},\n\tenableStrictNotFoundMode: {\n\t\ttype: 'boolean',\n\t\tdescription: '当开启组件未找到严格模式时,渲染模块不会默认给一个容器组件',\n\t},\n\tfocusNodeSelector: {\n\t\ttype: 'function',\n\t\tdescription: '配置指定节点为根组件',\n\t},\n\tenableAutoOpenFirstWindow: {\n\t\ttype: 'boolean',\n\t\tdescription: '应用级设计模式下,自动打开第一个窗口',\n\t\tdefault: true,\n\t},\n\tenableWorkspaceMode: {\n\t\ttype: 'boolean',\n\t\tdescription: '是否开启应用级设计模式',\n\t\tdefault: false,\n\t},\n\tworkspaceEmptyComponent: {\n\t\ttype: 'function',\n\t\tdescription: '应用级设计模式下,窗口为空时展示的占位组件',\n\t},\n\tenableContextMenu: {\n\t\ttype: 'boolean',\n\t\tdescription: '是否开启右键菜单',\n\t\tdefault: false,\n\t},\n\thideComponentAction: {\n\t\ttype: 'boolean',\n\t\tdescription: '是否隐藏设计器辅助层',\n\t\tdefault: false,\n\t},\n};\n\nconst logger = getLogger({ level: 'log', bizName: 'config' });\n\nconst getStrictModeValue = (\n\tengineOptions: IPublicTypeEngineOptions,\n\tdefaultValue: boolean\n): boolean => {\n\tif (!engineOptions || !isPlainObject(engineOptions)) {\n\t\treturn defaultValue;\n\t}\n\tif (\n\t\tengineOptions.enableStrictPluginMode === undefined ||\n\t\tengineOptions.enableStrictPluginMode === null\n\t) {\n\t\treturn defaultValue;\n\t}\n\treturn engineOptions.enableStrictPluginMode;\n};\n\nexport interface IEngineConfig extends IPublicModelEngineConfig {\n\t/**\n\t * if engineOptions.strictPluginMode === true, only accept propertied predefined in EngineOptions.\n\t *\n\t * @param {IPublicTypeEngineOptions} engineOptions\n\t */\n\tsetEngineOptions(engineOptions: IPublicTypeEngineOptions): void;\n\n\tnotifyGot(key: string): void;\n\n\tsetWait(key: string, resolve: (data: any) => void, once?: boolean): void;\n\n\tdelWait(key: string, fn: any): void;\n}\n\n/**\n * 管理低代码引擎中的配置项,支持严格模式下的配置项校验,\n * 且提供异步获取配置值的能力,非常适合复杂配置管理场景。\n */\n\nexport class EngineConfig implements IEngineConfig {\n\t/**\n\t * 配置项\n\t */\n\tprivate config: { [key: string]: any } = {};\n\n\t/**\n\t * 这是一个等待队列,用于管理那些需要等待某个配置项赋值的回调。\n\t */\n\tprivate waits = new Map<\n\t\tstring,\n\t\tArray<{\n\t\t\tonce?: boolean;\n\t\t\tresolve: (data: any) => void;\n\t\t}>\n\t>();\n\n\t/**\n\t * 存储 preference\n\t */\n\treadonly preference: IPublicModelPreference;\n\n\tconstructor(config?: { [key: string]: any }) {\n\t\tthis.config = config || {};\n\t\tthis.preference = new Preference();\n\t}\n\n\t/**\n\t * 设置引擎配置\n\t *\n\t * @param engineOptions 引擎配置对象\n\t */\n\tsetEngineOptions(engineOptions: IPublicTypeEngineOptions): void {\n\t\t// 不是一个有效的纯对象\n\t\tif (!engineOptions || !isPlainObject(engineOptions)) {\n\t\t\treturn;\n\t\t}\n\t\tconst strictMode =\n\t\t\tgetStrictModeValue(engineOptions, STRICT_PLUGIN_MODE_DEFAULT) === true;\n\t\tif (strictMode) {\n\t\t\t// 严格模式\n\t\t\tconst isValidKey = (key: string) => {\n\t\t\t\tconst result = (VALID_ENGINE_OPTIONS as any)[key];\n\t\t\t\treturn !(result === undefined || result === null);\n\t\t\t};\n\t\t\tObject.keys(engineOptions).forEach((key) => {\n\t\t\t\tif (isValidKey(key)) {\n\t\t\t\t\tthis.set(key, (engineOptions as any)[key]);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`failed to config ${key} to engineConfig, only predefined options can be set under strict mode, predefined options: `,\n\t\t\t\t\t\tVALID_ENGINE_OPTIONS\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.setConfig(engineOptions);\n\t\t}\n\t}\n\n\t/**\n\t * 判断指定 key 是否有值\n\t * @param key\n\t */\n\thas(key: string): boolean {\n\t\treturn this.config[key] !== undefined;\n\t}\n\n\t/**\n\t * 获取指定 key 的值\n\t * @param key\n\t * @param defaultValue\n\t */\n\tget(key: string, defaultValue?: any): any {\n\t\treturn lodashGet(this.config, key, defaultValue);\n\t}\n\n\t/**\n\t * 设置指定 key 的值\n\t * @param key\n\t * @param value\n\t */\n\tset(key: string, value: any) {\n\t\tthis.config[key] = value;\n\t\tthis.notifyGot(key);\n\t}\n\n\t/**\n\t * 批量设值,set 的对象版本\n\t * @param config\n\t */\n\tsetConfig(config: { [key: string]: any }) {\n\t\tif (config) {\n\t\t\tObject.keys(config).forEach((key) => {\n\t\t\t\tthis.set(key, config[key]);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * 获取指定 key 的值,若此时还未赋值,则等待,若已有值,则直接返回值\n\t * 注:此函数返回 Promise 实例,只会执行(fullfill)一次\n\t * @param key\n\t * @returns\n\t */\n\tonceGot(key: string): Promise<any> {\n\t\tconst val = this.config[key];\n\t\tif (val !== undefined) {\n\t\t\treturn Promise.resolve(val);\n\t\t}\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.setWait(key, resolve, true);\n\t\t});\n\t}\n\n\t/**\n\t * 获取指定 key 的值,函数回调模式,若多次被赋值,回调会被多次调用\n\t *\n\t * @param key\n\t * @param fn\n\t * @returns\n\t */\n\tonGot(key: string, fn: (data: any) => void): () => void {\n\t\tconst val = this.config?.[key];\n\t\tif (val !== undefined) {\n\t\t\tfn(val);\n\t\t}\n\t\tthis.setWait(key, fn);\n\t\treturn () => {\n\t\t\tthis.delWait(key, fn);\n\t\t};\n\t}\n\n\t/**\n\t * 通知获取指定键的值\n\t * @param key 键\n\t */\n\tnotifyGot(key: string): void {\n\t\tlet waits = this.waits.get(key);\n\t\tif (!waits) {\n\t\t\treturn;\n\t\t}\n\t\twaits = waits.slice().reverse();\n\t\tlet i = waits.length;\n\t\twhile (i--) {\n\t\t\twaits[i].resolve(this.get(key));\n\t\t\tif (waits[i].once) {\n\t\t\t\twaits.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\tif (waits.length > 0) {\n\t\t\tthis.waits.set(key, waits);\n\t\t} else {\n\t\t\tthis.waits.delete(key);\n\t\t}\n\t}\n\n\t/**\n\t * 设置等待获取指定键的值\n\t * @param key 键\n\t * @param resolve 回调函数\n\t * @param once 是否只执行一次\n\t */\n\tsetWait(key: string, resolve: (data: any) => void, once?: boolean) {\n\t\tconst waits = this.waits.get(key);\n\t\tif (waits) {\n\t\t\twaits.push({ resolve, once });\n\t\t} else {\n\t\t\tthis.waits.set(key, [{ resolve, once }]);\n\t\t}\n\t}\n\n\t/**\n\t * 删除等待获取指定键的值\n\t * @param key 键\n\t * @param fn 回调函数\n\t */\n\tdelWait(key: string, fn: any) {\n\t\tconst waits = this.waits.get(key);\n\t\tif (!waits) {\n\t\t\treturn;\n\t\t}\n\t\tlet i = waits.length;\n\t\twhile (i--) {\n\t\t\tif (waits[i].resolve === fn) {\n\t\t\t\twaits.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\tif (waits.length < 1) {\n\t\t\tthis.waits.delete(key);\n\t\t}\n\t}\n\n\t/**\n\t * 获取偏好设置\n\t * @returns 偏好设置对象\n\t */\n\tgetPreference(): IPublicModelPreference {\n\t\treturn this.preference;\n\t}\n}\n\nexport const engineConfig = new EngineConfig();\n"],"names":["getLogger","isPlainObject","Preference","lodashGet"],"mappings":"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"} |
| export * from './ioc-context'; | ||
| export * from './setter'; |
| 'use strict'; | ||
| var iocContext = require('./ioc-context.js'); | ||
| var setter = require('./setter.js'); | ||
| var powerDi = require('power-di'); | ||
| "use strict"; | ||
| exports.globalContext = iocContext.globalContext; | ||
| exports.Setters = setter.Setters; | ||
| Object.keys(powerDi).forEach(function (k) { | ||
| if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, { | ||
| enumerable: true, | ||
| get: function () { return powerDi[k]; } | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"} |
| import { IocContext } from 'power-di'; | ||
| export * from 'power-di'; | ||
| /** | ||
| * ioc容器,全局的依赖注入上下文 | ||
| */ | ||
| export declare const globalContext: IocContext; |
| 'use strict'; | ||
| var powerDi = require('power-di'); | ||
| "use strict"; | ||
| const globalContext = powerDi.IocContext.DefaultInstance; | ||
| exports.globalContext = globalContext; | ||
| Object.keys(powerDi).forEach(function (k) { | ||
| if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, { | ||
| enumerable: true, | ||
| get: function () { return powerDi[k]; } | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=ioc-context.js.map |
| {"version":3,"file":"ioc-context.js","sources":["../../../src/di/ioc-context.ts"],"sourcesContent":["import { IocContext } from 'power-di';\n\nexport * from 'power-di';\n\n/**\n * ioc容器,全局的依赖注入上下文\n */\nexport const globalContext = IocContext.DefaultInstance;\n"],"names":["IocContext"],"mappings":";;;;;AAOO,MAAM,gBAAgBA,kBAAW,CAAA;;;;;;;;;;"} |
| import { IPublicApiSetters, IPublicTypeCustomView, IPublicTypeRegisteredSetter } from '@arvin-shu/microcode-types'; | ||
| import { VNode } from 'vue'; | ||
| export interface ISetters extends IPublicApiSetters { | ||
| } | ||
| export declare class Setters implements ISetters { | ||
| readonly viewName: string; | ||
| settersMap: Map<string, IPublicTypeRegisteredSetter & { | ||
| type: string; | ||
| }>; | ||
| constructor(viewName?: string); | ||
| getSetter: (type: string) => IPublicTypeRegisteredSetter | null; | ||
| registerSetter: (typeOrMaps: string | { | ||
| [key: string]: IPublicTypeCustomView | IPublicTypeRegisteredSetter; | ||
| }, setter?: IPublicTypeCustomView | IPublicTypeRegisteredSetter) => void; | ||
| getSettersMap: () => Map<string, IPublicTypeRegisteredSetter & { | ||
| type: string; | ||
| }>; | ||
| createSetterContent: (setter: any, props: Record<string, any>) => VNode | null; | ||
| } |
| 'use strict'; | ||
| var microcodeUtils = require('@arvin-shu/microcode-utils'); | ||
| "use strict"; | ||
| class Setters { | ||
| // eslint-disable-next-line no-useless-constructor | ||
| constructor(viewName = "global") { | ||
| this.viewName = viewName; | ||
| } | ||
| settersMap = /* @__PURE__ */ new Map(); | ||
| getSetter = (type) => this.settersMap.get(type) || null; | ||
| registerSetter = (typeOrMaps, setter) => { | ||
| if (typeof typeOrMaps === "object") { | ||
| Object.keys(typeOrMaps).forEach((type) => { | ||
| this.registerSetter(type, typeOrMaps[type]); | ||
| }); | ||
| return; | ||
| } | ||
| if (!setter) { | ||
| return; | ||
| } | ||
| if (microcodeUtils.isCustomView(setter)) { | ||
| setter = { | ||
| component: setter, | ||
| title: setter.displayName || setter.name || "CustomSetter" | ||
| }; | ||
| } | ||
| if (!setter.initialValue) { | ||
| const initial = getInitialFromSetter(setter.component); | ||
| if (initial) { | ||
| setter.initialValue = (field) => initial.call(field, field.getValue()); | ||
| } | ||
| } | ||
| this.settersMap.set(typeOrMaps, { type: typeOrMaps, ...setter }); | ||
| }; | ||
| getSettersMap = () => this.settersMap; | ||
| createSetterContent = (setter, props) => { | ||
| if (typeof setter === "string") { | ||
| setter = this.getSetter(setter); | ||
| if (!setter) { | ||
| return null; | ||
| } | ||
| if (setter.defaultProps) { | ||
| props = { | ||
| ...setter.defaultProps, | ||
| ...props | ||
| }; | ||
| } | ||
| setter = setter.component; | ||
| } | ||
| if ("value" in props && typeof props.value === "undefined") { | ||
| delete props.value; | ||
| } | ||
| return microcodeUtils.createContent(setter, props); | ||
| }; | ||
| } | ||
| function getInitialFromSetter(setter) { | ||
| return setter && (setter.initial || setter.Initial || setter.type && (setter.type.initial || setter.type.Initial)) || null; | ||
| } | ||
| exports.Setters = Setters; | ||
| //# sourceMappingURL=setter.js.map |
| {"version":3,"file":"setter.js","sources":["../../../src/di/setter.ts"],"sourcesContent":["import {\n\tIPublicApiSetters,\n\tIPublicModelSettingField,\n\tIPublicTypeCustomView,\n\tIPublicTypeRegisteredSetter,\n} from '@arvin-shu/microcode-types';\nimport { createContent, isCustomView } from '@arvin-shu/microcode-utils';\nimport { VNode } from 'vue';\n\nexport interface ISetters extends IPublicApiSetters {}\n\nexport class Setters implements ISetters {\n\tsettersMap = new Map<\n\t\tstring,\n\t\tIPublicTypeRegisteredSetter & {\n\t\t\ttype: string;\n\t\t}\n\t>();\n\n\t// eslint-disable-next-line no-useless-constructor\n\tconstructor(readonly viewName: string = 'global') {\n\t\t//\n\t}\n\n\tgetSetter = (type: string): IPublicTypeRegisteredSetter | null =>\n\t\tthis.settersMap.get(type) || null;\n\n\tregisterSetter = (\n\t\ttypeOrMaps:\n\t\t\t| string\n\t\t\t| { [key: string]: IPublicTypeCustomView | IPublicTypeRegisteredSetter },\n\t\tsetter?: IPublicTypeCustomView | IPublicTypeRegisteredSetter\n\t) => {\n\t\tif (typeof typeOrMaps === 'object') {\n\t\t\tObject.keys(typeOrMaps).forEach((type) => {\n\t\t\t\tthis.registerSetter(type, typeOrMaps[type]);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (!setter) {\n\t\t\treturn;\n\t\t}\n\t\tif (isCustomView(setter)) {\n\t\t\tsetter = {\n\t\t\t\tcomponent: setter,\n\t\t\t\ttitle:\n\t\t\t\t\t(setter as any).displayName || (setter as any).name || 'CustomSetter',\n\t\t\t};\n\t\t}\n\n\t\tif (!setter.initialValue) {\n\t\t\tconst initial = getInitialFromSetter(setter.component);\n\t\t\tif (initial) {\n\t\t\t\tsetter.initialValue = (field: IPublicModelSettingField) =>\n\t\t\t\t\tinitial.call(field, field.getValue());\n\t\t\t}\n\t\t}\n\t\t// @ts-ignore\n\t\tthis.settersMap.set(typeOrMaps, { type: typeOrMaps, ...setter });\n\t};\n\n\tgetSettersMap = () => this.settersMap;\n\n\tcreateSetterContent = (\n\t\tsetter: any,\n\t\tprops: Record<string, any>\n\t): VNode | null => {\n\t\tif (typeof setter === 'string') {\n\t\t\tsetter = this.getSetter(setter);\n\t\t\tif (!setter) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (setter.defaultProps) {\n\t\t\t\tprops = {\n\t\t\t\t\t...setter.defaultProps,\n\t\t\t\t\t...props,\n\t\t\t\t};\n\t\t\t}\n\t\t\tsetter = setter.component;\n\t\t}\n\n\t\tif ('value' in props && typeof props.value === 'undefined') {\n\t\t\tdelete props.value;\n\t\t}\n\n\t\treturn createContent(setter, props);\n\t};\n}\n/**\n * 从 setter 中获取初始值函数\n * @param setter setter 组件或配置\n * @returns 返回初始值函数,如果没有找到则返回 null\n *\n * 查找顺序:\n * 1. setter.initial\n * 2. setter.Initial\n * 3. setter.type.initial\n * 4. setter.type.Initial\n */\nfunction getInitialFromSetter(setter: any) {\n\treturn (\n\t\t(setter &&\n\t\t\t(setter.initial ||\n\t\t\t\tsetter.Initial ||\n\t\t\t\t(setter.type && (setter.type.initial || setter.type.Initial)))) ||\n\t\tnull\n\t);\n}\n"],"names":["isCustomView","createContent"],"mappings":";;;;;AAWO,MAAM,OAA4B,CAAA;AAAA;AAAA,EASxC,WAAA,CAAqB,WAAmB,QAAU,EAAA;AAA7B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA;AAErB,EAVA,UAAA,uBAAiB,GAKf,EAAA;AAAA,EAOF,YAAY,CAAC,IAAA,KACZ,KAAK,UAAW,CAAA,GAAA,CAAI,IAAI,CAAK,IAAA,IAAA;AAAA,EAE9B,cAAA,GAAiB,CAChB,UAAA,EAGA,MACI,KAAA;AACJ,IAAI,IAAA,OAAO,eAAe,QAAU,EAAA;AACnC,MAAA,MAAA,CAAO,IAAK,CAAA,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,IAAS,KAAA;AACzC,QAAA,IAAA,CAAK,cAAe,CAAA,IAAA,EAAM,UAAW,CAAA,IAAI,CAAC,CAAA;AAAA,OAC1C,CAAA;AACD,MAAA;AAAA;AAED,IAAA,IAAI,CAAC,MAAQ,EAAA;AACZ,MAAA;AAAA;AAED,IAAI,IAAAA,2BAAA,CAAa,MAAM,CAAG,EAAA;AACzB,MAAS,MAAA,GAAA;AAAA,QACR,SAAW,EAAA,MAAA;AAAA,QACX,KACE,EAAA,MAAA,CAAe,WAAgB,IAAA,MAAA,CAAe,IAAQ,IAAA;AAAA,OACzD;AAAA;AAGD,IAAI,IAAA,CAAC,OAAO,YAAc,EAAA;AACzB,MAAM,MAAA,OAAA,GAAU,oBAAqB,CAAA,MAAA,CAAO,SAAS,CAAA;AACrD,MAAA,IAAI,OAAS,EAAA;AACZ,QAAO,MAAA,CAAA,YAAA,GAAe,CAAC,KACtB,KAAA,OAAA,CAAQ,KAAK,KAAO,EAAA,KAAA,CAAM,UAAU,CAAA;AAAA;AACtC;AAGD,IAAK,IAAA,CAAA,UAAA,CAAW,IAAI,UAAY,EAAA,EAAE,MAAM,UAAY,EAAA,GAAG,QAAQ,CAAA;AAAA,GAChE;AAAA,EAEA,aAAA,GAAgB,MAAM,IAAK,CAAA,UAAA;AAAA,EAE3B,mBAAA,GAAsB,CACrB,MAAA,EACA,KACkB,KAAA;AAClB,IAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC/B,MAAS,MAAA,GAAA,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9B,MAAA,IAAI,CAAC,MAAQ,EAAA;AACZ,QAAO,OAAA,IAAA;AAAA;AAER,MAAA,IAAI,OAAO,YAAc,EAAA;AACxB,QAAQ,KAAA,GAAA;AAAA,UACP,GAAG,MAAO,CAAA,YAAA;AAAA,UACV,GAAG;AAAA,SACJ;AAAA;AAED,MAAA,MAAA,GAAS,MAAO,CAAA,SAAA;AAAA;AAGjB,IAAA,IAAI,OAAW,IAAA,KAAA,IAAS,OAAO,KAAA,CAAM,UAAU,WAAa,EAAA;AAC3D,MAAA,OAAO,KAAM,CAAA,KAAA;AAAA;AAGd,IAAO,OAAAC,4BAAA,CAAc,QAAQ,KAAK,CAAA;AAAA,GACnC;AACD;AAYA,SAAS,qBAAqB,MAAa,EAAA;AAC1C,EAAA,OACE,MACC,KAAA,MAAA,CAAO,OACP,IAAA,MAAA,CAAO,OACN,IAAA,MAAA,CAAO,IAAS,KAAA,MAAA,CAAO,IAAK,CAAA,OAAA,IAAW,MAAO,CAAA,IAAA,CAAK,OACtD,CAAA,CAAA,IAAA,IAAA;AAEF;;;;"} |
-133
| import EventEmitter from 'eventemitter2'; | ||
| import { EditorConfig, HookConfig, IPublicModelEditor, IPublicTypeAssetsJson, IPublicTypeEditorGetResult, IPublicTypeEditorValueKey, PluginClassSet } from '@arvin-shu/microcode-types'; | ||
| import { EventBus, IEventBus } from './event-bus'; | ||
| export interface IEditor extends IPublicModelEditor { | ||
| config?: EditorConfig; | ||
| components?: PluginClassSet; | ||
| eventBus: IEventBus; | ||
| init(config?: EditorConfig, components?: PluginClassSet): Promise<any>; | ||
| } | ||
| export declare class Editor extends EventEmitter implements IEditor { | ||
| readonly viewName: string; | ||
| readonly workspaceMode: boolean; | ||
| /** | ||
| * 存储全局状态和资源 | ||
| */ | ||
| private context; | ||
| /** | ||
| * 获取当前语言 | ||
| */ | ||
| get locale(): any; | ||
| /** | ||
| * 编辑器配置 | ||
| */ | ||
| config?: EditorConfig; | ||
| /** | ||
| * 事件总线 | ||
| */ | ||
| eventBus: EventBus; | ||
| /** | ||
| * 插件集合 | ||
| */ | ||
| components?: PluginClassSet; | ||
| /** | ||
| * 钩子集合 | ||
| */ | ||
| private hooks; | ||
| /** | ||
| * 等待集合 | ||
| */ | ||
| private waits; | ||
| constructor(viewName?: string, workspaceMode?: boolean); | ||
| /** | ||
| * 获取指定键的值 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 获取到的值 | ||
| */ | ||
| get<T = undefined, KeyOrType = any>(keyOrType: KeyOrType): IPublicTypeEditorGetResult<T, KeyOrType> | undefined; | ||
| /** | ||
| * 检查指定键是否存在 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 是否存在 | ||
| */ | ||
| has(keyOrType: IPublicTypeEditorValueKey): boolean; | ||
| /** | ||
| * 设置指定键的值 | ||
| * @param key 键 | ||
| * @param data 值 | ||
| */ | ||
| set(key: IPublicTypeEditorValueKey, data: any): void | Promise<void>; | ||
| /** | ||
| * 设置资源配置 | ||
| * @param assets 资源配置对象 | ||
| */ | ||
| setAssets(assets: IPublicTypeAssetsJson): Promise<void>; | ||
| /** | ||
| * 用于监听某个键的数据变化,并在数据变化时调用回调函数。 | ||
| * | ||
| * @param keyOrType | ||
| * @param fn | ||
| * @returns | ||
| */ | ||
| onChange<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(keyOrType: KeyOrType, fn: (data: IPublicTypeEditorGetResult<T, KeyOrType>) => void): () => void; | ||
| register(data: any, key?: IPublicTypeEditorValueKey): void; | ||
| /** | ||
| * 初始化编辑器 | ||
| * | ||
| * @param config 编辑器配置项,包含生命周期和钩子函数等 | ||
| * @param components 组件集合 | ||
| * @returns Promise<boolean> 初始化是否成功 | ||
| */ | ||
| init(config?: EditorConfig, components?: PluginClassSet): Promise<any>; | ||
| /** | ||
| * 初始化钩子函数 | ||
| * @param hooks 钩子函数配置 | ||
| * @returns 钩子函数集合 | ||
| */ | ||
| initHooks: (hooks: HookConfig[]) => HookConfig[]; | ||
| /** | ||
| * 注册钩子函数 | ||
| * @param hooks 钩子函数配置 | ||
| * @returns 钩子函数集合 | ||
| */ | ||
| registerHooks: (hooks: HookConfig[]) => void; | ||
| /** | ||
| * 注销钩子函数 | ||
| */ | ||
| unregisterHooks: () => void; | ||
| /** | ||
| * 获取指定键的值,如果值不存在则等待获取 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 获取到的值 | ||
| */ | ||
| onceGot<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(keyOrType: KeyOrType): Promise<IPublicTypeEditorGetResult<T, KeyOrType>>; | ||
| /** | ||
| * 获取指定键的值,如果值不存在则等待获取 | ||
| * @param keyOrType 键或类型 | ||
| * @param fn 回调函数 | ||
| * @returns 注销函数 | ||
| */ | ||
| onGot<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(keyOrType: KeyOrType, fn: (data: IPublicTypeEditorGetResult<T, KeyOrType>) => void): () => void; | ||
| /** | ||
| * 通知获取指定键的值 | ||
| * @param key 键 | ||
| */ | ||
| private notifyGot; | ||
| /** | ||
| * 设置等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param resolve 回调函数 | ||
| * @param once 是否只执行一次 | ||
| */ | ||
| private setWait; | ||
| /** | ||
| * 删除等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param fn 回调函数 | ||
| */ | ||
| private delWait; | ||
| } | ||
| /** | ||
| * 全局事件总线 | ||
| */ | ||
| export declare const commonEvent: EventBus; |
-347
| 'use strict'; | ||
| var EventEmitter = require('eventemitter2'); | ||
| var vue = require('vue'); | ||
| var microcodeUtils = require('@arvin-shu/microcode-utils'); | ||
| var eventBus = require('./event-bus.js'); | ||
| var config = require('./config.js'); | ||
| var globalLocale = require('./inti/global-locale.js'); | ||
| require('./utils/index.js'); | ||
| var assetsTransform = require('./utils/assets-transform.js'); | ||
| "use strict"; | ||
| const keyBlacklist = [ | ||
| "designer", | ||
| "skeleton", | ||
| "currentDocument", | ||
| "simulator", | ||
| "plugins", | ||
| "setters", | ||
| "material", | ||
| "innerHotkey", | ||
| "innerPlugins" | ||
| ]; | ||
| const AssetsCache = {}; | ||
| class Editor extends EventEmitter { | ||
| constructor(viewName = "global", workspaceMode = false) { | ||
| super(); | ||
| this.viewName = viewName; | ||
| this.workspaceMode = workspaceMode; | ||
| this.setMaxListeners(200); | ||
| this.eventBus = new eventBus.EventBus(this); | ||
| } | ||
| /** | ||
| * 存储全局状态和资源 | ||
| */ | ||
| context = vue.shallowReactive( | ||
| /* @__PURE__ */ new Map() | ||
| ); | ||
| /** | ||
| * 获取当前语言 | ||
| */ | ||
| get locale() { | ||
| return globalLocale.globalLocale.getLocale(); | ||
| } | ||
| /** | ||
| * 编辑器配置 | ||
| */ | ||
| config; | ||
| /** | ||
| * 事件总线 | ||
| */ | ||
| eventBus; | ||
| /** | ||
| * 插件集合 | ||
| */ | ||
| components; | ||
| /** | ||
| * 钩子集合 | ||
| */ | ||
| hooks = []; | ||
| /** | ||
| * 等待集合 | ||
| */ | ||
| waits = /* @__PURE__ */ new Map(); | ||
| /** | ||
| * 获取指定键的值 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 获取到的值 | ||
| */ | ||
| get(keyOrType) { | ||
| return this.context.get(keyOrType); | ||
| } | ||
| /** | ||
| * 检查指定键是否存在 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 是否存在 | ||
| */ | ||
| has(keyOrType) { | ||
| return this.context.has(keyOrType); | ||
| } | ||
| /** | ||
| * 设置指定键的值 | ||
| * @param key 键 | ||
| * @param data 值 | ||
| */ | ||
| set(key, data) { | ||
| if (key === "assets") { | ||
| return this.setAssets(data); | ||
| } | ||
| this.context.set(key, data); | ||
| if (!keyBlacklist.includes(key)) { | ||
| config.engineConfig.set(key, data); | ||
| } | ||
| this.context.set(key, data); | ||
| this.notifyGot(key); | ||
| } | ||
| /** | ||
| * 设置资源配置 | ||
| * @param assets 资源配置对象 | ||
| */ | ||
| async setAssets(assets) { | ||
| const { components } = assets; | ||
| if (components && components.length) { | ||
| const componentDescriptions = []; | ||
| const remoteComponentDescriptions = []; | ||
| components.forEach((component) => { | ||
| if (!component) { | ||
| return; | ||
| } | ||
| if (component.exportName && component.url) { | ||
| remoteComponentDescriptions.push(component); | ||
| } else { | ||
| componentDescriptions.push( | ||
| component | ||
| ); | ||
| } | ||
| }); | ||
| assets.components = componentDescriptions; | ||
| if (remoteComponentDescriptions && remoteComponentDescriptions.length) { | ||
| await Promise.all( | ||
| remoteComponentDescriptions.map( | ||
| async (component) => { | ||
| const { exportName, url, npm } = component; | ||
| if (!url || !exportName) { | ||
| return; | ||
| } | ||
| if (!AssetsCache[exportName] || !npm?.version || AssetsCache[exportName].npm?.version !== npm.version) { | ||
| await new microcodeUtils.AssetLoader().load(url); | ||
| } | ||
| AssetsCache[exportName] = component; | ||
| function setAssetsComponent(component2, extraNpmInfo = {}) { | ||
| const { components: components2 } = component2; | ||
| if (Array.isArray(components2)) { | ||
| components2.forEach((d) => { | ||
| assets.components = assets.components.concat({ | ||
| npm: { | ||
| ...npm, | ||
| ...extraNpmInfo | ||
| }, | ||
| ...d | ||
| }); | ||
| }); | ||
| return; | ||
| } | ||
| if (component2.components) { | ||
| assets.components = assets.components.concat({ | ||
| npm: { | ||
| ...npm, | ||
| ...extraNpmInfo | ||
| }, | ||
| ...component2.components | ||
| }); | ||
| } | ||
| } | ||
| function setArrayAssets(value, preExportName = "", preSubName = "") { | ||
| value.forEach((d, i) => { | ||
| const exportName2 = [preExportName, i.toString()].filter((d2) => !!d2).join("."); | ||
| const subName = [preSubName, i.toString()].filter((d2) => !!d2).join("."); | ||
| Array.isArray(d) ? setArrayAssets(d, exportName2, subName) : setAssetsComponent(d, { | ||
| exportName: exportName2, | ||
| subName | ||
| }); | ||
| }); | ||
| } | ||
| if (window[exportName]) { | ||
| if (Array.isArray(window[exportName])) { | ||
| setArrayAssets(window[exportName]); | ||
| } else { | ||
| setAssetsComponent(window[exportName]); | ||
| } | ||
| } | ||
| return window[exportName]; | ||
| } | ||
| ) | ||
| ); | ||
| } | ||
| } | ||
| const innerAssets = assetsTransform.assetsTransform(assets); | ||
| this.context.set("assets", innerAssets); | ||
| this.notifyGot("assets"); | ||
| } | ||
| /** | ||
| * 用于监听某个键的数据变化,并在数据变化时调用回调函数。 | ||
| * | ||
| * @param keyOrType | ||
| * @param fn | ||
| * @returns | ||
| */ | ||
| onChange(keyOrType, fn) { | ||
| this.setWait(keyOrType, fn); | ||
| return () => { | ||
| this.delWait(keyOrType, fn); | ||
| }; | ||
| } | ||
| register(data, key) { | ||
| this.context.set(key || data, data); | ||
| this.notifyGot(key || data); | ||
| } | ||
| /** | ||
| * 初始化编辑器 | ||
| * | ||
| * @param config 编辑器配置项,包含生命周期和钩子函数等 | ||
| * @param components 组件集合 | ||
| * @returns Promise<boolean> 初始化是否成功 | ||
| */ | ||
| async init(config, components) { | ||
| this.config = config || {}; | ||
| this.components = components || {}; | ||
| const { hooks = [], lifeCycles } = this.config; | ||
| this.emit("editor.beforeInit"); | ||
| const init = lifeCycles && lifeCycles.init || (() => { | ||
| }); | ||
| try { | ||
| await init(this); | ||
| this.registerHooks(hooks); | ||
| this.emit("editor.afterInit"); | ||
| return true; | ||
| } catch (e) { | ||
| console.error(e); | ||
| } | ||
| } | ||
| /** | ||
| * 初始化钩子函数 | ||
| * @param hooks 钩子函数配置 | ||
| * @returns 钩子函数集合 | ||
| */ | ||
| initHooks = (hooks) => { | ||
| this.hooks = hooks.map((hook) => ({ | ||
| ...hook, | ||
| // 指定第一个参数为 editor | ||
| handler: hook.handler.bind(this, this) | ||
| })); | ||
| return this.hooks; | ||
| }; | ||
| /** | ||
| * 注册钩子函数 | ||
| * @param hooks 钩子函数配置 | ||
| * @returns 钩子函数集合 | ||
| */ | ||
| registerHooks = (hooks) => { | ||
| this.initHooks(hooks).forEach(({ message, type, handler }) => { | ||
| if (["on", "once"].indexOf(type) !== -1) { | ||
| this[type](message, handler); | ||
| } | ||
| }); | ||
| }; | ||
| /** | ||
| * 注销钩子函数 | ||
| */ | ||
| unregisterHooks = () => { | ||
| this.hooks.forEach(({ message, handler }) => { | ||
| this.removeListener(message, handler); | ||
| }); | ||
| }; | ||
| /** | ||
| * 获取指定键的值,如果值不存在则等待获取 | ||
| * @param keyOrType 键或类型 | ||
| * @returns 获取到的值 | ||
| */ | ||
| onceGot(keyOrType) { | ||
| const x = this.context.get(keyOrType); | ||
| if (x !== void 0) { | ||
| return Promise.resolve(x); | ||
| } | ||
| return new Promise((resolve) => { | ||
| this.setWait(keyOrType, resolve, true); | ||
| }); | ||
| } | ||
| /** | ||
| * 获取指定键的值,如果值不存在则等待获取 | ||
| * @param keyOrType 键或类型 | ||
| * @param fn 回调函数 | ||
| * @returns 注销函数 | ||
| */ | ||
| onGot(keyOrType, fn) { | ||
| const x = this.context.get(keyOrType); | ||
| if (x !== void 0) { | ||
| fn(x); | ||
| } | ||
| this.setWait(keyOrType, fn); | ||
| return () => { | ||
| this.delWait(keyOrType, fn); | ||
| }; | ||
| } | ||
| /** | ||
| * 通知获取指定键的值 | ||
| * @param key 键 | ||
| */ | ||
| notifyGot(key) { | ||
| let waits = this.waits.get(key); | ||
| if (!waits) { | ||
| return; | ||
| } | ||
| waits = waits.slice().reverse(); | ||
| let 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); | ||
| } | ||
| } | ||
| /** | ||
| * 设置等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param resolve 回调函数 | ||
| * @param once 是否只执行一次 | ||
| */ | ||
| setWait(key, resolve, once) { | ||
| const waits = this.waits.get(key); | ||
| if (waits) { | ||
| waits.push({ resolve, once }); | ||
| } else { | ||
| this.waits.set(key, [{ resolve, once }]); | ||
| } | ||
| } | ||
| /** | ||
| * 删除等待获取指定键的值 | ||
| * @param key 键 | ||
| * @param fn 回调函数 | ||
| */ | ||
| delWait(key, fn) { | ||
| const waits = this.waits.get(key); | ||
| if (!waits) { | ||
| return; | ||
| } | ||
| let i = waits.length; | ||
| while (i--) { | ||
| if (waits[i].resolve === fn) { | ||
| waits.splice(i, 1); | ||
| } | ||
| } | ||
| if (waits.length < 1) { | ||
| this.waits.delete(key); | ||
| } | ||
| } | ||
| } | ||
| const commonEvent = new eventBus.EventBus(new EventEmitter()); | ||
| exports.Editor = Editor; | ||
| exports.commonEvent = commonEvent; | ||
| //# sourceMappingURL=editor.js.map |
| {"version":3,"file":"editor.js","sources":["../../src/editor.ts"],"sourcesContent":["import EventEmitter from 'eventemitter2';\nimport {\n\tEditorConfig,\n\tHookConfig,\n\tIPublicModelEditor,\n\tIPublicTypeAssetsJson,\n\tIPublicTypeComponentDescription,\n\tIPublicTypeEditorGetResult,\n\tIPublicTypeEditorValueKey,\n\tIPublicTypeRemoteComponentDescription,\n\tPluginClassSet,\n} from '@arvin-shu/microcode-types';\nimport { shallowReactive } from 'vue';\nimport { AssetLoader } from '@arvin-shu/microcode-utils';\nimport { EventBus, IEventBus } from './event-bus';\nimport { engineConfig } from './config';\nimport { globalLocale } from './inti/global-locale';\nimport { assetsTransform } from './utils';\n\nconst keyBlacklist = [\n\t'designer',\n\t'skeleton',\n\t'currentDocument',\n\t'simulator',\n\t'plugins',\n\t'setters',\n\t'material',\n\t'innerHotkey',\n\t'innerPlugins',\n];\n\nconst AssetsCache: {\n\t[key: string]: IPublicTypeRemoteComponentDescription;\n} = {};\n\nexport interface IEditor extends IPublicModelEditor {\n\tconfig?: EditorConfig;\n\tcomponents?: PluginClassSet;\n\teventBus: IEventBus;\n\tinit(config?: EditorConfig, components?: PluginClassSet): Promise<any>;\n}\nexport class Editor extends EventEmitter implements IEditor {\n\t/**\n\t * 存储全局状态和资源\n\t */\n\tprivate context = shallowReactive<Map<IPublicTypeEditorValueKey, any>>(\n\t\tnew Map<IPublicTypeEditorValueKey, any>()\n\t);\n\n\t/**\n\t * 获取当前语言\n\t */\n\tget locale() {\n\t\treturn globalLocale.getLocale();\n\t}\n\n\t/**\n\t * 编辑器配置\n\t */\n\tconfig?: EditorConfig;\n\n\t/**\n\t * 事件总线\n\t */\n\teventBus: EventBus;\n\n\t/**\n\t * 插件集合\n\t */\n\tcomponents?: PluginClassSet;\n\n\t/**\n\t * 钩子集合\n\t */\n\tprivate hooks: HookConfig[] = [];\n\n\t/**\n\t * 等待集合\n\t */\n\tprivate waits = new Map<\n\t\tIPublicTypeEditorValueKey,\n\t\tArray<{\n\t\t\tonce?: boolean;\n\t\t\tresolve: (data: any) => void;\n\t\t}>\n\t>();\n\n\tconstructor(\n\t\treadonly viewName: string = 'global',\n\t\treadonly workspaceMode: boolean = false\n\t) {\n\t\tsuper();\n\t\tthis.setMaxListeners(200);\n\t\tthis.eventBus = new EventBus(this);\n\t}\n\n\t/**\n\t * 获取指定键的值\n\t * @param keyOrType 键或类型\n\t * @returns 获取到的值\n\t */\n\tget<T = undefined, KeyOrType = any>(\n\t\tkeyOrType: KeyOrType\n\t): IPublicTypeEditorGetResult<T, KeyOrType> | undefined {\n\t\treturn this.context.get(keyOrType as any);\n\t}\n\n\t/**\n\t * 检查指定键是否存在\n\t * @param keyOrType 键或类型\n\t * @returns 是否存在\n\t */\n\thas(keyOrType: IPublicTypeEditorValueKey): boolean {\n\t\treturn this.context.has(keyOrType);\n\t}\n\n\t/**\n\t * 设置指定键的值\n\t * @param key 键\n\t * @param data 值\n\t */\n\tset(key: IPublicTypeEditorValueKey, data: any): void | Promise<void> {\n\t\tif (key === 'assets') {\n\t\t\treturn this.setAssets(data);\n\t\t}\n\t\tthis.context.set(key, data);\n\t\t// 不应存储在配置中的内部实例\n\t\tif (!keyBlacklist.includes(key as string)) {\n\t\t\tengineConfig.set(key as string, data);\n\t\t}\n\t\tthis.context.set(key, data);\n\t\tthis.notifyGot(key);\n\t}\n\n\t/**\n\t * 设置资源配置\n\t * @param assets 资源配置对象\n\t */\n\tasync setAssets(assets: IPublicTypeAssetsJson) {\n\t\tconst { components } = assets;\n\t\t// 如果存在组件配置\n\t\tif (components && components.length) {\n\t\t\t// 用于存储本地组件和远程组件的数组\n\t\t\tconst componentDescriptions: IPublicTypeComponentDescription[] = [];\n\t\t\tconst remoteComponentDescriptions: IPublicTypeRemoteComponentDescription[] =\n\t\t\t\t[];\n\t\t\t// 遍历组件配置,区分本地组件和远程组件\n\t\t\tcomponents.forEach((component) => {\n\t\t\t\tif (!component) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 如果有 exportName 和 url 则为远程组件\n\t\t\t\tif (component.exportName && component.url) {\n\t\t\t\t\tremoteComponentDescriptions.push(component);\n\t\t\t\t} else {\n\t\t\t\t\t// 否则为本地组件\n\t\t\t\t\tcomponentDescriptions.push(\n\t\t\t\t\t\tcomponent as IPublicTypeComponentDescription\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tassets.components = componentDescriptions;\n\n\t\t\t// 处理远程组件\n\t\t\tif (remoteComponentDescriptions && remoteComponentDescriptions.length) {\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tremoteComponentDescriptions.map(\n\t\t\t\t\t\tasync (component: IPublicTypeRemoteComponentDescription) => {\n\t\t\t\t\t\t\tconst { exportName, url, npm } = component;\n\t\t\t\t\t\t\tif (!url || !exportName) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// 检查缓存,如果组件不在缓存中或版本不一致,则重新加载\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!AssetsCache[exportName] ||\n\t\t\t\t\t\t\t\t!npm?.version ||\n\t\t\t\t\t\t\t\tAssetsCache[exportName].npm?.version !== npm.version\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tawait new AssetLoader().load(url);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tAssetsCache[exportName] = component;\n\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * 设置资源组件\n\t\t\t\t\t\t\t * @param component 组件配置\n\t\t\t\t\t\t\t * @param extraNpmInfo 额外的 npm 信息\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tfunction setAssetsComponent(\n\t\t\t\t\t\t\t\tcomponent: any,\n\t\t\t\t\t\t\t\textraNpmInfo: any = {}\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tconst { components } = component;\n\t\t\t\t\t\t\t\t// 处理组件数组\n\t\t\t\t\t\t\t\tif (Array.isArray(components)) {\n\t\t\t\t\t\t\t\t\tcomponents.forEach((d) => {\n\t\t\t\t\t\t\t\t\t\tassets.components = assets.components.concat({\n\t\t\t\t\t\t\t\t\t\t\tnpm: {\n\t\t\t\t\t\t\t\t\t\t\t\t...npm,\n\t\t\t\t\t\t\t\t\t\t\t\t...extraNpmInfo,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t...d,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// 处理单个组件\n\t\t\t\t\t\t\t\tif (component.components) {\n\t\t\t\t\t\t\t\t\tassets.components = assets.components.concat({\n\t\t\t\t\t\t\t\t\t\tnpm: {\n\t\t\t\t\t\t\t\t\t\t\t...npm,\n\t\t\t\t\t\t\t\t\t\t\t...extraNpmInfo,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t...component.components,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * 设置数组类型的资源\n\t\t\t\t\t\t\t * @param value 资源数组\n\t\t\t\t\t\t\t * @param preExportName 前缀导出名\n\t\t\t\t\t\t\t * @param preSubName 前缀子名\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tfunction setArrayAssets(\n\t\t\t\t\t\t\t\tvalue: any[],\n\t\t\t\t\t\t\t\tpreExportName: string = '',\n\t\t\t\t\t\t\t\tpreSubName: string = ''\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tvalue.forEach((d: any, i: number) => {\n\t\t\t\t\t\t\t\t\tconst exportName = [preExportName, i.toString()]\n\t\t\t\t\t\t\t\t\t\t.filter((d) => !!d)\n\t\t\t\t\t\t\t\t\t\t.join('.');\n\t\t\t\t\t\t\t\t\tconst subName = [preSubName, i.toString()]\n\t\t\t\t\t\t\t\t\t\t.filter((d) => !!d)\n\t\t\t\t\t\t\t\t\t\t.join('.');\n\t\t\t\t\t\t\t\t\t// 递归处理数组\n\t\t\t\t\t\t\t\t\tArray.isArray(d)\n\t\t\t\t\t\t\t\t\t\t? setArrayAssets(d, exportName, subName)\n\t\t\t\t\t\t\t\t\t\t: setAssetsComponent(d, {\n\t\t\t\t\t\t\t\t\t\t\t\texportName,\n\t\t\t\t\t\t\t\t\t\t\t\tsubName,\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// 处理全局导出的组件\n\t\t\t\t\t\t\tif ((window as any)[exportName]) {\n\t\t\t\t\t\t\t\tif (Array.isArray((window as any)[exportName])) {\n\t\t\t\t\t\t\t\t\tsetArrayAssets((window as any)[exportName] as any);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tsetAssetsComponent((window as any)[exportName] as any);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (window as any)[exportName];\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst innerAssets = assetsTransform(assets);\n\t\t// 设置资源到上下文\n\t\tthis.context.set('assets', innerAssets);\n\t\t// 通知资源更新\n\t\tthis.notifyGot('assets');\n\t}\n\n\t/**\n\t * 用于监听某个键的数据变化,并在数据变化时调用回调函数。\n\t *\n\t * @param keyOrType\n\t * @param fn\n\t * @returns\n\t */\n\tonChange<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(\n\t\tkeyOrType: KeyOrType,\n\t\tfn: (data: IPublicTypeEditorGetResult<T, KeyOrType>) => void\n\t): () => void {\n\t\tthis.setWait(keyOrType, fn);\n\t\treturn () => {\n\t\t\tthis.delWait(keyOrType, fn);\n\t\t};\n\t}\n\n\tregister(data: any, key?: IPublicTypeEditorValueKey): void {\n\t\tthis.context.set(key || data, data);\n\t\tthis.notifyGot(key || data);\n\t}\n\n\t/**\n\t * 初始化编辑器\n\t *\n\t * @param config 编辑器配置项,包含生命周期和钩子函数等\n\t * @param components 组件集合\n\t * @returns Promise<boolean> 初始化是否成功\n\t */\n\tasync init(config?: EditorConfig, components?: PluginClassSet): Promise<any> {\n\t\t// 初始化配置和组件\n\t\tthis.config = config || {};\n\t\tthis.components = components || {};\n\n\t\t// 从配置中获取钩子函数和生命周期函数\n\t\tconst { hooks = [], lifeCycles } = this.config;\n\n\t\t// 触发初始化前事件\n\t\tthis.emit('editor.beforeInit');\n\t\t// 获取初始化生命周期函数,如果没有则使用空函数\n\t\tconst init = (lifeCycles && lifeCycles.init) || ((): void => {});\n\t\ttry {\n\t\t\t// 执行初始化函数\n\t\t\tawait init(this);\n\t\t\t// 注册快捷键\n\t\t\t// 注册钩子函数\n\t\t\tthis.registerHooks(hooks);\n\t\t\t// 触发初始化完成事件\n\t\t\tthis.emit('editor.afterInit');\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n\n\t/**\n\t * 初始化钩子函数\n\t * @param hooks 钩子函数配置\n\t * @returns 钩子函数集合\n\t */\n\tinitHooks = (hooks: HookConfig[]) => {\n\t\tthis.hooks = hooks.map((hook) => ({\n\t\t\t...hook,\n\t\t\t// 指定第一个参数为 editor\n\t\t\thandler: hook.handler.bind(this, this),\n\t\t}));\n\t\treturn this.hooks;\n\t};\n\n\t/**\n\t * 注册钩子函数\n\t * @param hooks 钩子函数配置\n\t * @returns 钩子函数集合\n\t */\n\tregisterHooks = (hooks: HookConfig[]) => {\n\t\tthis.initHooks(hooks).forEach(({ message, type, handler }) => {\n\t\t\t// 调用eventemitter2的on和once方法注册事件\n\t\t\tif (['on', 'once'].indexOf(type) !== -1) {\n\t\t\t\t// 注册一下hook的监听\n\t\t\t\tthis[type](message as any, handler);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * 注销钩子函数\n\t */\n\tunregisterHooks = () => {\n\t\tthis.hooks.forEach(({ message, handler }) => {\n\t\t\tthis.removeListener(message, handler);\n\t\t});\n\t};\n\n\t/**\n\t * 获取指定键的值,如果值不存在则等待获取\n\t * @param keyOrType 键或类型\n\t * @returns 获取到的值\n\t */\n\tonceGot<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(\n\t\tkeyOrType: KeyOrType\n\t): Promise<IPublicTypeEditorGetResult<T, KeyOrType>> {\n\t\tconst x = this.context.get(keyOrType);\n\t\tif (x !== undefined) {\n\t\t\treturn Promise.resolve(x);\n\t\t}\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.setWait(keyOrType, resolve, true);\n\t\t});\n\t}\n\n\t/**\n\t * 获取指定键的值,如果值不存在则等待获取\n\t * @param keyOrType 键或类型\n\t * @param fn 回调函数\n\t * @returns 注销函数\n\t */\n\tonGot<T = undefined, KeyOrType extends IPublicTypeEditorValueKey = any>(\n\t\tkeyOrType: KeyOrType,\n\t\tfn: (data: IPublicTypeEditorGetResult<T, KeyOrType>) => void\n\t): () => void {\n\t\tconst x = this.context.get(keyOrType);\n\t\tif (x !== undefined) {\n\t\t\tfn(x);\n\t\t}\n\t\tthis.setWait(keyOrType, fn);\n\t\treturn () => {\n\t\t\tthis.delWait(keyOrType, fn);\n\t\t};\n\t}\n\n\t/**\n\t * 通知获取指定键的值\n\t * @param key 键\n\t */\n\tprivate notifyGot(key: IPublicTypeEditorValueKey) {\n\t\tlet waits = this.waits.get(key);\n\t\tif (!waits) {\n\t\t\treturn;\n\t\t}\n\t\twaits = waits.slice().reverse();\n\t\tlet i = waits.length;\n\t\twhile (i--) {\n\t\t\twaits[i].resolve(this.get(key));\n\t\t\tif (waits[i].once) {\n\t\t\t\twaits.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\tif (waits.length > 0) {\n\t\t\tthis.waits.set(key, waits);\n\t\t} else {\n\t\t\tthis.waits.delete(key);\n\t\t}\n\t}\n\n\t/**\n\t * 设置等待获取指定键的值\n\t * @param key 键\n\t * @param resolve 回调函数\n\t * @param once 是否只执行一次\n\t */\n\tprivate setWait(\n\t\tkey: IPublicTypeEditorValueKey,\n\t\tresolve: (data: any) => void,\n\t\tonce?: boolean\n\t) {\n\t\tconst waits = this.waits.get(key);\n\t\tif (waits) {\n\t\t\twaits.push({ resolve, once });\n\t\t} else {\n\t\t\tthis.waits.set(key, [{ resolve, once }]);\n\t\t}\n\t}\n\n\t/**\n\t * 删除等待获取指定键的值\n\t * @param key 键\n\t * @param fn 回调函数\n\t */\n\tprivate delWait(key: IPublicTypeEditorValueKey, fn: any) {\n\t\tconst waits = this.waits.get(key);\n\t\tif (!waits) {\n\t\t\treturn;\n\t\t}\n\t\tlet i = waits.length;\n\t\twhile (i--) {\n\t\t\tif (waits[i].resolve === fn) {\n\t\t\t\twaits.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\tif (waits.length < 1) {\n\t\t\tthis.waits.delete(key);\n\t\t}\n\t}\n}\n\n/**\n * 全局事件总线\n */\nexport const commonEvent = new EventBus(new EventEmitter());\n"],"names":["EventBus","shallowReactive","globalLocale","engineConfig","AssetLoader","component","components","exportName","d","assetsTransform"],"mappings":"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"} |
| import { IPublicApiEvent, IPublicTypeDisposable } from '@arvin-shu/microcode-types'; | ||
| import EventEmitter from 'eventemitter2'; | ||
| export interface IEventBus extends IPublicApiEvent { | ||
| removeListener(event: string | symbol, listener: (...args: any[]) => void): any; | ||
| addListener(event: string | symbol, listener: (...args: any[]) => void): any; | ||
| setMaxListeners(n: number): any; | ||
| removeAllListeners(event?: string | symbol): any; | ||
| } | ||
| /** | ||
| * 事件总线 | ||
| */ | ||
| export declare class EventBus implements IEventBus { | ||
| private readonly eventEmitter; | ||
| private readonly name?; | ||
| constructor(emitter: EventEmitter, name?: string); | ||
| /** | ||
| * 监听事件 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| on(event: string, listener: (...args: any[]) => void): IPublicTypeDisposable; | ||
| /** | ||
| * 监听事件,会在其他回调函数之前执行 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| prependListener(event: string, listener: (...args: any[]) => void): () => void; | ||
| /** | ||
| * 取消监听事件 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| off(event: string, listener: (...args: any[]) => void): void; | ||
| /** | ||
| * 触发事件 | ||
| * @param event 事件名称 | ||
| * @param args 事件参数 | ||
| * @returns | ||
| */ | ||
| emit(event: string, ...args: any[]): void; | ||
| /** | ||
| * 移除事件监听 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| removeListener(event: string | symbol, listener: (...args: any[]) => void): any; | ||
| /** | ||
| * 添加事件监听 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| addListener(event: string | symbol, listener: (...args: any[]) => void): any; | ||
| /** | ||
| * 设置事件监听的最大数量 | ||
| * @param n 最大数量 | ||
| */ | ||
| setMaxListeners(n: number): any; | ||
| /** | ||
| * 移除所有事件监听 | ||
| * @param event 事件名称 | ||
| */ | ||
| removeAllListeners(event?: string | symbol): any; | ||
| /** | ||
| * 获取消息前缀 | ||
| * @param type 类型 | ||
| * @returns 消息前缀 | ||
| */ | ||
| private getMsgPrefix; | ||
| /** | ||
| * 获取日志器 | ||
| * @returns 日志器 | ||
| */ | ||
| private getLogger; | ||
| } | ||
| /** | ||
| * 创建模块事件总线 | ||
| * @param moduleName 模块名称 | ||
| * @param maxListeners 最大监听数量 | ||
| * @returns 事件总线 | ||
| */ | ||
| export declare const createModuleEventBus: (moduleName: string, maxListeners?: number) => IEventBus; |
-126
| 'use strict'; | ||
| var microcodeUtils = require('@arvin-shu/microcode-utils'); | ||
| var EventEmitter = require('eventemitter2'); | ||
| "use strict"; | ||
| const logger = new microcodeUtils.Logger({ level: "warn", bizName: "event-bus" }); | ||
| const moduleLogger = new microcodeUtils.Logger({ level: "warn", bizName: "module-event-bus" }); | ||
| class EventBus { | ||
| // 事件发射器 | ||
| eventEmitter; | ||
| // 模块名称 | ||
| name; | ||
| constructor(emitter, name) { | ||
| this.eventEmitter = emitter; | ||
| this.name = name; | ||
| } | ||
| /** | ||
| * 监听事件 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| on(event, listener) { | ||
| this.eventEmitter.on(event, listener); | ||
| this.getLogger().debug(`${this.getMsgPrefix("on")} ${event}`); | ||
| return () => { | ||
| this.off(event, listener); | ||
| }; | ||
| } | ||
| /** | ||
| * 监听事件,会在其他回调函数之前执行 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| prependListener(event, listener) { | ||
| this.eventEmitter.prependListener(event, listener); | ||
| this.getLogger().debug(`${this.getMsgPrefix("prependListener")} ${event}`); | ||
| return () => { | ||
| this.off(event, listener); | ||
| }; | ||
| } | ||
| /** | ||
| * 取消监听事件 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| off(event, listener) { | ||
| this.eventEmitter.off(event, listener); | ||
| this.getLogger().debug(`${this.getMsgPrefix("off")} ${event}`); | ||
| } | ||
| /** | ||
| * 触发事件 | ||
| * @param event 事件名称 | ||
| * @param args 事件参数 | ||
| * @returns | ||
| */ | ||
| emit(event, ...args) { | ||
| this.eventEmitter.emit(event, ...args); | ||
| this.getLogger().debug( | ||
| `${this.getMsgPrefix("emit")} name: ${event}, args: `, | ||
| ...args | ||
| ); | ||
| } | ||
| /** | ||
| * 移除事件监听 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| removeListener(event, listener) { | ||
| return this.eventEmitter.removeListener(event, listener); | ||
| } | ||
| /** | ||
| * 添加事件监听 | ||
| * @param event 事件名称 | ||
| * @param listener 事件回调 | ||
| */ | ||
| addListener(event, listener) { | ||
| return this.eventEmitter.addListener(event, listener); | ||
| } | ||
| /** | ||
| * 设置事件监听的最大数量 | ||
| * @param n 最大数量 | ||
| */ | ||
| setMaxListeners(n) { | ||
| return this.eventEmitter.setMaxListeners(n); | ||
| } | ||
| /** | ||
| * 移除所有事件监听 | ||
| * @param event 事件名称 | ||
| */ | ||
| removeAllListeners(event) { | ||
| return this.eventEmitter.removeAllListeners(event); | ||
| } | ||
| /** | ||
| * 获取消息前缀 | ||
| * @param type 类型 | ||
| * @returns 消息前缀 | ||
| */ | ||
| getMsgPrefix(type) { | ||
| if (this.name && this.name.length > 0) { | ||
| return `[${this.name}][event-${type}]`; | ||
| } | ||
| return `[*][event-${type}]`; | ||
| } | ||
| /** | ||
| * 获取日志器 | ||
| * @returns 日志器 | ||
| */ | ||
| getLogger() { | ||
| if (this.name && this.name.length > 0) { | ||
| return moduleLogger; | ||
| } | ||
| return logger; | ||
| } | ||
| } | ||
| const createModuleEventBus = (moduleName, maxListeners = 200) => { | ||
| const emitter = new EventEmitter(); | ||
| if (maxListeners) { | ||
| emitter.setMaxListeners(maxListeners); | ||
| } | ||
| return new EventBus(emitter, moduleName); | ||
| }; | ||
| exports.EventBus = EventBus; | ||
| exports.createModuleEventBus = createModuleEventBus; | ||
| //# sourceMappingURL=event-bus.js.map |
| {"version":3,"file":"event-bus.js","sources":["../../src/event-bus.ts"],"sourcesContent":["import {\n\tIPublicApiEvent,\n\tIPublicTypeDisposable,\n} from '@arvin-shu/microcode-types';\nimport { Logger } from '@arvin-shu/microcode-utils';\nimport EventEmitter from 'eventemitter2';\n\nconst logger = new Logger({ level: 'warn', bizName: 'event-bus' });\nconst moduleLogger = new Logger({ level: 'warn', bizName: 'module-event-bus' });\n\nexport interface IEventBus extends IPublicApiEvent {\n\tremoveListener(\n\t\tevent: string | symbol,\n\t\tlistener: (...args: any[]) => void\n\t): any;\n\taddListener(event: string | symbol, listener: (...args: any[]) => void): any;\n\tsetMaxListeners(n: number): any;\n\tremoveAllListeners(event?: string | symbol): any;\n}\n\n/**\n * 事件总线\n */\nexport class EventBus implements IEventBus {\n\t// 事件发射器\n\tprivate readonly eventEmitter: EventEmitter;\n\n\t// 模块名称\n\tprivate readonly name?: string;\n\n\tconstructor(emitter: EventEmitter, name?: string) {\n\t\tthis.eventEmitter = emitter;\n\t\tthis.name = name;\n\t}\n\n\t/**\n\t * 监听事件\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\ton(event: string, listener: (...args: any[]) => void): IPublicTypeDisposable {\n\t\tthis.eventEmitter.on(event, listener);\n\t\tthis.getLogger().debug(`${this.getMsgPrefix('on')} ${event}`);\n\t\treturn () => {\n\t\t\tthis.off(event, listener);\n\t\t};\n\t}\n\n\t/**\n\t * 监听事件,会在其他回调函数之前执行\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\tprependListener(\n\t\tevent: string,\n\t\tlistener: (...args: any[]) => void\n\t): () => void {\n\t\tthis.eventEmitter.prependListener(event, listener);\n\t\tthis.getLogger().debug(`${this.getMsgPrefix('prependListener')} ${event}`);\n\t\treturn () => {\n\t\t\tthis.off(event, listener);\n\t\t};\n\t}\n\n\t/**\n\t * 取消监听事件\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\toff(event: string, listener: (...args: any[]) => void) {\n\t\tthis.eventEmitter.off(event, listener);\n\t\tthis.getLogger().debug(`${this.getMsgPrefix('off')} ${event}`);\n\t}\n\n\t/**\n\t * 触发事件\n\t * @param event 事件名称\n\t * @param args 事件参数\n\t * @returns\n\t */\n\temit(event: string, ...args: any[]) {\n\t\tthis.eventEmitter.emit(event, ...args);\n\t\tthis.getLogger().debug(\n\t\t\t`${this.getMsgPrefix('emit')} name: ${event}, args: `,\n\t\t\t...args\n\t\t);\n\t}\n\n\t/**\n\t * 移除事件监听\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\tremoveListener(\n\t\tevent: string | symbol,\n\t\tlistener: (...args: any[]) => void\n\t): any {\n\t\treturn this.eventEmitter.removeListener(event, listener);\n\t}\n\n\t/**\n\t * 添加事件监听\n\t * @param event 事件名称\n\t * @param listener 事件回调\n\t */\n\taddListener(event: string | symbol, listener: (...args: any[]) => void): any {\n\t\treturn this.eventEmitter.addListener(event, listener);\n\t}\n\n\t/**\n\t * 设置事件监听的最大数量\n\t * @param n 最大数量\n\t */\n\tsetMaxListeners(n: number): any {\n\t\treturn this.eventEmitter.setMaxListeners(n);\n\t}\n\n\t/**\n\t * 移除所有事件监听\n\t * @param event 事件名称\n\t */\n\tremoveAllListeners(event?: string | symbol): any {\n\t\treturn this.eventEmitter.removeAllListeners(event);\n\t}\n\n\t/**\n\t * 获取消息前缀\n\t * @param type 类型\n\t * @returns 消息前缀\n\t */\n\tprivate getMsgPrefix(type: string): string {\n\t\tif (this.name && this.name.length > 0) {\n\t\t\treturn `[${this.name}][event-${type}]`;\n\t\t}\n\t\treturn `[*][event-${type}]`;\n\t}\n\n\t/**\n\t * 获取日志器\n\t * @returns 日志器\n\t */\n\tprivate getLogger(): Logger {\n\t\tif (this.name && this.name.length > 0) {\n\t\t\treturn moduleLogger;\n\t\t}\n\t\treturn logger;\n\t}\n}\n\n/**\n * 创建模块事件总线\n * @param moduleName 模块名称\n * @param maxListeners 最大监听数量\n * @returns 事件总线\n */\nexport const createModuleEventBus = (\n\tmoduleName: string,\n\tmaxListeners: number = 200\n): IEventBus => {\n\tconst emitter = new EventEmitter();\n\tif (maxListeners) {\n\t\temitter.setMaxListeners(maxListeners);\n\t}\n\treturn new EventBus(emitter, moduleName);\n};\n"],"names":["Logger"],"mappings":"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"} |
| import { IPublicApiHotkey, IPublicTypeHotkeyCallback, IPublicTypeHotkeyCallbacks } from '@arvin-shu/microcode-types'; | ||
| export interface IHotKey extends Omit<IPublicApiHotkey, 'bind' | 'callbacks'> { | ||
| activate(activate: boolean): void; | ||
| } | ||
| /** | ||
| * 热键管理类 | ||
| */ | ||
| export declare class Hotkey implements IHotKey { | ||
| readonly viewName: string; | ||
| callBacks: IPublicTypeHotkeyCallbacks; | ||
| private directMap; | ||
| private sequenceLevels; | ||
| private resetTimer; | ||
| private ignoreNextKeyup; | ||
| private ignoreNextKeypress; | ||
| private nextExpectedAction; | ||
| private isActivate; | ||
| constructor(viewName?: string); | ||
| activate(activate: boolean): void; | ||
| mount(window: Window): () => void; | ||
| bind(combos: string[] | string, callback: IPublicTypeHotkeyCallback, action?: string): Hotkey; | ||
| unbind(combos: string[] | string, callback: IPublicTypeHotkeyCallback, action?: string): void; | ||
| /** | ||
| * 重置除指定序列外的所有序列计数器 | ||
| */ | ||
| private resetSequences; | ||
| /** | ||
| * 根据按键码、修饰键和事件类型查找匹配的回调函数 | ||
| */ | ||
| private getMatches; | ||
| /** | ||
| * 处理按键事件 | ||
| */ | ||
| private handleKey; | ||
| /** | ||
| * 处理键盘事件 | ||
| */ | ||
| private handleKeyEvent; | ||
| /** | ||
| * 重置序列计时器 | ||
| */ | ||
| private resetSequenceTimer; | ||
| /** | ||
| * 绑定按键序列 | ||
| */ | ||
| private bindSequence; | ||
| /** | ||
| * 绑定单个按键组合 | ||
| */ | ||
| private bindSingle; | ||
| /** | ||
| * 绑定多个按键组合 | ||
| */ | ||
| private bindMultiple; | ||
| } |
-439
| 'use strict'; | ||
| var lodashEs = require('lodash-es'); | ||
| require('./di/index.js'); | ||
| var iocContext = require('./di/ioc-context.js'); | ||
| "use strict"; | ||
| const MAP = { | ||
| 8: "backspace", | ||
| 9: "tab", | ||
| 13: "enter", | ||
| 16: "shift", | ||
| 17: "ctrl", | ||
| 18: "alt", | ||
| 20: "capslock", | ||
| 27: "esc", | ||
| 32: "space", | ||
| 33: "pageup", | ||
| 34: "pagedown", | ||
| 35: "end", | ||
| 36: "home", | ||
| 37: "left", | ||
| 38: "up", | ||
| 39: "right", | ||
| 40: "down", | ||
| 45: "ins", | ||
| 46: "del", | ||
| 91: "meta", | ||
| 93: "meta", | ||
| 224: "meta" | ||
| }; | ||
| const KEYCODE_MAP = { | ||
| 106: "*", | ||
| 107: "+", | ||
| 109: "-", | ||
| 110: ".", | ||
| 111: "/", | ||
| 186: ";", | ||
| 187: "=", | ||
| 188: ",", | ||
| 189: "-", | ||
| 190: ".", | ||
| 191: "/", | ||
| 192: "`", | ||
| 219: "[", | ||
| 220: "\\", | ||
| 221: "]", | ||
| 222: "'" | ||
| }; | ||
| const SHIFT_MAP = { | ||
| "~": "`", | ||
| "!": "1", | ||
| "@": "2", | ||
| "#": "3", | ||
| $: "4", | ||
| "%": "5", | ||
| "^": "6", | ||
| "&": "7", | ||
| "*": "8", | ||
| "(": "9", | ||
| ")": "0", | ||
| _: "-", | ||
| "+": "=", | ||
| ":": ";", | ||
| '"': "'", | ||
| "<": ",", | ||
| ">": ".", | ||
| "?": "/", | ||
| "|": "\\" | ||
| }; | ||
| const SPECIAL_ALIASES = { | ||
| option: "alt", | ||
| command: "meta", | ||
| return: "enter", | ||
| escape: "esc", | ||
| plus: "+", | ||
| mod: /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? "meta" : "ctrl" | ||
| }; | ||
| let REVERSE_MAP; | ||
| for (let i = 1; i < 20; ++i) { | ||
| MAP[111 + i] = `f${i}`; | ||
| } | ||
| for (let i = 0; i <= 9; ++i) { | ||
| MAP[i + 96] = String(i); | ||
| } | ||
| function characterFromEvent(e) { | ||
| const keyCode = e.keyCode || e.which; | ||
| if (e.type === "keypress") { | ||
| let character = String.fromCharCode(keyCode); | ||
| if (!e.shiftKey) { | ||
| character = character.toLowerCase(); | ||
| } | ||
| return character; | ||
| } | ||
| if (MAP[keyCode]) { | ||
| return MAP[keyCode]; | ||
| } | ||
| if (KEYCODE_MAP[keyCode]) { | ||
| return KEYCODE_MAP[keyCode]; | ||
| } | ||
| return String.fromCharCode(keyCode).toLowerCase(); | ||
| } | ||
| function isPressEvent(e) { | ||
| return e.type === "keypress"; | ||
| } | ||
| function modifiersMatch(modifiers1, modifiers2) { | ||
| return modifiers1.sort().join(",") === modifiers2.sort().join(","); | ||
| } | ||
| function eventModifiers(e) { | ||
| const modifiers = []; | ||
| if (e.shiftKey) { | ||
| modifiers.push("shift"); | ||
| } | ||
| if (e.altKey) { | ||
| modifiers.push("alt"); | ||
| } | ||
| if (e.ctrlKey) { | ||
| modifiers.push("ctrl"); | ||
| } | ||
| if (e.metaKey) { | ||
| modifiers.push("meta"); | ||
| } | ||
| return modifiers; | ||
| } | ||
| function isModifier(key) { | ||
| return key === "shift" || key === "ctrl" || key === "alt" || key === "meta"; | ||
| } | ||
| function getReverseMap() { | ||
| if (!REVERSE_MAP) { | ||
| REVERSE_MAP = {}; | ||
| for (const key in MAP) { | ||
| if (Number(key) > 95 && Number(key) < 112) { | ||
| continue; | ||
| } | ||
| if (MAP.hasOwnProperty(key)) { | ||
| REVERSE_MAP[MAP[key]] = key; | ||
| } | ||
| } | ||
| } | ||
| return REVERSE_MAP; | ||
| } | ||
| function pickBestAction(key, modifiers, action) { | ||
| if (!action) { | ||
| action = getReverseMap()[key] ? "keydown" : "keypress"; | ||
| } | ||
| if (action === "keypress" && modifiers.length) { | ||
| action = "keydown"; | ||
| } | ||
| return action; | ||
| } | ||
| function keysFromString(combination) { | ||
| if (combination === "+") { | ||
| return ["+"]; | ||
| } | ||
| combination = combination.replace(/\+{2}/g, "+plus"); | ||
| return combination.split("+"); | ||
| } | ||
| function getKeyInfo(combination, action) { | ||
| let keys = []; | ||
| let key = ""; | ||
| let i; | ||
| const modifiers = []; | ||
| keys = keysFromString(combination); | ||
| for (i = 0; i < keys.length; ++i) { | ||
| key = keys[i]; | ||
| if (SPECIAL_ALIASES[key]) { | ||
| key = SPECIAL_ALIASES[key]; | ||
| } | ||
| if (action && action !== "keypress" && SHIFT_MAP[key]) { | ||
| key = SHIFT_MAP[key]; | ||
| modifiers.push("shift"); | ||
| } | ||
| if (isModifier(key)) { | ||
| modifiers.push(key); | ||
| } | ||
| } | ||
| action = pickBestAction(key, modifiers, action); | ||
| return { | ||
| key, | ||
| modifiers, | ||
| action | ||
| }; | ||
| } | ||
| function fireCallback(callback, e, combo, sequence) { | ||
| try { | ||
| const workspace = iocContext.globalContext.get("workspace"); | ||
| const editor = workspace.isActive ? workspace.window?.editor : iocContext.globalContext.get("editor"); | ||
| const designer = editor?.get("designer"); | ||
| const node = designer?.currentSelection?.getNodes()?.[0]; | ||
| const npm = node?.componentMeta?.npm; | ||
| const selected = [npm?.package, npm?.componentName].filter((item) => !!item).join("-") || node?.componentMeta?.componentName || ""; | ||
| if (callback(e, combo) === false) { | ||
| e.preventDefault(); | ||
| e.stopPropagation(); | ||
| } | ||
| editor?.eventBus.emit("hotkey.callback.call", { | ||
| callback, | ||
| e, | ||
| combo, | ||
| sequence, | ||
| selected | ||
| }); | ||
| } catch (err) { | ||
| console.error(err.message); | ||
| } | ||
| } | ||
| class Hotkey { | ||
| constructor(viewName = "global") { | ||
| this.viewName = viewName; | ||
| this.mount(window); | ||
| } | ||
| callBacks = {}; | ||
| directMap = {}; | ||
| sequenceLevels = {}; | ||
| resetTimer = 0; | ||
| ignoreNextKeyup = false; | ||
| ignoreNextKeypress = false; | ||
| nextExpectedAction = false; | ||
| isActivate = true; | ||
| activate(activate) { | ||
| this.isActivate = activate; | ||
| } | ||
| mount(window2) { | ||
| const { document } = window2; | ||
| const handleKeyEvent = this.handleKeyEvent.bind(this); | ||
| document.addEventListener("keypress", handleKeyEvent, false); | ||
| document.addEventListener("keydown", handleKeyEvent, false); | ||
| document.addEventListener("keyup", handleKeyEvent, false); | ||
| return () => { | ||
| document.removeEventListener("keypress", handleKeyEvent, false); | ||
| document.removeEventListener("keydown", handleKeyEvent, false); | ||
| document.removeEventListener("keyup", handleKeyEvent, false); | ||
| }; | ||
| } | ||
| bind(combos, callback, action) { | ||
| this.bindMultiple( | ||
| Array.isArray(combos) ? combos : [combos], | ||
| callback, | ||
| action | ||
| ); | ||
| return this; | ||
| } | ||
| unbind(combos, callback, action) { | ||
| const combinations = Array.isArray(combos) ? combos : [combos]; | ||
| combinations.forEach((combination) => { | ||
| const info = getKeyInfo(combination, action); | ||
| const { key, modifiers } = info; | ||
| const idx = this.callBacks[key].findIndex( | ||
| (info2) => lodashEs.isEqual(info2.modifiers, modifiers) && info2.callback === callback | ||
| ); | ||
| if (idx !== -1) { | ||
| this.callBacks[key].splice(idx, 1); | ||
| } | ||
| }); | ||
| } | ||
| /** | ||
| * 重置除指定序列外的所有序列计数器 | ||
| */ | ||
| resetSequences(doNotReset) { | ||
| let activeSequences = false; | ||
| let key = ""; | ||
| for (key in this.sequenceLevels) { | ||
| if (doNotReset && doNotReset[key]) { | ||
| activeSequences = true; | ||
| } else { | ||
| this.sequenceLevels[key] = 0; | ||
| } | ||
| } | ||
| if (!activeSequences) { | ||
| this.nextExpectedAction = false; | ||
| } | ||
| } | ||
| /** | ||
| * 根据按键码、修饰键和事件类型查找匹配的回调函数 | ||
| */ | ||
| getMatches(character, modifiers, e, sequenceName, combination, level) { | ||
| let i; | ||
| let callback; | ||
| const matches = []; | ||
| const action = e.type; | ||
| if (!this.callBacks[character]) { | ||
| return []; | ||
| } | ||
| if (action === "keyup" && isModifier(character)) { | ||
| modifiers = [character]; | ||
| } | ||
| for (i = 0; i < this.callBacks[character].length; ++i) { | ||
| callback = this.callBacks[character][i]; | ||
| if (!sequenceName && callback.seq && this.sequenceLevels[callback.seq] !== callback.level) { | ||
| continue; | ||
| } | ||
| if (action !== callback.action) { | ||
| continue; | ||
| } | ||
| if (isPressEvent(e) && !e.metaKey && !e.ctrlKey || modifiersMatch(modifiers, callback.modifiers)) { | ||
| const deleteCombo = !sequenceName && callback.combo === combination; | ||
| const deleteSequence = sequenceName && callback.seq === sequenceName && callback.level === level; | ||
| if (deleteCombo || deleteSequence) { | ||
| this.callBacks[character].splice(i, 1); | ||
| } | ||
| matches.push(callback); | ||
| } | ||
| } | ||
| return matches; | ||
| } | ||
| /** | ||
| * 处理按键事件 | ||
| */ | ||
| handleKey(character, modifiers, e) { | ||
| const callbacks = this.getMatches( | ||
| character, | ||
| modifiers, | ||
| e | ||
| ); | ||
| let i; | ||
| const doNotReset = {}; | ||
| let maxLevel = 0; | ||
| let processedSequenceCallback = false; | ||
| for (i = 0; i < callbacks.length; ++i) { | ||
| if (callbacks[i].seq) { | ||
| maxLevel = Math.max(maxLevel, callbacks[i].level || 0); | ||
| } | ||
| } | ||
| for (i = 0; i < callbacks.length; ++i) { | ||
| if (callbacks[i].seq) { | ||
| if (callbacks[i].level !== maxLevel) { | ||
| continue; | ||
| } | ||
| processedSequenceCallback = true; | ||
| doNotReset[callbacks[i].seq || ""] = 1; | ||
| fireCallback( | ||
| callbacks[i].callback, | ||
| e, | ||
| callbacks[i].combo, | ||
| callbacks[i].seq | ||
| ); | ||
| continue; | ||
| } | ||
| if (!processedSequenceCallback) { | ||
| fireCallback(callbacks[i].callback, e, callbacks[i].combo); | ||
| } | ||
| } | ||
| const ignoreThisKeypress = e.type === "keypress" && this.ignoreNextKeypress; | ||
| if (e.type === this.nextExpectedAction && !isModifier(character) && !ignoreThisKeypress) { | ||
| this.resetSequences(doNotReset); | ||
| } | ||
| this.ignoreNextKeypress = processedSequenceCallback && e.type === "keydown"; | ||
| } | ||
| /** | ||
| * 处理键盘事件 | ||
| */ | ||
| handleKeyEvent(e) { | ||
| if (!this.isActivate) { | ||
| return; | ||
| } | ||
| const character = characterFromEvent(e); | ||
| if (!character) { | ||
| return; | ||
| } | ||
| if (e.type === "keyup" && this.ignoreNextKeyup === character) { | ||
| this.ignoreNextKeyup = false; | ||
| return; | ||
| } | ||
| this.handleKey(character, eventModifiers(e), e); | ||
| } | ||
| /** | ||
| * 重置序列计时器 | ||
| */ | ||
| resetSequenceTimer() { | ||
| if (this.resetTimer) { | ||
| clearTimeout(this.resetTimer); | ||
| } | ||
| this.resetTimer = window.setTimeout(this.resetSequences, 1e3); | ||
| } | ||
| /** | ||
| * 绑定按键序列 | ||
| */ | ||
| bindSequence(combo, keys, callback, action) { | ||
| this.sequenceLevels[combo] = 0; | ||
| const increaseSequence = (nextAction) => () => { | ||
| this.nextExpectedAction = nextAction; | ||
| ++this.sequenceLevels[combo]; | ||
| this.resetSequenceTimer(); | ||
| }; | ||
| const callbackAndReset = (e) => { | ||
| fireCallback(callback, e, combo); | ||
| if (action !== "keyup") { | ||
| this.ignoreNextKeyup = characterFromEvent(e); | ||
| } | ||
| setTimeout(this.resetSequences, 10); | ||
| }; | ||
| for (let i = 0; i < keys.length; ++i) { | ||
| const isFinal = i + 1 === keys.length; | ||
| const wrappedCallback = isFinal ? callbackAndReset : increaseSequence(action || getKeyInfo(keys[i + 1]).action); | ||
| this.bindSingle(keys[i], wrappedCallback, action, combo, i); | ||
| } | ||
| } | ||
| /** | ||
| * 绑定单个按键组合 | ||
| */ | ||
| bindSingle(combination, callback, action, sequenceName, level) { | ||
| this.directMap[`${combination}:${action}`] = callback; | ||
| combination = combination.replace(/\s+/g, " "); | ||
| const sequence = combination.split(" "); | ||
| if (sequence.length > 1) { | ||
| this.bindSequence(combination, sequence, callback, action); | ||
| return; | ||
| } | ||
| const info = getKeyInfo(combination, action); | ||
| this.callBacks[info.key] = this.callBacks[info.key] || []; | ||
| this.getMatches( | ||
| info.key, | ||
| info.modifiers, | ||
| { type: info.action }, | ||
| sequenceName, | ||
| combination, | ||
| level | ||
| ); | ||
| this.callBacks[info.key][sequenceName ? "unshift" : "push"]({ | ||
| callback, | ||
| modifiers: info.modifiers, | ||
| action: info.action, | ||
| seq: sequenceName, | ||
| level, | ||
| combo: combination | ||
| }); | ||
| } | ||
| /** | ||
| * 绑定多个按键组合 | ||
| */ | ||
| bindMultiple(combinations, callback, action) { | ||
| for (const item of combinations) { | ||
| this.bindSingle(item, callback, action); | ||
| } | ||
| } | ||
| } | ||
| exports.Hotkey = Hotkey; | ||
| //# sourceMappingURL=hotkey.js.map |
| {"version":3,"file":"hotkey.js","sources":["../../src/hotkey.ts"],"sourcesContent":["import { isEqual } from 'lodash-es';\nimport {\n\tIPublicApiHotkey,\n\tIPublicTypeHotkeyCallback,\n\tIPublicTypeHotkeyCallbackConfig,\n\tIPublicTypeHotkeyCallbacks,\n} from '@arvin-shu/microcode-types';\nimport { globalContext } from './di';\n\n/**\n * 键盘按键映射接口,用于存储键码到按键名的映射\n */\ninterface KeyMap {\n\t[key: number]: string;\n}\n\n/**\n * Ctrl组合键映射接口\n */\ninterface CtrlKeyMap {\n\t[key: string]: string;\n}\n\n/**\n * 按键事件接口\n */\ninterface ActionEvent {\n\ttype: string;\n}\n\n/**\n * 热键直接映射接口,用于存储组合键到回调函数的映射\n */\ninterface HotkeyDirectMap {\n\t[key: string]: IPublicTypeHotkeyCallback;\n}\n\n/**\n * 按键信息接口,包含按键、修饰键和动作类型\n */\ninterface KeyInfo {\n\tkey: string;\n\tmodifiers: string[];\n\taction: string;\n}\n\n/**\n * 按键序列等级接口\n */\ninterface SequenceLevels {\n\t[key: string]: number;\n}\n\n/**\n * 基础按键映射表,包含常用功能键的键码映射\n */\nconst MAP: KeyMap = {\n\t8: 'backspace',\n\t9: 'tab',\n\t13: 'enter',\n\t16: 'shift',\n\t17: 'ctrl',\n\t18: 'alt',\n\t20: 'capslock',\n\t27: 'esc',\n\t32: 'space',\n\t33: 'pageup',\n\t34: 'pagedown',\n\t35: 'end',\n\t36: 'home',\n\t37: 'left',\n\t38: 'up',\n\t39: 'right',\n\t40: 'down',\n\t45: 'ins',\n\t46: 'del',\n\t91: 'meta',\n\t93: 'meta',\n\t224: 'meta',\n};\n\n/**\n * 特殊字符键码映射表\n */\nconst KEYCODE_MAP: KeyMap = {\n\t106: '*',\n\t107: '+',\n\t109: '-',\n\t110: '.',\n\t111: '/',\n\t186: ';',\n\t187: '=',\n\t188: ',',\n\t189: '-',\n\t190: '.',\n\t191: '/',\n\t192: '`',\n\t219: '[',\n\t220: '\\\\',\n\t221: ']',\n\t222: \"'\",\n};\n\n/**\n * Shift组合键映射表,用于处理大写字符和特殊符号\n */\nconst SHIFT_MAP: CtrlKeyMap = {\n\t'~': '`',\n\t'!': '1',\n\t'@': '2',\n\t'#': '3',\n\t$: '4',\n\t'%': '5',\n\t'^': '6',\n\t'&': '7',\n\t'*': '8',\n\t'(': '9',\n\t')': '0',\n\t_: '-',\n\t'+': '=',\n\t':': ';',\n\t'\"': \"'\",\n\t'<': ',',\n\t'>': '.',\n\t'?': '/',\n\t'|': '\\\\',\n};\n\n/**\n * 特殊按键别名映射表\n */\nconst SPECIAL_ALIASES: CtrlKeyMap = {\n\toption: 'alt',\n\tcommand: 'meta',\n\treturn: 'enter',\n\tescape: 'esc',\n\tplus: '+',\n\tmod: /Mac|iPod|iPhone|iPad/.test(navigator.platform) ? 'meta' : 'ctrl',\n};\n\nlet REVERSE_MAP: CtrlKeyMap;\n\n/**\n * 添加F1-F19功能键到映射表\n */\nfor (let i = 1; i < 20; ++i) {\n\tMAP[111 + i] = `f${i}`;\n}\n\n/**\n * 添加数字键盘0-9的映射\n */\nfor (let i = 0; i <= 9; ++i) {\n\tMAP[i + 96] = String(i);\n}\n\n/**\n * 从键盘事件中获取按键字符\n * @param e 键盘事件对象\n * @returns 按键字符\n */\nfunction characterFromEvent(e: KeyboardEvent): string {\n\tconst keyCode = e.keyCode || e.which;\n\t// 对于keypress事件,直接返回字符\n\tif (e.type === 'keypress') {\n\t\tlet character = String.fromCharCode(keyCode);\n\t\t// 如果没有按下shift键,则转换为小写\n\t\tif (!e.shiftKey) {\n\t\t\tcharacter = character.toLowerCase();\n\t\t}\n\t\treturn character;\n\t}\n\t// 对于非keypress事件,需要使用特殊映射表\n\tif (MAP[keyCode]) {\n\t\treturn MAP[keyCode];\n\t}\n\tif (KEYCODE_MAP[keyCode]) {\n\t\treturn KEYCODE_MAP[keyCode];\n\t}\n\t// 如果不在特殊映射表中,转换为小写字符返回\n\treturn String.fromCharCode(keyCode).toLowerCase();\n}\n\ninterface KeypressEvent extends KeyboardEvent {\n\ttype: 'keypress';\n}\n\n/**\n * 判断是否为keypress事件\n */\nfunction isPressEvent(e: KeyboardEvent | ActionEvent): e is KeypressEvent {\n\treturn e.type === 'keypress';\n}\n\n/**\n * 检查两个修饰键数组是否相等\n */\nfunction modifiersMatch(modifiers1: string[], modifiers2: string[]): boolean {\n\treturn modifiers1.sort().join(',') === modifiers2.sort().join(',');\n}\n\n/**\n * 从键盘事件中获取按下的修饰键列表\n */\nfunction eventModifiers(e: KeyboardEvent): string[] {\n\tconst modifiers = [];\n\n\tif (e.shiftKey) {\n\t\tmodifiers.push('shift');\n\t}\n\n\tif (e.altKey) {\n\t\tmodifiers.push('alt');\n\t}\n\n\tif (e.ctrlKey) {\n\t\tmodifiers.push('ctrl');\n\t}\n\n\tif (e.metaKey) {\n\t\tmodifiers.push('meta');\n\t}\n\n\treturn modifiers;\n}\n\n/**\n * 判断按键是否为修饰键\n */\nfunction isModifier(key: string): boolean {\n\treturn key === 'shift' || key === 'ctrl' || key === 'alt' || key === 'meta';\n}\n\n/**\n * 生成反向映射表,用于查找特定按键\n */\nfunction getReverseMap(): CtrlKeyMap {\n\tif (!REVERSE_MAP) {\n\t\tREVERSE_MAP = {};\n\t\tfor (const key in MAP) {\n\t\t\t// 排除数字键盘的按键\n\t\t\tif (Number(key) > 95 && Number(key) < 112) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (MAP.hasOwnProperty(key)) {\n\t\t\t\tREVERSE_MAP[MAP[key]] = key;\n\t\t\t}\n\t\t}\n\t}\n\treturn REVERSE_MAP;\n}\n\n/**\n * 根据按键组合选择最佳的事件类型\n */\nfunction pickBestAction(\n\tkey: string,\n\tmodifiers: string[],\n\taction?: string\n): string {\n\t// 如果没有指定action,根据按键选择合适的事件类型\n\tif (!action) {\n\t\taction = getReverseMap()[key] ? 'keydown' : 'keypress';\n\t}\n\t// 对于有修饰键的组合,使用keydown而不是keypress\n\tif (action === 'keypress' && modifiers.length) {\n\t\taction = 'keydown';\n\t}\n\treturn action;\n}\n\n/**\n * 将组合键字符串转换为按键数组\n * @param combination 组合键字符串,如 \"command+shift+l\"\n */\nfunction keysFromString(combination: string): string[] {\n\tif (combination === '+') {\n\t\treturn ['+'];\n\t}\n\n\tcombination = combination.replace(/\\+{2}/g, '+plus');\n\treturn combination.split('+');\n}\n\n/**\n * 获取组合键的详细信息\n * @param combination 组合键字符串\n * @param action 事件类型\n */\nfunction getKeyInfo(combination: string, action?: string): KeyInfo {\n\tlet keys: string[] = [];\n\tlet key = '';\n\tlet i: number;\n\tconst modifiers: string[] = [];\n\n\t// 解析组合键字符串\n\tkeys = keysFromString(combination);\n\n\tfor (i = 0; i < keys.length; ++i) {\n\t\tkey = keys[i];\n\n\t\t// 处理按键别名\n\t\tif (SPECIAL_ALIASES[key]) {\n\t\t\tkey = SPECIAL_ALIASES[key];\n\t\t}\n\n\t\t// 处理shift组合键\n\t\tif (action && action !== 'keypress' && SHIFT_MAP[key]) {\n\t\t\tkey = SHIFT_MAP[key];\n\t\t\tmodifiers.push('shift');\n\t\t}\n\n\t\t// 如果是修饰键,添加到修饰键列表\n\t\tif (isModifier(key)) {\n\t\t\tmodifiers.push(key);\n\t\t}\n\t}\n\n\t// 选择最佳的事件类型\n\taction = pickBestAction(key, modifiers, action);\n\n\treturn {\n\t\tkey,\n\t\tmodifiers,\n\t\taction,\n\t};\n}\n\n/**\n * 执行回调函数\n * 如果回调返回false,则阻止事件默认行为和冒泡\n */\nfunction fireCallback(\n\tcallback: IPublicTypeHotkeyCallback,\n\te: KeyboardEvent,\n\tcombo?: string,\n\tsequence?: string\n): void {\n\ttry {\n\t\tconst workspace = globalContext.get('workspace');\n\t\tconst editor = workspace.isActive\n\t\t\t? workspace.window?.editor\n\t\t\t: globalContext.get('editor');\n\t\tconst designer = editor?.get('designer');\n\t\tconst node = designer?.currentSelection?.getNodes()?.[0];\n\t\tconst npm = node?.componentMeta?.npm;\n\t\tconst selected =\n\t\t\t[npm?.package, npm?.componentName].filter((item) => !!item).join('-') ||\n\t\t\tnode?.componentMeta?.componentName ||\n\t\t\t'';\n\t\tif (callback(e, combo) === false) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t}\n\t\teditor?.eventBus.emit('hotkey.callback.call', {\n\t\t\tcallback,\n\t\t\te,\n\t\t\tcombo,\n\t\t\tsequence,\n\t\t\tselected,\n\t\t});\n\t} catch (err: any) {\n\t\t// eslint-disable-next-line no-console\n\t\tconsole.error(err.message);\n\t}\n}\n\nexport interface IHotKey extends Omit<IPublicApiHotkey, 'bind' | 'callbacks'> {\n\tactivate(activate: boolean): void;\n}\n\n/**\n * 热键管理类\n */\nexport class Hotkey implements IHotKey {\n\tcallBacks: IPublicTypeHotkeyCallbacks = {};\n\n\tprivate directMap: HotkeyDirectMap = {};\n\n\tprivate sequenceLevels: SequenceLevels = {};\n\n\tprivate resetTimer = 0;\n\n\tprivate ignoreNextKeyup: boolean | string = false;\n\n\tprivate ignoreNextKeypress = false;\n\n\tprivate nextExpectedAction: boolean | string = false;\n\n\tprivate isActivate = true;\n\n\tconstructor(readonly viewName: string = 'global') {\n\t\tthis.mount(window);\n\t}\n\n\tactivate(activate: boolean): void {\n\t\tthis.isActivate = activate;\n\t}\n\n\tmount(window: Window) {\n\t\tconst { document } = window;\n\t\tconst handleKeyEvent = this.handleKeyEvent.bind(this);\n\t\tdocument.addEventListener('keypress', handleKeyEvent, false);\n\t\tdocument.addEventListener('keydown', handleKeyEvent, false);\n\t\tdocument.addEventListener('keyup', handleKeyEvent, false);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keypress', handleKeyEvent, false);\n\t\t\tdocument.removeEventListener('keydown', handleKeyEvent, false);\n\t\t\tdocument.removeEventListener('keyup', handleKeyEvent, false);\n\t\t};\n\t}\n\n\tbind(\n\t\tcombos: string[] | string,\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string\n\t): Hotkey {\n\t\tthis.bindMultiple(\n\t\t\tArray.isArray(combos) ? combos : [combos],\n\t\t\tcallback,\n\t\t\taction\n\t\t);\n\t\treturn this;\n\t}\n\n\tunbind(\n\t\tcombos: string[] | string,\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string\n\t) {\n\t\tconst combinations = Array.isArray(combos) ? combos : [combos];\n\n\t\tcombinations.forEach((combination) => {\n\t\t\tconst info: KeyInfo = getKeyInfo(combination, action);\n\t\t\tconst { key, modifiers } = info;\n\t\t\tconst idx = this.callBacks[key].findIndex(\n\t\t\t\t(info) =>\n\t\t\t\t\tisEqual(info.modifiers, modifiers) && info.callback === callback\n\t\t\t);\n\t\t\tif (idx !== -1) {\n\t\t\t\tthis.callBacks[key].splice(idx, 1);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * 重置除指定序列外的所有序列计数器\n\t */\n\tprivate resetSequences(doNotReset?: SequenceLevels): void {\n\t\tlet activeSequences = false;\n\t\tlet key = '';\n\t\tfor (key in this.sequenceLevels) {\n\t\t\tif (doNotReset && doNotReset[key]) {\n\t\t\t\tactiveSequences = true;\n\t\t\t} else {\n\t\t\t\tthis.sequenceLevels[key] = 0;\n\t\t\t}\n\t\t}\n\t\tif (!activeSequences) {\n\t\t\tthis.nextExpectedAction = false;\n\t\t}\n\t}\n\n\t/**\n\t * 根据按键码、修饰键和事件类型查找匹配的回调函数\n\t */\n\tprivate getMatches(\n\t\tcharacter: string,\n\t\tmodifiers: string[],\n\t\te: KeyboardEvent | ActionEvent,\n\t\tsequenceName?: string,\n\t\tcombination?: string,\n\t\tlevel?: number\n\t): IPublicTypeHotkeyCallbackConfig[] {\n\t\tlet i: number;\n\t\tlet callback: IPublicTypeHotkeyCallbackConfig;\n\t\tconst matches: IPublicTypeHotkeyCallbackConfig[] = [];\n\t\tconst action: string = e.type;\n\n\t\tif (!this.callBacks[character]) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (action === 'keyup' && isModifier(character)) {\n\t\t\tmodifiers = [character];\n\t\t}\n\n\t\tfor (i = 0; i < this.callBacks[character].length; ++i) {\n\t\t\tcallback = this.callBacks[character][i];\n\n\t\t\tif (\n\t\t\t\t!sequenceName &&\n\t\t\t\tcallback.seq &&\n\t\t\t\tthis.sequenceLevels[callback.seq] !== callback.level\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (action !== callback.action) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t(isPressEvent(e) && !e.metaKey && !e.ctrlKey) ||\n\t\t\t\tmodifiersMatch(modifiers, callback.modifiers)\n\t\t\t) {\n\t\t\t\tconst deleteCombo = !sequenceName && callback.combo === combination;\n\t\t\t\tconst deleteSequence =\n\t\t\t\t\tsequenceName &&\n\t\t\t\t\tcallback.seq === sequenceName &&\n\t\t\t\t\tcallback.level === level;\n\t\t\t\tif (deleteCombo || deleteSequence) {\n\t\t\t\t\tthis.callBacks[character].splice(i, 1);\n\t\t\t\t}\n\n\t\t\t\tmatches.push(callback);\n\t\t\t}\n\t\t}\n\t\treturn matches;\n\t}\n\n\t/**\n\t * 处理按键事件\n\t */\n\tprivate handleKey(\n\t\tcharacter: string,\n\t\tmodifiers: string[],\n\t\te: KeyboardEvent\n\t): void {\n\t\tconst callbacks: IPublicTypeHotkeyCallbackConfig[] = this.getMatches(\n\t\t\tcharacter,\n\t\t\tmodifiers,\n\t\t\te\n\t\t);\n\t\tlet i: number;\n\t\tconst doNotReset: SequenceLevels = {};\n\t\tlet maxLevel = 0;\n\t\tlet processedSequenceCallback = false;\n\n\t\t// 计算序列的最大等级\n\t\tfor (i = 0; i < callbacks.length; ++i) {\n\t\t\tif (callbacks[i].seq) {\n\t\t\t\tmaxLevel = Math.max(maxLevel, callbacks[i].level || 0);\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0; i < callbacks.length; ++i) {\n\t\t\tif (callbacks[i].seq) {\n\t\t\t\tif (callbacks[i].level !== maxLevel) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tprocessedSequenceCallback = true;\n\n\t\t\t\tdoNotReset[callbacks[i].seq || ''] = 1;\n\t\t\t\tfireCallback(\n\t\t\t\t\tcallbacks[i].callback,\n\t\t\t\t\te,\n\t\t\t\t\tcallbacks[i].combo,\n\t\t\t\t\tcallbacks[i].seq\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!processedSequenceCallback) {\n\t\t\t\tfireCallback(callbacks[i].callback, e, callbacks[i].combo);\n\t\t\t}\n\t\t}\n\n\t\tconst ignoreThisKeypress = e.type === 'keypress' && this.ignoreNextKeypress;\n\t\tif (\n\t\t\te.type === this.nextExpectedAction &&\n\t\t\t!isModifier(character) &&\n\t\t\t!ignoreThisKeypress\n\t\t) {\n\t\t\tthis.resetSequences(doNotReset);\n\t\t}\n\n\t\tthis.ignoreNextKeypress = processedSequenceCallback && e.type === 'keydown';\n\t}\n\n\t/**\n\t * 处理键盘事件\n\t */\n\tprivate handleKeyEvent(e: KeyboardEvent): void {\n\t\tif (!this.isActivate) {\n\t\t\treturn;\n\t\t}\n\t\tconst character = characterFromEvent(e);\n\n\t\tif (!character) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.type === 'keyup' && this.ignoreNextKeyup === character) {\n\t\t\tthis.ignoreNextKeyup = false;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.handleKey(character, eventModifiers(e), e);\n\t}\n\n\t/**\n\t * 重置序列计时器\n\t */\n\tprivate resetSequenceTimer(): void {\n\t\tif (this.resetTimer) {\n\t\t\tclearTimeout(this.resetTimer);\n\t\t}\n\t\tthis.resetTimer = window.setTimeout(this.resetSequences, 1000);\n\t}\n\n\t/**\n\t * 绑定按键序列\n\t */\n\tprivate bindSequence(\n\t\tcombo: string,\n\t\tkeys: string[],\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string\n\t): void {\n\t\tthis.sequenceLevels[combo] = 0;\n\t\tconst increaseSequence = (nextAction: string) => () => {\n\t\t\tthis.nextExpectedAction = nextAction;\n\t\t\t++this.sequenceLevels[combo];\n\t\t\tthis.resetSequenceTimer();\n\t\t};\n\t\tconst callbackAndReset = (e: KeyboardEvent): void => {\n\t\t\tfireCallback(callback, e, combo);\n\n\t\t\tif (action !== 'keyup') {\n\t\t\t\tthis.ignoreNextKeyup = characterFromEvent(e);\n\t\t\t}\n\n\t\t\tsetTimeout(this.resetSequences, 10);\n\t\t};\n\t\tfor (let i = 0; i < keys.length; ++i) {\n\t\t\tconst isFinal = i + 1 === keys.length;\n\t\t\tconst wrappedCallback = isFinal\n\t\t\t\t? callbackAndReset\n\t\t\t\t: increaseSequence(action || getKeyInfo(keys[i + 1]).action);\n\t\t\tthis.bindSingle(keys[i], wrappedCallback, action, combo, i);\n\t\t}\n\t}\n\n\t/**\n\t * 绑定单个按键组合\n\t */\n\tprivate bindSingle(\n\t\tcombination: string,\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string,\n\t\tsequenceName?: string,\n\t\tlevel?: number\n\t): void {\n\t\tthis.directMap[`${combination}:${action}`] = callback;\n\n\t\tcombination = combination.replace(/\\s+/g, ' ');\n\n\t\tconst sequence: string[] = combination.split(' ');\n\n\t\tif (sequence.length > 1) {\n\t\t\tthis.bindSequence(combination, sequence, callback, action);\n\t\t\treturn;\n\t\t}\n\n\t\tconst info: KeyInfo = getKeyInfo(combination, action);\n\n\t\tthis.callBacks[info.key] = this.callBacks[info.key] || [];\n\n\t\tthis.getMatches(\n\t\t\tinfo.key,\n\t\t\tinfo.modifiers,\n\t\t\t{ type: info.action },\n\t\t\tsequenceName,\n\t\t\tcombination,\n\t\t\tlevel\n\t\t);\n\n\t\tthis.callBacks[info.key][sequenceName ? 'unshift' : 'push']({\n\t\t\tcallback,\n\t\t\tmodifiers: info.modifiers,\n\t\t\taction: info.action,\n\t\t\tseq: sequenceName,\n\t\t\tlevel,\n\t\t\tcombo: combination,\n\t\t});\n\t}\n\n\t/**\n\t * 绑定多个按键组合\n\t */\n\tprivate bindMultiple(\n\t\tcombinations: string[],\n\t\tcallback: IPublicTypeHotkeyCallback,\n\t\taction?: string\n\t) {\n\t\tfor (const item of combinations) {\n\t\t\tthis.bindSingle(item, callback, action);\n\t\t}\n\t}\n}\n"],"names":["globalContext","window","info","isEqual"],"mappings":"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"} |
| export * from './di'; | ||
| export * from './config'; | ||
| export * from './utils'; | ||
| export * from './event-bus'; | ||
| export * from './editor'; | ||
| export * from './widgets'; | ||
| export * from './inti'; | ||
| export * from './hotkey'; |
-60
| 'use strict'; | ||
| require('./di/index.js'); | ||
| var config = require('./config.js'); | ||
| require('./utils/index.js'); | ||
| var eventBus = require('./event-bus.js'); | ||
| var editor = require('./editor.js'); | ||
| require('./widgets/index.js'); | ||
| var index$1 = require('./inti/index.js'); | ||
| var hotkey = require('./hotkey.js'); | ||
| var powerDi = require('power-di'); | ||
| var iocContext = require('./di/ioc-context.js'); | ||
| var setter = require('./di/setter.js'); | ||
| var focusTracker = require('./utils/focus-tracker.js'); | ||
| var assetsTransform = require('./utils/assets-transform.js'); | ||
| var control = require('./utils/control.js'); | ||
| var getPublicPath = require('./utils/get-public-path.js'); | ||
| var index = require('./widgets/title/index.js'); | ||
| var tip = require('./widgets/tip/tip.js'); | ||
| var tipContainer = require('./widgets/tip/tip-container.js'); | ||
| var helpTips = require('./widgets/tip/help-tips.js'); | ||
| var globalLocale = require('./inti/global-locale.js'); | ||
| "use strict"; | ||
| exports.EngineConfig = config.EngineConfig; | ||
| exports.engineConfig = config.engineConfig; | ||
| exports.EventBus = eventBus.EventBus; | ||
| exports.createModuleEventBus = eventBus.createModuleEventBus; | ||
| exports.Editor = editor.Editor; | ||
| exports.commonEvent = editor.commonEvent; | ||
| exports.createIntl = index$1.createIntl; | ||
| exports.intl = index$1.intl; | ||
| exports.shallowIntl = index$1.shallowIntl; | ||
| exports.Hotkey = hotkey.Hotkey; | ||
| exports.globalContext = iocContext.globalContext; | ||
| exports.Setters = setter.Setters; | ||
| exports.FocusTracker = focusTracker.FocusTracker; | ||
| exports.Focusable = focusTracker.Focusable; | ||
| exports.assetsTransform = assetsTransform.assetsTransform; | ||
| exports.isGlobalEventOn = control.isGlobalEventOn; | ||
| exports.runWithGlobalEventOff = control.runWithGlobalEventOff; | ||
| exports.setGlobalEventFlag = control.setGlobalEventFlag; | ||
| exports.switchGlobalEventOff = control.switchGlobalEventOff; | ||
| exports.switchGlobalEventOn = control.switchGlobalEventOn; | ||
| exports.wrapWithEventSwitch = control.wrapWithEventSwitch; | ||
| exports.getPublicPath = getPublicPath.getPublicPath; | ||
| exports.Title = index.Title; | ||
| exports.Tip = tip.Tip; | ||
| exports.TipContainer = tipContainer.TipContainer; | ||
| exports.TipItem = tipContainer.TipItem; | ||
| exports.HelpTip = helpTips.HelpTip; | ||
| exports.globalLocale = globalLocale.globalLocale; | ||
| Object.keys(powerDi).forEach(function (k) { | ||
| if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, { | ||
| enumerable: true, | ||
| get: function () { return powerDi[k]; } | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} |
| /** | ||
| * 全局国际化标准 | ||
| */ | ||
| declare class GlobalLocale { | ||
| private emitter; | ||
| private _locale; | ||
| locale: import("vue").ComputedRef<any>; | ||
| constructor(); | ||
| setLocale(locale: string): void; | ||
| getLocale(): any; | ||
| onChangeLocale(fn: (locale: string) => void): () => void; | ||
| } | ||
| declare const globalLocale: GlobalLocale; | ||
| export { globalLocale }; |
| 'use strict'; | ||
| var vue = require('vue'); | ||
| var microcodeUtils = require('@arvin-shu/microcode-utils'); | ||
| var eventBus = require('../event-bus.js'); | ||
| "use strict"; | ||
| const languageMap = { | ||
| en: "en-US", | ||
| zh: "zh-CN", | ||
| zt: "zh-TW", | ||
| es: "es-ES", | ||
| pt: "pt-PT", | ||
| fr: "fr-FR", | ||
| de: "de-DE", | ||
| it: "it-IT", | ||
| ru: "ru-RU", | ||
| ja: "ja-JP", | ||
| ko: "ko-KR", | ||
| ar: "ar-SA", | ||
| tr: "tr-TR", | ||
| th: "th-TH", | ||
| vi: "vi-VN", | ||
| nl: "nl-NL", | ||
| he: "iw-IL", | ||
| id: "in-ID", | ||
| pl: "pl-PL", | ||
| hi: "hi-IN", | ||
| uk: "uk-UA", | ||
| ms: "ms-MY", | ||
| tl: "tl-PH" | ||
| }; | ||
| const logger = new microcodeUtils.Logger({ level: "warn", bizName: "globalLocale" }); | ||
| const MicrocodeConfigKey = "arvin-microcode-config"; | ||
| class GlobalLocale { | ||
| emitter = eventBus.createModuleEventBus("GlobalLocale"); | ||
| _locale = vue.ref(); | ||
| locale = vue.computed(() => { | ||
| if (this._locale.value != null) { | ||
| return this._locale.value; | ||
| } | ||
| let result = null; | ||
| if (hasLocalStorage(window)) { | ||
| const store = window.localStorage; | ||
| let config; | ||
| try { | ||
| config = JSON.parse(store.getItem(MicrocodeConfigKey) || ""); | ||
| } catch (e) { | ||
| logger.error(`get locale:${e}`); | ||
| } | ||
| if (config?.locale) { | ||
| result = (config.locale || "").replace("_", "-"); | ||
| logger.debug(`getting locale from localStorage: ${result}`); | ||
| } | ||
| } | ||
| if (!result) { | ||
| const localeFromConfig = getConfig("locale"); | ||
| if (localeFromConfig) { | ||
| result = languageMap[localeFromConfig] || localeFromConfig.replace("_", "-"); | ||
| logger.debug(`getting locale from config: ${result}`); | ||
| } | ||
| } | ||
| if (!result) { | ||
| const { navigator } = window; | ||
| if (navigator.language) { | ||
| const lang = navigator.language; | ||
| return languageMap[lang] || lang.replace("_", "-"); | ||
| } | ||
| if (navigator.browserLanguage) { | ||
| const it = navigator.browserLanguage.split("-"); | ||
| let localeFromSystem = it[0]; | ||
| if (it[1]) { | ||
| localeFromSystem += `-${it[1].toUpperCase()}`; | ||
| } | ||
| result = localeFromSystem; | ||
| logger.debug(`getting locale from system: ${result}`); | ||
| } | ||
| } | ||
| if (!result) { | ||
| logger.warn( | ||
| "something went wrong when trying to get locale, use zh-CN as default, please check it out!" | ||
| ); | ||
| result = "zh-CN"; | ||
| } | ||
| this._locale.value = result; | ||
| return result; | ||
| }); | ||
| constructor() { | ||
| this.emitter.setMaxListeners(200); | ||
| } | ||
| setLocale(locale) { | ||
| logger.info(`setting locale to ${locale}`); | ||
| if (locale === this.locale.value) { | ||
| return; | ||
| } | ||
| this._locale.value = locale; | ||
| if (hasLocalStorage(window)) { | ||
| const store = window.localStorage; | ||
| let config; | ||
| try { | ||
| config = JSON.parse(store.getItem(MicrocodeConfigKey) || ""); | ||
| } catch (e) { | ||
| logger.error(`set locale:${e}`); | ||
| } | ||
| if (config && typeof config === "object") { | ||
| config.locale = locale; | ||
| } else { | ||
| config = { locale }; | ||
| } | ||
| store.setItem(MicrocodeConfigKey, JSON.stringify(config)); | ||
| } | ||
| this.emitter.emit("localechange", locale); | ||
| } | ||
| getLocale() { | ||
| return this.locale.value; | ||
| } | ||
| onChangeLocale(fn) { | ||
| this.emitter.on("localechange", fn); | ||
| return () => { | ||
| this.emitter.removeListener("localechange", fn); | ||
| }; | ||
| } | ||
| } | ||
| function hasLocalStorage(obj) { | ||
| return obj.localStorage; | ||
| } | ||
| function getConfig(name) { | ||
| const win = window; | ||
| return win[name] || (win.g_config || {})[name] || (win.pageConfig || {})[name]; | ||
| } | ||
| const globalLocale = new GlobalLocale(); | ||
| exports.globalLocale = globalLocale; | ||
| //# sourceMappingURL=global-locale.js.map |
| {"version":3,"file":"global-locale.js","sources":["../../../src/inti/global-locale.ts"],"sourcesContent":["import { computed, ref, Ref } from 'vue';\nimport { Logger } from '@arvin-shu/microcode-utils';\nimport { createModuleEventBus, IEventBus } from '../event-bus';\n\nconst languageMap: { [key: string]: string } = {\n\ten: 'en-US',\n\tzh: 'zh-CN',\n\tzt: 'zh-TW',\n\tes: 'es-ES',\n\tpt: 'pt-PT',\n\tfr: 'fr-FR',\n\tde: 'de-DE',\n\tit: 'it-IT',\n\tru: 'ru-RU',\n\tja: 'ja-JP',\n\tko: 'ko-KR',\n\tar: 'ar-SA',\n\ttr: 'tr-TR',\n\tth: 'th-TH',\n\tvi: 'vi-VN',\n\tnl: 'nl-NL',\n\the: 'iw-IL',\n\tid: 'in-ID',\n\tpl: 'pl-PL',\n\thi: 'hi-IN',\n\tuk: 'uk-UA',\n\tms: 'ms-MY',\n\ttl: 'tl-PH',\n};\n\nconst logger = new Logger({ level: 'warn', bizName: 'globalLocale' });\n\nconst MicrocodeConfigKey = 'arvin-microcode-config';\n\n/**\n * 全局国际化标准\n */\nclass GlobalLocale {\n\tprivate emitter: IEventBus = createModuleEventBus('GlobalLocale');\n\n\tprivate _locale: Ref<string | undefined> = ref();\n\n\tlocale = computed(() => {\n\t\tif (this._locale.value != null) {\n\t\t\treturn this._locale.value;\n\t\t}\n\n\t\t// store 1: 从 localStorage 中获取配置\n\t\tlet result = null;\n\t\tif (hasLocalStorage(window)) {\n\t\t\tconst store = window.localStorage;\n\t\t\tlet config: any;\n\t\t\ttry {\n\t\t\t\tconfig = JSON.parse(store.getItem(MicrocodeConfigKey) || '');\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(`get locale:${e}`);\n\t\t\t}\n\t\t\tif (config?.locale) {\n\t\t\t\tresult = (config.locale || '').replace('_', '-');\n\t\t\t\tlogger.debug(`getting locale from localStorage: ${result}`);\n\t\t\t}\n\t\t}\n\n\t\t// store 2: 从 window 配置中获取\n\t\tif (!result) {\n\t\t\tconst localeFromConfig: string = getConfig('locale');\n\t\t\tif (localeFromConfig) {\n\t\t\t\tresult =\n\t\t\t\t\tlanguageMap[localeFromConfig] || localeFromConfig.replace('_', '-');\n\t\t\t\tlogger.debug(`getting locale from config: ${result}`);\n\t\t\t}\n\t\t}\n\t\t// store 3: 从系统语言获取\n\t\tif (!result) {\n\t\t\tconst { navigator } = window as any;\n\t\t\tif (navigator.language) {\n\t\t\t\tconst lang = navigator.language as string;\n\t\t\t\treturn languageMap[lang] || lang.replace('_', '-');\n\t\t\t}\n\t\t\tif (navigator.browserLanguage) {\n\t\t\t\tconst it = navigator.browserLanguage.split('-');\n\t\t\t\tlet localeFromSystem = it[0];\n\t\t\t\tif (it[1]) {\n\t\t\t\t\tlocaleFromSystem += `-${it[1].toUpperCase()}`;\n\t\t\t\t}\n\t\t\t\tresult = localeFromSystem;\n\t\t\t\tlogger.debug(`getting locale from system: ${result}`);\n\t\t\t}\n\t\t}\n\t\t// 默认值\n\t\tif (!result) {\n\t\t\tlogger.warn(\n\t\t\t\t'something went wrong when trying to get locale, use zh-CN as default, please check it out!'\n\t\t\t);\n\t\t\tresult = 'zh-CN';\n\t\t}\n\n\t\tthis._locale.value = result;\n\t\treturn result;\n\t});\n\n\tconstructor() {\n\t\tthis.emitter.setMaxListeners(200);\n\t}\n\n\tsetLocale(locale: string) {\n\t\tlogger.info(`setting locale to ${locale}`);\n\t\tif (locale === this.locale.value) {\n\t\t\treturn;\n\t\t}\n\t\tthis._locale.value = locale;\n\t\tif (hasLocalStorage(window)) {\n\t\t\tconst store = window.localStorage;\n\t\t\tlet config: any;\n\t\t\ttry {\n\t\t\t\tconfig = JSON.parse(store.getItem(MicrocodeConfigKey) || '');\n\t\t\t} catch (e) {\n\t\t\t\tlogger.error(`set locale:${e}`);\n\t\t\t}\n\t\t\tif (config && typeof config === 'object') {\n\t\t\t\tconfig.locale = locale;\n\t\t\t} else {\n\t\t\t\tconfig = { locale };\n\t\t\t}\n\t\t\tstore.setItem(MicrocodeConfigKey, JSON.stringify(config));\n\t\t}\n\t\tthis.emitter.emit('localechange', locale);\n\t}\n\n\tgetLocale() {\n\t\treturn this.locale.value;\n\t}\n\n\tonChangeLocale(fn: (locale: string) => void): () => void {\n\t\tthis.emitter.on('localechange', fn);\n\t\treturn () => {\n\t\t\tthis.emitter.removeListener('localechange', fn);\n\t\t};\n\t}\n}\n\nfunction hasLocalStorage(obj: any): obj is WindowLocalStorage {\n\treturn obj.localStorage;\n}\n\nfunction getConfig(name: string) {\n\tconst win: any = window;\n\treturn (\n\t\twin[name] || (win.g_config || {})[name] || (win.pageConfig || {})[name]\n\t);\n}\n\nconst globalLocale = new GlobalLocale();\n\nexport { globalLocale };\n"],"names":["Logger","createModuleEventBus","ref","computed"],"mappings":"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"} |
| import { IPublicTypeI18nData } from '@arvin-shu/microcode-types'; | ||
| import { VNode } from 'vue'; | ||
| import { globalLocale } from './global-locale'; | ||
| export declare function shallowIntl(data: any): any; | ||
| export declare function intl(data: IPublicTypeI18nData | string, params?: object): string | VNode<import("vue").RendererNode, import("vue").RendererElement, { | ||
| [key: string]: any; | ||
| }>; | ||
| export declare function createIntl(instance: string | object): { | ||
| intlNode(id: string, params?: object): VNode; | ||
| intl(id: string, params?: object): string; | ||
| getLocale(): string; | ||
| setLocale(locale: string): void; | ||
| }; | ||
| export { globalLocale }; |
| 'use strict'; | ||
| var microcodeUtils = require('@arvin-shu/microcode-utils'); | ||
| var intlMessageformat = require('intl-messageformat'); | ||
| var vue = require('vue'); | ||
| var globalLocale = require('./global-locale.js'); | ||
| "use strict"; | ||
| function generateTryLocales(locale) { | ||
| const tries = [locale, locale.replace("-", "_")]; | ||
| if (locale === "zh-TW" || locale === "en-US") { | ||
| tries.push("zh-CN"); | ||
| tries.push("zh_CN"); | ||
| } else { | ||
| tries.push("en-US"); | ||
| tries.push("en_US"); | ||
| if (locale !== "zh-CN") { | ||
| tries.push("zh-CN"); | ||
| tries.push("zh_CN"); | ||
| } | ||
| } | ||
| return tries; | ||
| } | ||
| function shallowIntl(data) { | ||
| if (!data || typeof data !== "object") { | ||
| return data; | ||
| } | ||
| const maps = {}; | ||
| Object.keys(data).forEach((key) => { | ||
| maps[key] = intl(data[key]); | ||
| }); | ||
| return maps; | ||
| } | ||
| function injectVars(msg, params, locale) { | ||
| if (!msg || !params) { | ||
| return msg; | ||
| } | ||
| const formater = new intlMessageformat.IntlMessageFormat(msg, locale); | ||
| return formater.format(params); | ||
| } | ||
| function intl(data, params) { | ||
| if (!microcodeUtils.isI18nData(data)) { | ||
| return data; | ||
| } | ||
| if (data.intl) { | ||
| return data.intl; | ||
| } | ||
| const locale = globalLocale.globalLocale.getLocale(); | ||
| const tries = generateTryLocales(locale); | ||
| let msg; | ||
| for (const lan of tries) { | ||
| msg = data[lan]; | ||
| if (msg != null) { | ||
| break; | ||
| } | ||
| } | ||
| if (msg == null) { | ||
| return `##intl@${locale}##`; | ||
| } | ||
| return injectVars(msg, params, locale); | ||
| } | ||
| function createIntl(instance) { | ||
| const data = (() => { | ||
| const locale = globalLocale.globalLocale.getLocale(); | ||
| if (typeof instance === "string") { | ||
| if (window[instance]) { | ||
| return window[instance][locale] || {}; | ||
| } | ||
| const key = `${instance}_${locale.toLocaleLowerCase()}`; | ||
| return window[key] || {}; | ||
| } | ||
| if (instance && typeof instance === "object") { | ||
| return instance[locale] || {}; | ||
| } | ||
| return {}; | ||
| })(); | ||
| function intl2(key, params) { | ||
| const str = data[key]; | ||
| if (str == null) { | ||
| return `##intl@${key}##`; | ||
| } | ||
| return injectVars(str, params, globalLocale.globalLocale.getLocale()); | ||
| } | ||
| const IntlElement = vue.defineComponent({ | ||
| props: { | ||
| id: String, | ||
| params: Object | ||
| }, | ||
| render() { | ||
| const { id, params } = this; | ||
| return intl2(id, params); | ||
| } | ||
| }); | ||
| return { | ||
| intlNode(id, params) { | ||
| return vue.h(IntlElement, { id, params }); | ||
| }, | ||
| intl: intl2, | ||
| getLocale() { | ||
| return globalLocale.globalLocale.getLocale(); | ||
| }, | ||
| setLocale(locale) { | ||
| globalLocale.globalLocale.setLocale(locale); | ||
| } | ||
| }; | ||
| } | ||
| exports.globalLocale = globalLocale.globalLocale; | ||
| exports.createIntl = createIntl; | ||
| exports.intl = intl; | ||
| exports.shallowIntl = shallowIntl; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":["../../../src/inti/index.ts"],"sourcesContent":["import { isI18nData } from '@arvin-shu/microcode-utils';\nimport { IPublicTypeI18nData } from '@arvin-shu/microcode-types';\nimport { IntlMessageFormat } from 'intl-messageformat';\nimport { defineComponent, h, VNode } from 'vue';\nimport { globalLocale } from './global-locale';\n\nfunction generateTryLocales(locale: string) {\n\tconst tries = [locale, locale.replace('-', '_')];\n\tif (locale === 'zh-TW' || locale === 'en-US') {\n\t\ttries.push('zh-CN');\n\t\ttries.push('zh_CN');\n\t} else {\n\t\ttries.push('en-US');\n\t\ttries.push('en_US');\n\t\tif (locale !== 'zh-CN') {\n\t\t\ttries.push('zh-CN');\n\t\t\ttries.push('zh_CN');\n\t\t}\n\t}\n\treturn tries;\n}\n\nexport function shallowIntl(data: any): any {\n\tif (!data || typeof data !== 'object') {\n\t\treturn data;\n\t}\n\tconst maps: any = {};\n\tObject.keys(data).forEach((key) => {\n\t\tmaps[key] = intl(data[key]);\n\t});\n\treturn maps;\n}\n\nfunction injectVars(msg: string, params: any, locale: string): string {\n\tif (!msg || !params) {\n\t\treturn msg;\n\t}\n\tconst formater = new IntlMessageFormat(msg, locale);\n\treturn formater.format(params as any) as string;\n}\n\nexport function intl(data: IPublicTypeI18nData | string, params?: object) {\n\tif (!isI18nData(data)) {\n\t\treturn data;\n\t}\n\tif (data.intl) {\n\t\treturn data.intl;\n\t}\n\tconst locale = globalLocale.getLocale();\n\tconst tries = generateTryLocales(locale);\n\tlet msg: string | undefined;\n\tfor (const lan of tries) {\n\t\tmsg = data[lan];\n\t\tif (msg != null) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (msg == null) {\n\t\treturn `##intl@${locale}##`;\n\t}\n\n\treturn injectVars(msg, params, locale);\n}\n\nexport function createIntl(instance: string | object): {\n\tintlNode(id: string, params?: object): VNode;\n\tintl(id: string, params?: object): string;\n\tgetLocale(): string;\n\tsetLocale(locale: string): void;\n} {\n\tconst data = (() => {\n\t\tconst locale = globalLocale.getLocale();\n\t\tif (typeof instance === 'string') {\n\t\t\tif ((window as any)[instance]) {\n\t\t\t\treturn (window as any)[instance][locale] || {};\n\t\t\t}\n\t\t\tconst key = `${instance}_${locale.toLocaleLowerCase()}`;\n\t\t\treturn (window as any)[key] || {};\n\t\t}\n\t\tif (instance && typeof instance === 'object') {\n\t\t\treturn (instance as any)[locale] || {};\n\t\t}\n\t\treturn {};\n\t})();\n\n\tfunction intl(key: string, params?: object): string {\n\t\tconst str = data[key];\n\n\t\tif (str == null) {\n\t\t\treturn `##intl@${key}##`;\n\t\t}\n\n\t\treturn injectVars(str, params, globalLocale.getLocale());\n\t}\n\n\tconst IntlElement = defineComponent({\n\t\tprops: {\n\t\t\tid: String,\n\t\t\tparams: Object,\n\t\t},\n\t\trender() {\n\t\t\tconst { id, params } = this;\n\t\t\treturn intl(id!, params);\n\t\t},\n\t});\n\n\treturn {\n\t\tintlNode(id: string, params?: object) {\n\t\t\treturn h(IntlElement, { id, params });\n\t\t},\n\t\tintl,\n\t\tgetLocale() {\n\t\t\treturn globalLocale.getLocale();\n\t\t},\n\t\tsetLocale(locale: string) {\n\t\t\tglobalLocale.setLocale(locale);\n\t\t},\n\t};\n}\n\nexport { globalLocale };\n"],"names":["IntlMessageFormat","isI18nData","globalLocale","intl","defineComponent","h"],"mappings":"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"} |
| declare global { | ||
| interface Window { | ||
| __isDebug?: boolean; | ||
| __newFunc?: (funcStr: string) => (...args: any[]) => any; | ||
| } | ||
| } | ||
| export {}; |
| 'use strict'; | ||
| var store = require('store'); | ||
| "use strict"; | ||
| const debugRegRes = /_?debug=(.*?)(&|$)/.exec(location.search); | ||
| if (debugRegRes && debugRegRes[1]) { | ||
| window.__isDebug = true; | ||
| store.storage.write( | ||
| "debug", | ||
| debugRegRes[1] === "true" ? "*" : debugRegRes[1] | ||
| ); | ||
| } else { | ||
| window.__isDebug = false; | ||
| store.remove("debug"); | ||
| } | ||
| window.__newFunc = (funContext) => { | ||
| return new Function(funContext); | ||
| }; | ||
| window.onbeforeunload = function(e) { | ||
| const ev = e || window.event; | ||
| if (location.href.indexOf("localhost") > 0) { | ||
| return ""; | ||
| } | ||
| const msg = "\u60A8\u786E\u5B9A\u8981\u79BB\u5F00\u6B64\u9875\u9762\u5417\uFF1F"; | ||
| ev.cancelBubble = true; | ||
| ev.returnValue = true; | ||
| if (e.stopPropagation) { | ||
| e.stopPropagation(); | ||
| e.preventDefault(); | ||
| } | ||
| return msg; | ||
| }; | ||
| //# sourceMappingURL=app-preset.js.map |
| {"version":3,"file":"app-preset.js","sources":["../../../src/utils/app-preset.ts"],"sourcesContent":["import store from 'store';\n\ndeclare global {\n\tinterface Window {\n\t\t__isDebug?: boolean;\n\t\t__newFunc?: (funcStr: string) => (...args: any[]) => any;\n\t}\n}\n\n// 根据 url 参数设置 debug 选项\n// eslint-disable-next-line no-restricted-globals\nconst debugRegRes = /_?debug=(.*?)(&|$)/.exec(location.search);\nif (debugRegRes && debugRegRes[1]) {\n\t// eslint-disable-next-line no-underscore-dangle\n\twindow.__isDebug = true;\n\t// @ts-ignore\n\tstore.storage.write(\n\t\t'debug',\n\t\tdebugRegRes[1] === 'true' ? '*' : debugRegRes[1]\n\t);\n} else {\n\t// eslint-disable-next-line no-underscore-dangle\n\twindow.__isDebug = false;\n\tstore.remove('debug');\n}\n\n// 重要,用于矫正画布执行 new Function 的 window 对象上下文\n// eslint-disable-next-line arrow-body-style\nwindow.__newFunc = (funContext: string): ((...args: any[]) => any) => {\n\t// eslint-disable-next-line no-new-func\n\treturn new Function(funContext) as (...args: any[]) => any;\n};\n\n// 关闭浏览器前提醒,只有产生过交互才会生效\n// eslint-disable-next-line func-names\nwindow.onbeforeunload = function (e: Event): string {\n\tconst ev = e || window.event;\n\t// 本地调试不生效\n\t// eslint-disable-next-line no-restricted-globals\n\tif (location.href.indexOf('localhost') > 0) {\n\t\treturn '';\n\t}\n\tconst msg = '您确定要离开此页面吗?';\n\tev.cancelBubble = true;\n\tev.returnValue = true;\n\tif (e.stopPropagation) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t}\n\treturn msg;\n};\n"],"names":[],"mappings":";;;;;AAWA,MAAM,WAAc,GAAA,oBAAA,CAAqB,IAAK,CAAA,QAAA,CAAS,MAAM,CAAA;AAC7D,IAAI,WAAA,IAAe,WAAY,CAAA,CAAC,CAAG,EAAA;AAElC,EAAA,MAAA,CAAO,SAAY,GAAA,IAAA;AAEnB,EAAA,KAAA,CAAM,OAAQ,CAAA,KAAA;AAAA,IACb,OAAA;AAAA,IACA,YAAY,CAAC,CAAA,KAAM,MAAS,GAAA,GAAA,GAAM,YAAY,CAAC;AAAA,GAChD;AACD,CAAO,MAAA;AAEN,EAAA,MAAA,CAAO,SAAY,GAAA,KAAA;AACnB,EAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AACrB;AAIA,MAAO,CAAA,SAAA,GAAY,CAAC,UAAkD,KAAA;AAErE,EAAO,OAAA,IAAI,SAAS,UAAU,CAAA;AAC/B,CAAA;AAIA,MAAO,CAAA,cAAA,GAAiB,SAAU,CAAkB,EAAA;AACnD,EAAM,MAAA,EAAA,GAAK,KAAK,MAAO,CAAA,KAAA;AAGvB,EAAA,IAAI,QAAS,CAAA,IAAA,CAAK,OAAQ,CAAA,WAAW,IAAI,CAAG,EAAA;AAC3C,IAAO,OAAA,EAAA;AAAA;AAER,EAAA,MAAM,GAAM,GAAA,oEAAA;AACZ,EAAA,EAAA,CAAG,YAAe,GAAA,IAAA;AAClB,EAAA,EAAA,CAAG,WAAc,GAAA,IAAA;AACjB,EAAA,IAAI,EAAE,eAAiB,EAAA;AACtB,IAAA,CAAA,CAAE,eAAgB,EAAA;AAClB,IAAA,CAAA,CAAE,cAAe,EAAA;AAAA;AAElB,EAAO,OAAA,GAAA;AACR,CAAA;;"} |
| import { IPublicTypeAssetsJson } from '@arvin-shu/microcode-types'; | ||
| export declare function assetsTransform(assets: IPublicTypeAssetsJson): IPublicTypeAssetsJson; |
| 'use strict'; | ||
| "use strict"; | ||
| function assetsTransform(assets) { | ||
| const { components, packages } = assets; | ||
| const packageMaps = (packages || []).reduce( | ||
| (acc, cur) => { | ||
| const key = cur.id || cur.package || ""; | ||
| acc[key] = cur; | ||
| return acc; | ||
| }, | ||
| {} | ||
| ); | ||
| components.forEach( | ||
| (componentDesc) => { | ||
| let { devMode } = componentDesc; | ||
| const { schema, reference } = componentDesc; | ||
| if (devMode === "microCode") { | ||
| devMode = "microCode"; | ||
| } else if (devMode === "proCode") { | ||
| devMode = "proCode"; | ||
| } | ||
| if (devMode) { | ||
| componentDesc.devMode = devMode; | ||
| } | ||
| if (devMode === "microCode" && !schema && reference) { | ||
| const referenceId = reference.id || ""; | ||
| componentDesc.schema = packageMaps[referenceId].schema; | ||
| } | ||
| } | ||
| ); | ||
| return assets; | ||
| } | ||
| exports.assetsTransform = assetsTransform; | ||
| //# sourceMappingURL=assets-transform.js.map |
| {"version":3,"file":"assets-transform.js","sources":["../../../src/utils/assets-transform.ts"],"sourcesContent":["import {\n\tIPublicTypeAssetsJson,\n\tIPublicTypeComponentDescription,\n\tIPublicTypePackage,\n\tIPublicTypeRemoteComponentDescription,\n} from '@arvin-shu/microcode-types';\n\nexport function assetsTransform(assets: IPublicTypeAssetsJson) {\n\tconst { components, packages } = assets;\n\tconst packageMaps = (packages || []).reduce(\n\t\t(acc: Record<string, IPublicTypePackage>, cur: IPublicTypePackage) => {\n\t\t\tconst key = cur.id || cur.package || '';\n\t\t\tacc[key] = cur;\n\t\t\treturn acc;\n\t\t},\n\t\t{} as any\n\t);\n\tcomponents.forEach(\n\t\t(\n\t\t\tcomponentDesc:\n\t\t\t\t| IPublicTypeComponentDescription\n\t\t\t\t| IPublicTypeRemoteComponentDescription\n\t\t) => {\n\t\t\tlet { devMode } = componentDesc;\n\t\t\tconst { schema, reference } = componentDesc;\n\t\t\tif ((devMode as string) === 'microCode') {\n\t\t\t\tdevMode = 'microCode';\n\t\t\t} else if (devMode === 'proCode') {\n\t\t\t\tdevMode = 'proCode';\n\t\t\t}\n\t\t\tif (devMode) {\n\t\t\t\tcomponentDesc.devMode = devMode;\n\t\t\t}\n\t\t\tif (devMode === 'microCode' && !schema && reference) {\n\t\t\t\tconst referenceId = reference.id || '';\n\t\t\t\tcomponentDesc.schema = packageMaps[referenceId].schema as any;\n\t\t\t}\n\t\t}\n\t);\n\treturn assets;\n}\n"],"names":[],"mappings":";;;AAOO,SAAS,gBAAgB,MAA+B,EAAA;AAC9D,EAAM,MAAA,EAAE,UAAY,EAAA,QAAA,EAAa,GAAA,MAAA;AACjC,EAAM,MAAA,WAAA,GAAA,CAAe,QAAY,IAAA,EAAI,EAAA,MAAA;AAAA,IACpC,CAAC,KAAyC,GAA4B,KAAA;AACrE,MAAA,MAAM,GAAM,GAAA,GAAA,CAAI,EAAM,IAAA,GAAA,CAAI,OAAW,IAAA,EAAA;AACrC,MAAA,GAAA,CAAI,GAAG,CAAI,GAAA,GAAA;AACX,MAAO,OAAA,GAAA;AAAA,KACR;AAAA,IACA;AAAC,GACF;AACA,EAAW,UAAA,CAAA,OAAA;AAAA,IACV,CACC,aAGI,KAAA;AACJ,MAAI,IAAA,EAAE,SAAY,GAAA,aAAA;AAClB,MAAM,MAAA,EAAE,MAAQ,EAAA,SAAA,EAAc,GAAA,aAAA;AAC9B,MAAA,IAAK,YAAuB,WAAa,EAAA;AACxC,QAAU,OAAA,GAAA,WAAA;AAAA,OACX,MAAA,IAAW,YAAY,SAAW,EAAA;AACjC,QAAU,OAAA,GAAA,SAAA;AAAA;AAEX,MAAA,IAAI,OAAS,EAAA;AACZ,QAAA,aAAA,CAAc,OAAU,GAAA,OAAA;AAAA;AAEzB,MAAA,IAAI,OAAY,KAAA,WAAA,IAAe,CAAC,MAAA,IAAU,SAAW,EAAA;AACpD,QAAM,MAAA,WAAA,GAAc,UAAU,EAAM,IAAA,EAAA;AACpC,QAAc,aAAA,CAAA,MAAA,GAAS,WAAY,CAAA,WAAW,CAAE,CAAA,MAAA;AAAA;AACjD;AACD,GACD;AACA,EAAO,OAAA,MAAA;AACR;;;;"} |
| /** | ||
| * 设置全局事件开关状态 | ||
| * @param flag 开关状态,true 为开启,false 为关闭 | ||
| */ | ||
| export declare function setGlobalEventFlag(flag: boolean): void; | ||
| /** | ||
| * 打开全局事件开关 | ||
| */ | ||
| export declare function switchGlobalEventOn(): void; | ||
| /** | ||
| * 关闭全局事件开关 | ||
| */ | ||
| export declare function switchGlobalEventOff(): void; | ||
| /** | ||
| * 获取全局事件开关状态 | ||
| * @returns 当前开关状态 | ||
| */ | ||
| export declare function isGlobalEventOn(): boolean; | ||
| /** | ||
| * 在关闭全局事件的情况下执行函数 | ||
| * @param fn 需要执行的函数 | ||
| */ | ||
| export declare function runWithGlobalEventOff(fn: Function): void; | ||
| type ListenerFunc = (...args: any[]) => void; | ||
| /** | ||
| * 包装事件监听函数,只在全局事件开启时执行 | ||
| * @param fn 原始监听函数 | ||
| * @returns 包装后的监听函数 | ||
| */ | ||
| export declare function wrapWithEventSwitch(fn: ListenerFunc): ListenerFunc; | ||
| export {}; |
| 'use strict'; | ||
| "use strict"; | ||
| let globalEventOn = true; | ||
| function setGlobalEventFlag(flag) { | ||
| globalEventOn = flag; | ||
| } | ||
| function switchGlobalEventOn() { | ||
| setGlobalEventFlag(true); | ||
| } | ||
| function switchGlobalEventOff() { | ||
| setGlobalEventFlag(false); | ||
| } | ||
| function isGlobalEventOn() { | ||
| return globalEventOn; | ||
| } | ||
| function runWithGlobalEventOff(fn) { | ||
| switchGlobalEventOff(); | ||
| fn(); | ||
| switchGlobalEventOn(); | ||
| } | ||
| function wrapWithEventSwitch(fn) { | ||
| return (...args) => { | ||
| if (isGlobalEventOn()) fn(...args); | ||
| }; | ||
| } | ||
| exports.isGlobalEventOn = isGlobalEventOn; | ||
| exports.runWithGlobalEventOff = runWithGlobalEventOff; | ||
| exports.setGlobalEventFlag = setGlobalEventFlag; | ||
| exports.switchGlobalEventOff = switchGlobalEventOff; | ||
| exports.switchGlobalEventOn = switchGlobalEventOn; | ||
| exports.wrapWithEventSwitch = wrapWithEventSwitch; | ||
| //# sourceMappingURL=control.js.map |
| {"version":3,"file":"control.js","sources":["../../../src/utils/control.ts"],"sourcesContent":["// 全局事件开关标志\nlet globalEventOn = true;\n\n/**\n * 设置全局事件开关状态\n * @param flag 开关状态,true 为开启,false 为关闭\n */\nexport function setGlobalEventFlag(flag: boolean) {\n\tglobalEventOn = flag;\n}\n\n/**\n * 打开全局事件开关\n */\nexport function switchGlobalEventOn() {\n\tsetGlobalEventFlag(true);\n}\n\n/**\n * 关闭全局事件开关\n */\nexport function switchGlobalEventOff() {\n\tsetGlobalEventFlag(false);\n}\n\n/**\n * 获取全局事件开关状态\n * @returns 当前开关状态\n */\nexport function isGlobalEventOn() {\n\treturn globalEventOn;\n}\n\n/**\n * 在关闭全局事件的情况下执行函数\n * @param fn 需要执行的函数\n */\nexport function runWithGlobalEventOff(fn: Function) {\n\tswitchGlobalEventOff();\n\tfn();\n\tswitchGlobalEventOn();\n}\n\ntype ListenerFunc = (...args: any[]) => void;\n/**\n * 包装事件监听函数,只在全局事件开启时执行\n * @param fn 原始监听函数\n * @returns 包装后的监听函数\n */\nexport function wrapWithEventSwitch(fn: ListenerFunc): ListenerFunc {\n\treturn (...args: any[]) => {\n\t\tif (isGlobalEventOn()) fn(...args);\n\t};\n}\n"],"names":[],"mappings":";;;AACA,IAAI,aAAgB,GAAA,IAAA;AAMb,SAAS,mBAAmB,IAAe,EAAA;AACjD,EAAgB,aAAA,GAAA,IAAA;AACjB;AAKO,SAAS,mBAAsB,GAAA;AACrC,EAAA,kBAAA,CAAmB,IAAI,CAAA;AACxB;AAKO,SAAS,oBAAuB,GAAA;AACtC,EAAA,kBAAA,CAAmB,KAAK,CAAA;AACzB;AAMO,SAAS,eAAkB,GAAA;AACjC,EAAO,OAAA,aAAA;AACR;AAMO,SAAS,sBAAsB,EAAc,EAAA;AACnD,EAAqB,oBAAA,EAAA;AACrB,EAAG,EAAA,EAAA;AACH,EAAoB,mBAAA,EAAA;AACrB;AAQO,SAAS,oBAAoB,EAAgC,EAAA;AACnE,EAAA,OAAO,IAAI,IAAgB,KAAA;AAC1B,IAAA,IAAI,eAAgB,EAAA,EAAM,EAAA,CAAA,GAAG,IAAI,CAAA;AAAA,GAClC;AACD;;;;;;;;;"} |
| export declare class FocusTracker { | ||
| private actives; | ||
| private modals; | ||
| get first(): Focusable; | ||
| addModal(checkDown: (e: MouseEvent) => boolean, checkOpen: () => boolean): void; | ||
| private checkModalOpen; | ||
| private checkModalDown; | ||
| execSave(): void; | ||
| execEsc(): void; | ||
| mount(win: Window): () => void; | ||
| /** | ||
| * 创建一个新的 Focusable 实例,并将其注册到 FocusTracker 中。 | ||
| * @param config | ||
| * @returns | ||
| */ | ||
| create(config: FocusableConfig): Focusable; | ||
| /** | ||
| * 将传入的 Focusable 设置为活跃项,并触发当前活跃项的 onBlur 回调(如果有)。 | ||
| * @param item 当前活跃的 | ||
| */ | ||
| internalActiveItem(item: Focusable): void; | ||
| internalSuspenseItem(item: Focusable): void; | ||
| } | ||
| export interface FocusableConfig { | ||
| range: HTMLElement | ((e: MouseEvent) => boolean); | ||
| modal?: boolean; | ||
| onEsc?: () => void; | ||
| onBlur?: () => void; | ||
| onSave?: () => void; | ||
| onActive?: () => void; | ||
| } | ||
| export declare class Focusable { | ||
| private tracker; | ||
| private config; | ||
| readonly isModal?: boolean; | ||
| constructor(tracker: FocusTracker, config: FocusableConfig); | ||
| active(): void; | ||
| suspense(): void; | ||
| purge(): void; | ||
| internalCheckInRange(e: MouseEvent): boolean; | ||
| internalTriggerBlur(): void; | ||
| internalTriggerSave(): boolean; | ||
| internalTriggerEsc(): void; | ||
| internalTriggerActive(): void; | ||
| } |
| 'use strict'; | ||
| "use strict"; | ||
| class FocusTracker { | ||
| // 存储当前活跃的 Focusable 实例(处于焦点中的元素)。 | ||
| actives = []; | ||
| modals = []; | ||
| get first() { | ||
| return this.actives[0]; | ||
| } | ||
| addModal(checkDown, checkOpen) { | ||
| this.modals.push({ | ||
| checkDown, | ||
| checkOpen | ||
| }); | ||
| } | ||
| checkModalOpen() { | ||
| return this.modals.some((item) => item.checkOpen()); | ||
| } | ||
| checkModalDown(e) { | ||
| return this.modals.some((item) => item.checkDown(e)); | ||
| } | ||
| execSave() { | ||
| if (this.checkModalOpen()) { | ||
| return; | ||
| } | ||
| if (this.first) { | ||
| this.first.internalTriggerSave(); | ||
| } | ||
| } | ||
| execEsc() { | ||
| const { first } = this; | ||
| if (first) { | ||
| this.internalSuspenseItem(first); | ||
| first.internalTriggerEsc(); | ||
| } | ||
| } | ||
| mount(win) { | ||
| const checkDown = (e) => { | ||
| const { first } = this; | ||
| if (first && !first.internalCheckInRange(e)) { | ||
| this.internalSuspenseItem(first); | ||
| first.internalTriggerBlur(); | ||
| } | ||
| }; | ||
| win.document.addEventListener("click", checkDown, true); | ||
| return () => { | ||
| win.removeEventListener("click", checkDown, true); | ||
| }; | ||
| } | ||
| /** | ||
| * 创建一个新的 Focusable 实例,并将其注册到 FocusTracker 中。 | ||
| * @param config | ||
| * @returns | ||
| */ | ||
| create(config) { | ||
| return new Focusable(this, config); | ||
| } | ||
| /** | ||
| * 将传入的 Focusable 设置为活跃项,并触发当前活跃项的 onBlur 回调(如果有)。 | ||
| * @param item 当前活跃的 | ||
| */ | ||
| internalActiveItem(item) { | ||
| const first = this.actives[0]; | ||
| if (first === item) { | ||
| return; | ||
| } | ||
| const i = this.actives.indexOf(item); | ||
| if (i > -1) { | ||
| this.actives.splice(i, 1); | ||
| } | ||
| this.actives.unshift(item); | ||
| if (!item.isModal && first) { | ||
| first.internalTriggerBlur(); | ||
| } | ||
| item.internalTriggerActive(); | ||
| } | ||
| internalSuspenseItem(item) { | ||
| const i = this.actives.indexOf(item); | ||
| if (i > -1) { | ||
| this.actives.splice(i, 1); | ||
| this.first?.internalTriggerActive(); | ||
| } | ||
| } | ||
| } | ||
| class Focusable { | ||
| constructor(tracker, config) { | ||
| this.tracker = tracker; | ||
| this.config = config; | ||
| this.isModal = config.modal === null ? false : config.modal; | ||
| } | ||
| isModal; | ||
| active() { | ||
| this.tracker.internalActiveItem(this); | ||
| } | ||
| suspense() { | ||
| this.tracker.internalSuspenseItem(this); | ||
| } | ||
| purge() { | ||
| this.tracker.internalSuspenseItem(this); | ||
| } | ||
| internalCheckInRange(e) { | ||
| const { range } = this.config; | ||
| if (!range) { | ||
| return false; | ||
| } | ||
| if (typeof range === "function") { | ||
| return range(e); | ||
| } | ||
| return range.contains(e.target); | ||
| } | ||
| internalTriggerBlur() { | ||
| if (this.config.onBlur) { | ||
| this.config.onBlur(); | ||
| } | ||
| } | ||
| internalTriggerSave() { | ||
| if (this.config.onSave) { | ||
| this.config.onSave(); | ||
| return true; | ||
| } | ||
| return false; | ||
| } | ||
| internalTriggerEsc() { | ||
| if (this.config.onEsc) { | ||
| this.config.onEsc(); | ||
| } | ||
| } | ||
| internalTriggerActive() { | ||
| if (this.config.onActive) { | ||
| this.config.onActive(); | ||
| } | ||
| } | ||
| } | ||
| exports.FocusTracker = FocusTracker; | ||
| exports.Focusable = Focusable; | ||
| //# sourceMappingURL=focus-tracker.js.map |
| {"version":3,"file":"focus-tracker.js","sources":["../../../src/utils/focus-tracker.ts"],"sourcesContent":["export class FocusTracker {\n\t// 存储当前活跃的 Focusable 实例(处于焦点中的元素)。\n\tprivate actives: Focusable[] = [];\n\n\tprivate modals: Array<{\n\t\tcheckDown: (e: MouseEvent) => boolean;\n\t\tcheckOpen: () => boolean;\n\t}> = [];\n\n\tget first() {\n\t\treturn this.actives[0];\n\t}\n\n\taddModal(checkDown: (e: MouseEvent) => boolean, checkOpen: () => boolean) {\n\t\tthis.modals.push({\n\t\t\tcheckDown,\n\t\t\tcheckOpen,\n\t\t});\n\t}\n\n\tprivate checkModalOpen(): boolean {\n\t\treturn this.modals.some((item) => item.checkOpen());\n\t}\n\n\tprivate checkModalDown(e: MouseEvent): boolean {\n\t\treturn this.modals.some((item) => item.checkDown(e));\n\t}\n\n\texecSave() {\n\t\t// has Modal return;\n\t\tif (this.checkModalOpen()) {\n\t\t\treturn;\n\t\t}\n\t\t// catch\n\t\tif (this.first) {\n\t\t\tthis.first.internalTriggerSave();\n\t\t}\n\t}\n\n\texecEsc() {\n\t\tconst { first } = this;\n\t\tif (first) {\n\t\t\tthis.internalSuspenseItem(first);\n\t\t\tfirst.internalTriggerEsc();\n\t\t}\n\t}\n\n\tmount(win: Window) {\n\t\tconst checkDown = (e: MouseEvent) => {\n\t\t\tconst { first } = this;\n\t\t\tif (first && !first.internalCheckInRange(e)) {\n\t\t\t\t// 失去焦点\n\t\t\t\tthis.internalSuspenseItem(first);\n\t\t\t\tfirst.internalTriggerBlur();\n\t\t\t}\n\t\t};\n\t\twin.document.addEventListener('click', checkDown, true);\n\n\t\treturn () => {\n\t\t\twin.removeEventListener('click', checkDown, true);\n\t\t};\n\t}\n\n\t/**\n\t * 创建一个新的 Focusable 实例,并将其注册到 FocusTracker 中。\n\t * @param config\n\t * @returns\n\t */\n\tcreate(config: FocusableConfig) {\n\t\treturn new Focusable(this, config);\n\t}\n\n\t/**\n\t * 将传入的 Focusable 设置为活跃项,并触发当前活跃项的 onBlur 回调(如果有)。\n\t * @param item 当前活跃的\n\t */\n\tinternalActiveItem(item: Focusable) {\n\t\t// 获取当前活跃的元素,判断当前激活的元素是否已经活跃\n\t\tconst first = this.actives[0];\n\t\tif (first === item) {\n\t\t\treturn;\n\t\t}\n\t\t// 从 actives 中移除当前激活的 item(如果存在):\n\t\tconst i = this.actives.indexOf(item);\n\t\tif (i > -1) {\n\t\t\tthis.actives.splice(i, 1);\n\t\t}\n\t\t// 将当前激活的 item 添加到 actives 数组的第一个位置,以更新它为当前的焦点元素。\n\t\tthis.actives.unshift(item);\n\t\t// 如果当前激活的 item 不是模态窗口 (!item.isModal) 且存在之前的焦点元素 first,\n\t\t// 则触发 first 的 internalTriggerBlur() 方法,使之前的焦点元素失去焦点。\n\t\t// 这可以确保在非模态窗口间切换时,焦点变化能够触发 blur 事件。\n\t\tif (!item.isModal && first) {\n\t\t\tfirst.internalTriggerBlur();\n\t\t}\n\t\t// 调用 item 的 internalTriggerActive 方法,以触发激活状态的回调或执行激活事件。\n\t\t// 这一方法可以用于更新 UI 或执行一些焦点激活时的逻辑。\n\t\titem.internalTriggerActive();\n\t}\n\n\tinternalSuspenseItem(item: Focusable) {\n\t\tconst i = this.actives.indexOf(item);\n\t\tif (i > -1) {\n\t\t\tthis.actives.splice(i, 1);\n\t\t\t// 触发新的首个活跃元素的激活事件\n\t\t\tthis.first?.internalTriggerActive();\n\t\t}\n\t}\n}\n\nexport interface FocusableConfig {\n\t// 用于指定一个可聚焦元素的点击范围。\n\trange: HTMLElement | ((e: MouseEvent) => boolean);\n\tmodal?: boolean; // 模态窗口级别\n\tonEsc?: () => void;\n\tonBlur?: () => void;\n\tonSave?: () => void;\n\tonActive?: () => void;\n}\n\nexport class Focusable {\n\treadonly isModal?: boolean;\n\n\tconstructor(\n\t\tprivate tracker: FocusTracker,\n\t\tprivate config: FocusableConfig\n\t) {\n\t\tthis.isModal = config.modal === null ? false : config.modal;\n\t}\n\n\tactive() {\n\t\tthis.tracker.internalActiveItem(this);\n\t}\n\n\tsuspense() {\n\t\tthis.tracker.internalSuspenseItem(this);\n\t}\n\n\tpurge() {\n\t\tthis.tracker.internalSuspenseItem(this);\n\t}\n\n\tinternalCheckInRange(e: MouseEvent) {\n\t\tconst { range } = this.config;\n\t\tif (!range) {\n\t\t\treturn false;\n\t\t}\n\t\tif (typeof range === 'function') {\n\t\t\treturn range(e);\n\t\t}\n\n\t\treturn range.contains(e.target as HTMLElement);\n\t}\n\n\tinternalTriggerBlur() {\n\t\tif (this.config.onBlur) {\n\t\t\tthis.config.onBlur();\n\t\t}\n\t}\n\n\tinternalTriggerSave() {\n\t\tif (this.config.onSave) {\n\t\t\tthis.config.onSave();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tinternalTriggerEsc() {\n\t\tif (this.config.onEsc) {\n\t\t\tthis.config.onEsc();\n\t\t}\n\t}\n\n\tinternalTriggerActive() {\n\t\tif (this.config.onActive) {\n\t\t\tthis.config.onActive();\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"} |
| /** | ||
| * 获取当前脚本文件所在的公共路径 | ||
| * @returns 返回脚本文件所在目录的URL路径,如果获取失败则返回空字符串 | ||
| */ | ||
| export declare function getPublicPath(): string; |
| 'use strict'; | ||
| "use strict"; | ||
| const publicPath = document.currentScript?.src.replace( | ||
| /^(.*\/)[^/]+$/, | ||
| "$1" | ||
| ); | ||
| function getPublicPath() { | ||
| return publicPath || ""; | ||
| } | ||
| exports.getPublicPath = getPublicPath; | ||
| //# sourceMappingURL=get-public-path.js.map |
| {"version":3,"file":"get-public-path.js","sources":["../../../src/utils/get-public-path.ts"],"sourcesContent":["// 获取当前脚本文件所在的目录路径\n// 例如: 如果脚本文件路径是 https://example.com/assets/script.js\n// 则返回 https://example.com/assets/\nconst publicPath = (document.currentScript as HTMLScriptElement)?.src.replace(\n\t/^(.*\\/)[^/]+$/,\n\t'$1'\n);\n\n/**\n * 获取当前脚本文件所在的公共路径\n * @returns 返回脚本文件所在目录的URL路径,如果获取失败则返回空字符串\n */\nexport function getPublicPath(): string {\n\treturn publicPath || '';\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,UAAA,GAAc,QAAS,CAAA,aAAA,EAAqC,GAAI,CAAA,OAAA;AAAA,EACrE,eAAA;AAAA,EACA;AACD,CAAA;AAMO,SAAS,aAAwB,GAAA;AACvC,EAAA,OAAO,UAAc,IAAA,EAAA;AACtB;;;;"} |
| export * from './preference'; | ||
| export * from './focus-tracker'; | ||
| export * from './assets-transform'; | ||
| export * from './control'; | ||
| export * from './get-public-path'; |
| 'use strict'; | ||
| require('./preference.js'); | ||
| var focusTracker = require('./focus-tracker.js'); | ||
| var assetsTransform = require('./assets-transform.js'); | ||
| var control = require('./control.js'); | ||
| var getPublicPath = require('./get-public-path.js'); | ||
| "use strict"; | ||
| exports.FocusTracker = focusTracker.FocusTracker; | ||
| exports.Focusable = focusTracker.Focusable; | ||
| exports.assetsTransform = assetsTransform.assetsTransform; | ||
| exports.isGlobalEventOn = control.isGlobalEventOn; | ||
| exports.runWithGlobalEventOff = control.runWithGlobalEventOff; | ||
| exports.setGlobalEventFlag = control.setGlobalEventFlag; | ||
| exports.switchGlobalEventOff = control.switchGlobalEventOff; | ||
| exports.switchGlobalEventOn = control.switchGlobalEventOn; | ||
| exports.wrapWithEventSwitch = control.wrapWithEventSwitch; | ||
| exports.getPublicPath = getPublicPath.getPublicPath; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"} |
| import { IPublicModelPreference } from '@arvin-shu/microcode-types'; | ||
| export default class Preference implements IPublicModelPreference { | ||
| getStorageKey(key: string, module?: string): string; | ||
| set(key: string, value: any, module?: string): void; | ||
| get(key: string, module: string): any; | ||
| /** | ||
| * 检查本地存储是否包含特定密钥 | ||
| * | ||
| * @param key | ||
| * @param module | ||
| * @returns | ||
| */ | ||
| contains(key: string, module: string): boolean; | ||
| } |
| 'use strict'; | ||
| var microcodeUtils = require('@arvin-shu/microcode-utils'); | ||
| var store = require('store'); | ||
| "use strict"; | ||
| const logger = microcodeUtils.getLogger({ level: "warn", bizName: "Preference" }); | ||
| const STORAGE_KEY_PREFIX = "arvin"; | ||
| class Preference { | ||
| getStorageKey(key, module) { | ||
| const moduleKey = module || "__inner__"; | ||
| return `${STORAGE_KEY_PREFIX}_${moduleKey}.${key}`; | ||
| } | ||
| set(key, value, module) { | ||
| if (!key || typeof key !== "string" || key.length === 0) { | ||
| logger.error("Invalid key when setting preference", key); | ||
| return; | ||
| } | ||
| const storageKey = this.getStorageKey(key, module); | ||
| logger.debug("storageKey:", storageKey, "set with value:", value); | ||
| store.set(storageKey, value); | ||
| } | ||
| get(key, module) { | ||
| if (!key || typeof key !== "string" || key.length === 0) { | ||
| logger.error("Invalid key when getting from preference", key); | ||
| return; | ||
| } | ||
| const storageKey = this.getStorageKey(key, module); | ||
| const result = store.get(storageKey); | ||
| logger.debug("storageKey:", storageKey, "get with result:", result); | ||
| return result; | ||
| } | ||
| /** | ||
| * 检查本地存储是否包含特定密钥 | ||
| * | ||
| * @param key | ||
| * @param module | ||
| * @returns | ||
| */ | ||
| contains(key, module) { | ||
| if (!key || typeof key !== "string" || key.length === 0) { | ||
| logger.error("Invalid key when getting from preference", key); | ||
| return false; | ||
| } | ||
| const storageKey = this.getStorageKey(key, module); | ||
| const result = store.get(storageKey); | ||
| return !(result === void 0 || result === null); | ||
| } | ||
| } | ||
| module.exports = Preference; | ||
| //# sourceMappingURL=preference.js.map |
| {"version":3,"file":"preference.js","sources":["../../../src/utils/preference.ts"],"sourcesContent":["import { IPublicModelPreference } from '@arvin-shu/microcode-types';\nimport { getLogger } from '@arvin-shu/microcode-utils';\nimport store from 'store';\n\nconst logger = getLogger({ level: 'warn', bizName: 'Preference' });\nconst STORAGE_KEY_PREFIX = 'arvin';\n\nexport default class Preference implements IPublicModelPreference {\n\tgetStorageKey(key: string, module?: string): string {\n\t\tconst moduleKey = module || '__inner__';\n\t\treturn `${STORAGE_KEY_PREFIX}_${moduleKey}.${key}`;\n\t}\n\n\tset(key: string, value: any, module?: string): void {\n\t\tif (!key || typeof key !== 'string' || key.length === 0) {\n\t\t\tlogger.error('Invalid key when setting preference', key);\n\t\t\treturn;\n\t\t}\n\t\tconst storageKey = this.getStorageKey(key, module);\n\t\tlogger.debug('storageKey:', storageKey, 'set with value:', value);\n\t\tstore.set(storageKey, value);\n\t}\n\n\tget(key: string, module: string): any {\n\t\tif (!key || typeof key !== 'string' || key.length === 0) {\n\t\t\tlogger.error('Invalid key when getting from preference', key);\n\t\t\treturn;\n\t\t}\n\t\tconst storageKey = this.getStorageKey(key, module);\n\t\tconst result = store.get(storageKey);\n\t\tlogger.debug('storageKey:', storageKey, 'get with result:', result);\n\t\treturn result;\n\t}\n\n\t/**\n\t * 检查本地存储是否包含特定密钥\n\t *\n\t * @param key\n\t * @param module\n\t * @returns\n\t */\n\tcontains(key: string, module: string): boolean {\n\t\tif (!key || typeof key !== 'string' || key.length === 0) {\n\t\t\tlogger.error('Invalid key when getting from preference', key);\n\t\t\treturn false;\n\t\t}\n\t\tconst storageKey = this.getStorageKey(key, module);\n\t\tconst result = store.get(storageKey);\n\n\t\treturn !(result === undefined || result === null);\n\t}\n}\n"],"names":["getLogger"],"mappings":";;;;;;AAIA,MAAM,SAASA,wBAAU,CAAA,EAAE,OAAO,MAAQ,EAAA,OAAA,EAAS,cAAc,CAAA;AACjE,MAAM,kBAAqB,GAAA,OAAA;AAE3B,MAAqB,UAA6C,CAAA;AAAA,EACjE,aAAA,CAAc,KAAa,MAAyB,EAAA;AACnD,IAAA,MAAM,YAAY,MAAU,IAAA,WAAA;AAC5B,IAAA,OAAO,CAAG,EAAA,kBAAkB,CAAI,CAAA,EAAA,SAAS,IAAI,GAAG,CAAA,CAAA;AAAA;AACjD,EAEA,GAAA,CAAI,GAAa,EAAA,KAAA,EAAY,MAAuB,EAAA;AACnD,IAAA,IAAI,CAAC,GAAO,IAAA,OAAO,QAAQ,QAAY,IAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACxD,MAAO,MAAA,CAAA,KAAA,CAAM,uCAAuC,GAAG,CAAA;AACvD,MAAA;AAAA;AAED,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,EAAK,MAAM,CAAA;AACjD,IAAA,MAAA,CAAO,KAAM,CAAA,aAAA,EAAe,UAAY,EAAA,iBAAA,EAAmB,KAAK,CAAA;AAChE,IAAM,KAAA,CAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AAAA;AAC5B,EAEA,GAAA,CAAI,KAAa,MAAqB,EAAA;AACrC,IAAA,IAAI,CAAC,GAAO,IAAA,OAAO,QAAQ,QAAY,IAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACxD,MAAO,MAAA,CAAA,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAC5D,MAAA;AAAA;AAED,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,EAAK,MAAM,CAAA;AACjD,IAAM,MAAA,MAAA,GAAS,KAAM,CAAA,GAAA,CAAI,UAAU,CAAA;AACnC,IAAA,MAAA,CAAO,KAAM,CAAA,aAAA,EAAe,UAAY,EAAA,kBAAA,EAAoB,MAAM,CAAA;AAClE,IAAO,OAAA,MAAA;AAAA;AACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAA,CAAS,KAAa,MAAyB,EAAA;AAC9C,IAAA,IAAI,CAAC,GAAO,IAAA,OAAO,QAAQ,QAAY,IAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACxD,MAAO,MAAA,CAAA,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAC5D,MAAO,OAAA,KAAA;AAAA;AAER,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,EAAK,MAAM,CAAA;AACjD,IAAM,MAAA,MAAA,GAAS,KAAM,CAAA,GAAA,CAAI,UAAU,CAAA;AAEnC,IAAO,OAAA,EAAE,MAAW,KAAA,KAAA,CAAA,IAAa,MAAW,KAAA,IAAA,CAAA;AAAA;AAE9C;;;;"} |
| export * from './title'; | ||
| export * from './tip'; |
| 'use strict'; | ||
| var index = require('./title/index.js'); | ||
| require('./tip/index.js'); | ||
| var tip = require('./tip/tip.js'); | ||
| var tipContainer = require('./tip/tip-container.js'); | ||
| var helpTips = require('./tip/help-tips.js'); | ||
| "use strict"; | ||
| exports.Title = index.Title; | ||
| exports.Tip = tip.Tip; | ||
| exports.TipContainer = tipContainer.TipContainer; | ||
| exports.TipItem = tipContainer.TipItem; | ||
| exports.HelpTip = helpTips.HelpTip; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"} |
| import { IPublicTypeHelpTipConfig, IPublicTypeTipConfig } from '@arvin-shu/microcode-types'; | ||
| export declare function HelpTip({ help, direction, size, }: { | ||
| help: IPublicTypeHelpTipConfig; | ||
| direction?: IPublicTypeTipConfig['direction']; | ||
| size?: Number; | ||
| }): VNode; |
| 'use strict'; | ||
| var vue = require('vue'); | ||
| var tip = require('./tip.js'); | ||
| var infoIcon = require('./info-icon.js'); | ||
| "use strict"; | ||
| function HelpTip({ | ||
| help, | ||
| direction = "left", | ||
| size = 16 | ||
| }) { | ||
| if (typeof help === "string") { | ||
| return vue.createVNode("div", null, [vue.createVNode("div", null, [vue.createVNode(infoIcon.InfoIcon, { | ||
| "style": { | ||
| width: `${size}px`, | ||
| height: `${size}px`, | ||
| verticalAlign: "middle" | ||
| }, | ||
| "class": "mtc-help-tip" | ||
| }, null)]), vue.createVNode(tip.Tip, { | ||
| "direction": direction, | ||
| "children": help | ||
| }, null)]); | ||
| } | ||
| if (typeof help === "object" && help.url) { | ||
| return vue.createVNode("div", null, [vue.createVNode("a", { | ||
| "href": help.url, | ||
| "target": "_blank", | ||
| "rel": "noopener noreferrer" | ||
| }, [vue.createVNode(infoIcon.InfoIcon, { | ||
| "style": { | ||
| width: `${size}px`, | ||
| height: `${size}px`, | ||
| verticalAlign: "middle" | ||
| } | ||
| }, null)]), vue.createVNode(tip.Tip, { | ||
| "direction": direction, | ||
| "children": help | ||
| }, null)]); | ||
| } | ||
| return vue.createVNode("div", null, [vue.createVNode(infoIcon.InfoIcon, { | ||
| "style": { | ||
| width: `${size}px`, | ||
| height: `${size}px`, | ||
| verticalAlign: "middle" | ||
| }, | ||
| "class": "mtc-help-tip" | ||
| }, null), vue.createVNode(tip.Tip, { | ||
| "direction": direction, | ||
| "children": help | ||
| }, null)]); | ||
| } | ||
| exports.HelpTip = HelpTip; | ||
| //# sourceMappingURL=help-tips.js.map |
| {"version":3,"file":"help-tips.js","sources":["../../../../src/widgets/tip/help-tips.tsx"],"sourcesContent":["import {\n\tIPublicTypeHelpTipConfig,\n\tIPublicTypeTipConfig,\n} from '@arvin-shu/microcode-types';\nimport { Tip } from './tip';\nimport { InfoIcon } from './info-icon';\n\nexport function HelpTip({\n\thelp,\n\tdirection = 'left',\n\tsize = 16,\n}: {\n\thelp: IPublicTypeHelpTipConfig;\n\tdirection?: IPublicTypeTipConfig['direction'];\n\tsize?: Number;\n}) {\n\tif (typeof help === 'string') {\n\t\treturn (\n\t\t\t<div>\n\t\t\t\t<div>\n\t\t\t\t\t<InfoIcon\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: `${size}px`,\n\t\t\t\t\t\t\theight: `${size}px`,\n\t\t\t\t\t\t\tverticalAlign: 'middle',\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclass=\"mtc-help-tip\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<Tip direction={direction} children={help as any}></Tip>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (typeof help === 'object' && help.url) {\n\t\treturn (\n\t\t\t<div>\n\t\t\t\t<a href={help.url} target=\"_blank\" rel=\"noopener noreferrer\">\n\t\t\t\t\t<InfoIcon\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\twidth: `${size}px`,\n\t\t\t\t\t\t\theight: `${size}px`,\n\t\t\t\t\t\t\tverticalAlign: 'middle',\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</a>\n\t\t\t\t<Tip direction={direction} children={help as any}></Tip>\n\t\t\t</div>\n\t\t);\n\t}\n\treturn (\n\t\t<div>\n\t\t\t<InfoIcon\n\t\t\t\tstyle={{\n\t\t\t\t\twidth: `${size}px`,\n\t\t\t\t\theight: `${size}px`,\n\t\t\t\t\tverticalAlign: 'middle',\n\t\t\t\t}}\n\t\t\t\tclass=\"mtc-help-tip\"\n\t\t\t/>\n\t\t\t<Tip direction={direction} children={help as any}></Tip>\n\t\t</div>\n\t);\n}\n"],"names":["HelpTip","help","direction","size","_createVNode","InfoIcon","width","height","verticalAlign","Tip","url"],"mappings":";;;;;;;AAOO,SAASA,OAAQ,CAAA;AAAA,EACvBC,IAAAA;AAAAA,EACAC,SAAY,GAAA,MAAA;AAAA,EACZC,IAAO,GAAA;AAKR,CAAG,EAAA;AACF,EAAI,IAAA,OAAOF,SAAS,QAAU,EAAA;AAC7B,IAAAG,OAAAA,eAAAA,CAAAA,OAAAA,IAAAA,EAAAA,CAAAA,gBAAAA,KAAAA,EAAAA,IAAAA,EAAAA,CAAAA,eAAAA,CAAAC,iBAAA,EAAA;AAAA,MAAA,OAIW,EAAA;AAAA,QACNC,KAAAA,EAAO,GAAGH,IAAI,CAAA,EAAA,CAAA;AAAA,QACdI,MAAAA,EAAQ,GAAGJ,IAAI,CAAA,EAAA,CAAA;AAAA,QACfK,aAAe,EAAA;AAAA,OAChB;AAAA,MAAC,OAAA,EAAA;AAAA,OAAAJ,IAAAA,CAAAA,CAAAA,CAAAA,EAAAA,gBAAAK,OAAA,EAAA;AAAA,MAAA,WAKaP,EAAAA,SAAAA;AAAAA,MAAS,UAAYD,EAAAA;AAAAA,KAAI,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA;AAK5C,EAAA,IAAI,OAAOA,IAAAA,KAAS,QAAYA,IAAAA,IAAAA,CAAKS,GAAK,EAAA;AACzC,IAAA,OAAAN,8BAAAA,gBAAA,GAAA,EAAA;AAAA,MAAA,QAEWH,IAAKS,CAAAA,GAAAA;AAAAA,MAAG,QAAA,EAAA,QAAA;AAAA,MAAA,KAAA,EAAA;AAAA,KAAA,EAAAN,CAAAA,eAAAA,CAAAC,iBAAA,EAAA;AAAA,MAAA,OAER,EAAA;AAAA,QACNC,KAAAA,EAAO,GAAGH,IAAI,CAAA,EAAA,CAAA;AAAA,QACdI,MAAAA,EAAQ,GAAGJ,IAAI,CAAA,EAAA,CAAA;AAAA,QACfK,aAAe,EAAA;AAAA;AAChB,OAACJ,IAAAA,CAAAA,CAAAA,CAAAA,EAAAA,gBAAAK,OAAA,EAAA;AAAA,MAAA,WAGaP,EAAAA,SAAAA;AAAAA,MAAS,UAAYD,EAAAA;AAAAA,KAAI,EAAA,IAAA,CAAA,CAAA,CAAA;AAAA;AAI5C,EAAA,OAAAG,eAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAAA,gBAAAC,iBAAA,EAAA;AAAA,IAAA,OAGU,EAAA;AAAA,MACNC,KAAAA,EAAO,GAAGH,IAAI,CAAA,EAAA,CAAA;AAAA,MACdI,MAAAA,EAAQ,GAAGJ,IAAI,CAAA,EAAA,CAAA;AAAA,MACfK,aAAe,EAAA;AAAA,KAChB;AAAA,IAAC,OAAA,EAAA;AAAA,GAAAJ,EAAAA,IAAAA,CAAAA,EAAAA,eAAAA,CAAAK,OAAA,EAAA;AAAA,IAAA,WAGcP,EAAAA,SAAAA;AAAAA,IAAS,UAAYD,EAAAA;AAAAA,GAAI,EAAA,IAAA,CAAA,CAAA,CAAA;AAG5C;;;;"} |
| export * from './tip'; | ||
| export * from './tip-container'; | ||
| export * from './help-tips'; |
| 'use strict'; | ||
| var tip = require('./tip.js'); | ||
| var tipContainer = require('./tip-container.js'); | ||
| var helpTips = require('./help-tips.js'); | ||
| "use strict"; | ||
| exports.Tip = tip.Tip; | ||
| exports.TipContainer = tipContainer.TipContainer; | ||
| exports.TipItem = tipContainer.TipItem; | ||
| exports.HelpTip = helpTips.HelpTip; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"} |
| export declare const InfoIcon: import("vue").DefineComponent<{}, () => VNode, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; |
| 'use strict'; | ||
| var vue = require('vue'); | ||
| "use strict"; | ||
| const InfoIcon = /* @__PURE__ */ vue.defineComponent({ | ||
| name: "InfoIcon", | ||
| setup() { | ||
| return () => vue.createVNode("svg", { | ||
| "xmlns": "http://www.w3.org/2000/svg", | ||
| "width": "24", | ||
| "height": "24", | ||
| "viewBox": "0 0 24 24" | ||
| }, [vue.createVNode("path", { | ||
| "fill": "currentColor", | ||
| "d": "M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8" | ||
| }, null)]); | ||
| } | ||
| }); | ||
| exports.InfoIcon = InfoIcon; | ||
| //# sourceMappingURL=info-icon.js.map |
| {"version":3,"file":"info-icon.js","sources":["../../../../src/widgets/tip/info-icon.tsx"],"sourcesContent":["import { defineComponent } from 'vue';\n\nexport const InfoIcon = defineComponent({\n\tname: 'InfoIcon',\n\tsetup() {\n\t\treturn () => (\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\twidth=\"24\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\td=\"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10s10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t);\n\t},\n});\n"],"names":["InfoIcon","defineComponent","name","setup","_createVNode"],"mappings":";;;;;AAEO,MAAMA,2BAA2BC,mBAAA,CAAA;AAAA,EACvCC,IAAM,EAAA,UAAA;AAAA,EACNC,KAAQ,GAAA;AACP,IAAO,OAAA,MAAAC,gBAAA,KAAA,EAAA;AAAA,MAAA,OAAA,EAAA,4BAAA;AAAA,MAAA,OAAA,EAAA,IAAA;AAAA,MAAA,QAAA,EAAA,IAAA;AAAA,MAAA,SAAA,EAAA;AAAA,KAAA,EAAA,CAAAA,eAAAA,CAAA,MAAA,EAAA;AAAA,MAAA,MAAA,EAAA,cAAA;AAAA,MAAA,GAAA,EAAA;AAAA,KAAA,EAYN,IAAA,CAAA,CAAA,CAAA;AAAA;AAEH,CAAC;;;;"} |
| export declare const TipContainer: import("vue").DefineComponent<{}, () => VNode, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; | ||
| export declare const TipItem: import("vue").DefineComponent<{}, () => VNode, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; |
| 'use strict'; | ||
| var vue = require('vue'); | ||
| var tipHandler = require('./tip-handler.js'); | ||
| var utils = require('./utils.js'); | ||
| var index = require('../../inti/index.js'); | ||
| "use strict"; | ||
| const TipContainer = /* @__PURE__ */ vue.defineComponent({ | ||
| name: "TipContainer", | ||
| setup() { | ||
| let dispose; | ||
| vue.onMounted(() => { | ||
| const over = (e) => tipHandler.tipHandler.setTarget(e.target); | ||
| const down = () => tipHandler.tipHandler.hideImmediately(); | ||
| document.addEventListener("mouseover", over, false); | ||
| document.addEventListener("mousedown", down, true); | ||
| dispose = () => { | ||
| document.removeEventListener("mouseover", over, false); | ||
| document.removeEventListener("mousedown", down, true); | ||
| }; | ||
| }); | ||
| vue.onBeforeUnmount(() => { | ||
| if (dispose) { | ||
| dispose(); | ||
| } | ||
| }); | ||
| return () => vue.createVNode(vue.Teleport, { | ||
| "to": "body" | ||
| }, { | ||
| default: () => [vue.createVNode("div", { | ||
| "class": "mtc-tips-container" | ||
| }, [vue.createVNode(TipItem, null, null)])] | ||
| }); | ||
| } | ||
| }); | ||
| const TipItem = /* @__PURE__ */ vue.defineComponent({ | ||
| name: "TipItem", | ||
| setup() { | ||
| const dispose = tipHandler.tipHandler.onChange(() => { | ||
| updateTip(); | ||
| }); | ||
| const shell = vue.ref(); | ||
| const updateTip = () => { | ||
| if (!shell.value) { | ||
| return; | ||
| } | ||
| const arrow = shell.value.querySelector(".mtc-arrow"); | ||
| shell.value.className = getClass(); | ||
| shell.value.style.cssText = ""; | ||
| arrow.style.cssText = ""; | ||
| clearTimer(); | ||
| const { | ||
| tip | ||
| } = tipHandler.tipHandler; | ||
| if (!tip) { | ||
| return; | ||
| } | ||
| const { | ||
| target, | ||
| direction, | ||
| children | ||
| } = tip; | ||
| text.value = children; | ||
| const targetRect = target.getBoundingClientRect(); | ||
| if (targetRect.width === 0 || targetRect.height === 0) { | ||
| return; | ||
| } | ||
| const shellRect = shell.value.getBoundingClientRect(); | ||
| const bounds = { | ||
| left: 1, | ||
| top: 1, | ||
| right: document.documentElement.clientWidth - 1, | ||
| bottom: document.documentElement.clientHeight - 1 | ||
| }; | ||
| const arrowRect = arrow.getBoundingClientRect(); | ||
| const { | ||
| dir, | ||
| left, | ||
| top, | ||
| arrowLeft, | ||
| arrowTop | ||
| } = utils.resolvePosition(shellRect, targetRect, arrowRect, bounds, direction); | ||
| shell.value.classList.add(`mtc-align-${dir}`); | ||
| shell.value.style.top = `${top}px`; | ||
| shell.value.style.left = `${left}px`; | ||
| shell.value.style.width = `${shellRect.width}px`; | ||
| shell.value.style.height = `${shellRect.height}px`; | ||
| if (dir === "top" || dir === "bottom") { | ||
| arrow.style.left = `${arrowLeft}px`; | ||
| } else { | ||
| arrow.style.top = `${arrowTop}px`; | ||
| } | ||
| timer = window.setTimeout(() => { | ||
| if (shell.value) { | ||
| shell.value.classList.add("mtc-visible-animate"); | ||
| shell.value.style.transform = "none"; | ||
| } | ||
| }, 10); | ||
| }; | ||
| vue.onMounted(() => { | ||
| updateTip(); | ||
| }); | ||
| vue.onUpdated(() => { | ||
| updateTip(); | ||
| }); | ||
| vue.onBeforeUnmount(() => { | ||
| if (dispose) { | ||
| dispose(); | ||
| } | ||
| clearTimer(); | ||
| }); | ||
| let timer = null; | ||
| function clearTimer() { | ||
| if (timer) { | ||
| clearTimeout(timer); | ||
| timer = null; | ||
| } | ||
| } | ||
| function getClass() { | ||
| const classes = ["mtc-tip"]; | ||
| if (tipHandler.tipHandler.tip?.className) { | ||
| classes.push(tipHandler.tipHandler.tip?.className); | ||
| } | ||
| if (tipHandler.tipHandler.tip && tipHandler.tipHandler.tip.theme) { | ||
| classes.push(`mtc-theme-${tipHandler.tipHandler.tip.theme}`); | ||
| } | ||
| return classes.join(" "); | ||
| } | ||
| const text = vue.ref(); | ||
| return () => vue.createVNode("div", { | ||
| "class": getClass(), | ||
| "ref": shell | ||
| }, [vue.createVNode("i", { | ||
| "class": "mtc-arrow" | ||
| }, null), vue.createVNode("div", { | ||
| "class": "mtc-tip-content" | ||
| }, [index.intl(text.value)])]); | ||
| } | ||
| }); | ||
| exports.TipContainer = TipContainer; | ||
| exports.TipItem = TipItem; | ||
| //# sourceMappingURL=tip-container.js.map |
| {"version":3,"file":"tip-container.js","sources":["../../../../src/widgets/tip/tip-container.tsx"],"sourcesContent":["import {\n\tdefineComponent,\n\tonBeforeUnmount,\n\tonMounted,\n\tonUpdated,\n\tref,\n\tTeleport,\n} from 'vue';\nimport { tipHandler } from './tip-handler';\nimport { resolvePosition } from './utils';\nimport { intl } from '../../inti';\n\nexport const TipContainer = defineComponent({\n\tname: 'TipContainer',\n\tsetup() {\n\t\tlet dispose: (() => void) | undefined;\n\n\t\tonMounted(() => {\n\t\t\tconst over = (e: MouseEvent) => tipHandler.setTarget(e.target as any);\n\t\t\tconst down = () => tipHandler.hideImmediately();\n\n\t\t\tdocument.addEventListener('mouseover', over, false);\n\t\t\tdocument.addEventListener('mousedown', down, true);\n\n\t\t\tdispose = () => {\n\t\t\t\tdocument.removeEventListener('mouseover', over, false);\n\t\t\t\tdocument.removeEventListener('mousedown', down, true);\n\t\t\t};\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tif (dispose) {\n\t\t\t\tdispose();\n\t\t\t}\n\t\t});\n\t\treturn () => (\n\t\t\t<Teleport to=\"body\">\n\t\t\t\t<div class=\"mtc-tips-container\">\n\t\t\t\t\t<TipItem></TipItem>\n\t\t\t\t</div>\n\t\t\t</Teleport>\n\t\t);\n\t},\n});\n\nexport const TipItem = defineComponent({\n\tname: 'TipItem',\n\tsetup() {\n\t\tconst dispose = tipHandler.onChange(() => {\n\t\t\tupdateTip();\n\t\t});\n\n\t\tconst shell = ref<HTMLDivElement>();\n\n\t\tconst updateTip = () => {\n\t\t\tif (!shell.value) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst arrow = shell.value.querySelector('.mtc-arrow') as HTMLElement;\n\n\t\t\tshell.value.className = getClass();\n\t\t\tshell.value.style.cssText = '';\n\t\t\tarrow.style.cssText = '';\n\t\t\tclearTimer();\n\n\t\t\tconst { tip } = tipHandler;\n\t\t\tif (!tip) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { target, direction, children } = tip;\n\t\t\ttext.value = children;\n\t\t\tconst targetRect = target.getBoundingClientRect();\n\n\t\t\tif (targetRect.width === 0 || targetRect.height === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst shellRect = shell.value.getBoundingClientRect();\n\t\t\tconst bounds = {\n\t\t\t\tleft: 1,\n\t\t\t\ttop: 1,\n\t\t\t\tright: document.documentElement.clientWidth - 1,\n\t\t\t\tbottom: document.documentElement.clientHeight - 1,\n\t\t\t};\n\t\t\tconst arrowRect = arrow.getBoundingClientRect();\n\t\t\tconst { dir, left, top, arrowLeft, arrowTop } = resolvePosition(\n\t\t\t\tshellRect,\n\t\t\t\ttargetRect,\n\t\t\t\tarrowRect,\n\t\t\t\tbounds,\n\t\t\t\tdirection\n\t\t\t);\n\n\t\t\tshell.value.classList.add(`mtc-align-${dir}`);\n\t\t\tshell.value.style.top = `${top}px`;\n\t\t\tshell.value.style.left = `${left}px`;\n\t\t\tshell.value.style.width = `${shellRect.width}px`;\n\t\t\tshell.value.style.height = `${shellRect.height}px`;\n\n\t\t\tif (dir === 'top' || dir === 'bottom') {\n\t\t\t\tarrow.style.left = `${arrowLeft}px`;\n\t\t\t} else {\n\t\t\t\tarrow.style.top = `${arrowTop}px`;\n\t\t\t}\n\n\t\t\ttimer = window.setTimeout(() => {\n\t\t\t\tif (shell.value) {\n\t\t\t\t\tshell.value.classList.add('mtc-visible-animate');\n\t\t\t\t\tshell.value.style.transform = 'none';\n\t\t\t\t}\n\t\t\t}, 10);\n\t\t};\n\n\t\tonMounted(() => {\n\t\t\tupdateTip();\n\t\t});\n\n\t\tonUpdated(() => {\n\t\t\tupdateTip();\n\t\t});\n\n\t\tonBeforeUnmount(() => {\n\t\t\tif (dispose) {\n\t\t\t\tdispose();\n\t\t\t}\n\t\t\tclearTimer();\n\t\t});\n\n\t\tlet timer: number | null = null;\n\n\t\tfunction clearTimer() {\n\t\t\tif (timer) {\n\t\t\t\tclearTimeout(timer);\n\t\t\t\ttimer = null;\n\t\t\t}\n\t\t}\n\n\t\tfunction getClass() {\n\t\t\tconst classes = ['mtc-tip'];\n\t\t\tif (tipHandler.tip?.className) {\n\t\t\t\tclasses.push(tipHandler.tip?.className);\n\t\t\t}\n\t\t\tif (tipHandler.tip && tipHandler.tip.theme) {\n\t\t\t\tclasses.push(`mtc-theme-${tipHandler.tip.theme}`);\n\t\t\t}\n\t\t\treturn classes.join(' ');\n\t\t}\n\n\t\tconst text = ref();\n\t\treturn () => (\n\t\t\t<div class={getClass()} ref={shell}>\n\t\t\t\t<i class=\"mtc-arrow\" />\n\t\t\t\t<div class=\"mtc-tip-content\">{intl(text.value)}</div>\n\t\t\t</div>\n\t\t);\n\t},\n});\n"],"names":["TipContainer","defineComponent","name","setup","dispose","onMounted","over","e","tipHandler","setTarget","target","down","hideImmediately","document","addEventListener","removeEventListener","onBeforeUnmount","_createVNode","Teleport","default","TipItem","onChange","updateTip","shell","ref","value","arrow","querySelector","className","getClass","style","cssText","clearTimer","tip","direction","children","text","targetRect","getBoundingClientRect","width","height","shellRect","bounds","left","top","right","documentElement","clientWidth","bottom","clientHeight","arrowRect","dir","arrowLeft","arrowTop","resolvePosition","classList","add","timer","window","setTimeout","transform","onUpdated","clearTimeout","classes","push","theme","join","intl"],"mappings":"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"} |
| import { IPublicTypeTipConfig } from '@arvin-shu/microcode-types'; | ||
| export interface TipOptions extends IPublicTypeTipConfig { | ||
| target: HTMLElement; | ||
| } | ||
| declare class TipHandler { | ||
| tip: TipOptions | null; | ||
| private showDelay; | ||
| private hideDelay; | ||
| private emitter; | ||
| setTarget(target: HTMLElement): void; | ||
| hideImmediately(): void; | ||
| onChange(func: () => void): () => void; | ||
| } | ||
| export declare const tipHandler: TipHandler; | ||
| export declare function postTip(id: string, props: IPublicTypeTipConfig | null): void; | ||
| export {}; |
| 'use strict'; | ||
| var eventBus = require('../../event-bus.js'); | ||
| "use strict"; | ||
| class TipHandler { | ||
| tip = null; | ||
| showDelay = null; | ||
| hideDelay = null; | ||
| emitter = eventBus.createModuleEventBus("TipHandler"); | ||
| setTarget(target) { | ||
| const tip = findTip(target); | ||
| if (tip) { | ||
| if (this.tip) { | ||
| if (this.tip.target === tip.target) { | ||
| this.tip = tip; | ||
| return; | ||
| } | ||
| if (this.showDelay) { | ||
| clearTimeout(this.showDelay); | ||
| this.showDelay = null; | ||
| this.tip = null; | ||
| } else { | ||
| if (this.hideDelay) { | ||
| clearTimeout(this.hideDelay); | ||
| this.hideDelay = null; | ||
| } | ||
| this.tip = tip; | ||
| this.emitter.emit("tipchange"); | ||
| return; | ||
| } | ||
| } | ||
| this.tip = tip; | ||
| if (this.hideDelay) { | ||
| clearTimeout(this.hideDelay); | ||
| this.hideDelay = null; | ||
| this.emitter.emit("tipchange"); | ||
| } else { | ||
| this.showDelay = setTimeout(() => { | ||
| this.showDelay = null; | ||
| this.emitter.emit("tipchange"); | ||
| }, 350); | ||
| } | ||
| } else { | ||
| if (this.showDelay) { | ||
| clearTimeout(this.showDelay); | ||
| this.showDelay = null; | ||
| } else { | ||
| this.hideDelay = setTimeout(() => { | ||
| this.hideDelay = null; | ||
| }, 100); | ||
| } | ||
| this.tip = null; | ||
| this.emitter.emit("tipchange"); | ||
| } | ||
| } | ||
| hideImmediately() { | ||
| if (this.hideDelay) { | ||
| clearTimeout(this.hideDelay); | ||
| this.hideDelay = null; | ||
| } | ||
| if (this.showDelay) { | ||
| clearTimeout(this.showDelay); | ||
| this.showDelay = null; | ||
| } | ||
| this.tip = null; | ||
| this.emitter.emit("tipchange"); | ||
| } | ||
| onChange(func) { | ||
| this.emitter.on("tipchange", func); | ||
| return () => { | ||
| this.emitter.removeListener("tipchange", func); | ||
| }; | ||
| } | ||
| } | ||
| const tipHandler = new TipHandler(); | ||
| function findTip(target) { | ||
| if (!target) { | ||
| return null; | ||
| } | ||
| let loopupLimit = 10; | ||
| while (target && loopupLimit-- > 0) { | ||
| if (target.dataset && target.dataset.tip) { | ||
| return { | ||
| children: target.dataset.tip, | ||
| direction: target.dataset.direction || target.dataset.dir, | ||
| theme: target.dataset.theme, | ||
| target | ||
| }; | ||
| } | ||
| let child = target.lastElementChild; | ||
| while (child) { | ||
| if (child.dataset && child.dataset.role === "tip") { | ||
| const { tipId } = child.dataset; | ||
| if (!tipId) { | ||
| return null; | ||
| } | ||
| const tipProps = tipsMap.get(tipId); | ||
| if (!tipProps) { | ||
| return null; | ||
| } | ||
| return { | ||
| ...tipProps, | ||
| target | ||
| }; | ||
| } | ||
| child = child.previousElementSibling; | ||
| } | ||
| target = target.parentNode; | ||
| } | ||
| return null; | ||
| } | ||
| const tipsMap = /* @__PURE__ */ new Map(); | ||
| function postTip(id, props) { | ||
| if (props) { | ||
| tipsMap.set(id, props); | ||
| } else { | ||
| tipsMap.delete(id); | ||
| } | ||
| } | ||
| exports.postTip = postTip; | ||
| exports.tipHandler = tipHandler; | ||
| //# sourceMappingURL=tip-handler.js.map |
| {"version":3,"file":"tip-handler.js","sources":["../../../../src/widgets/tip/tip-handler.ts"],"sourcesContent":["import { IPublicTypeTipConfig } from '@arvin-shu/microcode-types';\nimport { createModuleEventBus, IEventBus } from '../../event-bus';\n\nexport interface TipOptions extends IPublicTypeTipConfig {\n\ttarget: HTMLElement;\n}\n\nclass TipHandler {\n\ttip: TipOptions | null = null;\n\n\tprivate showDelay: number | null = null;\n\n\tprivate hideDelay: number | null = null;\n\n\tprivate emitter: IEventBus = createModuleEventBus('TipHandler');\n\n\tsetTarget(target: HTMLElement) {\n\t\tconst tip = findTip(target);\n\t\tif (tip) {\n\t\t\tif (this.tip) {\n\t\t\t\t// the some target should return\n\t\t\t\tif ((this.tip as any).target === (tip as any).target) {\n\t\t\t\t\tthis.tip = tip;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// not show already, reset show delay\n\t\t\t\tif (this.showDelay) {\n\t\t\t\t\tclearTimeout(this.showDelay);\n\t\t\t\t\tthis.showDelay = null;\n\t\t\t\t\tthis.tip = null;\n\t\t\t\t} else {\n\t\t\t\t\tif (this.hideDelay) {\n\t\t\t\t\t\tclearTimeout(this.hideDelay);\n\t\t\t\t\t\tthis.hideDelay = null;\n\t\t\t\t\t}\n\t\t\t\t\tthis.tip = tip;\n\t\t\t\t\tthis.emitter.emit('tipchange');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.tip = tip;\n\t\t\tif (this.hideDelay) {\n\t\t\t\tclearTimeout(this.hideDelay);\n\t\t\t\tthis.hideDelay = null;\n\t\t\t\tthis.emitter.emit('tipchange');\n\t\t\t} else {\n\t\t\t\tthis.showDelay = setTimeout(() => {\n\t\t\t\t\tthis.showDelay = null;\n\t\t\t\t\tthis.emitter.emit('tipchange');\n\t\t\t\t}, 350) as any;\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.showDelay) {\n\t\t\t\tclearTimeout(this.showDelay);\n\t\t\t\tthis.showDelay = null;\n\t\t\t} else {\n\t\t\t\tthis.hideDelay = setTimeout(() => {\n\t\t\t\t\tthis.hideDelay = null;\n\t\t\t\t}, 100) as any;\n\t\t\t}\n\t\t\tthis.tip = null;\n\n\t\t\tthis.emitter.emit('tipchange');\n\t\t}\n\t}\n\n\thideImmediately() {\n\t\tif (this.hideDelay) {\n\t\t\tclearTimeout(this.hideDelay);\n\t\t\tthis.hideDelay = null;\n\t\t}\n\t\tif (this.showDelay) {\n\t\t\tclearTimeout(this.showDelay);\n\t\t\tthis.showDelay = null;\n\t\t}\n\t\tthis.tip = null;\n\t\tthis.emitter.emit('tipchange');\n\t}\n\n\tonChange(func: () => void) {\n\t\tthis.emitter.on('tipchange', func);\n\t\treturn () => {\n\t\t\tthis.emitter.removeListener('tipchange', func);\n\t\t};\n\t}\n}\n\nexport const tipHandler = new TipHandler();\n\nfunction findTip(target: HTMLElement | null): TipOptions | null {\n\tif (!target) {\n\t\treturn null;\n\t}\n\t// optimize deep finding on mouseover\n\tlet loopupLimit = 10;\n\twhile (target && loopupLimit-- > 0) {\n\t\t// get tip from target node\n\t\tif (target.dataset && target.dataset.tip) {\n\t\t\treturn {\n\t\t\t\tchildren: target.dataset.tip as any,\n\t\t\t\tdirection: (target.dataset.direction || target.dataset.dir) as any,\n\t\t\t\ttheme: target.dataset.theme,\n\t\t\t\ttarget,\n\t\t\t};\n\t\t}\n\n\t\t// or get tip from child nodes\n\t\tlet child: HTMLElement | null = target.lastElementChild as HTMLElement;\n\n\t\twhile (child) {\n\t\t\tif (child.dataset && child.dataset.role === 'tip') {\n\t\t\t\tconst { tipId } = child.dataset;\n\t\t\t\tif (!tipId) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst tipProps = tipsMap.get(tipId);\n\n\t\t\t\tif (!tipProps) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...tipProps,\n\t\t\t\t\ttarget,\n\t\t\t\t};\n\t\t\t}\n\t\t\tchild = child.previousElementSibling as HTMLElement;\n\t\t}\n\n\t\ttarget = target.parentNode as HTMLElement;\n\t}\n\n\treturn null;\n}\n\nconst tipsMap = new Map<string, IPublicTypeTipConfig>();\nexport function postTip(id: string, props: IPublicTypeTipConfig | null) {\n\tif (props) {\n\t\ttipsMap.set(id, props);\n\t} else {\n\t\ttipsMap.delete(id);\n\t}\n}\n"],"names":["createModuleEventBus"],"mappings":"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"} |
| import { IPublicTypeI18nData } from '@arvin-shu/microcode-types'; | ||
| import { VNode } from 'vue'; | ||
| export declare const Tip: import("vue").DefineComponent<{ | ||
| className?: string | undefined; | ||
| children?: (IPublicTypeI18nData | VNode | string) | undefined; | ||
| theme?: string | undefined; | ||
| direction?: ("top" | "bottom" | "left" | "right") | undefined; | ||
| }, () => VNode, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{ | ||
| className?: string | undefined; | ||
| children?: (IPublicTypeI18nData | VNode | string) | undefined; | ||
| theme?: string | undefined; | ||
| direction?: ("top" | "bottom" | "left" | "right") | undefined; | ||
| }> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; |
| 'use strict'; | ||
| var vue = require('vue'); | ||
| var microcodeUtils = require('@arvin-shu/microcode-utils'); | ||
| var tipHandler = require('./tip-handler.js'); | ||
| "use strict"; | ||
| const Tip = /* @__PURE__ */ vue.defineComponent({ | ||
| name: "Tip", | ||
| props: { | ||
| className: String, | ||
| children: [Object, String], | ||
| theme: String, | ||
| direction: String | ||
| }, | ||
| setup(props, { | ||
| slots | ||
| }) { | ||
| const id = microcodeUtils.uniqueId("tips$"); | ||
| vue.onUnmounted(() => { | ||
| tipHandler.postTip(id, null); | ||
| }); | ||
| return () => { | ||
| tipHandler.postTip(id, { | ||
| ...props, | ||
| children: props.children ? props.children : slots.default?.() | ||
| }); | ||
| return vue.createVNode("meta", { | ||
| "data-role": "tip", | ||
| "data-tip-id": id | ||
| }, null); | ||
| }; | ||
| } | ||
| }); | ||
| exports.Tip = Tip; | ||
| //# sourceMappingURL=tip.js.map |
| {"version":3,"file":"tip.js","sources":["../../../../src/widgets/tip/tip.tsx"],"sourcesContent":["import {\n\tIPublicTypeI18nData,\n\tIPublicTypeTipConfig,\n} from '@arvin-shu/microcode-types';\nimport { uniqueId } from '@arvin-shu/microcode-utils';\nimport { defineComponent, onUnmounted, PropType, VNode } from 'vue';\nimport { postTip } from './tip-handler';\n\nexport const Tip = defineComponent({\n\tname: 'Tip',\n\tprops: {\n\t\tclassName: String,\n\t\tchildren: [Object, String] as PropType<\n\t\t\tIPublicTypeI18nData | VNode | string\n\t\t>,\n\t\ttheme: String,\n\t\tdirection: String as PropType<'top' | 'bottom' | 'left' | 'right'>,\n\t},\n\tsetup(props: IPublicTypeTipConfig, { slots }) {\n\t\tconst id = uniqueId('tips$');\n\t\tonUnmounted(() => {\n\t\t\tpostTip(id, null);\n\t\t});\n\n\t\treturn () => {\n\t\t\tpostTip(id, {\n\t\t\t\t...props,\n\t\t\t\tchildren: props.children ? props.children : (slots.default?.() as any),\n\t\t\t});\n\t\t\treturn <meta data-role=\"tip\" data-tip-id={id}></meta>;\n\t\t};\n\t},\n});\n"],"names":["Tip","defineComponent","name","props","className","String","children","Object","theme","direction","setup","slots","id","uniqueId","onUnmounted","postTip","default","_createVNode"],"mappings":";;;;;;;AAQO,MAAMA,sBAAsBC,mBAAA,CAAA;AAAA,EAClCC,IAAM,EAAA,KAAA;AAAA,EACNC,KAAO,EAAA;AAAA,IACNC,SAAWC,EAAAA,MAAAA;AAAAA,IACXC,QAAAA,EAAU,CAACC,MAAAA,EAAQF,MAAM,CAAA;AAAA,IAGzBG,KAAOH,EAAAA,MAAAA;AAAAA,IACPI,SAAWJ,EAAAA;AAAAA,GACZ;AAAA,EACAK,MAAMP,KAA6B,EAAA;AAAA,IAAEQ;AAAAA,GAAS,EAAA;AAC7C,IAAMC,MAAAA,EAAAA,GAAKC,wBAAS,OAAO,CAAA;AAC3BC,IAAAA,eAAAA,CAAY,MAAM;AACjBC,MAAAA,kBAAAA,CAAQH,IAAI,IAAI,CAAA;AAAA,KAChB,CAAA;AAED,IAAA,OAAO,MAAM;AACZG,MAAAA,kBAAAA,CAAQH,EAAI,EAAA;AAAA,QACX,GAAGT,KAAAA;AAAAA,QACHG,UAAUH,KAAMG,CAAAA,QAAAA,GAAWH,KAAMG,CAAAA,QAAAA,GAAYK,MAAMK,OAAU;AAAA,OAC7D,CAAA;AACD,MAAA,OAAAC,gBAAA,MAAA,EAAA;AAAA,QAAA,WAAA,EAAA,KAAA;AAAA,QAAA,aAA0CL,EAAAA;AAAAA,SAAE,IAAA,CAAA;AAAA,KAC7C;AAAA;AAEF,CAAC;;;;"} |
| export declare function resolvePosition(popup: any, target: any, arrow: any, bounds: any, prefer: any): { | ||
| dir: any; | ||
| left: any; | ||
| top: any; | ||
| arrowLeft: number | undefined; | ||
| arrowTop: number | undefined; | ||
| }; | ||
| export declare function resolveRelativePosition(align: any, popup: any, bounds: any): { | ||
| top: string; | ||
| left: string; | ||
| }; |
| 'use strict'; | ||
| var lodashEs = require('lodash-es'); | ||
| "use strict"; | ||
| function resolveEdge(popup, target, arrow, bounds) { | ||
| const sx = arrow.width > target.width ? (arrow.width - target.width) / 2 : 0; | ||
| const sy = arrow.width > target.height ? (arrow.width - target.height) / 2 : 0; | ||
| const top = Math.max( | ||
| target.top - popup.height + arrow.width - sy, | ||
| bounds.top | ||
| ); | ||
| const right = Math.min( | ||
| target.right + popup.width - arrow.width + sx, | ||
| bounds.right | ||
| ); | ||
| const bottom = Math.min( | ||
| target.bottom + popup.height - arrow.width + sy, | ||
| bounds.bottom | ||
| ); | ||
| const left = Math.max( | ||
| target.left - popup.width + arrow.width - sx, | ||
| bounds.left | ||
| ); | ||
| return { top, right, bottom, left }; | ||
| } | ||
| function resolveDirection(popup, target, edge, bounds, prefers) { | ||
| if (prefers.forceDirection) { | ||
| return prefers.dir; | ||
| } | ||
| const extendWidth = popup.width + popup.extraOffset; | ||
| const extendHeight = popup.height + popup.extraOffset; | ||
| const SY = popup.width * extendHeight; | ||
| const SX = popup.height * extendWidth; | ||
| const mw = Math.min(edge.right - edge.left, popup.width); | ||
| const mh = Math.min(edge.bottom - edge.top, popup.height); | ||
| const mat = { | ||
| top: () => { | ||
| const s = mw * Math.min(target.top - bounds.top, extendHeight); | ||
| return { s, enough: s >= SY }; | ||
| }, | ||
| bottom: () => { | ||
| const s = mw * Math.min(bounds.bottom - target.bottom, extendHeight); | ||
| return { s, enough: s >= SY }; | ||
| }, | ||
| left: () => { | ||
| const s = mh * Math.min(target.left - bounds.left, extendWidth); | ||
| return { s, enough: s >= SX }; | ||
| }, | ||
| right: () => { | ||
| const s = mh * Math.min(bounds.right - target.right, extendWidth); | ||
| return { s, enough: s >= SX }; | ||
| } | ||
| }; | ||
| const orders = ["top", "right", "bottom", "left"]; | ||
| if (prefers.dir) { | ||
| const i = orders.indexOf(prefers.dir); | ||
| if (i > -1) { | ||
| orders.splice(i, 1); | ||
| orders.unshift(prefers.dir); | ||
| } | ||
| } | ||
| let ms = 0; | ||
| let prefer = orders[0]; | ||
| for (let i = 0, l = orders.length; i < l; i++) { | ||
| const dir = orders[i]; | ||
| const { s, enough } = mat[dir](); | ||
| if (enough) { | ||
| return dir; | ||
| } | ||
| if (s > ms) { | ||
| ms = s; | ||
| prefer = dir; | ||
| } | ||
| } | ||
| return prefer; | ||
| } | ||
| function resolvePrefer(prefer, targetRect, bounds) { | ||
| if (!prefer) { | ||
| if (targetRect.left - bounds.left < 10) { | ||
| return { dir: "right" }; | ||
| } | ||
| if (targetRect.top - bounds.top < 10) { | ||
| return { dir: "bottom" }; | ||
| } | ||
| if (bounds.bottom - targetRect.bottom < 10) { | ||
| return { dir: "top" }; | ||
| } | ||
| if (bounds.right - targetRect.right < 10) { | ||
| return { dir: "left" }; | ||
| } | ||
| return {}; | ||
| } | ||
| const force = prefer[0] === "!"; | ||
| if (force) { | ||
| prefer = prefer.slice(1); | ||
| } | ||
| let [dir, offset] = prefer.split(/\s+/); | ||
| let forceDirection = false; | ||
| let forceOffset = false; | ||
| if (dir === "center") { | ||
| dir = "auto"; | ||
| if (!offset) { | ||
| offset = "center"; | ||
| } | ||
| } | ||
| if (force) { | ||
| if (dir && dir !== "auto") { | ||
| forceDirection = true; | ||
| } | ||
| if (offset && offset !== "auto") { | ||
| forceOffset = true; | ||
| } | ||
| } | ||
| return { dir, offset, forceDirection, forceOffset }; | ||
| } | ||
| function resolvePosition(popup, target, arrow, bounds, prefer) { | ||
| popup = { | ||
| extraOffset: arrow.height, | ||
| top: popup.top, | ||
| right: popup.right, | ||
| left: popup.left, | ||
| bottom: popup.bottom, | ||
| height: popup.height, | ||
| width: popup.width | ||
| }; | ||
| const prefers = resolvePrefer(prefer, target, bounds); | ||
| const edge = resolveEdge(popup, target, arrow, bounds); | ||
| const dir = resolveDirection(popup, target, edge, bounds, prefers); | ||
| let top; | ||
| let left; | ||
| let arrowTop; | ||
| let arrowLeft; | ||
| if (dir === "top" || dir === "bottom") { | ||
| if (dir === "top") { | ||
| top = target.top - popup.extraOffset - popup.height; | ||
| } else { | ||
| top = target.bottom + popup.extraOffset; | ||
| } | ||
| const offset = arrow.width > target.width ? (arrow.width - target.width) / 2 : 0; | ||
| const minLeft = target.left + arrow.width - offset - popup.width; | ||
| const maxLeft = target.right - arrow.width + offset; | ||
| const centerLeft = target.left - (popup.width - target.width) / 2; | ||
| if (prefers.offset === "left") { | ||
| left = minLeft; | ||
| } else if (prefers.offset === "right") { | ||
| left = maxLeft; | ||
| } else { | ||
| left = centerLeft; | ||
| } | ||
| if (!prefers.forceOffset) { | ||
| left = Math.max(Math.min(edge.right - popup.width, left), minLeft); | ||
| left = Math.min(Math.max(edge.left, left), maxLeft); | ||
| } | ||
| arrowLeft = Math.min( | ||
| popup.width - arrow.width, | ||
| Math.max(target.left - (arrow.width - target.width) / 2 - left, 0) | ||
| ); | ||
| } else { | ||
| if (dir === "left") { | ||
| left = target.left - popup.extraOffset - popup.width; | ||
| } else { | ||
| left = target.right + popup.extraOffset; | ||
| } | ||
| const offset = arrow.width > target.height ? (arrow.width - target.height) / 2 : 0; | ||
| const minTop = target.top + arrow.width - offset - popup.height; | ||
| const maxTop = target.bottom - arrow.width + offset; | ||
| const centerTop = target.top - (popup.height - target.height) / 2; | ||
| if (prefers.offset === "top") { | ||
| top = minTop; | ||
| } else if (prefers.offset === "bottom") { | ||
| top = maxTop; | ||
| } else { | ||
| top = centerTop; | ||
| } | ||
| if (!prefers.forceOffset) { | ||
| top = Math.max(Math.min(edge.bottom - popup.height, top), minTop); | ||
| top = Math.min(Math.max(edge.top, top), maxTop); | ||
| } | ||
| arrowTop = Math.min( | ||
| popup.height - arrow.height, | ||
| Math.max(target.top - (arrow.width - target.height) / 2 - top, 0) | ||
| ); | ||
| } | ||
| return { dir, left, top, arrowLeft, arrowTop }; | ||
| } | ||
| const percentPresets = { | ||
| right: 1, | ||
| left: 0, | ||
| top: 0, | ||
| bottom: 1, | ||
| center: 0.5 | ||
| }; | ||
| function isPercent(val) { | ||
| return /^[\d.]+%$/.test(val); | ||
| } | ||
| function resolveRelativeValue(val, offset, total) { | ||
| if (!val) { | ||
| val = 0; | ||
| } else if (isPercent(val)) { | ||
| val = parseFloat(val) / 100 * total; | ||
| } else if (percentPresets.hasOwnProperty(val)) { | ||
| val = percentPresets[val] * total; | ||
| } else { | ||
| val = parseFloat(val); | ||
| if (lodashEs.isNaN(val)) { | ||
| val = 0; | ||
| } | ||
| } | ||
| return `${val + offset}px`; | ||
| } | ||
| function resolveRelativePosition(align, popup, bounds) { | ||
| if (!align) { | ||
| return { | ||
| top: "38.2%", | ||
| left: "calc(50% - 110px)" | ||
| }; | ||
| } | ||
| let [xAlign, yAlign] = align.trim().split(/\s+/); | ||
| if (xAlign === "top" || xAlign === "bottom" || yAlign === "left" || yAlign === "right") { | ||
| const tmp = xAlign; | ||
| xAlign = yAlign; | ||
| yAlign = tmp; | ||
| } | ||
| if (xAlign === "center" && !yAlign) { | ||
| yAlign = "center"; | ||
| } | ||
| return { | ||
| left: resolveRelativeValue( | ||
| xAlign, | ||
| 0, | ||
| bounds.right - bounds.left - popup.width | ||
| ), | ||
| top: resolveRelativeValue( | ||
| yAlign, | ||
| 0, | ||
| bounds.bottom - bounds.top - popup.height | ||
| ) | ||
| }; | ||
| } | ||
| exports.resolvePosition = resolvePosition; | ||
| exports.resolveRelativePosition = resolveRelativePosition; | ||
| //# sourceMappingURL=utils.js.map |
| {"version":3,"file":"utils.js","sources":["../../../../src/widgets/tip/utils.ts"],"sourcesContent":["import { isNaN } from 'lodash-es';\n\nfunction resolveEdge(popup: any, target: any, arrow: any, bounds: any) {\n\tconst sx = arrow.width > target.width ? (arrow.width - target.width) / 2 : 0;\n\tconst sy =\n\t\tarrow.width > target.height ? (arrow.width - target.height) / 2 : 0;\n\n\tconst top = Math.max(\n\t\ttarget.top - popup.height + arrow.width - sy,\n\t\tbounds.top\n\t);\n\tconst right = Math.min(\n\t\ttarget.right + popup.width - arrow.width + sx,\n\t\tbounds.right\n\t);\n\tconst bottom = Math.min(\n\t\ttarget.bottom + popup.height - arrow.width + sy,\n\t\tbounds.bottom\n\t);\n\tconst left = Math.max(\n\t\ttarget.left - popup.width + arrow.width - sx,\n\t\tbounds.left\n\t);\n\n\treturn { top, right, bottom, left };\n}\n\nfunction resolveDirection(\n\tpopup: any,\n\ttarget: any,\n\tedge: any,\n\tbounds: any,\n\tprefers: any\n) {\n\tif (prefers.forceDirection) {\n\t\treturn prefers.dir;\n\t}\n\tconst extendWidth = popup.width + popup.extraOffset;\n\tconst extendHeight = popup.height + popup.extraOffset;\n\tconst SY = popup.width * extendHeight;\n\tconst SX = popup.height * extendWidth;\n\tconst mw = Math.min(edge.right - edge.left, popup.width);\n\tconst mh = Math.min(edge.bottom - edge.top, popup.height);\n\n\tconst mat: any = {\n\t\ttop: () => {\n\t\t\tconst s = mw * Math.min(target.top - bounds.top, extendHeight);\n\t\t\treturn { s, enough: s >= SY };\n\t\t},\n\t\tbottom: () => {\n\t\t\tconst s = mw * Math.min(bounds.bottom - target.bottom, extendHeight);\n\t\t\treturn { s, enough: s >= SY };\n\t\t},\n\t\tleft: () => {\n\t\t\tconst s = mh * Math.min(target.left - bounds.left, extendWidth);\n\t\t\treturn { s, enough: s >= SX };\n\t\t},\n\t\tright: () => {\n\t\t\tconst s = mh * Math.min(bounds.right - target.right, extendWidth);\n\t\t\treturn { s, enough: s >= SX };\n\t\t},\n\t};\n\n\tconst orders = ['top', 'right', 'bottom', 'left'];\n\tif (prefers.dir) {\n\t\tconst i = orders.indexOf(prefers.dir);\n\t\tif (i > -1) {\n\t\t\torders.splice(i, 1);\n\t\t\torders.unshift(prefers.dir);\n\t\t}\n\t}\n\tlet ms = 0;\n\tlet prefer = orders[0];\n\tfor (let i = 0, l = orders.length; i < l; i++) {\n\t\tconst dir = orders[i];\n\t\tconst { s, enough } = mat[dir]();\n\t\tif (enough) {\n\t\t\treturn dir;\n\t\t}\n\t\tif (s > ms) {\n\t\t\tms = s;\n\t\t\tprefer = dir;\n\t\t}\n\t}\n\treturn prefer;\n}\n\nfunction resolvePrefer(prefer: any, targetRect: any, bounds: any) {\n\tif (!prefer) {\n\t\tif (targetRect.left - bounds.left < 10) {\n\t\t\treturn { dir: 'right' };\n\t\t}\n\t\tif (targetRect.top - bounds.top < 10) {\n\t\t\treturn { dir: 'bottom' };\n\t\t}\n\t\tif (bounds.bottom - targetRect.bottom < 10) {\n\t\t\treturn { dir: 'top' };\n\t\t}\n\t\tif (bounds.right - targetRect.right < 10) {\n\t\t\treturn { dir: 'left' };\n\t\t}\n\t\treturn {};\n\t}\n\tconst force = prefer[0] === '!';\n\tif (force) {\n\t\tprefer = prefer.slice(1);\n\t}\n\tlet [dir, offset] = prefer.split(/\\s+/);\n\tlet forceDirection = false;\n\tlet forceOffset = false;\n\tif (dir === 'center') {\n\t\tdir = 'auto';\n\t\tif (!offset) {\n\t\t\toffset = 'center';\n\t\t}\n\t}\n\n\tif (force) {\n\t\tif (dir && dir !== 'auto') {\n\t\t\tforceDirection = true;\n\t\t}\n\t\tif (offset && offset !== 'auto') {\n\t\t\tforceOffset = true;\n\t\t}\n\t}\n\n\treturn { dir, offset, forceDirection, forceOffset };\n}\n\nexport function resolvePosition(\n\tpopup: any,\n\ttarget: any,\n\tarrow: any,\n\tbounds: any,\n\tprefer: any\n) {\n\tpopup = {\n\t\textraOffset: arrow.height,\n\t\ttop: popup.top,\n\t\tright: popup.right,\n\t\tleft: popup.left,\n\t\tbottom: popup.bottom,\n\t\theight: popup.height,\n\t\twidth: popup.width,\n\t};\n\n\tconst prefers = resolvePrefer(prefer, target, bounds);\n\n\tconst edge = resolveEdge(popup, target, arrow, bounds);\n\n\t// 选择方向\n\tconst dir = resolveDirection(popup, target, edge, bounds, prefers);\n\n\tlet top;\n\tlet left;\n\tlet arrowTop;\n\tlet arrowLeft;\n\n\t// 或得该方位上横向 或 纵向的 偏移\n\tif (dir === 'top' || dir === 'bottom') {\n\t\tif (dir === 'top') {\n\t\t\ttop = target.top - popup.extraOffset - popup.height;\n\t\t} else {\n\t\t\ttop = target.bottom + popup.extraOffset;\n\t\t}\n\n\t\t// 解决横向偏移\n\t\tconst offset =\n\t\t\tarrow.width > target.width ? (arrow.width - target.width) / 2 : 0;\n\t\tconst minLeft = target.left + arrow.width - offset - popup.width;\n\t\tconst maxLeft = target.right - arrow.width + offset;\n\t\tconst centerLeft = target.left - (popup.width - target.width) / 2;\n\n\t\tif (prefers.offset === 'left') {\n\t\t\tleft = minLeft;\n\t\t} else if (prefers.offset === 'right') {\n\t\t\tleft = maxLeft;\n\t\t} else {\n\t\t\tleft = centerLeft;\n\t\t}\n\n\t\tif (!prefers.forceOffset) {\n\t\t\tleft = Math.max(Math.min(edge.right - popup.width, left), minLeft);\n\t\t\tleft = Math.min(Math.max(edge.left, left), maxLeft);\n\t\t}\n\n\t\tarrowLeft = Math.min(\n\t\t\tpopup.width - arrow.width,\n\t\t\tMath.max(target.left - (arrow.width - target.width) / 2 - left, 0)\n\t\t);\n\t} else {\n\t\tif (dir === 'left') {\n\t\t\tleft = target.left - popup.extraOffset - popup.width;\n\t\t} else {\n\t\t\tleft = target.right + popup.extraOffset;\n\t\t}\n\n\t\t// 解决纵向偏移\n\t\tconst offset =\n\t\t\tarrow.width > target.height ? (arrow.width - target.height) / 2 : 0;\n\t\tconst minTop = target.top + arrow.width - offset - popup.height;\n\t\tconst maxTop = target.bottom - arrow.width + offset;\n\t\tconst centerTop = target.top - (popup.height - target.height) / 2;\n\n\t\tif (prefers.offset === 'top') {\n\t\t\ttop = minTop;\n\t\t} else if (prefers.offset === 'bottom') {\n\t\t\ttop = maxTop;\n\t\t} else {\n\t\t\ttop = centerTop;\n\t\t}\n\n\t\tif (!prefers.forceOffset) {\n\t\t\ttop = Math.max(Math.min(edge.bottom - popup.height, top), minTop);\n\t\t\ttop = Math.min(Math.max(edge.top, top), maxTop);\n\t\t}\n\n\t\tarrowTop = Math.min(\n\t\t\tpopup.height - arrow.height,\n\t\t\tMath.max(target.top - (arrow.width - target.height) / 2 - top, 0)\n\t\t);\n\t}\n\n\treturn { dir, left, top, arrowLeft, arrowTop };\n}\n\nconst percentPresets: any = {\n\tright: 1,\n\tleft: 0,\n\ttop: 0,\n\tbottom: 1,\n\tcenter: 0.5,\n};\n\nfunction isPercent(val: any) {\n\treturn /^[\\d.]+%$/.test(val);\n}\n\nfunction resolveRelativeValue(val: any, offset: any, total: any) {\n\tif (!val) {\n\t\tval = 0;\n\t} else if (isPercent(val)) {\n\t\tval = (parseFloat(val) / 100) * total;\n\t} else if (percentPresets.hasOwnProperty(val)) {\n\t\tval = percentPresets[val] * total;\n\t} else {\n\t\tval = parseFloat(val);\n\t\tif (isNaN(val)) {\n\t\t\tval = 0;\n\t\t}\n\t}\n\n\treturn `${val + offset}px`;\n}\n\nexport function resolveRelativePosition(align: any, popup: any, bounds: any) {\n\tif (!align) {\n\t\t// return default position\n\t\treturn {\n\t\t\ttop: '38.2%',\n\t\t\tleft: 'calc(50% - 110px)',\n\t\t};\n\t}\n\n\tlet [xAlign, yAlign] = align.trim().split(/\\s+/);\n\n\tif (\n\t\txAlign === 'top' ||\n\t\txAlign === 'bottom' ||\n\t\tyAlign === 'left' ||\n\t\tyAlign === 'right'\n\t) {\n\t\tconst tmp = xAlign;\n\t\txAlign = yAlign;\n\t\tyAlign = tmp;\n\t}\n\n\tif (xAlign === 'center' && !yAlign) {\n\t\tyAlign = 'center';\n\t}\n\n\treturn {\n\t\tleft: resolveRelativeValue(\n\t\t\txAlign,\n\t\t\t0,\n\t\t\tbounds.right - bounds.left - popup.width\n\t\t),\n\t\ttop: resolveRelativeValue(\n\t\t\tyAlign,\n\t\t\t0,\n\t\t\tbounds.bottom - bounds.top - popup.height\n\t\t),\n\t};\n}\n"],"names":["isNaN"],"mappings":"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"} |
| export declare const Title: import("vue").DefineComponent<import("vue").ExtractPropTypes<{ | ||
| title: (ObjectConstructor | StringConstructor | FunctionConstructor)[]; | ||
| className: StringConstructor; | ||
| match: BooleanConstructor; | ||
| keywords: StringConstructor; | ||
| onClick: FunctionConstructor; | ||
| }>, () => any, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{ | ||
| title: (ObjectConstructor | StringConstructor | FunctionConstructor)[]; | ||
| className: StringConstructor; | ||
| match: BooleanConstructor; | ||
| keywords: StringConstructor; | ||
| onClick: FunctionConstructor; | ||
| }>> & Readonly<{}>, { | ||
| match: boolean; | ||
| }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>; |
| 'use strict'; | ||
| var vue = require('vue'); | ||
| var microcodeUtils = require('@arvin-shu/microcode-utils'); | ||
| var index = require('../../inti/index.js'); | ||
| require('../tip/index.js'); | ||
| var tip = require('../tip/tip.js'); | ||
| "use strict"; | ||
| function splitLabelByKeywords(label, keywords) { | ||
| const len = keywords.length; | ||
| const fragments = []; | ||
| let str = label; | ||
| while (str.length > 0) { | ||
| const index = str.indexOf(keywords); | ||
| if (index === 0) { | ||
| fragments.push(keywords); | ||
| str = str.slice(len); | ||
| } else if (index < 0) { | ||
| fragments.push(str); | ||
| str = ""; | ||
| } else { | ||
| fragments.push(str.slice(0, index)); | ||
| str = str.slice(index); | ||
| } | ||
| } | ||
| return fragments; | ||
| } | ||
| const Title = /* @__PURE__ */ vue.defineComponent({ | ||
| name: "CustomTitle", | ||
| props: { | ||
| title: [String, Object, Function], | ||
| className: String, | ||
| match: Boolean, | ||
| keywords: String, | ||
| onClick: Function | ||
| }, | ||
| setup(props) { | ||
| const handleClick = (e) => { | ||
| const { | ||
| onClick, | ||
| title | ||
| } = props; | ||
| const url = title?.docUrl || title?.url; | ||
| if (url) { | ||
| window.open(url); | ||
| e.stopPropagation(); | ||
| } | ||
| onClick && onClick(e); | ||
| }; | ||
| const renderLabel = (label) => { | ||
| const { | ||
| match, | ||
| keywords | ||
| } = props; | ||
| if (!label) { | ||
| return null; | ||
| } | ||
| const intlLabel = index.intl(label); | ||
| if (typeof intlLabel !== "string") { | ||
| return vue.createVNode("span", { | ||
| "class": "mtc-title-txt" | ||
| }, [intlLabel]); | ||
| } | ||
| let labelToRender = intlLabel; | ||
| if (match && keywords) { | ||
| const fragments = splitLabelByKeywords(intlLabel, keywords); | ||
| labelToRender = fragments.map((f) => vue.createVNode("span", { | ||
| "style": { | ||
| color: f === keywords ? "red" : "inherit" | ||
| } | ||
| }, [f])); | ||
| } | ||
| return vue.createVNode("span", { | ||
| "class": "mtc-title-txt" | ||
| }, [labelToRender]); | ||
| }; | ||
| return () => { | ||
| const { | ||
| className, | ||
| title | ||
| } = props; | ||
| let _title; | ||
| if (title == null) { | ||
| return null; | ||
| } | ||
| if (vue.isVNode(title)) { | ||
| return title; | ||
| } | ||
| if (typeof title === "string" || microcodeUtils.isI18nData(title)) { | ||
| _title = { | ||
| label: title | ||
| }; | ||
| } else if (microcodeUtils.isTitleConfig(title)) { | ||
| _title = title; | ||
| } else { | ||
| _title = { | ||
| label: title | ||
| }; | ||
| } | ||
| const icon = _title.icon ? microcodeUtils.createIcon(_title.icon, { | ||
| style: { | ||
| fontSize: "20px" | ||
| } | ||
| }) : null; | ||
| let tip$1 = null; | ||
| if (_title.tip) { | ||
| if (vue.isVNode(_title.tip) && _title.tip.type === tip.Tip) { | ||
| tip$1 = _title.tip; | ||
| } else { | ||
| const tipProps = typeof _title.tip === "object" && !(vue.isVNode(_title.tip) || microcodeUtils.isI18nData(_title.tip)) ? _title.tip : { | ||
| children: _title.tip | ||
| }; | ||
| tip$1 = vue.h(tip.Tip, { | ||
| ...tipProps | ||
| }); | ||
| } | ||
| } | ||
| return vue.createVNode("span", { | ||
| "class": { | ||
| "mtc-title": true, | ||
| [className || ""]: !!className, | ||
| "has-tip": !!tip$1, | ||
| "only-icon": !_title.label | ||
| }, | ||
| "onClick": handleClick | ||
| }, [icon ? vue.createVNode("b", { | ||
| "class": "mtc-title-icon" | ||
| }, [icon]) : null, renderLabel(_title.label), tip$1]); | ||
| }; | ||
| } | ||
| }); | ||
| exports.Title = Title; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sources":["../../../../src/widgets/title/index.tsx"],"sourcesContent":["import {\n\tIPublicTypeI18nData,\n\tIPublicTypeTitleConfig,\n} from '@arvin-shu/microcode-types';\nimport {\n\tcreateIcon,\n\tisI18nData,\n\tisTitleConfig,\n} from '@arvin-shu/microcode-utils';\nimport { defineComponent, h, isVNode, VNode } from 'vue';\nimport { intl } from '../../inti';\nimport { Tip } from '../tip';\n\n/**\n * 根据 keywords 将 label 分割成文字片段\n * 示例:title = '自定义页面布局',keywords = '页面',返回结果为 ['自定义', '页面', '布局']\n * @param label title\n * @param keywords 关键字\n * @returns 文字片段列表\n */\nfunction splitLabelByKeywords(label: string, keywords: string): string[] {\n\tconst len = keywords.length;\n\tconst fragments = [];\n\tlet str = label;\n\n\twhile (str.length > 0) {\n\t\tconst index = str.indexOf(keywords);\n\n\t\tif (index === 0) {\n\t\t\tfragments.push(keywords);\n\t\t\tstr = str.slice(len);\n\t\t} else if (index < 0) {\n\t\t\tfragments.push(str);\n\t\t\tstr = '';\n\t\t} else {\n\t\t\tfragments.push(str.slice(0, index));\n\t\t\tstr = str.slice(index);\n\t\t}\n\t}\n\treturn fragments;\n}\n\nexport const Title = defineComponent({\n\tname: 'CustomTitle',\n\tprops: {\n\t\ttitle: [String, Object, Function],\n\t\tclassName: String,\n\t\tmatch: Boolean,\n\t\tkeywords: String,\n\t\tonClick: Function,\n\t},\n\tsetup(props) {\n\t\tconst handleClick = (e: MouseEvent) => {\n\t\t\tconst { onClick, title } = props;\n\t\t\tconst url = (title as any)?.docUrl || (title as any)?.url;\n\t\t\tif (url) {\n\t\t\t\twindow.open(url);\n\t\t\t\te.stopPropagation(); // 防止触发行操作(如折叠面板)\n\t\t\t}\n\t\t\tonClick && onClick(e);\n\t\t};\n\n\t\tconst renderLabel = (label: string | IPublicTypeI18nData | VNode) => {\n\t\t\tconst { match, keywords } = props;\n\n\t\t\tif (!label) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst intlLabel = intl(label as any);\n\n\t\t\tif (typeof intlLabel !== 'string') {\n\t\t\t\treturn <span class=\"mtc-title-txt\">{intlLabel}</span>;\n\t\t\t}\n\n\t\t\tlet labelToRender = intlLabel;\n\n\t\t\tif (match && keywords) {\n\t\t\t\tconst fragments = splitLabelByKeywords(intlLabel as string, keywords);\n\n\t\t\t\tlabelToRender = fragments.map((f) => (\n\t\t\t\t\t<span style={{ color: f === keywords ? 'red' : 'inherit' }}>{f}</span>\n\t\t\t\t)) as any;\n\t\t\t}\n\n\t\t\treturn <span class=\"mtc-title-txt\">{labelToRender}</span>;\n\t\t};\n\n\t\treturn () => {\n\t\t\tconst { className, title } = props;\n\t\t\tlet _title: IPublicTypeTitleConfig;\n\t\t\tif (title == null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (isVNode(title)) {\n\t\t\t\treturn title;\n\t\t\t}\n\t\t\tif (typeof title === 'string' || isI18nData(title)) {\n\t\t\t\t_title = { label: title } as IPublicTypeTitleConfig;\n\t\t\t} else if (isTitleConfig(title)) {\n\t\t\t\t_title = title;\n\t\t\t} else {\n\t\t\t\t_title = {\n\t\t\t\t\tlabel: title,\n\t\t\t\t} as IPublicTypeTitleConfig;\n\t\t\t}\n\n\t\t\tconst icon = _title.icon\n\t\t\t\t? createIcon(_title.icon, {\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tfontSize: '20px',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t: null;\n\n\t\t\tlet tip: any = null;\n\t\t\tif (_title.tip) {\n\t\t\t\tif (isVNode(_title.tip) && _title.tip.type === Tip) {\n\t\t\t\t\ttip = _title.tip;\n\t\t\t\t} else {\n\t\t\t\t\tconst tipProps =\n\t\t\t\t\t\ttypeof _title.tip === 'object' &&\n\t\t\t\t\t\t!(isVNode(_title.tip) || isI18nData(_title.tip))\n\t\t\t\t\t\t\t? _title.tip\n\t\t\t\t\t\t\t: { children: _title.tip };\n\t\t\t\t\ttip = h(Tip, {\n\t\t\t\t\t\t...tipProps,\n\t\t\t\t\t} as any);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<span\n\t\t\t\t\tclass={{\n\t\t\t\t\t\t'mtc-title': true,\n\t\t\t\t\t\t[className || '']: !!className,\n\t\t\t\t\t\t'has-tip': !!tip,\n\t\t\t\t\t\t'only-icon': !_title.label,\n\t\t\t\t\t}}\n\t\t\t\t\tonClick={handleClick}\n\t\t\t\t>\n\t\t\t\t\t{icon ? <b class=\"mtc-title-icon\">{icon}</b> : null}\n\t\t\t\t\t{renderLabel(_title.label as any)}\n\t\t\t\t\t{tip}\n\t\t\t\t</span>\n\t\t\t);\n\t\t};\n\t},\n});\n"],"names":["splitLabelByKeywords","label","keywords","len","length","fragments","str","index","indexOf","push","slice","Title","defineComponent","name","props","title","String","Object","Function","className","match","Boolean","onClick","setup","handleClick","e","url","docUrl","window","open","stopPropagation","renderLabel","intlLabel","intl","_createVNode","labelToRender","map","f","color","_title","isVNode","isI18nData","isTitleConfig","icon","createIcon","style","fontSize","tip","type","Tip","tipProps","children","h"],"mappings":"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"} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Trivial Package
Supply chain riskPackages less than 10 lines of code are easily copied into your own project and may not warrant the additional supply chain risk of an external dependency.
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
1
-50%990
-99.81%2
-98.73%8
-99.88%