🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@arvin-shu/microcode-editor-core

Package Overview
Dependencies
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@arvin-shu/microcode-editor-core - npm Package Compare versions

Comparing version
1.0.4
to
1.0.5
+8
src/index.ts
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",

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;
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;;;;"}
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;
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;
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;
}
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';
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":";;;;;AAIA,MAAM,WAAyC,GAAA;AAAA,EAC9C,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA,OAAA;AAAA,EACJ,EAAI,EAAA;AACL,CAAA;AAEA,MAAM,MAAA,GAAS,IAAI,MAAO,CAAA,EAAE,OAAO,MAAQ,EAAA,OAAA,EAAS,gBAAgB,CAAA;AAEpE,MAAM,kBAAqB,GAAA,wBAAA;AAK3B,MAAM,YAAa,CAAA;AAAA,EACV,OAAA,GAAqB,qBAAqB,cAAc,CAAA;AAAA,EAExD,UAAmC,GAAI,EAAA;AAAA,EAE/C,MAAA,GAAS,SAAS,MAAM;AACvB,IAAI,IAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,IAAS,IAAM,EAAA;AAC/B,MAAA,OAAO,KAAK,OAAQ,CAAA,KAAA;AAAA;AAIrB,IAAA,IAAI,MAAS,GAAA,IAAA;AACb,IAAI,IAAA,eAAA,CAAgB,MAAM,CAAG,EAAA;AAC5B,MAAA,MAAM,QAAQ,MAAO,CAAA,YAAA;AACrB,MAAI,IAAA,MAAA;AACJ,MAAI,IAAA;AACH,QAAA,MAAA,GAAS,KAAK,KAAM,CAAA,KAAA,CAAM,OAAQ,CAAA,kBAAkB,KAAK,EAAE,CAAA;AAAA,eACnD,CAAG,EAAA;AACX,QAAO,MAAA,CAAA,KAAA,CAAM,CAAc,WAAA,EAAA,CAAC,CAAE,CAAA,CAAA;AAAA;AAE/B,MAAA,IAAI,QAAQ,MAAQ,EAAA;AACnB,QAAA,MAAA,GAAA,CAAU,MAAO,CAAA,MAAA,IAAU,EAAI,EAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC/C,QAAO,MAAA,CAAA,KAAA,CAAM,CAAqC,kCAAA,EAAA,MAAM,CAAE,CAAA,CAAA;AAAA;AAC3D;AAID,IAAA,IAAI,CAAC,MAAQ,EAAA;AACZ,MAAM,MAAA,gBAAA,GAA2B,UAAU,QAAQ,CAAA;AACnD,MAAA,IAAI,gBAAkB,EAAA;AACrB,QAAA,MAAA,GACC,YAAY,gBAAgB,CAAA,IAAK,gBAAiB,CAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AACnE,QAAO,MAAA,CAAA,KAAA,CAAM,CAA+B,4BAAA,EAAA,MAAM,CAAE,CAAA,CAAA;AAAA;AACrD;AAGD,IAAA,IAAI,CAAC,MAAQ,EAAA;AACZ,MAAM,MAAA,EAAE,WAAc,GAAA,MAAA;AACtB,MAAA,IAAI,UAAU,QAAU,EAAA;AACvB,QAAA,MAAM,OAAO,SAAU,CAAA,QAAA;AACvB,QAAA,OAAO,YAAY,IAAI,CAAA,IAAK,IAAK,CAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA;AAElD,MAAA,IAAI,UAAU,eAAiB,EAAA;AAC9B,QAAA,MAAM,EAAK,GAAA,SAAA,CAAU,eAAgB,CAAA,KAAA,CAAM,GAAG,CAAA;AAC9C,QAAI,IAAA,gBAAA,GAAmB,GAAG,CAAC,CAAA;AAC3B,QAAI,IAAA,EAAA,CAAG,CAAC,CAAG,EAAA;AACV,UAAA,gBAAA,IAAoB,CAAI,CAAA,EAAA,EAAA,CAAG,CAAC,CAAA,CAAE,aAAa,CAAA,CAAA;AAAA;AAE5C,QAAS,MAAA,GAAA,gBAAA;AACT,QAAO,MAAA,CAAA,KAAA,CAAM,CAA+B,4BAAA,EAAA,MAAM,CAAE,CAAA,CAAA;AAAA;AACrD;AAGD,IAAA,IAAI,CAAC,MAAQ,EAAA;AACZ,MAAO,MAAA,CAAA,IAAA;AAAA,QACN;AAAA,OACD;AACA,MAAS,MAAA,GAAA,OAAA;AAAA;AAGV,IAAA,IAAA,CAAK,QAAQ,KAAQ,GAAA,MAAA;AACrB,IAAO,OAAA,MAAA;AAAA,GACP,CAAA;AAAA,EAED,WAAc,GAAA;AACb,IAAK,IAAA,CAAA,OAAA,CAAQ,gBAAgB,GAAG,CAAA;AAAA;AACjC,EAEA,UAAU,MAAgB,EAAA;AACzB,IAAO,MAAA,CAAA,IAAA,CAAK,CAAqB,kBAAA,EAAA,MAAM,CAAE,CAAA,CAAA;AACzC,IAAI,IAAA,MAAA,KAAW,IAAK,CAAA,MAAA,CAAO,KAAO,EAAA;AACjC,MAAA;AAAA;AAED,IAAA,IAAA,CAAK,QAAQ,KAAQ,GAAA,MAAA;AACrB,IAAI,IAAA,eAAA,CAAgB,MAAM,CAAG,EAAA;AAC5B,MAAA,MAAM,QAAQ,MAAO,CAAA,YAAA;AACrB,MAAI,IAAA,MAAA;AACJ,MAAI,IAAA;AACH,QAAA,MAAA,GAAS,KAAK,KAAM,CAAA,KAAA,CAAM,OAAQ,CAAA,kBAAkB,KAAK,EAAE,CAAA;AAAA,eACnD,CAAG,EAAA;AACX,QAAO,MAAA,CAAA,KAAA,CAAM,CAAc,WAAA,EAAA,CAAC,CAAE,CAAA,CAAA;AAAA;AAE/B,MAAI,IAAA,MAAA,IAAU,OAAO,MAAA,KAAW,QAAU,EAAA;AACzC,QAAA,MAAA,CAAO,MAAS,GAAA,MAAA;AAAA,OACV,MAAA;AACN,QAAA,MAAA,GAAS,EAAE,MAAO,EAAA;AAAA;AAEnB,MAAA,KAAA,CAAM,OAAQ,CAAA,kBAAA,EAAoB,IAAK,CAAA,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA;AAEzD,IAAK,IAAA,CAAA,OAAA,CAAQ,IAAK,CAAA,cAAA,EAAgB,MAAM,CAAA;AAAA;AACzC,EAEA,SAAY,GAAA;AACX,IAAA,OAAO,KAAK,MAAO,CAAA,KAAA;AAAA;AACpB,EAEA,eAAe,EAA0C,EAAA;AACxD,IAAK,IAAA,CAAA,OAAA,CAAQ,EAAG,CAAA,cAAA,EAAgB,EAAE,CAAA;AAClC,IAAA,OAAO,MAAM;AACZ,MAAK,IAAA,CAAA,OAAA,CAAQ,cAAe,CAAA,cAAA,EAAgB,EAAE,CAAA;AAAA,KAC/C;AAAA;AAEF;AAEA,SAAS,gBAAgB,GAAqC,EAAA;AAC7D,EAAA,OAAO,GAAI,CAAA,YAAA;AACZ;AAEA,SAAS,UAAU,IAAc,EAAA;AAChC,EAAA,MAAM,GAAW,GAAA,MAAA;AACjB,EAAA,OACC,GAAI,CAAA,IAAI,CAAM,IAAA,CAAA,GAAA,CAAI,QAAY,IAAA,EAAI,EAAA,IAAI,CAAM,IAAA,CAAA,GAAA,CAAI,UAAc,IAAA,IAAI,IAAI,CAAA;AAExE;AAEM,MAAA,YAAA,GAAe,IAAI,YAAa;;;;"}
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 };
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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"}
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;
'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;;;;"}
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;
'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;
'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;
}
'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';
'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":";;;;;;;;AAMA,SAAS,mBAAmB,MAAgB,EAAA;AAC3C,EAAA,MAAM,QAAQ,CAAC,MAAA,EAAQ,OAAO,OAAQ,CAAA,GAAA,EAAK,GAAG,CAAC,CAAA;AAC/C,EAAI,IAAA,MAAA,KAAW,OAAW,IAAA,MAAA,KAAW,OAAS,EAAA;AAC7C,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,GACZ,MAAA;AACN,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,IAAI,WAAW,OAAS,EAAA;AACvB,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA;AACnB;AAED,EAAO,OAAA,KAAA;AACR;AAEO,SAAS,YAAY,IAAgB,EAAA;AAC3C,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAU,EAAA;AACtC,IAAO,OAAA,IAAA;AAAA;AAER,EAAA,MAAM,OAAY,EAAC;AACnB,EAAA,MAAA,CAAO,IAAK,CAAA,IAAI,CAAE,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AAClC,IAAA,IAAA,CAAK,GAAG,CAAA,GAAI,IAAK,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,GAC1B,CAAA;AACD,EAAO,OAAA,IAAA;AACR;AAEA,SAAS,UAAA,CAAW,GAAa,EAAA,MAAA,EAAa,MAAwB,EAAA;AACrE,EAAI,IAAA,CAAC,GAAO,IAAA,CAAC,MAAQ,EAAA;AACpB,IAAO,OAAA,GAAA;AAAA;AAER,EAAA,MAAM,QAAW,GAAA,IAAIA,mCAAkB,CAAA,GAAA,EAAK,MAAM,CAAA;AAClD,EAAO,OAAA,QAAA,CAAS,OAAO,MAAa,CAAA;AACrC;AAEgB,SAAA,IAAA,CAAK,MAAoC,MAAiB,EAAA;AACzE,EAAI,IAAA,CAACC,yBAAW,CAAA,IAAI,CAAG,EAAA;AACtB,IAAO,OAAA,IAAA;AAAA;AAER,EAAA,IAAI,KAAK,IAAM,EAAA;AACd,IAAA,OAAO,IAAK,CAAA,IAAA;AAAA;AAEb,EAAM,MAAA,MAAA,GAASC,0BAAa,SAAU,EAAA;AACtC,EAAM,MAAA,KAAA,GAAQ,mBAAmB,MAAM,CAAA;AACvC,EAAI,IAAA,GAAA;AACJ,EAAA,KAAA,MAAW,OAAO,KAAO,EAAA;AACxB,IAAA,GAAA,GAAM,KAAK,GAAG,CAAA;AACd,IAAA,IAAI,OAAO,IAAM,EAAA;AAChB,MAAA;AAAA;AACD;AAED,EAAA,IAAI,OAAO,IAAM,EAAA;AAChB,IAAA,OAAO,UAAU,MAAM,CAAA,EAAA,CAAA;AAAA;AAGxB,EAAO,OAAA,UAAA,CAAW,GAAK,EAAA,MAAA,EAAQ,MAAM,CAAA;AACtC;AAEO,SAAS,WAAW,QAKzB,EAAA;AACD,EAAA,MAAM,QAAQ,MAAM;AACnB,IAAM,MAAA,MAAA,GAASA,0BAAa,SAAU,EAAA;AACtC,IAAI,IAAA,OAAO,aAAa,QAAU,EAAA;AACjC,MAAK,IAAA,MAAA,CAAe,QAAQ,CAAG,EAAA;AAC9B,QAAA,OAAQ,MAAe,CAAA,QAAQ,CAAE,CAAA,MAAM,KAAK,EAAC;AAAA;AAE9C,MAAA,MAAM,MAAM,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,MAAA,CAAO,mBAAmB,CAAA,CAAA;AACrD,MAAQ,OAAA,MAAA,CAAe,GAAG,CAAA,IAAK,EAAC;AAAA;AAEjC,IAAI,IAAA,QAAA,IAAY,OAAO,QAAA,KAAa,QAAU,EAAA;AAC7C,MAAQ,OAAA,QAAA,CAAiB,MAAM,CAAA,IAAK,EAAC;AAAA;AAEtC,IAAA,OAAO,EAAC;AAAA,GACN,GAAA;AAEH,EAASC,SAAAA,KAAAA,CAAK,KAAa,MAAyB,EAAA;AACnD,IAAM,MAAA,GAAA,GAAM,KAAK,GAAG,CAAA;AAEpB,IAAA,IAAI,OAAO,IAAM,EAAA;AAChB,MAAA,OAAO,UAAU,GAAG,CAAA,EAAA,CAAA;AAAA;AAGrB,IAAA,OAAO,UAAW,CAAA,GAAA,EAAK,MAAQ,EAAAD,yBAAA,CAAa,WAAW,CAAA;AAAA;AAGxD,EAAA,MAAM,cAAcE,mBAAgB,CAAA;AAAA,IACnC,KAAO,EAAA;AAAA,MACN,EAAI,EAAA,MAAA;AAAA,MACJ,MAAQ,EAAA;AAAA,KACT;AAAA,IACA,MAAS,GAAA;AACR,MAAM,MAAA,EAAE,EAAI,EAAA,MAAA,EAAW,GAAA,IAAA;AACvB,MAAOD,OAAAA,KAAAA,CAAK,IAAK,MAAM,CAAA;AAAA;AACxB,GACA,CAAA;AAED,EAAO,OAAA;AAAA,IACN,QAAA,CAAS,IAAY,MAAiB,EAAA;AACrC,MAAA,OAAOE,KAAE,CAAA,WAAA,EAAa,EAAE,EAAA,EAAI,QAAQ,CAAA;AAAA,KACrC;AAAA,IACA,IAAAF,EAAAA,KAAAA;AAAA,IACA,SAAY,GAAA;AACX,MAAA,OAAOD,0BAAa,SAAU,EAAA;AAAA,KAC/B;AAAA,IACA,UAAU,MAAgB,EAAA;AACzB,MAAAA,yBAAA,CAAa,UAAU,MAAM,CAAA;AAAA;AAC9B,GACD;AACD;;;;;;;"}
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":";;;;;AAOA,MAAM,UAAW,CAAA;AAAA,EAChB,GAAyB,GAAA,IAAA;AAAA,EAEjB,SAA2B,GAAA,IAAA;AAAA,EAE3B,SAA2B,GAAA,IAAA;AAAA,EAE3B,OAAA,GAAqBA,8BAAqB,YAAY,CAAA;AAAA,EAE9D,UAAU,MAAqB,EAAA;AAC9B,IAAM,MAAA,GAAA,GAAM,QAAQ,MAAM,CAAA;AAC1B,IAAA,IAAI,GAAK,EAAA;AACR,MAAA,IAAI,KAAK,GAAK,EAAA;AAEb,QAAA,IAAK,IAAK,CAAA,GAAA,CAAY,MAAY,KAAA,GAAA,CAAY,MAAQ,EAAA;AACrD,UAAA,IAAA,CAAK,GAAM,GAAA,GAAA;AACX,UAAA;AAAA;AAGD,QAAA,IAAI,KAAK,SAAW,EAAA;AACnB,UAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,UAAA,IAAA,CAAK,SAAY,GAAA,IAAA;AACjB,UAAA,IAAA,CAAK,GAAM,GAAA,IAAA;AAAA,SACL,MAAA;AACN,UAAA,IAAI,KAAK,SAAW,EAAA;AACnB,YAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,YAAA,IAAA,CAAK,SAAY,GAAA,IAAA;AAAA;AAElB,UAAA,IAAA,CAAK,GAAM,GAAA,GAAA;AACX,UAAK,IAAA,CAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AAC7B,UAAA;AAAA;AACD;AAGD,MAAA,IAAA,CAAK,GAAM,GAAA,GAAA;AACX,MAAA,IAAI,KAAK,SAAW,EAAA;AACnB,QAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,QAAA,IAAA,CAAK,SAAY,GAAA,IAAA;AACjB,QAAK,IAAA,CAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AAAA,OACvB,MAAA;AACN,QAAK,IAAA,CAAA,SAAA,GAAY,WAAW,MAAM;AACjC,UAAA,IAAA,CAAK,SAAY,GAAA,IAAA;AACjB,UAAK,IAAA,CAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AAAA,WAC3B,GAAG,CAAA;AAAA;AACP,KACM,MAAA;AACN,MAAA,IAAI,KAAK,SAAW,EAAA;AACnB,QAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,QAAA,IAAA,CAAK,SAAY,GAAA,IAAA;AAAA,OACX,MAAA;AACN,QAAK,IAAA,CAAA,SAAA,GAAY,WAAW,MAAM;AACjC,UAAA,IAAA,CAAK,SAAY,GAAA,IAAA;AAAA,WACf,GAAG,CAAA;AAAA;AAEP,MAAA,IAAA,CAAK,GAAM,GAAA,IAAA;AAEX,MAAK,IAAA,CAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AAAA;AAC9B;AACD,EAEA,eAAkB,GAAA;AACjB,IAAA,IAAI,KAAK,SAAW,EAAA;AACnB,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAY,GAAA,IAAA;AAAA;AAElB,IAAA,IAAI,KAAK,SAAW,EAAA;AACnB,MAAA,YAAA,CAAa,KAAK,SAAS,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAY,GAAA,IAAA;AAAA;AAElB,IAAA,IAAA,CAAK,GAAM,GAAA,IAAA;AACX,IAAK,IAAA,CAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AAAA;AAC9B,EAEA,SAAS,IAAkB,EAAA;AAC1B,IAAK,IAAA,CAAA,OAAA,CAAQ,EAAG,CAAA,WAAA,EAAa,IAAI,CAAA;AACjC,IAAA,OAAO,MAAM;AACZ,MAAK,IAAA,CAAA,OAAA,CAAQ,cAAe,CAAA,WAAA,EAAa,IAAI,CAAA;AAAA,KAC9C;AAAA;AAEF;AAEa,MAAA,UAAA,GAAa,IAAI,UAAW;AAEzC,SAAS,QAAQ,MAA+C,EAAA;AAC/D,EAAA,IAAI,CAAC,MAAQ,EAAA;AACZ,IAAO,OAAA,IAAA;AAAA;AAGR,EAAA,IAAI,WAAc,GAAA,EAAA;AAClB,EAAO,OAAA,MAAA,IAAU,gBAAgB,CAAG,EAAA;AAEnC,IAAA,IAAI,MAAO,CAAA,OAAA,IAAW,MAAO,CAAA,OAAA,CAAQ,GAAK,EAAA;AACzC,MAAO,OAAA;AAAA,QACN,QAAA,EAAU,OAAO,OAAQ,CAAA,GAAA;AAAA,QACzB,SAAY,EAAA,MAAA,CAAO,OAAQ,CAAA,SAAA,IAAa,OAAO,OAAQ,CAAA,GAAA;AAAA,QACvD,KAAA,EAAO,OAAO,OAAQ,CAAA,KAAA;AAAA,QACtB;AAAA,OACD;AAAA;AAID,IAAA,IAAI,QAA4B,MAAO,CAAA,gBAAA;AAEvC,IAAA,OAAO,KAAO,EAAA;AACb,MAAA,IAAI,KAAM,CAAA,OAAA,IAAW,KAAM,CAAA,OAAA,CAAQ,SAAS,KAAO,EAAA;AAClD,QAAM,MAAA,EAAE,KAAM,EAAA,GAAI,KAAM,CAAA,OAAA;AACxB,QAAA,IAAI,CAAC,KAAO,EAAA;AACX,UAAO,OAAA,IAAA;AAAA;AAER,QAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,GAAA,CAAI,KAAK,CAAA;AAElC,QAAA,IAAI,CAAC,QAAU,EAAA;AACd,UAAO,OAAA,IAAA;AAAA;AAGR,QAAO,OAAA;AAAA,UACN,GAAG,QAAA;AAAA,UACH;AAAA,SACD;AAAA;AAED,MAAA,KAAA,GAAQ,KAAM,CAAA,sBAAA;AAAA;AAGf,IAAA,MAAA,GAAS,MAAO,CAAA,UAAA;AAAA;AAGjB,EAAO,OAAA,IAAA;AACR;AAEA,MAAM,OAAA,uBAAc,GAAkC,EAAA;AACtC,SAAA,OAAA,CAAQ,IAAY,KAAoC,EAAA;AACvE,EAAA,IAAI,KAAO,EAAA;AACV,IAAQ,OAAA,CAAA,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,GACf,MAAA;AACN,IAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA;AAEnB;;;;;"}
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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"}