@widget-js/core 0.11.20 → 0.11.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +7 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +12 -3
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/model/DeployMode.ts","../src/utils/LanguageUtils.ts","../src/model/Page.ts","../src/model/Widget.ts","../src/model/event/BroadcastEvent.ts","../src/model/event/WebSocketEvent.ts","../src/model/WidgetData.ts","../src/model/WidgetTheme.ts","../src/router/encoding.ts","../src/router/query.ts","../src/model/WidgetParams.ts","../src/model/AppNotification.ts","../src/model/DeployedPage.ts","../src/model/DeployedWidget.ts","../src/model/msic/graphics.ts","../src/utils/normalizeUrl.ts","../src/utils/WidgetUrlUtils.ts","../src/model/WidgetPackage.ts","../src/utils/ElectronUtils.ts","../src/grid/GridSystem.ts","../src/api/ElectronApi.ts","../src/api/WidgetDataApi.ts","../src/api/Channel.ts","../src/api/BaseApi.ts","../src/api/BroadcastApi.ts","../src/api/WidgetApi.ts","../src/api/BrowserWindowApi.ts","../src/api/NotificationApi.ts","../src/api/DeployedWidgetApi.ts","../src/api/DeviceApi.ts","../src/api/ClipboardApi.ts","../src/api/ApiConstants.ts","../src/api/ShortcutApi.ts","../src/api/ProcessApi.ts","../src/api/AppApi.ts","../src/api/DialogApi.ts","../src/api/StoreApi.ts","../src/api/LogApi.ts","../src/api/FileApi.ts"],"sourcesContent":["/**\n * @deprecated use DeployedMode instead\n */\nexport enum HostedMode {\n NORMAL = 0x000001,\n /**\n * 悬浮窗\n */\n OVERLAP = 0x000010,\n WALLPAPER = 0x000100,\n SCREEN = 0x001000,\n /**\n * 后台组件,没有界面,一般在后台执行定时任务\n */\n BACKGROUND = 0x010000,\n /**\n * 页面\n */\n PAGE = 0x100000,\n ALL = 0x111111,\n}\n\nexport enum DeployMode {\n NORMAL = 0x000001,\n /**\n * 悬浮窗\n */\n OVERLAP = 0x000010,\n BACKGROUND = 0x010000,\n ALL = 0x111111,\n}\n","import {LanguageCode, LanguageTextMap} from \"../lang/LanguageCode\";\r\n\r\n/**\r\n * 根据语言环境获取文本\r\n * @param langMap 对象\r\n * @param {LanguageCode} langCode 语言环境 例如:zh-CN,en-US\r\n * @param fallbackToBrowser\r\n */\r\nexport function getTextByLanguageCode(langMap: LanguageTextMap, langCode?: LanguageCode, fallbackToBrowser: boolean = true): string | undefined {\r\n let result: string | undefined;\r\n if (langCode) {\r\n if (langCode in langMap) {\r\n return langMap[langCode]\r\n }\r\n }\r\n // fallback to browser default language\r\n if (result == undefined && fallbackToBrowser) {\r\n if (typeof navigator != 'undefined' && navigator.languages) {\r\n const langCode = navigator.language as LanguageCode;\r\n result = getTextByLanguageCode(langMap, langCode, false);\r\n if (result != undefined) {\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n // fallback to first language\r\n if (result == undefined) {\r\n let langCode = Object.keys(langMap);\r\n if (langCode.length > 0) {\r\n return langMap[langCode[0] as LanguageCode];\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n","import {LanguageCode, LanguageTextMap} from '../lang/LanguageCode';\r\nimport {getTextByLanguageCode} from '../utils/LanguageUtils';\r\nimport {WidgetKeyword} from './Widget';\r\nimport {WidgetPermission} from \"../permission/permission\";\r\n\r\nexport type MetaInfo = { [key: string]: string | number | boolean };\r\n\r\nexport interface IWindowSize {\r\n width: number;\r\n height: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n minWidth?: number;\r\n minHeight?: number;\r\n}\r\n\r\nexport interface IPageOptions extends IWindowSize {\r\n name: string;\r\n /**\r\n * 当showInSearch为true时,此项必填\r\n */\r\n title: LanguageTextMap;\r\n /**\r\n * 当showInSearch为true时,此项必填\r\n */\r\n description?: LanguageTextMap;\r\n /**\r\n * 当showInSearch为true时,此项必填\r\n */\r\n keywords?: WidgetKeyword[];\r\n lang: LanguageCode;\r\n packageName?: string;\r\n /**\r\n * 当showInSearch为true时,此项必填\r\n */\r\n previewImage?: string;\r\n /**\r\n * 是否在搜索中显示\r\n */\r\n showInSearch?: boolean;\r\n /**\r\n * 悬浮窗模式 是否可移动\r\n */\r\n movable?: boolean;\r\n resizable?: boolean;\r\n backgroundThrottling?: boolean;\r\n security?: boolean;\r\n webviewTag?: boolean;\r\n path: string;\r\n /**\r\n * 是否只能添加一次\r\n */\r\n singleton?: boolean;\r\n permissions?: WidgetPermission[];\r\n meta?: MetaInfo;\r\n broadcastChannels?: string[];\r\n}\r\n\r\nexport interface IPage {\r\n //窗口名称,名称与包名类似,e.g. com.example.countdown\r\n readonly name: string;\r\n\r\n /**\r\n * 窗口标题,显示在界面上的,\r\n * https://zh.m.wikipedia.org/zh-hans/ISO_639-1\r\n */\r\n readonly title: LanguageTextMap;\r\n readonly permissions: WidgetPermission[];\r\n readonly webviewTag: boolean;\r\n /**\r\n * 窗口介绍\r\n */\r\n readonly description: LanguageTextMap;\r\n readonly keywords: WidgetKeyword[];\r\n /**\r\n * 组件默认语言\r\n */\r\n readonly lang: LanguageCode;\r\n readonly width: number;\r\n packageName?: string | null;\r\n readonly height: number;\r\n readonly maxWidth: number;\r\n readonly maxHeight: number;\r\n readonly minWidth: number;\r\n readonly minHeight: number;\r\n readonly movable: boolean;\r\n readonly singleton: boolean;\r\n readonly resizable: boolean;\r\n readonly path: string;\r\n readonly meta: { [key: string]: string | number | boolean };\r\n readonly backgroundThrottling: boolean;\r\n /**\r\n * 预览图片,可以是GIF\r\n */\r\n readonly previewImage?: string;\r\n}\r\n\r\nexport class Page implements IPage {\r\n //窗口名称,名称与包名类似,e.g. com.example.countdown\r\n readonly name: string;\r\n\r\n /**\r\n * 窗口标题,显示在界面上的,\r\n * https://zh.m.wikipedia.org/zh-hans/ISO_639-1\r\n */\r\n readonly title: LanguageTextMap;\r\n /**\r\n * 窗口介绍\r\n */\r\n readonly description: LanguageTextMap;\r\n readonly keywords: WidgetKeyword[];\r\n readonly security: boolean;\r\n readonly permissions: WidgetPermission[];\r\n /**\r\n * 组件默认语言\r\n */\r\n readonly lang: LanguageCode;\r\n readonly width: number;\r\n packageName?: string | null;\r\n readonly height: number;\r\n readonly maxWidth: number;\r\n readonly webviewTag: boolean;\r\n readonly maxHeight: number;\r\n readonly minWidth: number;\r\n readonly minHeight: number;\r\n readonly movable: boolean;\r\n readonly singleton: boolean;\r\n readonly resizable: boolean;\r\n readonly path: string;\r\n readonly meta: { [key: string]: string | number | boolean };\r\n readonly backgroundThrottling: boolean;\r\n /**\r\n * 预览图片,可以是GIF\r\n */\r\n readonly previewImage?: string;\r\n\r\n constructor(options: IPageOptions) {\r\n this.name = options.name;\r\n this.title = options.title;\r\n this.description = options.description ?? {};\r\n this.keywords = options.keywords ?? [];\r\n this.lang = options.lang;\r\n this.width = options.width;\r\n this.height = options.height;\r\n this.movable = options.movable ?? true;\r\n this.resizable = options.resizable ?? true;\r\n this.maxWidth = options.maxWidth ?? options.width;\r\n this.maxHeight = options.maxHeight ?? options.height;\r\n this.minWidth = options.minWidth ?? options.width;\r\n this.minHeight = options.minHeight ?? options.height;\r\n this.backgroundThrottling = options.backgroundThrottling ?? true;\r\n this.packageName = options.packageName;\r\n this.singleton = options.singleton ?? false;\r\n this.previewImage = options.previewImage;\r\n this.path = options.path;\r\n this.meta = options.meta ?? {};\r\n this.security = options.security ?? false;\r\n this.webviewTag = options.webviewTag ?? false;\r\n this.permissions = options.permissions ?? [];\r\n }\r\n\r\n /**\r\n * 获取组件标题\r\n * @param lang 语言环境,不传则获取默认语言\r\n */\r\n getTitle(lang?: LanguageCode): string | undefined {\r\n return getTextByLanguageCode(this.title, lang);\r\n }\r\n\r\n /**\r\n * 获取组件描述\r\n * @param lang 语言环境,不传则获取默认标题\r\n */\r\n getDescription(lang?: LanguageCode): string | undefined {\r\n if (this.description == undefined) return undefined;\r\n return getTextByLanguageCode(this.description, lang);\r\n }\r\n\r\n static parseJSON(json: string): Page {\r\n const object = JSON.parse(json);\r\n return this.parseObject(object);\r\n }\r\n\r\n static parseObject(obj: any): Page {\r\n let widget = new Page({\r\n path: '',\r\n description: {},\r\n height: 0,\r\n keywords: [],\r\n lang: 'zh-CN',\r\n name: '',\r\n previewImage: '',\r\n title: {},\r\n width: 0,\r\n });\r\n Object.assign(widget, obj);\r\n return widget;\r\n }\r\n\r\n isResizable(): boolean {\r\n return (\r\n this.resizable ||\r\n !(\r\n this.minWidth == this.width &&\r\n this.maxWidth == this.width &&\r\n this.minHeight == this.height &&\r\n this.maxHeight == this.height\r\n )\r\n );\r\n }\r\n\r\n}\r\n","import { DeployMode } from './DeployMode';\r\nimport { WidgetPermission } from '../permission/permission';\r\nimport { Page, IPageOptions, IWindowSize } from './Page';\r\nimport { LanguageTextMap } from '../lang/LanguageCode';\r\nimport { SocialLink } from './SocialInfo';\r\n\r\nexport interface IWidgetOptions extends IWindowSize, IPageOptions {\r\n supportDeployMode?: DeployMode;\r\n configPagePath?: string;\r\n previewImage: string;\r\n description: LanguageTextMap;\r\n keywords: WidgetKeyword[];\r\n /**\r\n */\r\n routes?: WidgetRoute[];\r\n /**\r\n * 一般用于填写教程链接\r\n */\r\n socialLinks?: SocialLink[];\r\n}\r\n\r\n/**\r\n * @deprecated\r\n */\r\nexport interface WidgetRoute {\r\n url: string;\r\n name: string;\r\n}\r\n\r\nexport class Widget extends Page {\r\n declare readonly previewImage: string;\r\n readonly supportDeployMode: number;\r\n /**\r\n * 配置页面路径,没有则不能修改\r\n */\r\n readonly configPagePath?: string;\r\n /**\r\n * @deprecated\r\n */\r\n readonly routes: WidgetRoute[];\r\n\r\n readonly socialLinks?: SocialLink[];\r\n\r\n constructor(options: IWidgetOptions) {\r\n super(options);\r\n this.configPagePath = options.configPagePath;\r\n this.supportDeployMode = options.supportDeployMode ?? DeployMode.NORMAL | DeployMode.OVERLAP;\r\n this.socialLinks = options.socialLinks;\r\n this.routes = options.routes ?? [];\r\n }\r\n\r\n static parseJSON(json: string): Widget {\r\n const object = JSON.parse(json);\r\n return this.parseObject(object);\r\n }\r\n\r\n static parseObject(obj: any): Widget {\r\n let widget = new Widget({\r\n path: '',\r\n description: {},\r\n height: 0,\r\n keywords: [],\r\n lang: 'zh-CN',\r\n name: '',\r\n previewImage: '',\r\n title: {},\r\n width: 0,\r\n });\r\n Object.assign(widget, obj);\r\n return widget;\r\n }\r\n\r\n /**\r\n * 是否支持悬浮窗\r\n */\r\n isSupportOverlap(): boolean {\r\n return (this.supportDeployMode & DeployMode.OVERLAP) > 0;\r\n }\r\n\r\n isSupportBackground(): boolean {\r\n return (this.supportDeployMode & DeployMode.BACKGROUND) > 0;\r\n }\r\n\r\n /**\r\n * 是否支持普通模式\r\n */\r\n isSupportNormal() {\r\n return (this.supportDeployMode & DeployMode.NORMAL) > 0;\r\n }\r\n\r\n isConfigurable(): boolean {\r\n return this.configPagePath != null && this.configPagePath != '';\r\n }\r\n}\r\n\r\nexport enum WidgetKeyword {\r\n RECOMMEND = 'recommend',\r\n TOOLS = 'tools',\r\n EFFICIENCY = 'efficiency',\r\n PICTURE = 'picture',\r\n LIFE = 'life',\r\n SHORTCUT = 'shortcut',\r\n COUNTDOWN = 'countdown',\r\n TIMER = 'timer',\r\n INFO = 'info',\r\n DASHBOARD = 'dashboard',\r\n}\r\n","import {WidgetApiEvent} from \"../../api/WidgetApi\";\r\nimport {AppApiEvent} from \"../../api/AppApi\";\r\n\r\ninterface BroadcastEventOptions {\r\n event: WidgetApiEvent | AppApiEvent | string\r\n /**\r\n * 发送人,用于标记发送源,一般为组件名,如:com.example.widgets.countdown\r\n */\r\n sender?: string\r\n /**\r\n * 广播事件携带的数据,只支持部分数据类型。\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\r\n */\r\n payload?: any\r\n}\r\n\r\nexport class BroadcastEvent {\r\n readonly event: string\r\n readonly sender?: string\r\n payload?: any\r\n\r\n constructor(options: BroadcastEventOptions) {\r\n this.event = options.event;\r\n this.sender = options.sender;\r\n this.payload = options.payload;\r\n }\r\n\r\n}\r\n","export enum WebSocketEventType {\r\n RESISTER_PACKAGE = \"ws::cn.widgetjs.core.resister_package\"\r\n}\r\n\r\nexport class WebSocketEvent {\r\n //类型\r\n type: WebSocketEventType\r\n payload: any\r\n\r\n constructor(type: WebSocketEventType, payload: any) {\r\n this.type = type;\r\n this.payload = payload;\r\n }\r\n}\r\n","import kebabCase from 'lodash/kebabCase';\r\nimport { DefaultWidgetTheme, WidgetTheme, WidgetThemeKey } from './WidgetTheme';\r\n\r\n/**\r\n * 组件配置数据,用于存储组件自定义页面所设置的数据\r\n */\r\nexport class WidgetData {\r\n /**\r\n * 组件id\r\n */\r\n id?: string;\r\n /**\r\n * 组件名\r\n */\r\n name: string;\r\n /**\r\n * 背景颜色\r\n * @deprecated\r\n */\r\n backgroundColor?: string;\r\n /**\r\n * 文字颜色\r\n * @deprecated\r\n */\r\n color?: string;\r\n /**\r\n * 字体大小\r\n * @deprecated\r\n */\r\n fontSize?: number;\r\n /**\r\n * 字体\r\n * @deprecated\r\n */\r\n fontFamily?: string;\r\n /**\r\n * 圆角半径\r\n * @deprecated\r\n */\r\n borderRadius?: number;\r\n /**\r\n * 组件样式\r\n */\r\n theme: WidgetTheme;\r\n\r\n constructor(name: string, id?: string) {\r\n this.id = id;\r\n this.name = name;\r\n this.theme = JSON.parse(JSON.stringify(DefaultWidgetTheme));\r\n }\r\n\r\n public parseJSON(json: {}) {\r\n Object.assign(this, json);\r\n }\r\n\r\n /**\r\n * Gets the style properties from the widget's style object.\r\n * @returns A record representing CSS custom properties and their values.\r\n */\r\n public getThemeProperties(): Record<string, string> {\r\n const properties: Record<string, string> = {};\r\n if (this.theme) {\r\n const prefix = '--widget-';\r\n let keys = Object.keys(this.theme) as WidgetThemeKey[];\r\n keys\r\n .filter((key) => this.theme![key] != undefined)\r\n .map((key) => {\r\n properties[`${prefix}${kebabCase(key)}`] = `${this.theme![key]!}`;\r\n });\r\n }\r\n return properties;\r\n }\r\n\r\n /**\r\n * Injects the style properties as css variable.\r\n * @remarks Only works in a browser environment.\r\n */\r\n public injectThemeProperties() {\r\n const properties = this.getThemeProperties();\r\n Object.keys(properties).forEach((key) => {\r\n document.documentElement.style.setProperty(key, properties[key].toString());\r\n });\r\n }\r\n}\r\n","import type * as CSS from 'csstype';\r\n\r\nexport interface WidgetTheme {\r\n borderRadius?: CSS.Properties['borderRadius'];\r\n backgroundColor?: CSS.Properties['color'];\r\n fontSize?: CSS.Properties['fontSize'];\r\n dividerColor?: CSS.Properties['color'];\r\n /**\r\n * 主色调\r\n */\r\n primaryColor?: CSS.Properties['color'];\r\n /**\r\n * 文字颜色\r\n */\r\n color?: CSS.Properties['color'];\r\n fontFamily?: CSS.Properties['fontFamily'];\r\n shadowColor?: CSS.Properties['color'];\r\n padding?: CSS.Properties['padding'];\r\n borderColor?: CSS.Properties['borderColor'];\r\n}\r\n\r\nexport type WidgetThemeKey = keyof WidgetTheme;\r\n\r\n/**\r\n * Widget default theme, this object is immutable. Clone it before use.\r\n */\r\nconst DefaultWidgetTheme: WidgetTheme = {\r\n backgroundColor: 'rgba(0,0,0,0.2)',\r\n color: '#fff',\r\n fontSize: '14px',\r\n borderColor: 'rgba(255,255,255,0.4)',\r\n dividerColor: 'rgba(255,255,255,0.4)',\r\n primaryColor: 'rgb(0, 149, 255)',\r\n borderRadius: '22px',\r\n};\r\n\r\nObject.freeze(DefaultWidgetTheme);\r\n\r\nexport { DefaultWidgetTheme };\r\n","/**\r\n * Encoding Rules ␣ = Space Path: ␣ \" < > # ? { } Query: ␣ \" < > # & = Hash: ␣ \"\r\n * < > `\r\n *\r\n * On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2)\r\n * defines some extra characters to be encoded. Most browsers do not encode them\r\n * in encodeURI https://github.com/whatwg/url/issues/369, so it may be safer to\r\n * also encode `!'()*`. Leaving un-encoded only ASCII alphanumeric(`a-zA-Z0-9`)\r\n * plus `-._~`. This extra safety should be applied to query by patching the\r\n * string returned by encodeURIComponent encodeURI also encodes `[\\]^`. `\\`\r\n * should be encoded to avoid ambiguity. Browsers (IE, FF, C) transform a `\\`\r\n * into a `/` if directly typed in. The _backtick_ (`````) should also be\r\n * encoded everywhere because some browsers like FF encode it when directly\r\n * written while others don't. Safari and IE don't encode ``\"<>{}``` in hash.\r\n */\r\n// const EXTRA_RESERVED_RE = /[!'()*]/g\r\n// const encodeReservedReplacer = (c: string) => '%' + c.charCodeAt(0).toString(16)\r\n\r\nconst HASH_RE = /#/g // %23\r\nconst AMPERSAND_RE = /&/g // %26\r\nconst SLASH_RE = /\\//g // %2F\r\nconst EQUAL_RE = /=/g // %3D\r\nconst IM_RE = /\\?/g // %3F\r\nexport const PLUS_RE = /\\+/g // %2B\r\n/**\r\n * NOTE: It's not clear to me if we should encode the + symbol in queries, it\r\n * seems to be less flexible than not doing so and I can't find out the legacy\r\n * systems requiring this for regular requests like text/html. In the standard,\r\n * the encoding of the plus character is only mentioned for\r\n * application/x-www-form-urlencoded\r\n * (https://url.spec.whatwg.org/#urlencoded-parsing) and most browsers seems lo\r\n * leave the plus character as is in queries. To be more flexible, we allow the\r\n * plus character on the query, but it can also be manually encoded by the user.\r\n *\r\n * Resources:\r\n * - https://url.spec.whatwg.org/#urlencoded-parsing\r\n * - https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20\r\n */\r\n\r\nconst ENC_BRACKET_OPEN_RE = /%5B/g // [\r\nconst ENC_BRACKET_CLOSE_RE = /%5D/g // ]\r\nconst ENC_CARET_RE = /%5E/g // ^\r\nconst ENC_BACKTICK_RE = /%60/g // `\r\nconst ENC_CURLY_OPEN_RE = /%7B/g // {\r\nconst ENC_PIPE_RE = /%7C/g // |\r\nconst ENC_CURLY_CLOSE_RE = /%7D/g // }\r\nconst ENC_SPACE_RE = /%20/g // }\r\n\r\n/**\r\n * Encode characters that need to be encoded on the path, search and hash\r\n * sections of the URL.\r\n *\r\n * @internal\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nfunction commonEncode(text: string | number): string {\r\n return encodeURI('' + text)\r\n .replace(ENC_PIPE_RE, '|')\r\n .replace(ENC_BRACKET_OPEN_RE, '[')\r\n .replace(ENC_BRACKET_CLOSE_RE, ']')\r\n}\r\n\r\n/**\r\n * Encode characters that need to be encoded on the hash section of the URL.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nexport function encodeHash(text: string): string {\r\n return commonEncode(text)\r\n .replace(ENC_CURLY_OPEN_RE, '{')\r\n .replace(ENC_CURLY_CLOSE_RE, '}')\r\n .replace(ENC_CARET_RE, '^')\r\n}\r\n\r\n/**\r\n * Encode characters that need to be encoded query values on the query\r\n * section of the URL.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nexport function encodeQueryValue(text: string | number): string {\r\n return (\r\n commonEncode(text)\r\n // Encode the space as +, encode the + to differentiate it from the space\r\n .replace(PLUS_RE, '%2B')\r\n .replace(ENC_SPACE_RE, '+')\r\n .replace(HASH_RE, '%23')\r\n .replace(AMPERSAND_RE, '%26')\r\n .replace(ENC_BACKTICK_RE, '`')\r\n .replace(ENC_CURLY_OPEN_RE, '{')\r\n .replace(ENC_CURLY_CLOSE_RE, '}')\r\n .replace(ENC_CARET_RE, '^')\r\n )\r\n}\r\n\r\n/**\r\n * Like `encodeQueryValue` but also encodes the `=` character.\r\n *\r\n * @param text - string to encode\r\n */\r\nexport function encodeQueryKey(text: string | number): string {\r\n return encodeQueryValue(text).replace(EQUAL_RE, '%3D')\r\n}\r\n\r\n/**\r\n * Encode characters that need to be encoded on the path section of the URL.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nexport function encodePath(text: string | number): string {\r\n return commonEncode(text).replace(HASH_RE, '%23').replace(IM_RE, '%3F')\r\n}\r\n\r\n/**\r\n * Encode characters that need to be encoded on the path section of the URL as a\r\n * param. This function encodes everything {@link encodePath} does plus the\r\n * slash (`/`) character. If `text` is `null` or `undefined`, returns an empty\r\n * string instead.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nexport function encodeParam(text: string | number | null | undefined): string {\r\n return text == null ? '' : encodePath(text).replace(SLASH_RE, '%2F')\r\n}\r\n\r\n/**\r\n * Decode text using `decodeURIComponent`. Returns the original text if it\r\n * fails.\r\n *\r\n * @param text - string to decode\r\n * @returns decoded string\r\n */\r\nexport function decode(text: string | number): string {\r\n try {\r\n return decodeURIComponent('' + text)\r\n } catch (err) {\r\n // __DEV__ && warn(`Error decoding \"${text}\". Using original value`)\r\n }\r\n return '' + text\r\n}\r\n","import { decode, encodeQueryKey, encodeQueryValue, PLUS_RE } from './encoding'\r\nconst isArray: (arg: ArrayLike<any> | any) => arg is ReadonlyArray<any> =\r\n Array.isArray\r\n/**\r\n * Possible values in normalized {@link LocationQuery}. `null` renders the query\r\n * param but without an `=`.\r\n *\r\n * @example\r\n * ```\r\n * ?isNull&isEmpty=&other=other\r\n * gives\r\n * `{ isNull: null, isEmpty: '', other: 'other' }`.\r\n * ```\r\n *\r\n * @internal\r\n */\r\nexport type LocationQueryValue = string | null\r\n/**\r\n * Possible values when defining a query.\r\n *\r\n * @internal\r\n */\r\nexport type LocationQueryValueRaw = LocationQueryValue | number | undefined\r\n/**\r\n * Normalized query object that appears in {@link RouteLocationNormalized}\r\n *\r\n * @public\r\n */\r\nexport type LocationQuery = Record<\r\n string,\r\n LocationQueryValue | LocationQueryValue[]\r\n >\r\n/**\r\n * Loose {@link LocationQuery} object that can be passed to functions like\r\n * {@link Router.push} and {@link Router.replace} or anywhere when creating a\r\n * {@link RouteLocationRaw}\r\n *\r\n * @public\r\n */\r\nexport type LocationQueryRaw = Record<\r\n string | number,\r\n LocationQueryValueRaw | LocationQueryValueRaw[]\r\n >\r\n\r\n/**\r\n * Transforms a queryString into a {@link LocationQuery} object. Accept both, a\r\n * version with the leading `?` and without Should work as URLSearchParams\r\n * @internal\r\n *\r\n * @param search - search string to parse\r\n * @returns a query object\r\n */\r\nexport function parseQuery(search: string): LocationQuery {\r\n const query: LocationQuery = {}\r\n // avoid creating an object with an empty key and empty value\r\n // because of split('&')\r\n if (search === '' || search === '?') return query\r\n const hasLeadingIM = search[0] === '?'\r\n const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&')\r\n for (let i = 0; i < searchParams.length; ++i) {\r\n // pre decode the + into space\r\n const searchParam = searchParams[i].replace(PLUS_RE, ' ')\r\n // allow the = character\r\n const eqPos = searchParam.indexOf('=')\r\n const key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos))\r\n const value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1))\r\n\r\n if (key in query) {\r\n // an extra variable for ts types\r\n let currentValue = query[key]\r\n if (!isArray(currentValue)) {\r\n currentValue = query[key] = [currentValue]\r\n }\r\n // we force the modification\r\n ;(currentValue as LocationQueryValue[]).push(value)\r\n } else {\r\n query[key] = value\r\n }\r\n }\r\n return query\r\n}\r\n\r\n/**\r\n * Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it\r\n * doesn't prepend a `?`\r\n *\r\n * @internal\r\n *\r\n * @param query - query object to stringify\r\n * @returns string version of the query without the leading `?`\r\n */\r\nexport function stringifyQuery(query: LocationQueryRaw): string {\r\n let search = ''\r\n for (let key in query) {\r\n const value = query[key]\r\n key = encodeQueryKey(key)\r\n if (value == null) {\r\n // only null adds the value\r\n if (value !== undefined) {\r\n search += (search.length ? '&' : '') + key\r\n }\r\n continue\r\n }\r\n // keep null values\r\n const values: LocationQueryValueRaw[] = isArray(value)\r\n ? value.map(v => v && encodeQueryValue(v))\r\n : [value && encodeQueryValue(value)]\r\n\r\n values.forEach(value => {\r\n // skip undefined values in arrays as if they were not present\r\n // smaller code than using filter\r\n if (value !== undefined) {\r\n // only append & with non-empty search\r\n search += (search.length ? '&' : '') + key\r\n if (value != null) search += '=' + value\r\n }\r\n })\r\n }\r\n\r\n return search\r\n}\r\n\r\n","/**\n * 组件参数,如宽,高,id,语言等环境参数\n */\nimport { parseQuery } from '../router/query';\nimport { DeployMode } from './DeployMode';\nimport snakeCase from 'lodash/snakeCase';\n\nexport class WidgetParams {\n static readonly PARAM_PREFIX = 'w_';\n static readonly PARAM_ID = 'id';\n static readonly PARAM_WIDTH = 'width';\n static readonly PARAM_HEIGHT = 'height';\n static readonly PARAM_WIDTH_PX = 'width_px';\n static readonly PARAM_HEIGHT_PX = 'height_px';\n static readonly PARAM_X = 'x';\n static readonly PARAM_Y = 'y';\n static readonly PARAM_LANG = 'lang';\n static readonly PARAM_THEME = 'theme';\n static readonly PARAM_MODE = 'mode';\n static readonly PARAM_RADIUS = 'radius';\n static readonly PARAM_NAME = 'name';\n static readonly PARAM_TITLE = 'title';\n static readonly PARAM_PREVIEW = 'preview';\n static readonly PARAMS = [\n WidgetParams.PARAM_ID,\n WidgetParams.PARAM_WIDTH,\n WidgetParams.PARAM_HEIGHT,\n WidgetParams.PARAM_X,\n WidgetParams.PARAM_Y,\n WidgetParams.PARAM_LANG,\n WidgetParams.PARAM_THEME,\n WidgetParams.PARAM_MODE,\n WidgetParams.PARAM_WIDTH_PX,\n WidgetParams.PARAM_HEIGHT_PX,\n WidgetParams.PARAM_NAME,\n WidgetParams.PARAM_TITLE,\n WidgetParams.PARAM_PREVIEW,\n ];\n //组件id\n id?: string;\n //网格宽度,1就代表宽度占用1格\n width?: number;\n //宽度,单位px\n widthPx?: number;\n //宽度,单位px\n heightPx?: number;\n //网格高度,2就代表高度占用2格\n height?: number;\n x?: number;\n y?: number;\n //是否是预览模式,添加组件时,预览状态\n preview?: boolean;\n //语言环境:zh,en,jp...\n lang?: string;\n //主题:浅色,深色\n theme?: ThemeMode;\n //\n mode?: DeployMode;\n //系统设置的组件圆角半径\n radius?: number;\n //组件名\n name?: string;\n title?: string;\n\n /**\n * 将组件参数转为url参数\n * @param object\n * @return URLSearchParams w_w=2&w_h=2&w_id=21&w_width=156&w_height=156\n */\n toUrlParams(): URLSearchParams {\n const urlParams = new URLSearchParams();\n const ownPropertyNames = Object.getOwnPropertyNames(this);\n for (let ownPropertyName of ownPropertyNames) {\n type ObjectKey = keyof typeof this;\n const key = ownPropertyName as ObjectKey;\n const value = this[key];\n if (value) {\n urlParams.append(WidgetParams.PARAM_PREFIX + snakeCase(ownPropertyName), value.toString());\n }\n }\n return urlParams;\n }\n\n getPersistKey(): string {\n return `${this.name}-${this.id}`;\n }\n\n /**\n * 从当前地址解析组件参数:\n * http://localhost:8080/#/widget/config/labor_progress?w_w=2&w_h=2&w_width=156&w_height=156\n * =>\n * {width:2,height:2,id:21,width_px:156,height_px:156}\n */\n static fromCurrentLocation(): WidgetParams {\n const href = window.location.href;\n let strings = href.split('?');\n if (strings.length > 1) {\n let queryString = strings[1];\n return this.fromObject(parseQuery(queryString));\n }\n return new WidgetParams();\n }\n\n static fromLocation(url: string): WidgetParams {\n let strings = url.split('?');\n if (strings.length > 1) {\n let queryString = strings[1];\n return this.fromObject(parseQuery(queryString));\n }\n return new WidgetParams();\n }\n\n private static setValue(widgetEnv: WidgetParams, key: string, value: string) {\n const keyWithoutPrefix = key.replace(this.PARAM_PREFIX, '');\n if (keyWithoutPrefix == WidgetParams.PARAM_ID) {\n widgetEnv.id = value;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_X) {\n widgetEnv.x = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_Y) {\n widgetEnv.y = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_HEIGHT) {\n widgetEnv.height = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_WIDTH) {\n widgetEnv.width = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_LANG) {\n widgetEnv.lang = value;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_THEME) {\n widgetEnv.theme = value as ThemeMode;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_MODE) {\n widgetEnv.mode = parseInt(value) as DeployMode;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_RADIUS) {\n widgetEnv.radius = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_WIDTH_PX) {\n widgetEnv.widthPx = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_HEIGHT_PX) {\n widgetEnv.heightPx = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_NAME) {\n widgetEnv.name = value;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_TITLE) {\n widgetEnv.title = value;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_PREVIEW) {\n widgetEnv.preview = value === 'true';\n }\n }\n\n /**\n * 从对象键值对中初始化组件参数\n * {w_width:2,w_height:2,w_id:21,w_width_px:156,w_height_px:156}=>\n * {width:2,height:2,id:21,width_px:156,height_px:156}\n * @param object\n */\n static fromObject(object: any): WidgetParams {\n const widgetEnv = new WidgetParams();\n const ownPropertyNames = Object.getOwnPropertyNames(object);\n for (let ownPropertyName of ownPropertyNames) {\n type ObjectKey = keyof typeof this;\n const key = ownPropertyName as ObjectKey;\n const value = object[key];\n this.setValue(widgetEnv, key, value);\n }\n return widgetEnv;\n }\n}\n\nexport enum ThemeMode {\n AUTO = 'auto',\n LIGHT = 'LIGHT',\n DARK = 'DARK',\n}\n","export type NotificationType =\r\n | \"countdown\"\r\n | \"advance-countdown\"\r\n | \"error\"\r\n | \"success\"\r\n | \"warning\"\r\n | \"info\"\r\n | \"reminder\"\r\n | \"url\"\r\n | \"call\"\r\n\r\nexport enum NotificationSize {\r\n SMALL = 'small',\r\n NORMAL = 'normal',\r\n LARGE = 'large',\r\n}\r\n\r\nexport interface NotificationOption {\r\n type?: NotificationType;\r\n title?: string;\r\n message: string;\r\n targetTime?: string;\r\n duration?: number;\r\n /**\r\n * 图片名,目前只支持mingcute图标。\r\n * https://www.mingcute.com/\r\n */\r\n icon?: string;\r\n color?: string;\r\n confirmButtonText?: string;\r\n cancelButtonText?: string;\r\n cancelBroadcast?: string;\r\n confirmBroadcast?: string;\r\n size?: NotificationSize;\r\n url?: string;\r\n avatar?: string;\r\n audio?: string;\r\n lyric?: string;\r\n backgroundColor?: string;\r\n}\r\n\r\nexport class AppNotification {\r\n type: NotificationType = \"info\"\r\n message: string;\r\n title?: string;\r\n targetTime?: string;\r\n duration: number;\r\n icon?: string;\r\n color?: string;\r\n backgroundColor?: string;\r\n confirmButtonText?: string;\r\n cancelButtonText?: string;\r\n cancelBroadcast?: string;\r\n confirmBroadcast?: string;\r\n size: NotificationSize;\r\n url?: string;\r\n avatar?: string;\r\n audio?: string;\r\n lyric?: string;\r\n createdAt: string;\r\n\r\n constructor(option: NotificationOption) {\r\n this.createdAt = new Date().toISOString();\r\n this.type = option.type ?? \"info\";\r\n this.title = option.title;\r\n this.message = option.message;\r\n this.targetTime = option.targetTime;\r\n this.duration = option.duration ?? 5000;\r\n this.icon = option.icon;\r\n this.color = option.color ?? \"#5D8AC8\";\r\n this.confirmButtonText = option.confirmButtonText;\r\n this.cancelButtonText = option.cancelButtonText;\r\n this.cancelBroadcast = option.cancelBroadcast;\r\n this.confirmBroadcast = option.confirmBroadcast;\r\n this.size = option.size ?? NotificationSize.NORMAL;\r\n this.audio = option.audio;\r\n this.avatar = option.avatar;\r\n this.lyric = option.lyric;\r\n this.backgroundColor = option.backgroundColor ?? '#000000';\r\n }\r\n\r\n}\r\n","interface IDeployedPage{\n id: string;\n name: string;\n packageName: string;\n x: number;\n y: number;\n height: number;\n width: number;\n proxy?: string;\n}\n\nexport class DeployedPage implements IDeployedPage {\n name!: string;\n packageName!: string;\n x: number = 0;\n y: number = 0;\n height: number = 600;\n width: number = 800;\n proxy?: string;\n id!: string;\n}\n","import { DeployMode } from './DeployMode';\nimport { DeployedPage } from './DeployedPage';\n\nexport class DeployedWidget extends DeployedPage {\n shortcut?: string;\n deployMode!: number;\n\n isOverlap(): boolean {\n return (this.deployMode & DeployMode.OVERLAP) > 0;\n }\n}\n","export interface Point {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport type Position = {\r\n x: number,\r\n y: number\r\n}\r\n\r\nexport enum Gravity {\r\n TOP = 'TOP', LEFT = \"LEFT\", RIGHT = \"RIGHT\", BOTTOM = \"BOTTOM\"\r\n}\r\n","// source: https://github.com/sindresorhus/normalize-url\r\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\r\nconst DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';\r\nconst DATA_URL_DEFAULT_CHARSET = 'us-ascii';\r\nexport type NormalizeOptions = {\r\n /**\r\n @default 'http'\r\n */\r\n defaultProtocol?: string | 'http' | 'https';\r\n\r\n /**\r\n Prepends `defaultProtocol` to the URL if it's protocol-relative.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('//sindresorhus.com');\r\n //=> 'http://sindresorhus.com'\r\n\r\n normalizeUrl('//sindresorhus.com', {normalizeProtocol: false});\r\n //=> '//sindresorhus.com'\r\n ```\r\n */\r\n readonly normalizeProtocol?: boolean;\r\n\r\n /**\r\n Normalizes HTTPS URLs to HTTP.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://sindresorhus.com');\r\n //=> 'https://sindresorhus.com'\r\n\r\n normalizeUrl('https://sindresorhus.com', {forceHttp: true});\r\n //=> 'http://sindresorhus.com'\r\n ```\r\n */\r\n readonly forceHttp?: boolean;\r\n\r\n /**\r\n Normalizes HTTP URLs to HTTPS.\r\n\r\n This option cannot be used with the `forceHttp` option at the same time.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('http://sindresorhus.com');\r\n //=> 'http://sindresorhus.com'\r\n\r\n normalizeUrl('http://sindresorhus.com', {forceHttps: true});\r\n //=> 'https://sindresorhus.com'\r\n ```\r\n */\r\n readonly forceHttps?: boolean;\r\n\r\n /**\r\n Strip the [authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) part of a URL.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://user:password@sindresorhus.com');\r\n //=> 'https://sindresorhus.com'\r\n\r\n normalizeUrl('https://user:password@sindresorhus.com', {stripAuthentication: false});\r\n //=> 'https://user:password@sindresorhus.com'\r\n ```\r\n */\r\n readonly stripAuthentication?: boolean;\r\n\r\n /**\r\n Removes hash from the URL.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('sindresorhus.com/about.html#contact');\r\n //=> 'http://sindresorhus.com/about.html#contact'\r\n\r\n normalizeUrl('sindresorhus.com/about.html#contact', {stripHash: true});\r\n //=> 'http://sindresorhus.com/about.html'\r\n ```\r\n */\r\n readonly stripHash?: boolean;\r\n\r\n /**\r\n Remove the protocol from the URL: `http://sindresorhus.com` → `sindresorhus.com`.\r\n\r\n It will only remove `https://` and `http://` protocols.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://sindresorhus.com');\r\n //=> 'https://sindresorhus.com'\r\n\r\n normalizeUrl('sindresorhus.com', {stripProtocol: true});\r\n //=> 'sindresorhus.com'\r\n ```\r\n */\r\n readonly stripProtocol?: boolean;\r\n\r\n /**\r\n Strip the [text fragment](https://web.dev/text-fragments/) part of the URL\r\n\r\n __Note:__ The text fragment will always be removed if the `stripHash` option is set to `true`, as the hash contains the text fragment.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('http://sindresorhus.com/about.html#:~:text=hello');\r\n //=> 'http://sindresorhus.com/about.html#'\r\n\r\n normalizeUrl('http://sindresorhus.com/about.html#section:~:text=hello');\r\n //=> 'http://sindresorhus.com/about.html#section'\r\n\r\n normalizeUrl('http://sindresorhus.com/about.html#:~:text=hello', {stripTextFragment: false});\r\n //=> 'http://sindresorhus.com/about.html#:~:text=hello'\r\n\r\n normalizeUrl('http://sindresorhus.com/about.html#section:~:text=hello', {stripTextFragment: false});\r\n //=> 'http://sindresorhus.com/about.html#section:~:text=hello'\r\n ```\r\n */\r\n readonly stripTextFragment?: boolean;\r\n\r\n /**\r\n Removes `www.` from the URL.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('http://www.sindresorhus.com');\r\n //=> 'http://sindresorhus.com'\r\n\r\n normalizeUrl('http://www.sindresorhus.com', {stripWWW: false});\r\n //=> 'http://www.sindresorhus.com'\r\n ```\r\n */\r\n readonly stripWWW?: boolean;\r\n\r\n /**\r\n Removes query parameters that matches any of the provided strings or regexes.\r\n\r\n @default [/^utm_\\w+/i]\r\n\r\n @example\r\n ```\r\n normalizeUrl('www.sindresorhus.com?foo=bar&ref=test_ref', {\r\n\t\tremoveQueryParameters: ['ref']\r\n\t});\r\n //=> 'http://sindresorhus.com/?foo=bar'\r\n ```\r\n\r\n If a boolean is provided, `true` will remove all the query parameters.\r\n\r\n ```\r\n normalizeUrl('www.sindresorhus.com?foo=bar', {\r\n\t\tremoveQueryParameters: true\r\n\t});\r\n //=> 'http://sindresorhus.com'\r\n ```\r\n\r\n `false` will not remove any query parameter.\r\n\r\n ```\r\n normalizeUrl('www.sindresorhus.com?foo=bar&utm_medium=test&ref=test_ref', {\r\n\t\tremoveQueryParameters: false\r\n\t});\r\n //=> 'http://www.sindresorhus.com/?foo=bar&ref=test_ref&utm_medium=test'\r\n ```\r\n */\r\n readonly removeQueryParameters?: ReadonlyArray<RegExp | string> | boolean;\r\n\r\n /**\r\n Keeps only query parameters that matches any of the provided strings or regexes.\r\n\r\n __Note__: It overrides the `removeQueryParameters` option.\r\n\r\n @default undefined\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://sindresorhus.com?foo=bar&ref=unicorn', {\r\n\t\tkeepQueryParameters: ['ref']\r\n\t});\r\n //=> 'https://sindresorhus.com/?ref=unicorn'\r\n ```\r\n */\r\n readonly keepQueryParameters?: ReadonlyArray<RegExp | string>;\r\n\r\n /**\r\n Removes trailing slash.\r\n\r\n __Note__: Trailing slash is always removed if the URL doesn't have a pathname unless the `removeSingleSlash` option is set to `false`.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('http://sindresorhus.com/redirect/');\r\n //=> 'http://sindresorhus.com/redirect'\r\n\r\n normalizeUrl('http://sindresorhus.com/redirect/', {removeTrailingSlash: false});\r\n //=> 'http://sindresorhus.com/redirect/'\r\n\r\n normalizeUrl('http://sindresorhus.com/', {removeTrailingSlash: false});\r\n //=> 'http://sindresorhus.com'\r\n ```\r\n */\r\n readonly removeTrailingSlash?: boolean;\r\n\r\n /**\r\n Remove a sole `/` pathname in the output. This option is independent of `removeTrailingSlash`.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://sindresorhus.com/');\r\n //=> 'https://sindresorhus.com'\r\n\r\n normalizeUrl('https://sindresorhus.com/', {removeSingleSlash: false});\r\n //=> 'https://sindresorhus.com/'\r\n ```\r\n */\r\n readonly removeSingleSlash?: boolean;\r\n\r\n /**\r\n Removes the default directory index file from path that matches any of the provided strings or regexes.\r\n When `true`, the regex `/^index\\.[a-z]+$/` is used.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('www.sindresorhus.com/foo/default.php', {\r\n\t\tremoveDirectoryIndex: [/^default\\.[a-z]+$/]\r\n\t});\r\n //=> 'http://sindresorhus.com/foo'\r\n ```\r\n */\r\n removeDirectoryIndex?: boolean | ReadonlyArray<RegExp | string>;\r\n\r\n /**\r\n Removes an explicit port number from the URL.\r\n\r\n Port 443 is always removed from HTTPS URLs and 80 is always removed from HTTP URLs regardless of this option.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('sindresorhus.com:123', {\r\n\t\tremoveExplicitPort: true\r\n\t});\r\n //=> 'http://sindresorhus.com'\r\n ```\r\n */\r\n readonly removeExplicitPort?: boolean;\r\n\r\n /**\r\n Sorts the query parameters alphabetically by key.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('www.sindresorhus.com?b=two&a=one&c=three', {\r\n\t\tsortQueryParameters: false\r\n\t});\r\n //=> 'http://sindresorhus.com/?b=two&a=one&c=three'\r\n ```\r\n */\r\n readonly sortQueryParameters?: boolean;\r\n};\r\n\r\nconst testParameter = (name: string, filters: RegExp[]) => filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);\r\n\r\nconst supportedProtocols = new Set([\r\n 'https:',\r\n 'http:',\r\n 'file:',\r\n]);\r\n\r\nconst hasCustomProtocol = (urlString: string) => {\r\n try {\r\n const {protocol} = new URL(urlString);\r\n return protocol.endsWith(':') && !supportedProtocols.has(protocol);\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nconst normalizeDataURL = (urlString: string, option: { stripHash: boolean }) => {\r\n const match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);\r\n\r\n if (!match) {\r\n throw new Error(`Invalid URL: ${urlString}`);\r\n }\r\n\r\n //@ts-ignore\r\n let {type, data, hash} = match.groups;\r\n const mediaType = type.split(';') as string[];\r\n hash = option.stripHash ? '' : hash;\r\n\r\n let isBase64 = false;\r\n if (mediaType[mediaType.length - 1] === 'base64') {\r\n mediaType.pop();\r\n isBase64 = true;\r\n }\r\n\r\n // Lowercase MIME type\r\n const mimeType = mediaType.shift()?.toLowerCase() ?? '';\r\n const attributes = mediaType\r\n .map(attribute => {\r\n let [key, value = ''] = attribute.split('=').map(item => item.trim());\r\n\r\n // Lowercase `charset`\r\n if (key === 'charset') {\r\n value = value.toLowerCase();\r\n\r\n if (value === DATA_URL_DEFAULT_CHARSET) {\r\n return '';\r\n }\r\n }\r\n\r\n return `${key}${value ? `=${value}` : ''}`;\r\n })\r\n .filter(Boolean);\r\n\r\n const normalizedMediaType = [\r\n ...attributes,\r\n ];\r\n\r\n if (isBase64) {\r\n normalizedMediaType.push('base64');\r\n }\r\n\r\n if (normalizedMediaType.length > 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {\r\n normalizedMediaType.unshift(mimeType);\r\n }\r\n\r\n return `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`;\r\n};\r\n\r\nexport function normalizeUrl(urlString: string, options?: NormalizeOptions) {\r\n options = {\r\n defaultProtocol: 'http',\r\n normalizeProtocol: true,\r\n forceHttp: false,\r\n forceHttps: false,\r\n stripAuthentication: true,\r\n stripHash: false,\r\n stripTextFragment: true,\r\n stripWWW: true,\r\n removeQueryParameters: [/^utm_\\w+/i],\r\n removeTrailingSlash: true,\r\n removeSingleSlash: true,\r\n removeDirectoryIndex: false,\r\n removeExplicitPort: false,\r\n sortQueryParameters: true,\r\n ...options,\r\n };\r\n urlString = urlString.replace('\\\\\\\\', '//')\r\n\r\n // Legacy: Append `:` to the protocol if missing.\r\n if (typeof options.defaultProtocol === 'string' && !options.defaultProtocol.endsWith(':')) {\r\n options.defaultProtocol = `${options.defaultProtocol}:`;\r\n }\r\n\r\n urlString = urlString.trim();\r\n\r\n // Data URL\r\n if (/^data:/i.test(urlString)) {\r\n return normalizeDataURL(urlString, {stripHash: options.stripHash ?? false});\r\n }\r\n\r\n if (hasCustomProtocol(urlString)) {\r\n return urlString;\r\n }\r\n\r\n const hasRelativeProtocol = urlString.startsWith('//');\r\n const isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString);\r\n\r\n // Prepend protocol\r\n if (!isRelativeUrl) {\r\n urlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, options.defaultProtocol!);\r\n }\r\n\r\n const urlObject = new URL(urlString);\r\n\r\n if (options.forceHttp && options.forceHttps) {\r\n throw new Error('The `forceHttp` and `forceHttps` options cannot be used together');\r\n }\r\n\r\n if (options.forceHttp && urlObject.protocol === 'https:') {\r\n urlObject.protocol = 'http:';\r\n }\r\n\r\n if (options.forceHttps && urlObject.protocol === 'http:') {\r\n urlObject.protocol = 'https:';\r\n }\r\n\r\n // Remove auth\r\n if (options.stripAuthentication) {\r\n urlObject.username = '';\r\n urlObject.password = '';\r\n }\r\n\r\n // Remove hash\r\n if (options.stripHash) {\r\n urlObject.hash = '';\r\n } else if (options.stripTextFragment) {\r\n urlObject.hash = urlObject.hash.replace(/#?:~:text.*?$/i, '');\r\n }\r\n\r\n // Remove duplicate slashes if not preceded by a protocol\r\n // NOTE: This could be implemented using a single negative lookbehind\r\n // regex, but we avoid that to maintain compatibility with older js engines\r\n // which do not have support for that feature.\r\n if (urlObject.pathname) {\r\n // TODO: Replace everything below with `urlObject.pathname = urlObject.pathname.replace(/(?<!\\b[a-z][a-z\\d+\\-.]{1,50}:)\\/{2,}/g, '/');` when Safari supports negative lookbehind.\r\n\r\n // Split the string by occurrences of this protocol regex, and perform\r\n // duplicate-slash replacement on the strings between those occurrences\r\n // (if any).\r\n const protocolRegex = /\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g;\r\n\r\n let lastIndex = 0;\r\n let result = '';\r\n for (; ;) {\r\n const match = protocolRegex.exec(urlObject.pathname);\r\n if (!match) {\r\n break;\r\n }\r\n\r\n const protocol = match[0];\r\n const protocolAtIndex = match.index;\r\n const intermediate = urlObject.pathname.slice(lastIndex, protocolAtIndex);\r\n\r\n result += intermediate.replace(/\\/{2,}/g, '/');\r\n result += protocol;\r\n lastIndex = protocolAtIndex + protocol.length;\r\n }\r\n\r\n const remnant = urlObject.pathname.slice(lastIndex, urlObject.pathname.length);\r\n result += remnant.replace(/\\/{2,}/g, '/');\r\n\r\n urlObject.pathname = result;\r\n }\r\n\r\n // Decode URI octets\r\n if (urlObject.pathname) {\r\n try {\r\n urlObject.pathname = decodeURI(urlObject.pathname);\r\n } catch {\r\n }\r\n }\r\n\r\n // Remove directory index\r\n if (options.removeDirectoryIndex === true) {\r\n options.removeDirectoryIndex = [/^index\\.[a-z]+$/];\r\n }\r\n\r\n if (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {\r\n let pathComponents = urlObject.pathname.split('/');\r\n const lastComponent = pathComponents[pathComponents.length - 1];\r\n\r\n if (testParameter(lastComponent, options.removeDirectoryIndex)) {\r\n pathComponents = pathComponents.slice(0, -1);\r\n urlObject.pathname = pathComponents.slice(1).join('/') + '/';\r\n }\r\n }\r\n\r\n if (urlObject.hostname) {\r\n // Remove trailing dot\r\n urlObject.hostname = urlObject.hostname.replace(/\\.$/, '');\r\n\r\n // Remove `www.`\r\n if (options.stripWWW && /^www\\.(?!www\\.)[a-z\\-\\d]{1,63}\\.[a-z.\\-\\d]{2,63}$/.test(urlObject.hostname)) {\r\n // Each label should be max 63 at length (min: 1).\r\n // Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names\r\n // Each TLD should be up to 63 characters long (min: 2).\r\n // It is technically possible to have a single character TLD, but none currently exist.\r\n urlObject.hostname = urlObject.hostname.replace(/^www\\./, '');\r\n }\r\n }\r\n\r\n // Remove query unwanted parameters\r\n if (Array.isArray(options.removeQueryParameters)) {\r\n // eslint-disable-next-line unicorn/no-useless-spread -- We are intentionally spreading to get a copy.\r\n for (const key of [...urlObject.searchParams.keys()]) {\r\n if (testParameter(key, options.removeQueryParameters)) {\r\n urlObject.searchParams.delete(key);\r\n }\r\n }\r\n }\r\n\r\n if (!Array.isArray(options.keepQueryParameters) && options.removeQueryParameters === true) {\r\n urlObject.search = '';\r\n }\r\n\r\n // Keep wanted query parameters\r\n if (Array.isArray(options.keepQueryParameters) && options.keepQueryParameters.length > 0) {\r\n // eslint-disable-next-line unicorn/no-useless-spread -- We are intentionally spreading to get a copy.\r\n for (const key of [...urlObject.searchParams.keys()]) {\r\n if (!testParameter(key, options.keepQueryParameters)) {\r\n urlObject.searchParams.delete(key);\r\n }\r\n }\r\n }\r\n\r\n // Sort query parameters\r\n if (options.sortQueryParameters) {\r\n urlObject.searchParams.sort();\r\n\r\n // Calling `.sort()` encodes the search parameters, so we need to decode them again.\r\n try {\r\n urlObject.search = decodeURIComponent(urlObject.search);\r\n } catch {\r\n }\r\n }\r\n\r\n if (options.removeTrailingSlash) {\r\n urlObject.pathname = urlObject.pathname.replace(/\\/$/, '');\r\n }\r\n\r\n // Remove an explicit port number, excluding a default port number, if applicable\r\n if (options.removeExplicitPort && urlObject.port) {\r\n urlObject.port = '';\r\n }\r\n\r\n const oldUrlString = urlString;\r\n\r\n // Take advantage of many of the Node `url` normalizations\r\n urlString = urlObject.toString();\r\n\r\n if (!options.removeSingleSlash && urlObject.pathname === '/' && !oldUrlString.endsWith('/') && urlObject.hash === '') {\r\n urlString = urlString.replace(/\\/$/, '');\r\n }\r\n\r\n // Remove ending `/` unless removeSingleSlash is false\r\n if ((options.removeTrailingSlash || urlObject.pathname === '/') && urlObject.hash === '' && options.removeSingleSlash) {\r\n urlString = urlString.replace(/\\/$/, '');\r\n }\r\n\r\n // Restore relative protocol, if applicable\r\n if (hasRelativeProtocol && !options.normalizeProtocol) {\r\n urlString = urlString.replace(/^http:\\/\\//, '//');\r\n }\r\n\r\n // Remove http/https\r\n if (options.stripProtocol) {\r\n urlString = urlString.replace(/^(?:https?:)?\\/\\//, '');\r\n }\r\n\r\n return urlString;\r\n}\r\n","import { WidgetPackage } from '../model/WidgetPackage';\r\nimport { WidgetParams } from '../model/WidgetParams';\r\nimport { normalizeUrl } from './normalizeUrl';\r\n\r\nexport class WidgetUrlUtils {\r\n static getWidgetUrl(widgetUrl: string, widgetPackage: WidgetPackage, widgetParams: WidgetParams) {\r\n let url = '';\r\n const arr = [];\r\n if (widgetUrl.startsWith('http')) {\r\n url = widgetUrl;\r\n } else {\r\n url = widgetPackage.getIndexUrl() + widgetUrl;\r\n }\r\n arr.push(url)\r\n if (url.includes('?')) {\r\n arr.push('&')\r\n } else {\r\n arr.push('?')\r\n }\r\n arr.push(widgetParams.toUrlParams().toString())\r\n return normalizeUrl(arr.join('')).replaceAll('//', '/');\r\n }\r\n\r\n static getWidgetPackageUrl(url: string, entry: string, hash: boolean,path:string = ''): string {\r\n const arr = [url];\r\n if (url.startsWith('http')) {\r\n if (hash) {\r\n arr.push('#');\r\n }\r\n } else {\r\n arr.push(`/${entry}`);\r\n if (hash) {\r\n arr.push('#');\r\n }\r\n }\r\n arr.push(path)\r\n return arr.join('');\r\n }\r\n}\r\n","import { Widget } from './Widget';\nimport { WidgetUrlUtils } from '../utils/WidgetUrlUtils';\nimport { LanguageCode, LanguageTextMap } from '../lang/LanguageCode';\nimport { getTextByLanguageCode } from '../utils/LanguageUtils';\nimport { WidgetPermission } from '../permission/permission';\nimport { Page } from './Page';\n\nexport interface LocalPackageUrlInfo {\n /**\n * 入口文件,默认为index.html,也可以是/\n * @example remote package: https://rtugeek.gitee.io/hotspot/index.html\n * @example local package: index.html\n */\n entry?: string;\n /**\n * 是否使用hash路由\n */\n hash: boolean;\n}\n\nexport interface RemotePackageUrlInfo extends LocalPackageUrlInfo {\n /**\n * 部署到服务器的base path,只在远程组件包中生效,需以/开始\n * @example /hotspot\n */\n base?: string;\n}\n\nexport interface WidgetPackageOptions extends LocalPackageUrlInfo {\n name: string;\n version?: string;\n author: string;\n homepage?: string;\n title: LanguageTextMap;\n permissions?: WidgetPermission[];\n description: LanguageTextMap;\n remoteEntry?: string;\n remotePackage?: string;\n remote?: RemotePackageUrlInfo;\n icon?: string;\n lang?: LanguageCode;\n widgets?: Widget[];\n devOptions?: DevOptions;\n}\n\nexport class WidgetPackage implements RemotePackageUrlInfo {\n /**\n * 组件包名,一般为域名倒写,e.g. com.example\n */\n readonly name!: string;\n /**\n * 组件包版本,可以为空,默认采用package.json里的版本\n * e.g. 1.0.2\n */\n version?: string;\n /**\n * 组件作者署名\n */\n readonly author!: string;\n /**\n * 组件首页\n */\n readonly homepage?: string;\n /**\n * 组件描述\n */\n readonly title!: { [key: LanguageCode | string]: string };\n /**\n * 组件描述\n */\n readonly description!: { [key: LanguageCode | string]: string };\n /**\n * 组件入口文件,通常为 index.html\n */\n entry!: string | 'index.html';\n /**\n * 组件包的远程入口地址,\n */\n remoteEntry?: string;\n readonly remotePackage?: string;\n readonly local?: LocalPackageUrlInfo;\n readonly remote?: RemotePackageUrlInfo;\n /**\n * 组件包图标\n */\n readonly icon?: string;\n /**\n * Hash路由模式,默认为true\n */\n readonly hash: boolean = true;\n /**\n * 可能是网络地址,或者本地路径(解压后的文件夹路径),\n * 网络地址:https://www.bilibili.com\n * 本地地址:file:///C:/Users/neo/Desktop\n * 在测试时。地址通常为: http://127.0.0.1:8080\n */\n url!: string;\n readonly widgets: Widget[] = [];\n readonly pages: Page[] = [];\n devOptions?: DevOptions;\n\n constructor(options: WidgetPackageOptions) {\n this.name = options.name;\n this.version = options.version;\n this.author = options.author;\n this.homepage = options.homepage;\n this.title = options.title;\n this.description = options.description;\n this.entry = options.entry ?? 'index.html';\n this.remoteEntry = options.remoteEntry;\n this.remotePackage = options.remotePackage;\n this.hash = options.hash;\n this.url = '';\n this.icon = options.icon;\n this.devOptions = options.devOptions;\n this.remote = options.remote;\n if (options.widgets) {\n for (let widget of options.widgets) {\n this.widgets.push(widget);\n }\n }\n }\n\n static parseJSON(json: string): WidgetPackage {\n const object = JSON.parse(json);\n return this.parseObject(object);\n }\n\n static parseObject(obj: any): WidgetPackage {\n let widgetPackage = new WidgetPackage({\n author: '',\n description: {\n 'zh-CN': '',\n },\n entry: '',\n hash: false,\n homepage: '',\n name: '',\n title: {\n 'zh-CN': '',\n },\n version: '',\n });\n Object.assign(widgetPackage, obj);\n const widgets: Widget[] = [];\n if (widgetPackage.widgets) {\n for (let jsonWidget of widgetPackage.widgets) {\n let widget = new Widget({\n previewImage: '',\n path: '',\n description: { 'zh-CN': '' },\n height: 0,\n keywords: [],\n lang: 'zh-CN',\n name: '',\n title: { 'zh-CN': '' },\n width: 0,\n });\n Object.assign(widget, jsonWidget);\n widgets.push(widget);\n }\n }\n widgetPackage.widgets.splice(0, widgetPackage.widgets.length);\n widgetPackage.widgets.push(...widgets);\n return widgetPackage;\n }\n\n /**\n * 获取组件包标题\n * @param lang 语言环境,不传则获取默认语言\n */\n getTitle(lang?: LanguageCode): string | undefined {\n return getTextByLanguageCode(this.title, lang);\n }\n\n /**\n * 获取组件包描述\n * @param lang 语言环境,不传则获取默认标题\n */\n getDescription(lang?: LanguageCode): string | undefined {\n return getTextByLanguageCode(this.description, lang);\n }\n\n /**\n * 获取组件完整路径\n * 如果url是http链接,直接返回链接\n * 如果是本地组件:file://链接,则返回 url+entry,\n * 如果是远程组件:http://链接,则返回 entry,\n * @example file://C:/users/neo/desktop/index.html#\n * @example file://C:/users/neo/desktop/index.html#\n */\n getIndexUrl(hash?: boolean) {\n return WidgetUrlUtils.getWidgetPackageUrl(this.url, this.entry, hash == null ? this.hash : hash);\n }\n\n getUrl(path:string, hash?: boolean) {\n return WidgetUrlUtils.getWidgetPackageUrl(this.url, this.entry, hash == null ? this.hash : hash,path);\n }\n}\n\nexport type DevOptions = {\n folder?: string;\n route?: boolean;\n devUrl?: string;\n remoteEntry?: string;\n};\n","export class ElectronUtils {\r\n static hasElectronApi(): boolean {\r\n return this.getAPI() != null;\r\n }\r\n\r\n /**\r\n * 获取ElectronAPI\r\n * windows api\r\n */\r\n static getAPI() {\r\n if (Reflect.has(window, \"electronAPI\")) {\r\n //@ts-ignore\r\n return window.electronAPI;\r\n } else if (Reflect.has(window.parent, \"electronAPI\")) {\r\n //@ts-ignore\r\n return window.parent.electronAPI;\r\n }\r\n return null\r\n }\r\n\r\n static async invokeMethod(channel: string, method: string, ...args: any[]): Promise<any> {\r\n return this.getAPI()?.invoke(channel, method, ...args);\r\n }\r\n\r\n static async invoke(channel: string, ...args: any[]): Promise<any> {\r\n return this.getAPI()?.invoke(channel, ...args);\r\n }\r\n}\r\n","export interface IGridRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport class GridRect implements IGridRect {\n top: number;\n left: number;\n width: number;\n height: number;\n\n constructor(left: number, top: number, width: number, height: number) {\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n }\n\n get right(): number {\n return this.left + this.width;\n }\n\n get bottom(): number {\n return this.top + this.height;\n }\n}\n\nexport class GridSystem extends GridRect {\n cellSize: number;\n horizontalCellCount: number;\n verticalCellCount: number;\n screenWidth: number;\n screenHeight: number;\n /**\n * 屏幕x坐标,用于解决多块屏幕坐标计算问题\n */\n screenLeft?: number;\n /**\n * 屏幕y坐标,用于解决多块屏幕坐标计算问题\n */\n screenTop?: number;\n canvasScreenTop: number;\n canvasScreenLeft: number;\n\n /**\n *\n * @param cellSize\n * @param padding 至少保留的边距\n * @param screenWidth\n * @param screenHeight\n * @param screenX\n * @param screenY\n */\n constructor(\n cellSize: number,\n padding: number,\n screenWidth: number,\n screenHeight: number,\n screenX?: number,\n screenY?: number,\n ) {\n let gridMaxWidth = screenWidth - padding * 2;\n let gridMaxHeight = screenHeight - padding * 2;\n let horizontalPadding = (gridMaxWidth % cellSize) / 2 + padding;\n let verticalPadding = (gridMaxHeight % cellSize) / 2 + padding;\n const horizontalCellCount = Math.floor(gridMaxWidth / cellSize);\n const verticalCellCount = Math.floor(gridMaxHeight / cellSize);\n super(horizontalPadding, verticalPadding, horizontalCellCount * cellSize, verticalCellCount * cellSize);\n this.canvasScreenLeft = horizontalPadding + (screenX ?? 0);\n this.canvasScreenTop = verticalPadding + (screenY ?? 0);\n this.cellSize = cellSize;\n this.screenWidth = screenWidth;\n this.screenHeight = screenHeight;\n this.horizontalCellCount = horizontalCellCount;\n this.verticalCellCount = verticalCellCount;\n this.screenLeft = screenX;\n this.screenTop = screenY;\n }\n\n /**\n * 将坐标对齐到网格上\n * @param x\n * @param y\n * @param gridSystem\n */\n snapCanvasPosition(x: number, y: number): number[] {\n //转为0坐标系\n let newX = this.getRangeValue(x - this.left, 0, this.right);\n let newY = this.getRangeValue(y - this.top, 0, this.bottom);\n return this.snapPosition(newX, newY);\n }\n\n private snapPosition(newX: number, newY: number) {\n const diffX = newX % this.cellSize;\n if (diffX >= this.cellSize / 2) {\n newX = newX + this.cellSize - diffX;\n } else {\n newX = newX - diffX;\n }\n\n const diffY = newY % this.cellSize;\n if (diffY >= this.cellSize / 2) {\n newY = newY + this.cellSize - diffY;\n } else {\n newY = newY - diffY;\n }\n return [newX + this.left, newY + this.top];\n }\n\n snapSize(width: number, height: number): number[] {\n let newWidth = Math.floor(width);\n let newHeight = Math.floor(height);\n let diffWidth = newWidth % this.cellSize;\n let diffHeight = newHeight % this.cellSize;\n if (diffWidth > this.cellSize / 2) {\n newWidth = width + this.cellSize - diffWidth;\n } else {\n newWidth = width - diffWidth;\n }\n\n if (diffHeight > this.cellSize / 2) {\n newHeight = height + this.cellSize - diffHeight;\n } else {\n newHeight = height - diffHeight;\n }\n\n return [newWidth, newHeight];\n }\n\n /**\n * 将矩形对齐到网格上\n * @param rect\n * @param minWidth\n * @param maxWidth\n * @param minHeight\n * @param maxHeight\n */\n snapCanvasRect(rect: GridRect, minWidth: number, maxWidth: number, minHeight: number, maxHeight: number): IGridRect {\n let [newX, newY] = this.snapCanvasPosition(rect.left, rect.top);\n return this.snapRect(rect, minWidth, maxWidth, minHeight, maxHeight, newX, newY);\n }\n\n private snapRect(\n rect: GridRect,\n minWidth: number,\n maxWidth: number,\n minHeight: number,\n maxHeight: number,\n newX: number,\n newY: number,\n ) {\n let [newWidth, newHeight] = this.snapSize(rect.width, rect.height);\n newWidth = this.getRangeValue(newWidth, minWidth, maxWidth);\n newHeight = this.getRangeValue(newHeight, minHeight, maxHeight);\n\n if (newX + newWidth > this.right) {\n newX = this.right - newWidth;\n }\n if (newY + newHeight > this.bottom) {\n newY = this.bottom - newHeight;\n }\n return new GridRect(newX, newY, newWidth, newHeight);\n }\n\n /**\n * 将矩形对齐到网格上,与snapRect的区别是,这个会加上屏幕x和y坐标,用于适配多个显示器\n * @param rect\n * @param minWidth\n * @param maxWidth\n * @param minHeight\n * @param maxHeight\n */\n snapWindow(rect: GridRect, minWidth: number, maxWidth: number, minHeight: number, maxHeight: number): IGridRect {\n rect.left = rect.left - (this.screenLeft ?? 0);\n rect.top = rect.top - (this.screenTop ?? 0);\n let result = this.snapCanvasRect(rect, minWidth, maxWidth, minHeight, maxHeight);\n return new GridRect(\n result.left + (this.screenLeft ?? 0),\n result.top + (this.screenTop ?? 0),\n result.width,\n result.height,\n );\n }\n\n /**\n * 限制值不超出屏幕\n * @param value\n * @param min\n * @param max\n * @private\n */\n private getRangeValue(value: number, min: number, max: number) {\n if (value < min) {\n return min;\n }\n if (value > max) {\n return max;\n }\n return value;\n }\n\n getWidth() {\n return this.width;\n }\n\n getHeight() {\n return this.height;\n }\n}\n","import {ElectronUtils} from \"../utils/ElectronUtils\";\r\n\r\nexport class ElectronApi {\r\n static async addIpcListener(key: String, f: Function) {\r\n await ElectronUtils.getAPI()?.addIpcListener(key, f);\r\n }\r\n\r\n static async removeIpcListener(key: String) {\r\n await ElectronUtils.getAPI()?.removeIpcListener(key);\r\n }\r\n\r\n}\r\n","import localforage from 'localforage';\nimport { BroadcastEvent } from '../model/event/BroadcastEvent';\nimport { WidgetData } from '../model/WidgetData';\nimport { BroadcastApi } from './BroadcastApi';\nimport { WidgetApiEvent } from './WidgetApi';\n\nexport interface SaveWidgetOption {\n sendBroadcast?: boolean;\n id?: string;\n}\n\nexport interface IWidgetDataApi {\n findByName<T extends WidgetData>(\n name: string,\n type: {\n new (name: string, id?: string): T;\n },\n ): Promise<T | undefined>;\n\n findByName<T extends WidgetData>(data: T): Promise<T | undefined>;\n\n save(data: WidgetData,options?: SaveWidgetOption): Promise<string>;\n\n getStore(name: string): LocalForage;\n\n saveByName<T extends WidgetData>(data: T, options?: SaveWidgetOption): Promise<string>;\n\n find<T extends WidgetData>(\n name: string,\n id: string,\n type: {\n new (name: string, id?: string): T;\n },\n ): Promise<T | undefined>;\n}\n\ntype WidgetDataApiMethods = keyof IWidgetDataApi;\n\nclass WidgetDataApiImpl implements IWidgetDataApi {\n private stores = new Map<string, LocalForage>();\n\n /**\n * 保存组件数据\n * @param data\n * @param options\n */\n public async save(data: WidgetData, options: SaveWidgetOption = { sendBroadcast: true }) {\n let store = this.getStore(data.name);\n let json = JSON.stringify(data);\n const result = await store.setItem(this.getKey(data.name, data.id), json);\n if (options.sendBroadcast) {\n const broadcastEvent = new BroadcastEvent({\n event: WidgetApiEvent.DATA_CHANGED,\n payload: { name: data.name, json },\n });\n await BroadcastApi.send(broadcastEvent);\n }\n return result;\n }\n\n /**\n * 获取组件 LocalForage 存储实例\n * @param name\n */\n public getStore(name: string): LocalForage {\n if (this.stores.has(name)) {\n return this.stores.get(name)!;\n }\n const store = localforage.createInstance({ name: name });\n this.stores.set(name, store);\n return store;\n }\n\n /**\n * 通过组件名保存组件信息,通常用于存储可以在同类组件中共用的数据\n * @param data\n * @param options\n */\n public async saveByName<T extends WidgetData>(data: T, options: SaveWidgetOption = { sendBroadcast: true }) {\n const store = this.getStore(data.name);\n const json = JSON.stringify(data);\n const result = await store.setItem(data.name, json);\n if (options?.sendBroadcast) {\n const broadcastEvent = new BroadcastEvent({\n event: WidgetApiEvent.DATA_CHANGED,\n payload: { name: data.name, json },\n });\n await BroadcastApi.send(broadcastEvent);\n }\n return result;\n }\n\n public async findByName<T extends WidgetData>(...args: any[]): Promise<T | undefined> {\n let name = '';\n let dbStr: string | null = '';\n let data: T;\n if (args.length === 2) {\n name = args[0];\n const type = args[1];\n data = new type(name);\n } else {\n data = args[0] as T;\n name = data.name;\n }\n let store = this.getStore(name);\n dbStr = await store.getItem<string>(name);\n if (dbStr) {\n data.parseJSON(JSON.parse(dbStr));\n return data;\n }\n return undefined;\n }\n\n public async find<T extends WidgetData>(\n name: string,\n id: string,\n type: {\n new (name: string, id?: string): T;\n },\n ): Promise<T | undefined> {\n let store = this.getStore(name);\n let result = await store.getItem<string>(this.getKey(name, id));\n if (result) {\n const widgetData = new type(name, id);\n widgetData.parseJSON(JSON.parse(result));\n return widgetData;\n }\n return undefined;\n }\n\n private getKey(name: string, id?: string) {\n return `${name}@${id}`;\n }\n}\n\nconst WidgetDataApi: IWidgetDataApi = new WidgetDataApiImpl();\nexport { WidgetDataApi, WidgetDataApiMethods };\n","export enum Channel {\r\n NOTIFICATION = \"channel::cn.widgetjs.core.notification\",\r\n BROWSER_WINDOW = \"channel::cn.widgetjs.core.browser_window\",\r\n BROADCAST = \"channel::cn.widgetjs.core.broadcast\",\r\n WIDGET = \"channel::cn.widgetjs.core.widget\",\r\n DEPLOYED_WIDGET = \"channel::cn.widgetjs.core.deployed_widget\",\r\n APP = \"channel::cn.widgetjs.core.app\",\r\n DIALOG = \"channel::cn.widgetjs.core.dialog\",\r\n CLIPBOARD = \"channel::cn.widgetjs.core.clipboard\",\r\n FILE = \"channel::cn.widgetjs.core.file\",\r\n SCREEN = \"channel::cn.widgetjs.core.screen\",\r\n SHORTCUT = \"channel::cn.widgetjs.core.shortcut\",\r\n LOG = \"channel::cn.widgetjs.core.log\",\r\n\r\n DEVICE = \"channel::cn.widgetjs.core.device\",\r\n MOUSE = \"channel::cn.widgetjs.core.mouse\",\r\n KEYBOARD = \"channel::cn.widgetjs.core.keyboard\",\r\n STORE = \"channel::cn.widgetjs.core.store\",\r\n\r\n PROCESS = \"channel::cn.widgetjs.core.process\",\r\n}\r\n","import {ElectronUtils} from \"../utils/ElectronUtils\";\r\n\r\nexport abstract class BaseApi<T extends string> {\r\n\r\n abstract getChannel(): string\r\n\r\n protected async invokeMethod(method: T, ...args: any[]): Promise<any> {\r\n return await ElectronUtils.invokeMethod(this.getChannel(), method, ...args);\r\n }\r\n\r\n protected async invoke(...args: any[]): Promise<any> {\r\n return await ElectronUtils.invoke(this.getChannel(), ...args);\r\n }\r\n}\r\n","import {BroadcastEvent} from \"../model/event/BroadcastEvent\";\r\nimport {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\nimport {WidgetApiEvent} from \"./WidgetApi\";\r\nimport {ShortcutApiEvent} from \"./ShortcutApi\";\r\nimport {ClipboardApiEvent} from \"./ClipboardApi\";\r\nimport {BrowserWindowApiEvent} from \"./BrowserWindowApi\";\r\n\r\ntype BroadcastEventType = WidgetApiEvent | BrowserWindowApiEvent | ShortcutApiEvent | ClipboardApiEvent | string\r\n\r\ninterface IBroadcastApi {\r\n send(event: BroadcastEvent): Promise<void>;\r\n\r\n register(...event: BroadcastEventType[]): Promise<void>;\r\n\r\n unregister(...event: BroadcastEventType[]): Promise<void>;\r\n}\r\n\r\ntype BroadcastApiMethods = keyof IBroadcastApi;\r\n\r\nclass BroadcastApiImpl extends BaseApi<BroadcastApiMethods> implements IBroadcastApi {\r\n async send(event: BroadcastEvent) {\r\n await this.invokeMethod('send', event);\r\n }\r\n\r\n async register(...event: BroadcastEventType[]) {\r\n await this.invokeMethod('register', event)\r\n }\r\n\r\n async unregister(...event: BroadcastEventType[]) {\r\n await this.invokeMethod('unregister', event)\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.BROADCAST;\r\n }\r\n\r\n}\r\n\r\nconst BroadcastApi: IBroadcastApi = new BroadcastApiImpl();\r\n\r\nexport {BroadcastApi, BroadcastApiMethods, BroadcastEventType}\r\n","import { Widget } from '../model/Widget';\r\nimport { WidgetPackage } from '../model/WidgetPackage';\r\nimport { Channel } from './Channel';\r\nimport { WidgetParams } from '../model/WidgetParams';\r\nimport { WidgetUrlUtils } from '../utils/WidgetUrlUtils';\r\nimport { BaseApi } from './BaseApi';\r\n\r\ninterface IWidgetApi {\r\n registerWidgets(widgets: Widget[]): Promise<void>;\r\n\r\n registerWidgetPackage(widgetPackage: WidgetPackage): Promise<void>;\r\n\r\n getWidgets(): Promise<Widget[]>;\r\n\r\n getWidget(name: string): Promise<Widget>;\r\n\r\n getWidgetPackage(name: string): Promise<WidgetPackage>;\r\n\r\n getWidgetPackages(): Promise<WidgetPackage[]>;\r\n\r\n getWidgetUrl(widgetName: string, widgetParams: WidgetParams): Promise<string | null>;\r\n\r\n getWidgetPackageIndexUrl(packageName: string, hash?: boolean): Promise<string | null>;\r\n\r\n getWidgetConfigUrl(widgetName: string, widgetParams: WidgetParams): Promise<string | null>;\r\n\r\n openConfigPage(id: string): Promise<void>;\r\n\r\n openConfigPageByName(name: string): Promise<void>;\r\n\r\n reload(): Promise<void>;\r\n\r\n getWidgetPackageUrl(packageName: string): Promise<string | null>;\r\n}\r\n\r\ntype WidgetApiMethods = keyof IWidgetApi;\r\n\r\nenum WidgetApiEvent {\r\n DATA_CHANGED = 'event::cn.widgetjs.core.widget.data-changed',\r\n EDIT_DESKTOP_WIDGETS = 'event::cn.widgetjs.core.widget.desktop.edit',\r\n}\r\n\r\nclass WidgetApiImpl extends BaseApi<WidgetApiMethods> implements IWidgetApi {\r\n reload(): Promise<void> {\r\n return this.invokeMethod('reload');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.WIDGET;\r\n }\r\n\r\n async registerWidgets(widgets: Widget[]) {\r\n return this.invokeMethod('registerWidgets', JSON.stringify(widgets));\r\n }\r\n\r\n async registerWidgetPackage(widgetPackage: WidgetPackage) {\r\n return this.invokeMethod('registerWidgetPackage', JSON.stringify(widgetPackage));\r\n }\r\n\r\n async getWidgets(): Promise<Widget[]> {\r\n const data = await this.invokeMethod('getWidgets');\r\n const widgets: Widget[] = [];\r\n if (data) {\r\n for (const item of data) {\r\n widgets.push(Widget.parseObject(item));\r\n }\r\n }\r\n return widgets;\r\n }\r\n\r\n async openConfigPage(widgetId: string) {\r\n return this.invokeMethod('openConfigPage', widgetId);\r\n }\r\n\r\n async openConfigPageByName(widgetName: string) {\r\n return this.invokeMethod('openConfigPageByName', widgetName);\r\n }\r\n\r\n async getWidgetPackages(): Promise<WidgetPackage[]> {\r\n return await this.invokeMethod('getWidgetPackages');\r\n }\r\n\r\n /**\r\n *\r\n * @param name package name\r\n */\r\n async getWidget(name: string): Promise<Widget> {\r\n return Widget.parseObject(await this.invokeMethod('getWidget', name));\r\n }\r\n\r\n /**\r\n *\r\n * @param name package name\r\n */\r\n async getWidgetPackage(name: string): Promise<WidgetPackage> {\r\n return WidgetPackage.parseObject(await this.invokeMethod('getWidgetPackage', name));\r\n }\r\n\r\n /**\r\n * 获取组件配置地址\r\n * @param widgetName\r\n */\r\n async getWidgetConfigUrl(widgetName: string, widgetParams: WidgetParams): Promise<string | null> {\r\n const widget = await this.getWidget(widgetName);\r\n if (!widget) return null;\r\n const configPagePath = widget.configPagePath;\r\n if (!configPagePath) return null;\r\n const widgetPackage = await this.getWidgetPackage(widget.packageName!);\r\n if (!widgetPackage) return null;\r\n return WidgetUrlUtils.getWidgetUrl(configPagePath, widgetPackage, widgetParams);\r\n }\r\n\r\n async getWidgetUrl(widgetName: string, widgetParams: WidgetParams): Promise<string | null> {\r\n const widget = await this.getWidget(widgetName);\r\n if (!widget) return null;\r\n const widgetPackage = await this.getWidgetPackage(widget.packageName!);\r\n if (!widgetPackage) return null;\r\n return WidgetUrlUtils.getWidgetUrl(widget.path, widgetPackage, widgetParams);\r\n }\r\n\r\n async getWidgetPackageIndexUrl(packageName: string, hash?: boolean): Promise<string | null> {\r\n const widgetPackage = await this.getWidgetPackage(packageName!);\r\n if (!widgetPackage) return null;\r\n return widgetPackage.getIndexUrl(hash);\r\n }\r\n\r\n async getWidgetPackageUrl(packageName: string): Promise<string | null> {\r\n const widgetPackage = await this.getWidgetPackage(packageName!);\r\n if (!widgetPackage) return null;\r\n return widgetPackage.url;\r\n }\r\n\r\n // /**\r\n // * 通过组件名保存组件信息,通常用于存储可以在同类组件中共用的数据\r\n // * @param data\r\n // * @param options\r\n // */\r\n // public async saveDataByName<T extends WidgetData>(data: T, options: SaveWidgetOption = {sendBroadcast: true}) {\r\n // const store = this.getStore(data.name);\r\n // const json = JSON.stringify(data);\r\n // const result = await store.setItem(data.name, json);\r\n // if (options.sendBroadcast) {\r\n // const broadcastEvent = new BroadcastEvent({\r\n // event: WidgetApiEvent.DATA_CHANGED,\r\n // payload: {\r\n // name: data.name,\r\n // id: options.id,\r\n // json\r\n // }\r\n // });\r\n // await BroadcastApi.send(broadcastEvent);\r\n // }\r\n // return result;\r\n // }\r\n //\r\n // private stores = new Map<string, LocalForage>()\r\n //\r\n // /**\r\n // * 获取组件 LocalForage 存储实例\r\n // * @param name\r\n // */\r\n // public getStore(name: string): LocalForage {\r\n // if (this.stores.has(name)) {\r\n // return this.stores.get(name)!\r\n // }\r\n // const store = localforage.createInstance({name: name});\r\n // this.stores.set(name, store);\r\n // return store;\r\n // }\r\n}\r\n\r\nconst WidgetApi = new WidgetApiImpl();\r\nexport { WidgetApi, WidgetApiEvent, WidgetApiMethods };\r\n","import { Channel } from './Channel';\r\nimport { ElectronUtils } from '../utils/ElectronUtils';\r\nimport { Rectangle } from '../model/interface/Rectangle';\r\nimport { Position } from '../model/msic/graphics';\r\nimport { BaseApi } from './BaseApi';\r\nimport type { Config } from 'electron';\r\n\r\ninterface IBrowserWindowApi {\r\n setIgnoreMouseEvent(ignore: boolean): Promise<void>;\r\n\r\n show(): Promise<void>;\r\n\r\n hide(): Promise<void>;\r\n\r\n close(): Promise<void>;\r\n\r\n showInactive(): Promise<void>;\r\n\r\n center(): Promise<void>;\r\n\r\n startDraggingWindow(): Promise<void>;\r\n\r\n minimize(): Promise<void>;\r\n\r\n restore(): Promise<void>;\r\n\r\n isMinimized(): Promise<boolean>;\r\n\r\n isMaximized(): Promise<boolean>;\r\n\r\n maximize(): Promise<void>;\r\n\r\n stopDraggingWindow(): Promise<void>;\r\n\r\n setAlwaysOnTop(alwaysOnTop: boolean): Promise<void>;\r\n\r\n isAlwaysOnTop(): Promise<boolean>;\r\n\r\n openUrl(url: string, option?: OpenUrlOptions): Promise<void>;\r\n\r\n moveTop(): Promise<void>;\r\n\r\n unmaximize(): Promise<void>;\r\n\r\n reload(): Promise<void>;\r\n\r\n setSize(width: number, height: number, animate?: boolean): Promise<void>;\r\n\r\n openDevTools(): Promise<void>;\r\n\r\n setPosition(options: SetPositionOptions): Promise<void>;\r\n\r\n getPosition(): Promise<Position>;\r\n\r\n blur(): Promise<void>;\r\n\r\n focus(): Promise<void>;\r\n\r\n setResizable(resizable: boolean): Promise<void>;\r\n\r\n setMovable(movable: boolean): Promise<void>;\r\n\r\n getBounds(): Promise<Rectangle>;\r\n\r\n setBounds(bounds: Partial<Rectangle>, animate: boolean): Promise<void>;\r\n\r\n alignToScreen(align: AlignPosition): Promise<void>;\r\n\r\n existsByUrl(url: string): Promise<boolean>;\r\n\r\n getMaximumSize(): Promise<number[]>;\r\n\r\n getMinimumSize(): Promise<number[]>;\r\n\r\n setMaximumSize(width: number, height: number): Promise<void>;\r\n\r\n setMinimumSize(width: number, height: number): Promise<void>;\r\n\r\n setZoomLevel(level: number): Promise<void>;\r\n\r\n setZoomFactor(factor: number): Promise<void>;\r\n\r\n setProxy(config: Config): Promise<void>;\r\n\r\n isFocused(): Promise<boolean>;\r\n}\r\n\r\ntype BrowserWindowApiMethods = keyof IBrowserWindowApi;\r\ntype AlignPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\r\n\r\ninterface OpenUrlOptions {\r\n partition?: string;\r\n external?: boolean;\r\n}\r\n\r\ninterface SetPositionOptions {\r\n x?: number;\r\n y?: number;\r\n /**\r\n * 只有在 macOS 上有效\r\n */\r\n animation?: boolean;\r\n}\r\n\r\nenum BrowserWindowApiEvent {\r\n BLUR = 'event::cn.widgetjs.core.browser-window.blur',\r\n MOVED = 'event::cn.widgetjs.core.browser-window.moved',\r\n FOCUS = 'event::cn.widgetjs.core.browser-window.focus',\r\n SNAP_TO_EDGE = 'event::cn.widgetjs.core.browser-window.snap_to_edge',\r\n RESIZED = 'event::cn.widgetjs.core.browser-window.resized',\r\n CANCEL_SNAP_TO_EDGE = 'event::cn.widgetjs.core.browser-window.cancel_snap_to_edge',\r\n}\r\n\r\ninterface SetupOptions {\r\n width: number;\r\n height: number;\r\n minWidth?: number;\r\n minHeight?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n resizable?: boolean;\r\n movable?: boolean;\r\n center?: boolean;\r\n alwaysOnTop?: boolean;\r\n}\r\n\r\nclass BrowserWindowApiImpl extends BaseApi<BrowserWindowApiMethods> implements IBrowserWindowApi {\r\n getChannel(): string {\r\n return Channel.BROWSER_WINDOW;\r\n }\r\n\r\n async setIgnoreMouseEvent(ignore: boolean) {\r\n await this.invokeMethod('setIgnoreMouseEvent', ignore);\r\n }\r\n\r\n async show() {\r\n await this.invokeMethod('show', true);\r\n }\r\n\r\n async showInactive() {\r\n await this.invokeMethod('showInactive', true);\r\n }\r\n\r\n async hide() {\r\n await this.invokeMethod('hide', false);\r\n }\r\n\r\n async center() {\r\n await this.invokeMethod('center', false);\r\n }\r\n\r\n async setAlwaysOnTop(alwaysOnTop: boolean) {\r\n await this.invokeMethod('setAlwaysOnTop', alwaysOnTop);\r\n }\r\n\r\n async isAlwaysOnTop(): Promise<boolean> {\r\n return await this.invokeMethod('isAlwaysOnTop');\r\n }\r\n\r\n async openUrl(url: string, option?: OpenUrlOptions) {\r\n if (ElectronUtils.hasElectronApi()) {\r\n await this.invokeMethod('openUrl', url, option);\r\n } else {\r\n window.open(url, '_blank');\r\n }\r\n }\r\n\r\n async moveTop() {\r\n await this.invokeMethod('moveTop');\r\n }\r\n\r\n async openDevTools() {\r\n await this.invokeMethod('openDevTools');\r\n }\r\n\r\n async setPosition(options: SetPositionOptions) {\r\n await this.invokeMethod('setPosition', options);\r\n }\r\n\r\n async getPosition(): Promise<Position> {\r\n return await this.invokeMethod('getPosition');\r\n }\r\n\r\n async blur() {\r\n return await this.invokeMethod('blur');\r\n }\r\n\r\n async focus() {\r\n return await this.invokeMethod('focus');\r\n }\r\n\r\n /**\r\n * 设置窗口是否可以拉伸\r\n * @param resizable\r\n */\r\n async setResizable(resizable: boolean) {\r\n return await this.invokeMethod('setResizable', resizable);\r\n }\r\n\r\n async getBounds(): Promise<Rectangle> {\r\n return await this.invokeMethod('getBounds');\r\n }\r\n\r\n async setBounds(bounds: Partial<Rectangle>, animate?: boolean): Promise<void> {\r\n return await this.invokeMethod('setBounds', bounds, animate);\r\n }\r\n\r\n async alignToScreen(align: AlignPosition) {\r\n return await this.invokeMethod('alignToScreen', align);\r\n }\r\n\r\n async startDraggingWindow() {\r\n return await this.invokeMethod('startDraggingWindow');\r\n }\r\n\r\n async stopDraggingWindow() {\r\n return await this.invokeMethod('stopDraggingWindow');\r\n }\r\n\r\n /**\r\n * 通过url检测窗口是否存在\r\n * @param url\r\n */\r\n async existsByUrl(url: string): Promise<boolean> {\r\n return await this.invokeMethod('existsByUrl', url);\r\n }\r\n\r\n async getMaximumSize(): Promise<number[]> {\r\n return await this.invokeMethod('getMaximumSize');\r\n }\r\n\r\n async minimize(): Promise<void> {\r\n return await this.invokeMethod('minimize');\r\n }\r\n\r\n async maximize(): Promise<void> {\r\n return await this.invokeMethod('maximize');\r\n }\r\n\r\n async isMaximized(): Promise<boolean> {\r\n return await this.invokeMethod('isMaximized');\r\n }\r\n\r\n async isMinimized(): Promise<boolean> {\r\n return await this.invokeMethod('isMinimized');\r\n }\r\n\r\n async restore(): Promise<void> {\r\n return await this.invokeMethod('restore');\r\n }\r\n\r\n async unmaximize(): Promise<void> {\r\n return await this.invokeMethod('unmaximize');\r\n }\r\n\r\n async setZoomLevel(level: number): Promise<void> {\r\n return await this.invokeMethod('setZoomLevel');\r\n }\r\n\r\n async reload(): Promise<void> {\r\n return await this.invokeMethod('reload');\r\n }\r\n\r\n async setMovable(movable: boolean): Promise<void> {\r\n return await this.invokeMethod('setMovable', movable);\r\n }\r\n\r\n async setSize(width: number, height: number, animate?: boolean): Promise<void> {\r\n return this.invokeMethod('setSize', width, height, animate);\r\n }\r\n\r\n async isFocused(): Promise<boolean> {\r\n return this.invokeMethod('isFocused');\r\n }\r\n\r\n async setMaximumSize(width: number, height: number): Promise<void> {\r\n return this.invokeMethod('setMaximumSize', width, height);\r\n }\r\n\r\n async setMinimumSize(width: number, height: number): Promise<void> {\r\n return this.invokeMethod('setMinimumSize', width, height);\r\n }\r\n\r\n getMinimumSize(): Promise<number[]> {\r\n return this.invokeMethod('getMinimumSize');\r\n }\r\n\r\n close(): Promise<void> {\r\n return this.invokeMethod('close');\r\n }\r\n\r\n setZoomFactor(factor: number): Promise<void> {\r\n return this.invokeMethod('setZoomFactor', factor);\r\n }\r\n\r\n async setup(options: SetupOptions): Promise<void> {\r\n if (options.alwaysOnTop) {\r\n await this.setAlwaysOnTop(true);\r\n }\r\n await this.setResizable(!!options.resizable);\r\n await this.setMovable(!!options.movable);\r\n if (options.width && options.height) {\r\n await this.setSize(options.width, options.height);\r\n }\r\n if (options.minWidth && options.minHeight) {\r\n await this.setMinimumSize(options.minWidth, options.minHeight);\r\n }\r\n if (options.maxWidth && options.maxHeight) {\r\n await this.setMaximumSize(options.maxWidth, options.maxHeight);\r\n }\r\n if (options.center) {\r\n await this.center();\r\n }\r\n }\r\n\r\n async setProxy(config: Config): Promise<void> {\r\n return await this.invokeMethod('setProxy',config);\r\n }\r\n}\r\n\r\nconst BrowserWindowApi = new BrowserWindowApiImpl();\r\nexport {\r\n BrowserWindowApi,\r\n BrowserWindowApiMethods,\r\n OpenUrlOptions,\r\n SetPositionOptions,\r\n BrowserWindowApiEvent,\r\n AlignPosition,\r\n};\r\n","import {AppNotification} from \"../model/AppNotification\";\r\nimport {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\n\r\ninterface INotificationApi {\r\n send(notification: AppNotification): Promise<void>;\r\n\r\n hide(): Promise<void>;\r\n}\r\n\r\ntype NotificationApiMethods = keyof INotificationApi\r\n\r\nenum NotificationApiEvent {\r\n CONFIRM = \"event::cn.widgetjs.core.notification.confirm\",\r\n CANCEL = \"event::cn.widgetjs.core.notification.cancel\",\r\n HIDE = \"event::cn.widgetjs.core.notification.hide\",\r\n}\r\n\r\nclass NotificationApiImpl extends BaseApi<NotificationApiMethods> implements INotificationApi {\r\n\r\n // static async url(url: string, duration: number = -1) {\r\n // this.invoke(Channel.NOTIFICATION, new AppNotification({\r\n // url, message: \"\",\r\n // duration,\r\n // type: \"url\",\r\n // }));\r\n // }\r\n\r\n /**\r\n * 来电\r\n * @param avatar 头像地址\r\n * @param audio 音频地址\r\n * @param title 标题文件\r\n * @param message 初始消息\r\n * @param lyric 歌词字符串\r\n */\r\n async call(avatar: string, audio: string, title: string, message: string, lyric: string) {\r\n await this.invoke(new AppNotification({\r\n avatar,\r\n audio,\r\n message,\r\n title,\r\n duration: -1,\r\n lyric,\r\n type: \"call\",\r\n }));\r\n }\r\n\r\n async send(notification: AppNotification) {\r\n return this.invokeMethod('send', notification);\r\n }\r\n\r\n async reminder(title: string, message: string, icon: string, cancelButtonText: string,\r\n confirmButtonText: string, cancelBroadcast: string, confirmBroadcast: string, duration: number = 5000) {\r\n return await this.send(new AppNotification({\r\n icon,\r\n message,\r\n title,\r\n duration,\r\n cancelButtonText,\r\n confirmButtonText,\r\n cancelBroadcast,\r\n confirmBroadcast,\r\n type: \"reminder\",\r\n }))\r\n }\r\n\r\n async advanceCountdown(message: string, targetTime: string, title?: string) {\r\n return await this.send(new AppNotification({\r\n title,\r\n message,\r\n targetTime,\r\n type: \"advance-countdown\"\r\n }))\r\n }\r\n\r\n async countdown(message: string, targetTime: string) {\r\n await this.send(new AppNotification({\r\n message,\r\n targetTime,\r\n backgroundColor: 'rgba(0,0,0,0.5)',\r\n duration: -1,\r\n type: \"countdown\"\r\n }));\r\n }\r\n\r\n async success(message: string, duration: number = 5000) {\r\n await this.send(new AppNotification({\r\n message,\r\n type: \"success\",\r\n icon: \"check_circle_line\",\r\n duration\r\n }));\r\n }\r\n\r\n async error(message: string, duration: number = 5000) {\r\n await this.send(new AppNotification({\r\n message,\r\n type: \"error\",\r\n icon: \"close_circle_line\",\r\n duration\r\n }));\r\n }\r\n\r\n async warning(message: string, duration: number = 5000) {\r\n await this.send(new AppNotification({\r\n message,\r\n type: \"warning\",\r\n icon: \"warning_line\",\r\n duration\r\n }));\r\n }\r\n\r\n async info(message: string, duration: number = 5000) {\r\n await this.send(new AppNotification({\r\n message,\r\n type: \"info\",\r\n icon: \"information_line\",\r\n duration\r\n }));\r\n }\r\n\r\n /**\r\n * 隐藏通知\r\n */\r\n async hide() {\r\n await this.invokeMethod('hide');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.NOTIFICATION;\r\n }\r\n}\r\n\r\nconst NotificationApi: NotificationApiImpl = new NotificationApiImpl();\r\nexport {NotificationApi, NotificationApiMethods, NotificationApiEvent}\r\n","import {Channel} from \"./Channel\";\r\nimport {WidgetParams} from \"../model/WidgetParams\";\r\nimport {BaseApi} from \"./BaseApi\";\r\nimport {DeployMode} from '../model/DeployMode';\r\nimport {Widget} from '../model/Widget';\r\nimport {DeployedWidget} from \"../model/DeployedWidget\";\r\n\r\ninterface IDeployedWidgetApi {\r\n removeDeployedWidget(id: string): Promise<void>;\r\n\r\n removeDeployedWidgetByName(name: string): Promise<DeployedWidget[]>;\r\n\r\n getDeployedWidgets(): Promise<DeployedWidget[]>;\r\n\r\n openDevTools(id: string): Promise<void>;\r\n\r\n openConfigPage(id: string): Promise<void>;\r\n\r\n registerActiveShortcut(id: string, shortcut: string): Promise<boolean>;\r\n\r\n setProxy(id: string, proxy: string): Promise<boolean>;\r\n\r\n getDeployedWidget(id: string): Promise<DeployedWidget>;\r\n\r\n addWidget(widgetName: string, hostMode: DeployMode): Promise<Widget[]>;\r\n}\r\n\r\ntype DeployedWidgetApiMethods = keyof IDeployedWidgetApi;\r\n\r\nclass DeployedWidgetApiImpl extends BaseApi<DeployedWidgetApiMethods> implements IDeployedWidgetApi {\r\n getChannel(): string {\r\n return Channel.DEPLOYED_WIDGET;\r\n }\r\n\r\n /**\r\n * 移除组件\r\n * @param id\r\n */\r\n async removeDeployedWidget(id: string) {\r\n return this.invokeMethod('removeDeployedWidget', id)\r\n }\r\n\r\n\r\n addWidget(widgetName: string, hostMode: DeployMode): Promise<Widget[]> {\r\n return this.invokeMethod('addWidget', widgetName, hostMode);\r\n }\r\n\r\n /**\r\n * 通过组件名移除已添加的组件\r\n * @param name 组件名\r\n */\r\n async removeDeployedWidgetByName(name: string): Promise<DeployedWidget[]> {\r\n return this.invokeMethod('removeDeployedWidgetByName', name)\r\n }\r\n\r\n /**\r\n * 获取已添加的组件\r\n * @param name 组件名,可以不传\r\n */\r\n async getDeployedWidgets(name?: string): Promise<DeployedWidget[]> {\r\n return this.invokeMethod('getDeployedWidgets', name)\r\n }\r\n\r\n async getDeployedWidget(id: string): Promise<DeployedWidget> {\r\n return this.invokeMethod('getDeployedWidget', id)\r\n }\r\n\r\n /**\r\n * Opens the dev tools for a widget with the specified ID.\r\n *\r\n * @param {string} widgetId - The ID of the widget to open the dev tools for.\r\n * @return {Promise} A Promise that resolves when the dev tools are opened.\r\n */\r\n async openDevTools(widgetId: string) {\r\n return this.invokeMethod('openDevTools', widgetId)\r\n }\r\n\r\n async openConfigPage(widgetId: string, params?: WidgetParams) {\r\n return this.invokeMethod('openConfigPage', widgetId, params)\r\n }\r\n\r\n /**\r\n * 注册激活、呼出、置顶组件快捷键\r\n * @param widgetId 组件id\r\n * @param shortcut 如果传空或者不传,则会取消快捷键。更多快捷键配置,请查看Accelerator用法\r\n * https://www.electronjs.org/docs/latest/api/accelerator\r\n */\r\n async registerActiveShortcut(widgetId: string, shortcut?: string): Promise<boolean> {\r\n return this.invokeMethod('registerActiveShortcut', widgetId, shortcut)\r\n }\r\n\r\n async setProxy(widgetId: string, proxy: string): Promise<boolean> {\r\n return this.invokeMethod('setProxy', widgetId, proxy)\r\n }\r\n\r\n}\r\n\r\nconst DeployedWidgetApi = new DeployedWidgetApiImpl();\r\nexport {DeployedWidgetApi, DeployedWidgetApiMethods}\r\n","import {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\nimport {Point} from \"../model/msic/graphics\";\r\n\r\ninterface IDeviceApi {\r\n getCursorScreenPoint(): Promise<Point>;\r\n\r\n isAllKeyReleased(): Promise<boolean>;\r\n}\r\n\r\ntype DeviceApiMethods = keyof IDeviceApi;\r\n\r\nclass DeviceApiImpl extends BaseApi<DeviceApiMethods> implements IDeviceApi {\r\n\r\n /**\r\n * 获取当前鼠标位置\r\n */\r\n async getCursorScreenPoint(): Promise<Point> {\r\n return this.invokeMethod('getCursorScreenPoint');\r\n }\r\n\r\n /**\r\n * 判断是否所有按键都已经释放\r\n */\r\n async isAllKeyReleased(): Promise<boolean> {\r\n return this.invokeMethod('isAllKeyReleased');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.DEVICE;\r\n }\r\n}\r\n\r\n\r\nconst DeviceApi: IDeviceApi = new DeviceApiImpl();\r\n\r\nexport {DeviceApi, DeviceApiMethods}\r\n","import {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\n\r\n\r\ninterface IClipboardApi {\r\n getSelectedText(): Promise<string | undefined>;\r\n\r\n getText(): Promise<string | undefined>;\r\n}\r\n\r\ntype ClipboardApiMethods = keyof IClipboardApi;\r\n\r\nenum ClipboardApiEvent {\r\n CHANGED = 'clipboard-changed'\r\n}\r\n\r\nclass ClipboardApiImpl extends BaseApi<ClipboardApiMethods> implements IClipboardApi {\r\n\r\n async getSelectedText(): Promise<string | undefined> {\r\n return this.invokeMethod('getSelectedText');\r\n }\r\n\r\n async getText(): Promise<string | undefined> {\r\n return this.invokeMethod('getText');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.CLIPBOARD;\r\n }\r\n\r\n}\r\n\r\n\r\nconst ClipboardApi: IClipboardApi = new ClipboardApiImpl();\r\n\r\nexport {ClipboardApi, ClipboardApiMethods, ClipboardApiEvent}\r\n","export class ApiConstants {\r\n static readonly CONFIG_LAUNCH_AT_STARTUP = \"CONFIG_LAUNCH_AT_STARTUP\";\r\n static readonly CONFIG_WIDGET_TITLE_COLOR = \"CONFIG_WIDGET_TITLE_COLOR\";\r\n static readonly CONFIG_DEBUG_MODE = \"cn.widgetjs.config.debug\";\r\n static readonly CONFIG_GRID_CELL_SIZE = \"cn.widgetjs.config.grid.size\";\r\n static readonly SHORTCUT_PIN_DESKTOP_WIDGETS = \"cn.widgetjs.config.shortcut.pin_desktop_widgets\";\r\n}\r\n","import {BaseApi} from \"./BaseApi\";\r\nimport {Channel} from \"./Channel\";\r\n\r\ninterface IShortcutApi {\r\n /**\r\n * register shortcut for widget, if registered successful, {@link BroadcastEvent} will be sent once shortcut hits\r\n * @see https://www.electronjs.org/docs/latest/api/accelerator\r\n * @example Ctrl+Meta+Y, Meta for windows key\r\n * @param shortcut\r\n * @return true if register success\r\n */\r\n register(shortcut: string): Promise<boolean>\r\n\r\n unregister(shortcut: string): void\r\n}\r\n\r\ntype ShortcutApiMethods = keyof IShortcutApi;\r\n\r\nenum ShortcutApiEvent {\r\n TRIGGERED = \"channel::cn.widgetjs.core.shortcut.triggered\"\r\n}\r\n\r\n\r\nclass ShortcutApiImpl extends BaseApi<ShortcutApiMethods> implements IShortcutApi {\r\n getChannel(): string {\r\n return Channel.SHORTCUT;\r\n }\r\n\r\n async register(shortcut: string):Promise<boolean> {\r\n return await this.invokeMethod('register', shortcut);\r\n }\r\n\r\n async unregister(shortcut: string) {\r\n return await this.invokeMethod('unregister', shortcut);\r\n }\r\n\r\n}\r\n\r\nconst ShortcutApi: IShortcutApi = new ShortcutApiImpl();\r\nexport {ShortcutApi, ShortcutApiMethods, ShortcutApiEvent}\r\n","import {Channel} from './Channel';\r\nimport {BaseApi} from './BaseApi';\r\nimport type {\r\n CPUUsage,\r\n IOCounters,\r\n BlinkMemoryInfo,\r\n HeapStatistics,\r\n ProcessMemoryInfo,\r\n SystemMemoryInfo\r\n} from 'electron';\r\n\r\ninterface IProcessApi {\r\n getCPUUsage(): Promise<CPUUsage>;\r\n\r\n getIOCounters(): Promise<IOCounters>;\r\n\r\n getBlinkMemoryInfo(): Promise<BlinkMemoryInfo>;\r\n\r\n getHeapStatistics(): Promise<HeapStatistics>;\r\n\r\n /**\r\n * // On macOS -> '10.13.6'\r\n * // On Windows -> '10.0.17763'\r\n * // On Linux -> '4.15.0-45-generic'\r\n */\r\n getSystemVersion(): Promise<string>;\r\n\r\n getProcessMemoryInfo(): Promise<ProcessMemoryInfo>;\r\n\r\n getSystemMemoryInfo(): Promise<SystemMemoryInfo>\r\n}\r\n\r\ntype ProcessApiMethods = keyof IProcessApi;\r\n\r\nclass ProcessApiImpl extends BaseApi<ProcessApiMethods> implements IProcessApi {\r\n getChannel(): string {\r\n return Channel.PROCESS;\r\n }\r\n\r\n getBlinkMemoryInfo(): Promise<BlinkMemoryInfo> {\r\n return this.invokeMethod('getBlinkMemoryInfo')\r\n }\r\n\r\n getCPUUsage(): Promise<CPUUsage> {\r\n return this.invokeMethod('getCPUUsage');\r\n }\r\n\r\n getHeapStatistics(): Promise<HeapStatistics> {\r\n return this.invokeMethod('getHeapStatistics');\r\n }\r\n\r\n getIOCounters(): Promise<IOCounters> {\r\n return this.invokeMethod('getIOCounters');\r\n }\r\n\r\n getProcessMemoryInfo(): Promise<ProcessMemoryInfo> {\r\n return this.invokeMethod('getProcessMemoryInfo');\r\n }\r\n\r\n getSystemMemoryInfo(): Promise<SystemMemoryInfo> {\r\n return this.invokeMethod('getSystemMemoryInfo');\r\n }\r\n\r\n getSystemVersion(): Promise<string> {\r\n return this.invokeMethod('getSystemVersion');\r\n }\r\n\r\n}\r\n\r\nconst ProcessApi: IProcessApi = new ProcessApiImpl();\r\n\r\nexport {ProcessApi, ProcessApiMethods};\r\n","import { Channel } from './Channel';\r\nimport { BaseApi } from './BaseApi';\r\nimport {key} from \"localforage\";\r\nimport {ElectronUtils} from \"../utils/ElectronUtils\";\r\n\r\ninterface IAppApi {\r\n setConfig(key: string, value: string | number | boolean): Promise<any>;\r\n\r\n getConfig(key: string, defaultValue: string | number | boolean): Promise<string | number | boolean>;\r\n\r\n getVersion(): Promise<string>;\r\n\r\n getPreloadPath(): Promise<string>;\r\n\r\n getAppPath(): Promise<string>;\r\n\r\n openAddWidgetWindow(): Promise<void>;\r\n\r\n openSettingWindow(): Promise<void>;\r\n\r\n getIconFile(): Promise<string>;\r\n\r\n /**\r\n * 应用是否是从微软商店下载\r\n */\r\n isWindowsStore(): Promise<boolean>;\r\n\r\n}\r\n\r\ntype AppApiMethods = keyof IAppApi;\r\n\r\nenum AppApiEvent {\r\n CONFIG_CHANGED = 'event::cn.widgetjs.core.app.config.changed',\r\n MOVING_GRID_WINDOW = 'event::cn.widgetjs.core.app.moving.grid.window',\r\n STOP_MOVING_GRID_WINDOW = 'event::cn.widgetjs.core.app.moving.grid.window.stop',\r\n}\r\n\r\nenum AppApiConstants {\r\n CONFIG_GRID_CELL_SIZE = 'cn.widgetjs.config.grid.size',\r\n}\r\n\r\nclass AppApiImpl extends BaseApi<AppApiMethods> implements IAppApi {\r\n isWindowsStore(): Promise<boolean> {\r\n return this.invokeMethod('isWindowsStore');\r\n }\r\n getAppPath(): Promise<string> {\r\n return this.invokeMethod('getAppPath');\r\n }\r\n\r\n async getIconFile(): Promise<string> {\r\n return this.invokeMethod('getIconFile');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.APP;\r\n }\r\n\r\n async setConfig(key: string, value: string | number | boolean) {\r\n return await this.invokeMethod('setConfig', key, value);\r\n }\r\n\r\n async getConfig(\r\n key: string | AppApiConstants,\r\n defaultValue: string | number | boolean,\r\n ): Promise<string | number | boolean> {\r\n const value = await this.invokeMethod('getConfig', key);\r\n if (value === null || value === undefined) {\r\n return defaultValue;\r\n }\r\n if (typeof defaultValue == 'boolean') {\r\n return value === 'true';\r\n }\r\n\r\n if (typeof defaultValue == 'number') {\r\n return Number(value);\r\n }\r\n return value;\r\n }\r\n\r\n async openAddWidgetWindow() {\r\n return this.invokeMethod('openAddWidgetWindow');\r\n }\r\n\r\n /**\r\n * 获取应用版本号,格式为 x.y.z\r\n */\r\n async getVersion(): Promise<string> {\r\n return this.invokeMethod('getVersion');\r\n }\r\n\r\n async getPreloadPath(): Promise<string> {\r\n return this.invokeMethod('getPreloadPath');\r\n }\r\n\r\n async openSettingWindow() {\r\n return this.invokeMethod('openSettingWindow');\r\n }\r\n\r\n}\r\n\r\nconst AppApi: IAppApi = new AppApiImpl();\r\n\r\nexport {AppApi, AppApiEvent, AppApiMethods, AppApiConstants};\r\n","import {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\n\r\ninterface IDialogApi {\r\n pickFile(extensions?: string[]): Promise<string | undefined>\r\n\r\n pickFolder(): Promise<string | undefined>\r\n}\r\n\r\ntype DialogApiMethods = keyof IDialogApi;\r\n\r\nclass DialogApiImpl extends BaseApi<DialogApiMethods> implements IDialogApi {\r\n\r\n getChannel(): string {\r\n return Channel.DIALOG;\r\n }\r\n\r\n /**\r\n * 选取单个文件\r\n * @param extensions 允许的文件后缀格式,如:[\"txt\",\"docx\",\"gif\"]\r\n */\r\n pickFile(extensions: string[] | undefined): Promise<string | undefined> {\r\n return this.invokeMethod('pickFile', extensions);\r\n }\r\n\r\n pickFolder(): Promise<string | undefined> {\r\n return this.invokeMethod('pickFolder');\r\n }\r\n\r\n}\r\n\r\n\r\nconst DialogApi: IDialogApi = new DialogApiImpl();\r\nexport {DialogApiMethods, DialogApi,}\r\n","import {BaseApi} from './BaseApi';\r\nimport {Channel} from './Channel';\r\n\r\ntype BaseType = string | number | boolean\r\n\r\ninterface IStoreApi {\r\n get<T extends BaseType>(key: string, defaultValue?: T): Promise<T | null>;\r\n\r\n set(key: string, value: BaseType | object): Promise<string>;\r\n\r\n getObject<T>(key: string, defaultValue?: T): Promise<T | undefined>;\r\n\r\n delete(key: string): Promise<void>;\r\n}\r\n\r\ntype StoreApiMethods = keyof IStoreApi;\r\n\r\nclass StoreApiImpl extends BaseApi<StoreApiMethods> implements IStoreApi {\r\n getChannel(): string {\r\n return Channel.STORE;\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n return this.invokeMethod('delete', key);\r\n }\r\n\r\n async get<T extends BaseType>(key: string, defaultValue?: T): Promise<T | null> {\r\n const result = await this.invokeMethod('get', key);\r\n if (result == null && defaultValue != undefined) {\r\n return defaultValue;\r\n }\r\n return result\r\n }\r\n\r\n async getObject<T>(key: string, defaultValue?: T): Promise<T | undefined> {\r\n const result = await this.invokeMethod('get', key)\r\n if (result) {\r\n return JSON.parse(result)\r\n }\r\n if (defaultValue != undefined) {\r\n return defaultValue;\r\n }\r\n return undefined;\r\n }\r\n\r\n async set(key: string, value: BaseType | object): Promise<string> {\r\n if (typeof value == 'object') {\r\n return this.invokeMethod('set', key, JSON.stringify(value))\r\n }\r\n return this.invokeMethod('set', key, value)\r\n }\r\n\r\n}\r\n\r\nconst StoreApi: IStoreApi = new StoreApiImpl();\r\nexport {StoreApi, StoreApiMethods}\r\n","import {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\n\r\ninterface ILogApi {\r\n info(...data: any[]): void;\r\n\r\n error(...data: any[]): void;\r\n\r\n warn(...data: any[]): void;\r\n\r\n log(...data: any[]): void;\r\n\r\n json(data: any): void;\r\n}\r\n\r\ntype LogApiMethods = keyof ILogApi;\r\n\r\nclass LogApiImpl extends BaseApi<LogApiMethods> implements ILogApi {\r\n\r\n getChannel(): string {\r\n return Channel.LOG\r\n }\r\n\r\n info(...data: any[]) {\r\n console.info(...data)\r\n this.invokeMethod('info', ...data)\r\n }\r\n\r\n error(...data: any[]) {\r\n console.error(...data)\r\n this.invokeMethod('error', ...data)\r\n }\r\n\r\n warn(...data: any[]) {\r\n console.warn(...data)\r\n this.invokeMethod('warn', ...data)\r\n }\r\n\r\n log(...data: any[]) {\r\n console.log(...data)\r\n this.invokeMethod('log', ...data)\r\n }\r\n\r\n json(data: any): void {\r\n const json = JSON.stringify(data, null, 2);\r\n this.log(json)\r\n }\r\n}\r\n\r\nconst LogApi: ILogApi = new LogApiImpl();\r\nexport {LogApi, LogApiMethods}\r\n","import { Channel } from './Channel';\r\nimport { BaseApi } from './BaseApi';\r\nimport { FileTypeResult } from 'file-type';\r\nimport { Metadata } from '../types';\r\n\r\nexport interface SystemFile {\r\n isDir: boolean;\r\n name: string;\r\n absolutePath: string;\r\n /**\r\n * mine type\r\n */\r\n type: string;\r\n children?: SystemFile[];\r\n}\r\n\r\nexport interface FileInfo {\r\n isDir: boolean;\r\n name: string;\r\n absolutePath: string;\r\n /**\r\n * mine类型\r\n */\r\n type?: string;\r\n /**\r\n * 格式\r\n */\r\n extension?: string;\r\n}\r\n\r\nexport interface ReadDirOptions {\r\n ignoreDir?: boolean;\r\n traverseDir?: boolean;\r\n}\r\n\r\nexport interface DownloadUrlOptions {\r\n url: string;\r\n savePath: string;\r\n fileName: string;\r\n /**\r\n * true - overwrite existing\r\n * false - ignore\r\n */\r\n overwrite?: boolean;\r\n}\r\n\r\ninterface IFileApi {\r\n readDirectory(path: string, options?: ReadDirOptions): Promise<SystemFile[]>;\r\n\r\n isDirectory(filePath: string): Promise<boolean>;\r\n\r\n getMimeType(absoluteFilePath: string): Promise<FileTypeResult>;\r\n\r\n downloadUrl(option: DownloadUrlOptions): Promise<string>;\r\n\r\n exists(filePath: string): Promise<boolean>;\r\n\r\n delete(filePath: string): Promise<boolean>;\r\n\r\n getInfo(absoluteFilePath: string): Promise<FileInfo>;\r\n\r\n /**\r\n * 显示系统文件夹\r\n * @param absoluteFolderPath\r\n */\r\n showSystemFolder(absoluteFolderPath: string): void;\r\n\r\n /**\r\n * @param childPath\r\n * @example childPath = \"/images/\" will return \"C:/Users/username/Documents/widgets/com/exmaple/widget/images\"\r\n * @see https://sharp.pixelplumbing.com/api-input\r\n * @return folder relative to system user's documents folder\r\n */\r\n getDocumentFolder(childPath?: string): Promise<string>;\r\n\r\n /**\r\n *\r\n * @param filePath absolute path\r\n */\r\n getPictureMetadata(filePath: string): Promise<Metadata>;\r\n\r\n /**\r\n * 移动文件\r\n * @param form\r\n * @param to\r\n */\r\n move(form: string, to: string): Promise<string>;\r\n\r\n /**\r\n * read file contents\r\n * @param filePath\r\n * @return base64 encoded string\r\n */\r\n readFile(filePath: string): Promise<string>;\r\n}\r\n\r\ntype FileApiMethods = keyof IFileApi;\r\n\r\nclass FileApiImpl extends BaseApi<FileApiMethods> implements IFileApi {\r\n async delete(filePath: string): Promise<boolean> {\r\n return this.invokeMethod('delete', filePath);\r\n }\r\n\r\n async getPictureMetadata(filePath: string): Promise<Metadata> {\r\n return this.invokeMethod('getPictureMetadata', filePath);\r\n }\r\n\r\n async move(form: string, to: string): Promise<string> {\r\n return this.invokeMethod('move', form, to);\r\n }\r\n\r\n async isDirectory(filePath: string): Promise<boolean> {\r\n return this.invokeMethod('isDirectory', filePath);\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.FILE;\r\n }\r\n\r\n async readDirectory(path: string, options?: ReadDirOptions): Promise<SystemFile[]> {\r\n return this.invokeMethod('readDirectory', path, options);\r\n }\r\n\r\n asyncdelete(filePath: string): Promise<boolean> {\r\n return this.invokeMethod('delete', filePath);\r\n }\r\n\r\n async downloadUrl(options: DownloadUrlOptions): Promise<string> {\r\n return this.invokeMethod('downloadUrl', options);\r\n }\r\n\r\n async exists(filePath: string): Promise<boolean> {\r\n return this.invokeMethod('exists', filePath);\r\n }\r\n\r\n async readFile(filePath: string): Promise<string> {\r\n return this.invokeMethod('readFile', filePath);\r\n }\r\n\r\n async getDocumentFolder(filePath?: string): Promise<string> {\r\n return this.invokeMethod('getDocumentFolder', filePath);\r\n }\r\n\r\n async getMimeType(absoluteFilePath: string): Promise<FileTypeResult> {\r\n return this.invokeMethod('getMimeType', absoluteFilePath);\r\n }\r\n\r\n async getInfo(absoluteFilePath: string): Promise<FileInfo> {\r\n return this.invokeMethod('getInfo', absoluteFilePath);\r\n }\r\n\r\n async showSystemFolder(absoluteFolderPath: string): Promise<void> {\r\n return this.invokeMethod('showSystemFolder', absoluteFolderPath);\r\n }\r\n}\r\n\r\n\r\nconst FileApi: IFileApi = new FileApiImpl();\r\n\r\nexport {FileApi, FileApiMethods}\r\n"],"mappings":"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","names":["HostedMode","DeployMode","langCode","WidgetKeyword","WebSocketEventType","value","ThemeMode","NotificationSize","Gravity","Channel","WidgetApiEvent","BrowserWindowApiEvent","NotificationApiEvent","ClipboardApiEvent","ShortcutApiEvent","AppApiEvent","AppApiConstants"]}
|
|
1
|
+
{"version":3,"sources":["../src/model/DeployMode.ts","../src/utils/LanguageUtils.ts","../src/model/Page.ts","../src/model/Widget.ts","../src/model/event/BroadcastEvent.ts","../src/model/event/WebSocketEvent.ts","../src/model/WidgetData.ts","../src/model/WidgetTheme.ts","../src/router/encoding.ts","../src/router/query.ts","../src/model/WidgetParams.ts","../src/model/AppNotification.ts","../src/model/DeployedPage.ts","../src/model/DeployedWidget.ts","../src/model/msic/graphics.ts","../src/utils/normalizeUrl.ts","../src/utils/WidgetUrlUtils.ts","../src/model/WidgetPackage.ts","../src/utils/ElectronUtils.ts","../src/grid/GridSystem.ts","../src/api/ElectronApi.ts","../src/api/WidgetDataApi.ts","../src/api/Channel.ts","../src/api/BaseApi.ts","../src/api/BroadcastApi.ts","../src/api/WidgetApi.ts","../src/api/BrowserWindowApi.ts","../src/api/NotificationApi.ts","../src/api/DeployedWidgetApi.ts","../src/api/DeviceApi.ts","../src/api/ClipboardApi.ts","../src/api/ApiConstants.ts","../src/api/ShortcutApi.ts","../src/api/ProcessApi.ts","../src/api/AppApi.ts","../src/api/DialogApi.ts","../src/api/StoreApi.ts","../src/api/LogApi.ts","../src/api/FileApi.ts"],"sourcesContent":["/**\n * @deprecated use DeployedMode instead\n */\nexport enum HostedMode {\n NORMAL = 0x000001,\n /**\n * 悬浮窗\n */\n OVERLAP = 0x000010,\n WALLPAPER = 0x000100,\n SCREEN = 0x001000,\n /**\n * 后台组件,没有界面,一般在后台执行定时任务\n */\n BACKGROUND = 0x010000,\n /**\n * 页面\n */\n PAGE = 0x100000,\n ALL = 0x111111,\n}\n\nexport enum DeployMode {\n NORMAL = 0x000001,\n /**\n * 悬浮窗\n */\n OVERLAP = 0x000010,\n BACKGROUND = 0x010000,\n ALL = 0x111111,\n}\n","import {LanguageCode, LanguageTextMap} from \"../lang/LanguageCode\";\r\n\r\n/**\r\n * 根据语言环境获取文本\r\n * @param langMap 对象\r\n * @param {LanguageCode} langCode 语言环境 例如:zh-CN,en-US\r\n * @param fallbackToBrowser\r\n */\r\nexport function getTextByLanguageCode(langMap: LanguageTextMap, langCode?: LanguageCode, fallbackToBrowser: boolean = true): string | undefined {\r\n let result: string | undefined;\r\n if (langCode) {\r\n if (langCode in langMap) {\r\n return langMap[langCode]\r\n }\r\n }\r\n // fallback to browser default language\r\n if (result == undefined && fallbackToBrowser) {\r\n if (typeof navigator != 'undefined' && navigator.languages) {\r\n const langCode = navigator.language as LanguageCode;\r\n result = getTextByLanguageCode(langMap, langCode, false);\r\n if (result != undefined) {\r\n return result;\r\n }\r\n }\r\n }\r\n\r\n // fallback to first language\r\n if (result == undefined) {\r\n let langCode = Object.keys(langMap);\r\n if (langCode.length > 0) {\r\n return langMap[langCode[0] as LanguageCode];\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n","import {LanguageCode, LanguageTextMap} from '../lang/LanguageCode';\r\nimport {getTextByLanguageCode} from '../utils/LanguageUtils';\r\nimport {WidgetKeyword} from './Widget';\r\nimport {WidgetPermission} from \"../permission/permission\";\r\n\r\nexport type MetaInfo = { [key: string]: string | number | boolean };\r\n\r\nexport interface IWindowSize {\r\n width: number;\r\n height: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n minWidth?: number;\r\n minHeight?: number;\r\n}\r\n\r\nexport interface IPageOptions extends IWindowSize {\r\n name: string;\r\n /**\r\n * 当showInSearch为true时,此项必填\r\n */\r\n title: LanguageTextMap;\r\n /**\r\n * 当showInSearch为true时,此项必填\r\n */\r\n description?: LanguageTextMap;\r\n /**\r\n * 当showInSearch为true时,此项必填\r\n */\r\n keywords?: WidgetKeyword[];\r\n lang: LanguageCode;\r\n packageName?: string;\r\n /**\r\n * 当showInSearch为true时,此项必填\r\n */\r\n previewImage?: string;\r\n /**\r\n * 是否在搜索中显示\r\n */\r\n showInSearch?: boolean;\r\n /**\r\n * 悬浮窗模式 是否可移动\r\n */\r\n movable?: boolean;\r\n resizable?: boolean;\r\n backgroundThrottling?: boolean;\r\n security?: boolean;\r\n webviewTag?: boolean;\r\n path: string;\r\n /**\r\n * 是否只能添加一次\r\n */\r\n singleton?: boolean;\r\n permissions?: WidgetPermission[];\r\n meta?: MetaInfo;\r\n broadcastChannels?: string[];\r\n}\r\n\r\nexport interface IPage {\r\n //窗口名称,名称与包名类似,e.g. com.example.countdown\r\n readonly name: string;\r\n\r\n /**\r\n * 窗口标题,显示在界面上的,\r\n * https://zh.m.wikipedia.org/zh-hans/ISO_639-1\r\n */\r\n readonly title: LanguageTextMap;\r\n readonly permissions: WidgetPermission[];\r\n readonly webviewTag: boolean;\r\n /**\r\n * 窗口介绍\r\n */\r\n readonly description: LanguageTextMap;\r\n readonly keywords: WidgetKeyword[];\r\n /**\r\n * 组件默认语言\r\n */\r\n readonly lang: LanguageCode;\r\n readonly width: number;\r\n packageName?: string | null;\r\n readonly height: number;\r\n readonly maxWidth: number;\r\n readonly maxHeight: number;\r\n readonly minWidth: number;\r\n readonly minHeight: number;\r\n readonly movable: boolean;\r\n readonly singleton: boolean;\r\n readonly resizable: boolean;\r\n readonly path: string;\r\n readonly meta: { [key: string]: string | number | boolean };\r\n readonly backgroundThrottling: boolean;\r\n /**\r\n * 预览图片,可以是GIF\r\n */\r\n readonly previewImage?: string;\r\n}\r\n\r\nexport class Page implements IPage {\r\n //窗口名称,名称与包名类似,e.g. com.example.countdown\r\n readonly name: string;\r\n\r\n /**\r\n * 窗口标题,显示在界面上的,\r\n * https://zh.m.wikipedia.org/zh-hans/ISO_639-1\r\n */\r\n readonly title: LanguageTextMap;\r\n /**\r\n * 窗口介绍\r\n */\r\n readonly description: LanguageTextMap;\r\n readonly keywords: WidgetKeyword[];\r\n readonly security: boolean;\r\n readonly permissions: WidgetPermission[];\r\n /**\r\n * 组件默认语言\r\n */\r\n readonly lang: LanguageCode;\r\n readonly width: number;\r\n packageName?: string | null;\r\n readonly height: number;\r\n readonly maxWidth: number;\r\n readonly webviewTag: boolean;\r\n readonly maxHeight: number;\r\n readonly minWidth: number;\r\n readonly minHeight: number;\r\n readonly movable: boolean;\r\n readonly singleton: boolean;\r\n readonly resizable: boolean;\r\n readonly path: string;\r\n readonly meta: { [key: string]: string | number | boolean };\r\n readonly backgroundThrottling: boolean;\r\n /**\r\n * 预览图片,可以是GIF\r\n */\r\n readonly previewImage?: string;\r\n\r\n constructor(options: IPageOptions) {\r\n this.name = options.name;\r\n this.title = options.title;\r\n this.description = options.description ?? {};\r\n this.keywords = options.keywords ?? [];\r\n this.lang = options.lang;\r\n this.width = options.width;\r\n this.height = options.height;\r\n this.movable = options.movable ?? true;\r\n this.resizable = options.resizable ?? true;\r\n this.maxWidth = options.maxWidth ?? options.width;\r\n this.maxHeight = options.maxHeight ?? options.height;\r\n this.minWidth = options.minWidth ?? options.width;\r\n this.minHeight = options.minHeight ?? options.height;\r\n this.backgroundThrottling = options.backgroundThrottling ?? true;\r\n this.packageName = options.packageName;\r\n this.singleton = options.singleton ?? false;\r\n this.previewImage = options.previewImage;\r\n this.path = options.path;\r\n this.meta = options.meta ?? {};\r\n this.security = options.security ?? false;\r\n this.webviewTag = options.webviewTag ?? false;\r\n this.permissions = options.permissions ?? [];\r\n }\r\n\r\n /**\r\n * 获取组件标题\r\n * @param lang 语言环境,不传则获取默认语言\r\n */\r\n getTitle(lang?: LanguageCode): string | undefined {\r\n return getTextByLanguageCode(this.title, lang);\r\n }\r\n\r\n /**\r\n * 获取组件描述\r\n * @param lang 语言环境,不传则获取默认标题\r\n */\r\n getDescription(lang?: LanguageCode): string | undefined {\r\n if (this.description == undefined) return undefined;\r\n return getTextByLanguageCode(this.description, lang);\r\n }\r\n\r\n static parseJSON(json: string): Page {\r\n const object = JSON.parse(json);\r\n return this.parseObject(object);\r\n }\r\n\r\n static parseObject(obj: any): Page {\r\n let widget = new Page({\r\n path: '',\r\n description: {},\r\n height: 0,\r\n keywords: [],\r\n lang: 'zh-CN',\r\n name: '',\r\n previewImage: '',\r\n title: {},\r\n width: 0,\r\n });\r\n Object.assign(widget, obj);\r\n return widget;\r\n }\r\n\r\n isResizable(): boolean {\r\n return (\r\n this.resizable ||\r\n !(\r\n this.minWidth == this.width &&\r\n this.maxWidth == this.width &&\r\n this.minHeight == this.height &&\r\n this.maxHeight == this.height\r\n )\r\n );\r\n }\r\n\r\n}\r\n","import { DeployMode } from './DeployMode';\r\nimport { Page, IPageOptions, IWindowSize } from './Page';\r\nimport { LanguageTextMap } from '../lang/LanguageCode';\r\nimport { SocialLink } from './SocialInfo';\r\n\r\nexport interface IWidgetOptions extends IWindowSize, IPageOptions {\r\n supportDeployMode?: DeployMode;\r\n configPagePath?: string;\r\n previewImage: string;\r\n description: LanguageTextMap;\r\n keywords: WidgetKeyword[];\r\n /**\r\n */\r\n routes?: WidgetRoute[];\r\n /**\r\n * 一般用于填写教程链接\r\n */\r\n socialLinks?: SocialLink[];\r\n}\r\n\r\n/**\r\n * @deprecated\r\n */\r\nexport interface WidgetRoute {\r\n url: string;\r\n name: string;\r\n}\r\n\r\nexport class Widget extends Page {\r\n declare readonly previewImage: string;\r\n readonly supportDeployMode: number;\r\n /**\r\n * 配置页面路径,没有则不能修改\r\n */\r\n readonly configPagePath?: string;\r\n /**\r\n * @deprecated\r\n */\r\n readonly routes: WidgetRoute[];\r\n\r\n readonly socialLinks?: SocialLink[];\r\n\r\n constructor(options: IWidgetOptions) {\r\n super(options);\r\n this.configPagePath = options.configPagePath;\r\n this.supportDeployMode = options.supportDeployMode ?? DeployMode.NORMAL | DeployMode.OVERLAP;\r\n this.socialLinks = options.socialLinks;\r\n this.routes = options.routes ?? [];\r\n }\r\n\r\n static parseJSON(json: string): Widget {\r\n const object = JSON.parse(json);\r\n return this.parseObject(object);\r\n }\r\n\r\n static parseObject(obj: any): Widget {\r\n let widget = new Widget({\r\n path: '',\r\n description: {},\r\n height: 0,\r\n keywords: [],\r\n lang: 'zh-CN',\r\n name: '',\r\n previewImage: '',\r\n title: {},\r\n width: 0,\r\n });\r\n Object.assign(widget, obj);\r\n return widget;\r\n }\r\n\r\n /**\r\n * 是否支持悬浮窗\r\n */\r\n isSupportOverlap(): boolean {\r\n return (this.supportDeployMode & DeployMode.OVERLAP) > 0;\r\n }\r\n\r\n isSupportBackground(): boolean {\r\n return (this.supportDeployMode & DeployMode.BACKGROUND) > 0;\r\n }\r\n\r\n /**\r\n * 是否支持普通模式\r\n */\r\n isSupportNormal() {\r\n return (this.supportDeployMode & DeployMode.NORMAL) > 0;\r\n }\r\n\r\n isConfigurable(): boolean {\r\n return this.configPagePath != null && this.configPagePath != '';\r\n }\r\n}\r\n\r\nexport enum WidgetKeyword {\r\n RECOMMEND = 'recommend',\r\n TOOLS = 'tools',\r\n EFFICIENCY = 'efficiency',\r\n PICTURE = 'picture',\r\n LIFE = 'life',\r\n SHORTCUT = 'shortcut',\r\n COUNTDOWN = 'countdown',\r\n TIMER = 'timer',\r\n INFO = 'info',\r\n DASHBOARD = 'dashboard',\r\n}\r\n","import {WidgetApiEvent} from \"../../api/WidgetApi\";\r\nimport {AppApiEvent} from \"../../api/AppApi\";\r\n\r\ninterface BroadcastEventOptions {\r\n event: WidgetApiEvent | AppApiEvent | string\r\n /**\r\n * 发送人,用于标记发送源,一般为组件名,如:com.example.widgets.countdown\r\n */\r\n sender?: string\r\n /**\r\n * 广播事件携带的数据,只支持部分数据类型。\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\r\n */\r\n payload?: any\r\n}\r\n\r\nexport class BroadcastEvent {\r\n readonly event: string\r\n readonly sender?: string\r\n payload?: any\r\n\r\n constructor(options: BroadcastEventOptions) {\r\n this.event = options.event;\r\n this.sender = options.sender;\r\n this.payload = options.payload;\r\n }\r\n\r\n}\r\n","export enum WebSocketEventType {\r\n RESISTER_PACKAGE = \"ws::cn.widgetjs.core.resister_package\"\r\n}\r\n\r\nexport class WebSocketEvent {\r\n //类型\r\n type: WebSocketEventType\r\n payload: any\r\n\r\n constructor(type: WebSocketEventType, payload: any) {\r\n this.type = type;\r\n this.payload = payload;\r\n }\r\n}\r\n","import kebabCase from 'lodash/kebabCase';\r\nimport { DefaultWidgetTheme, WidgetTheme, WidgetThemeKey } from './WidgetTheme';\r\n\r\n/**\r\n * 组件配置数据,用于存储组件自定义页面所设置的数据\r\n */\r\nexport class WidgetData {\r\n /**\r\n * 组件id\r\n */\r\n id?: string;\r\n /**\r\n * 组件名\r\n */\r\n name: string;\r\n /**\r\n * 背景颜色\r\n * @deprecated\r\n */\r\n backgroundColor?: string;\r\n /**\r\n * 文字颜色\r\n * @deprecated\r\n */\r\n color?: string;\r\n /**\r\n * 字体大小\r\n * @deprecated\r\n */\r\n fontSize?: number;\r\n /**\r\n * 字体\r\n * @deprecated\r\n */\r\n fontFamily?: string;\r\n /**\r\n * 圆角半径\r\n * @deprecated\r\n */\r\n borderRadius?: number;\r\n /**\r\n * 组件样式\r\n */\r\n theme: WidgetTheme;\r\n\r\n constructor(name: string, id?: string) {\r\n this.id = id;\r\n this.name = name;\r\n this.theme = JSON.parse(JSON.stringify(DefaultWidgetTheme));\r\n }\r\n\r\n public parseJSON(json: {}) {\r\n Object.assign(this, json);\r\n }\r\n\r\n /**\r\n * Gets the style properties from the widget's style object.\r\n * @returns A record representing CSS custom properties and their values.\r\n */\r\n public getThemeProperties(): Record<string, string> {\r\n const properties: Record<string, string> = {};\r\n if (this.theme) {\r\n const prefix = '--widget-';\r\n let keys = Object.keys(this.theme) as WidgetThemeKey[];\r\n keys\r\n .filter((key) => this.theme![key] != undefined)\r\n .map((key) => {\r\n properties[`${prefix}${kebabCase(key)}`] = `${this.theme![key]!}`;\r\n });\r\n }\r\n return properties;\r\n }\r\n\r\n /**\r\n * Injects the style properties as css variable.\r\n * @remarks Only works in a browser environment.\r\n */\r\n public injectThemeProperties() {\r\n const properties = this.getThemeProperties();\r\n Object.keys(properties).forEach((key) => {\r\n document.documentElement.style.setProperty(key, properties[key].toString());\r\n });\r\n }\r\n}\r\n","import type * as CSS from 'csstype';\r\n\r\nexport interface WidgetTheme {\r\n borderRadius?: CSS.Properties['borderRadius'];\r\n backgroundColor?: CSS.Properties['color'];\r\n fontSize?: CSS.Properties['fontSize'];\r\n dividerColor?: CSS.Properties['color'];\r\n /**\r\n * 主色调\r\n */\r\n primaryColor?: CSS.Properties['color'];\r\n /**\r\n * 文字颜色\r\n */\r\n color?: CSS.Properties['color'];\r\n fontFamily?: CSS.Properties['fontFamily'];\r\n shadowColor?: CSS.Properties['color'];\r\n padding?: CSS.Properties['padding'];\r\n borderColor?: CSS.Properties['borderColor'];\r\n}\r\n\r\nexport type WidgetThemeKey = keyof WidgetTheme;\r\n\r\n/**\r\n * Widget default theme, this object is immutable. Clone it before use.\r\n */\r\nconst DefaultWidgetTheme: WidgetTheme = {\r\n backgroundColor: 'rgba(0,0,0,0.2)',\r\n color: '#fff',\r\n fontSize: '14px',\r\n borderColor: 'rgba(255,255,255,0.4)',\r\n dividerColor: 'rgba(255,255,255,0.4)',\r\n primaryColor: 'rgb(0, 149, 255)',\r\n borderRadius: '22px',\r\n};\r\n\r\nObject.freeze(DefaultWidgetTheme);\r\n\r\nexport { DefaultWidgetTheme };\r\n","/**\r\n * Encoding Rules ␣ = Space Path: ␣ \" < > # ? { } Query: ␣ \" < > # & = Hash: ␣ \"\r\n * < > `\r\n *\r\n * On top of that, the RFC3986 (https://tools.ietf.org/html/rfc3986#section-2.2)\r\n * defines some extra characters to be encoded. Most browsers do not encode them\r\n * in encodeURI https://github.com/whatwg/url/issues/369, so it may be safer to\r\n * also encode `!'()*`. Leaving un-encoded only ASCII alphanumeric(`a-zA-Z0-9`)\r\n * plus `-._~`. This extra safety should be applied to query by patching the\r\n * string returned by encodeURIComponent encodeURI also encodes `[\\]^`. `\\`\r\n * should be encoded to avoid ambiguity. Browsers (IE, FF, C) transform a `\\`\r\n * into a `/` if directly typed in. The _backtick_ (`````) should also be\r\n * encoded everywhere because some browsers like FF encode it when directly\r\n * written while others don't. Safari and IE don't encode ``\"<>{}``` in hash.\r\n */\r\n// const EXTRA_RESERVED_RE = /[!'()*]/g\r\n// const encodeReservedReplacer = (c: string) => '%' + c.charCodeAt(0).toString(16)\r\n\r\nconst HASH_RE = /#/g // %23\r\nconst AMPERSAND_RE = /&/g // %26\r\nconst SLASH_RE = /\\//g // %2F\r\nconst EQUAL_RE = /=/g // %3D\r\nconst IM_RE = /\\?/g // %3F\r\nexport const PLUS_RE = /\\+/g // %2B\r\n/**\r\n * NOTE: It's not clear to me if we should encode the + symbol in queries, it\r\n * seems to be less flexible than not doing so and I can't find out the legacy\r\n * systems requiring this for regular requests like text/html. In the standard,\r\n * the encoding of the plus character is only mentioned for\r\n * application/x-www-form-urlencoded\r\n * (https://url.spec.whatwg.org/#urlencoded-parsing) and most browsers seems lo\r\n * leave the plus character as is in queries. To be more flexible, we allow the\r\n * plus character on the query, but it can also be manually encoded by the user.\r\n *\r\n * Resources:\r\n * - https://url.spec.whatwg.org/#urlencoded-parsing\r\n * - https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20\r\n */\r\n\r\nconst ENC_BRACKET_OPEN_RE = /%5B/g // [\r\nconst ENC_BRACKET_CLOSE_RE = /%5D/g // ]\r\nconst ENC_CARET_RE = /%5E/g // ^\r\nconst ENC_BACKTICK_RE = /%60/g // `\r\nconst ENC_CURLY_OPEN_RE = /%7B/g // {\r\nconst ENC_PIPE_RE = /%7C/g // |\r\nconst ENC_CURLY_CLOSE_RE = /%7D/g // }\r\nconst ENC_SPACE_RE = /%20/g // }\r\n\r\n/**\r\n * Encode characters that need to be encoded on the path, search and hash\r\n * sections of the URL.\r\n *\r\n * @internal\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nfunction commonEncode(text: string | number): string {\r\n return encodeURI('' + text)\r\n .replace(ENC_PIPE_RE, '|')\r\n .replace(ENC_BRACKET_OPEN_RE, '[')\r\n .replace(ENC_BRACKET_CLOSE_RE, ']')\r\n}\r\n\r\n/**\r\n * Encode characters that need to be encoded on the hash section of the URL.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nexport function encodeHash(text: string): string {\r\n return commonEncode(text)\r\n .replace(ENC_CURLY_OPEN_RE, '{')\r\n .replace(ENC_CURLY_CLOSE_RE, '}')\r\n .replace(ENC_CARET_RE, '^')\r\n}\r\n\r\n/**\r\n * Encode characters that need to be encoded query values on the query\r\n * section of the URL.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nexport function encodeQueryValue(text: string | number): string {\r\n return (\r\n commonEncode(text)\r\n // Encode the space as +, encode the + to differentiate it from the space\r\n .replace(PLUS_RE, '%2B')\r\n .replace(ENC_SPACE_RE, '+')\r\n .replace(HASH_RE, '%23')\r\n .replace(AMPERSAND_RE, '%26')\r\n .replace(ENC_BACKTICK_RE, '`')\r\n .replace(ENC_CURLY_OPEN_RE, '{')\r\n .replace(ENC_CURLY_CLOSE_RE, '}')\r\n .replace(ENC_CARET_RE, '^')\r\n )\r\n}\r\n\r\n/**\r\n * Like `encodeQueryValue` but also encodes the `=` character.\r\n *\r\n * @param text - string to encode\r\n */\r\nexport function encodeQueryKey(text: string | number): string {\r\n return encodeQueryValue(text).replace(EQUAL_RE, '%3D')\r\n}\r\n\r\n/**\r\n * Encode characters that need to be encoded on the path section of the URL.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nexport function encodePath(text: string | number): string {\r\n return commonEncode(text).replace(HASH_RE, '%23').replace(IM_RE, '%3F')\r\n}\r\n\r\n/**\r\n * Encode characters that need to be encoded on the path section of the URL as a\r\n * param. This function encodes everything {@link encodePath} does plus the\r\n * slash (`/`) character. If `text` is `null` or `undefined`, returns an empty\r\n * string instead.\r\n *\r\n * @param text - string to encode\r\n * @returns encoded string\r\n */\r\nexport function encodeParam(text: string | number | null | undefined): string {\r\n return text == null ? '' : encodePath(text).replace(SLASH_RE, '%2F')\r\n}\r\n\r\n/**\r\n * Decode text using `decodeURIComponent`. Returns the original text if it\r\n * fails.\r\n *\r\n * @param text - string to decode\r\n * @returns decoded string\r\n */\r\nexport function decode(text: string | number): string {\r\n try {\r\n return decodeURIComponent('' + text)\r\n } catch (err) {\r\n // __DEV__ && warn(`Error decoding \"${text}\". Using original value`)\r\n }\r\n return '' + text\r\n}\r\n","import { decode, encodeQueryKey, encodeQueryValue, PLUS_RE } from './encoding'\r\nconst isArray: (arg: ArrayLike<any> | any) => arg is ReadonlyArray<any> =\r\n Array.isArray\r\n/**\r\n * Possible values in normalized {@link LocationQuery}. `null` renders the query\r\n * param but without an `=`.\r\n *\r\n * @example\r\n * ```\r\n * ?isNull&isEmpty=&other=other\r\n * gives\r\n * `{ isNull: null, isEmpty: '', other: 'other' }`.\r\n * ```\r\n *\r\n * @internal\r\n */\r\nexport type LocationQueryValue = string | null\r\n/**\r\n * Possible values when defining a query.\r\n *\r\n * @internal\r\n */\r\nexport type LocationQueryValueRaw = LocationQueryValue | number | undefined\r\n/**\r\n * Normalized query object that appears in {@link RouteLocationNormalized}\r\n *\r\n * @public\r\n */\r\nexport type LocationQuery = Record<\r\n string,\r\n LocationQueryValue | LocationQueryValue[]\r\n >\r\n/**\r\n * Loose {@link LocationQuery} object that can be passed to functions like\r\n * {@link Router.push} and {@link Router.replace} or anywhere when creating a\r\n * {@link RouteLocationRaw}\r\n *\r\n * @public\r\n */\r\nexport type LocationQueryRaw = Record<\r\n string | number,\r\n LocationQueryValueRaw | LocationQueryValueRaw[]\r\n >\r\n\r\n/**\r\n * Transforms a queryString into a {@link LocationQuery} object. Accept both, a\r\n * version with the leading `?` and without Should work as URLSearchParams\r\n * @internal\r\n *\r\n * @param search - search string to parse\r\n * @returns a query object\r\n */\r\nexport function parseQuery(search: string): LocationQuery {\r\n const query: LocationQuery = {}\r\n // avoid creating an object with an empty key and empty value\r\n // because of split('&')\r\n if (search === '' || search === '?') return query\r\n const hasLeadingIM = search[0] === '?'\r\n const searchParams = (hasLeadingIM ? search.slice(1) : search).split('&')\r\n for (let i = 0; i < searchParams.length; ++i) {\r\n // pre decode the + into space\r\n const searchParam = searchParams[i].replace(PLUS_RE, ' ')\r\n // allow the = character\r\n const eqPos = searchParam.indexOf('=')\r\n const key = decode(eqPos < 0 ? searchParam : searchParam.slice(0, eqPos))\r\n const value = eqPos < 0 ? null : decode(searchParam.slice(eqPos + 1))\r\n\r\n if (key in query) {\r\n // an extra variable for ts types\r\n let currentValue = query[key]\r\n if (!isArray(currentValue)) {\r\n currentValue = query[key] = [currentValue]\r\n }\r\n // we force the modification\r\n ;(currentValue as LocationQueryValue[]).push(value)\r\n } else {\r\n query[key] = value\r\n }\r\n }\r\n return query\r\n}\r\n\r\n/**\r\n * Stringifies a {@link LocationQueryRaw} object. Like `URLSearchParams`, it\r\n * doesn't prepend a `?`\r\n *\r\n * @internal\r\n *\r\n * @param query - query object to stringify\r\n * @returns string version of the query without the leading `?`\r\n */\r\nexport function stringifyQuery(query: LocationQueryRaw): string {\r\n let search = ''\r\n for (let key in query) {\r\n const value = query[key]\r\n key = encodeQueryKey(key)\r\n if (value == null) {\r\n // only null adds the value\r\n if (value !== undefined) {\r\n search += (search.length ? '&' : '') + key\r\n }\r\n continue\r\n }\r\n // keep null values\r\n const values: LocationQueryValueRaw[] = isArray(value)\r\n ? value.map(v => v && encodeQueryValue(v))\r\n : [value && encodeQueryValue(value)]\r\n\r\n values.forEach(value => {\r\n // skip undefined values in arrays as if they were not present\r\n // smaller code than using filter\r\n if (value !== undefined) {\r\n // only append & with non-empty search\r\n search += (search.length ? '&' : '') + key\r\n if (value != null) search += '=' + value\r\n }\r\n })\r\n }\r\n\r\n return search\r\n}\r\n\r\n","/**\n * 组件参数,如宽,高,id,语言等环境参数\n */\nimport { parseQuery } from '../router/query';\nimport { DeployMode } from './DeployMode';\nimport snakeCase from 'lodash/snakeCase';\n\nexport class WidgetParams {\n static readonly PARAM_PREFIX = 'w_';\n static readonly PARAM_ID = 'id';\n static readonly PARAM_WIDTH = 'width';\n static readonly PARAM_HEIGHT = 'height';\n static readonly PARAM_WIDTH_PX = 'width_px';\n static readonly PARAM_HEIGHT_PX = 'height_px';\n static readonly PARAM_X = 'x';\n static readonly PARAM_Y = 'y';\n static readonly PARAM_LANG = 'lang';\n static readonly PARAM_THEME = 'theme';\n static readonly PARAM_MODE = 'mode';\n static readonly PARAM_RADIUS = 'radius';\n static readonly PARAM_NAME = 'name';\n static readonly PARAM_TITLE = 'title';\n static readonly PARAM_PREVIEW = 'preview';\n static readonly PARAMS = [\n WidgetParams.PARAM_ID,\n WidgetParams.PARAM_WIDTH,\n WidgetParams.PARAM_HEIGHT,\n WidgetParams.PARAM_X,\n WidgetParams.PARAM_Y,\n WidgetParams.PARAM_LANG,\n WidgetParams.PARAM_THEME,\n WidgetParams.PARAM_MODE,\n WidgetParams.PARAM_WIDTH_PX,\n WidgetParams.PARAM_HEIGHT_PX,\n WidgetParams.PARAM_NAME,\n WidgetParams.PARAM_TITLE,\n WidgetParams.PARAM_PREVIEW,\n ];\n //组件id\n id?: string;\n //网格宽度,1就代表宽度占用1格\n width?: number;\n //宽度,单位px\n widthPx?: number;\n //宽度,单位px\n heightPx?: number;\n //网格高度,2就代表高度占用2格\n height?: number;\n x?: number;\n y?: number;\n //是否是预览模式,添加组件时,预览状态\n preview?: boolean;\n //语言环境:zh,en,jp...\n lang?: string;\n //主题:浅色,深色\n theme?: ThemeMode;\n //\n mode?: DeployMode;\n //系统设置的组件圆角半径\n radius?: number;\n //组件名\n name?: string;\n title?: string;\n\n /**\n * 将组件参数转为url参数\n * @param object\n * @return URLSearchParams w_w=2&w_h=2&w_id=21&w_width=156&w_height=156\n */\n toUrlParams(): URLSearchParams {\n const urlParams = new URLSearchParams();\n const ownPropertyNames = Object.getOwnPropertyNames(this);\n for (let ownPropertyName of ownPropertyNames) {\n type ObjectKey = keyof typeof this;\n const key = ownPropertyName as ObjectKey;\n const value = this[key];\n if (value) {\n urlParams.append(WidgetParams.PARAM_PREFIX + snakeCase(ownPropertyName), value.toString());\n }\n }\n return urlParams;\n }\n\n getPersistKey(): string {\n return `${this.name}-${this.id}`;\n }\n\n /**\n * 从当前地址解析组件参数:\n * http://localhost:8080/#/widget/config/labor_progress?w_w=2&w_h=2&w_width=156&w_height=156\n * =>\n * {width:2,height:2,id:21,width_px:156,height_px:156}\n */\n static fromCurrentLocation(): WidgetParams {\n const href = window.location.href;\n let strings = href.split('?');\n if (strings.length > 1) {\n let queryString = strings[1];\n return this.fromObject(parseQuery(queryString));\n }\n return new WidgetParams();\n }\n\n static fromLocation(url: string): WidgetParams {\n let strings = url.split('?');\n if (strings.length > 1) {\n let queryString = strings[1];\n return this.fromObject(parseQuery(queryString));\n }\n return new WidgetParams();\n }\n\n private static setValue(widgetEnv: WidgetParams, key: string, value: string) {\n const keyWithoutPrefix = key.replace(this.PARAM_PREFIX, '');\n if (keyWithoutPrefix == WidgetParams.PARAM_ID) {\n widgetEnv.id = value;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_X) {\n widgetEnv.x = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_Y) {\n widgetEnv.y = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_HEIGHT) {\n widgetEnv.height = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_WIDTH) {\n widgetEnv.width = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_LANG) {\n widgetEnv.lang = value;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_THEME) {\n widgetEnv.theme = value as ThemeMode;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_MODE) {\n widgetEnv.mode = parseInt(value) as DeployMode;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_RADIUS) {\n widgetEnv.radius = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_WIDTH_PX) {\n widgetEnv.widthPx = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_HEIGHT_PX) {\n widgetEnv.heightPx = parseInt(value);\n } else if (keyWithoutPrefix == WidgetParams.PARAM_NAME) {\n widgetEnv.name = value;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_TITLE) {\n widgetEnv.title = value;\n } else if (keyWithoutPrefix == WidgetParams.PARAM_PREVIEW) {\n widgetEnv.preview = value === 'true';\n }\n }\n\n /**\n * 从对象键值对中初始化组件参数\n * {w_width:2,w_height:2,w_id:21,w_width_px:156,w_height_px:156}=>\n * {width:2,height:2,id:21,width_px:156,height_px:156}\n * @param object\n */\n static fromObject(object: any): WidgetParams {\n const widgetEnv = new WidgetParams();\n const ownPropertyNames = Object.getOwnPropertyNames(object);\n for (let ownPropertyName of ownPropertyNames) {\n type ObjectKey = keyof typeof this;\n const key = ownPropertyName as ObjectKey;\n const value = object[key];\n this.setValue(widgetEnv, key, value);\n }\n return widgetEnv;\n }\n}\n\nexport enum ThemeMode {\n AUTO = 'auto',\n LIGHT = 'LIGHT',\n DARK = 'DARK',\n}\n","export type NotificationType =\r\n | \"countdown\"\r\n | \"advance-countdown\"\r\n | \"error\"\r\n | \"success\"\r\n | \"warning\"\r\n | \"info\"\r\n | \"reminder\"\r\n | \"url\"\r\n | \"call\"\r\n\r\nexport enum NotificationSize {\r\n SMALL = 'small',\r\n NORMAL = 'normal',\r\n LARGE = 'large',\r\n}\r\n\r\nexport interface NotificationOption {\r\n type?: NotificationType;\r\n title?: string;\r\n message: string;\r\n targetTime?: string;\r\n duration?: number;\r\n /**\r\n * 图片名,目前只支持mingcute图标。\r\n * https://www.mingcute.com/\r\n */\r\n icon?: string;\r\n color?: string;\r\n confirmButtonText?: string;\r\n cancelButtonText?: string;\r\n cancelBroadcast?: string;\r\n confirmBroadcast?: string;\r\n size?: NotificationSize;\r\n url?: string;\r\n avatar?: string;\r\n audio?: string;\r\n lyric?: string;\r\n backgroundColor?: string;\r\n}\r\n\r\nexport class AppNotification {\r\n type: NotificationType = \"info\"\r\n message: string;\r\n title?: string;\r\n targetTime?: string;\r\n duration: number;\r\n icon?: string;\r\n color?: string;\r\n backgroundColor?: string;\r\n confirmButtonText?: string;\r\n cancelButtonText?: string;\r\n cancelBroadcast?: string;\r\n confirmBroadcast?: string;\r\n size: NotificationSize;\r\n url?: string;\r\n avatar?: string;\r\n audio?: string;\r\n lyric?: string;\r\n createdAt: string;\r\n\r\n constructor(option: NotificationOption) {\r\n this.createdAt = new Date().toISOString();\r\n this.type = option.type ?? \"info\";\r\n this.title = option.title;\r\n this.message = option.message;\r\n this.targetTime = option.targetTime;\r\n this.duration = option.duration ?? 5000;\r\n this.icon = option.icon;\r\n this.color = option.color ?? \"#5D8AC8\";\r\n this.confirmButtonText = option.confirmButtonText;\r\n this.cancelButtonText = option.cancelButtonText;\r\n this.cancelBroadcast = option.cancelBroadcast;\r\n this.confirmBroadcast = option.confirmBroadcast;\r\n this.size = option.size ?? NotificationSize.NORMAL;\r\n this.audio = option.audio;\r\n this.avatar = option.avatar;\r\n this.lyric = option.lyric;\r\n this.backgroundColor = option.backgroundColor ?? '#000000';\r\n }\r\n\r\n}\r\n","interface IDeployedPage{\n id: string;\n name: string;\n packageName: string;\n x: number;\n y: number;\n height: number;\n width: number;\n proxy?: string;\n}\n\nexport class DeployedPage implements IDeployedPage {\n name!: string;\n packageName!: string;\n x: number = 0;\n y: number = 0;\n height: number = 600;\n width: number = 800;\n proxy?: string;\n id!: string;\n}\n","import { DeployMode } from './DeployMode';\nimport { DeployedPage } from './DeployedPage';\n\nexport class DeployedWidget extends DeployedPage {\n shortcut?: string;\n deployMode!: number;\n\n isOverlap(): boolean {\n return (this.deployMode & DeployMode.OVERLAP) > 0;\n }\n}\n","export interface Point {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport type Position = {\r\n x: number,\r\n y: number\r\n}\r\n\r\nexport enum Gravity {\r\n TOP = 'TOP', LEFT = \"LEFT\", RIGHT = \"RIGHT\", BOTTOM = \"BOTTOM\"\r\n}\r\n","// source: https://github.com/sindresorhus/normalize-url\r\n// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs\r\nconst DATA_URL_DEFAULT_MIME_TYPE = 'text/plain';\r\nconst DATA_URL_DEFAULT_CHARSET = 'us-ascii';\r\nexport type NormalizeOptions = {\r\n /**\r\n @default 'http'\r\n */\r\n defaultProtocol?: string | 'http' | 'https';\r\n\r\n /**\r\n Prepends `defaultProtocol` to the URL if it's protocol-relative.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('//sindresorhus.com');\r\n //=> 'http://sindresorhus.com'\r\n\r\n normalizeUrl('//sindresorhus.com', {normalizeProtocol: false});\r\n //=> '//sindresorhus.com'\r\n ```\r\n */\r\n readonly normalizeProtocol?: boolean;\r\n\r\n /**\r\n Normalizes HTTPS URLs to HTTP.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://sindresorhus.com');\r\n //=> 'https://sindresorhus.com'\r\n\r\n normalizeUrl('https://sindresorhus.com', {forceHttp: true});\r\n //=> 'http://sindresorhus.com'\r\n ```\r\n */\r\n readonly forceHttp?: boolean;\r\n\r\n /**\r\n Normalizes HTTP URLs to HTTPS.\r\n\r\n This option cannot be used with the `forceHttp` option at the same time.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('http://sindresorhus.com');\r\n //=> 'http://sindresorhus.com'\r\n\r\n normalizeUrl('http://sindresorhus.com', {forceHttps: true});\r\n //=> 'https://sindresorhus.com'\r\n ```\r\n */\r\n readonly forceHttps?: boolean;\r\n\r\n /**\r\n Strip the [authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) part of a URL.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://user:password@sindresorhus.com');\r\n //=> 'https://sindresorhus.com'\r\n\r\n normalizeUrl('https://user:password@sindresorhus.com', {stripAuthentication: false});\r\n //=> 'https://user:password@sindresorhus.com'\r\n ```\r\n */\r\n readonly stripAuthentication?: boolean;\r\n\r\n /**\r\n Removes hash from the URL.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('sindresorhus.com/about.html#contact');\r\n //=> 'http://sindresorhus.com/about.html#contact'\r\n\r\n normalizeUrl('sindresorhus.com/about.html#contact', {stripHash: true});\r\n //=> 'http://sindresorhus.com/about.html'\r\n ```\r\n */\r\n readonly stripHash?: boolean;\r\n\r\n /**\r\n Remove the protocol from the URL: `http://sindresorhus.com` → `sindresorhus.com`.\r\n\r\n It will only remove `https://` and `http://` protocols.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://sindresorhus.com');\r\n //=> 'https://sindresorhus.com'\r\n\r\n normalizeUrl('sindresorhus.com', {stripProtocol: true});\r\n //=> 'sindresorhus.com'\r\n ```\r\n */\r\n readonly stripProtocol?: boolean;\r\n\r\n /**\r\n Strip the [text fragment](https://web.dev/text-fragments/) part of the URL\r\n\r\n __Note:__ The text fragment will always be removed if the `stripHash` option is set to `true`, as the hash contains the text fragment.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('http://sindresorhus.com/about.html#:~:text=hello');\r\n //=> 'http://sindresorhus.com/about.html#'\r\n\r\n normalizeUrl('http://sindresorhus.com/about.html#section:~:text=hello');\r\n //=> 'http://sindresorhus.com/about.html#section'\r\n\r\n normalizeUrl('http://sindresorhus.com/about.html#:~:text=hello', {stripTextFragment: false});\r\n //=> 'http://sindresorhus.com/about.html#:~:text=hello'\r\n\r\n normalizeUrl('http://sindresorhus.com/about.html#section:~:text=hello', {stripTextFragment: false});\r\n //=> 'http://sindresorhus.com/about.html#section:~:text=hello'\r\n ```\r\n */\r\n readonly stripTextFragment?: boolean;\r\n\r\n /**\r\n Removes `www.` from the URL.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('http://www.sindresorhus.com');\r\n //=> 'http://sindresorhus.com'\r\n\r\n normalizeUrl('http://www.sindresorhus.com', {stripWWW: false});\r\n //=> 'http://www.sindresorhus.com'\r\n ```\r\n */\r\n readonly stripWWW?: boolean;\r\n\r\n /**\r\n Removes query parameters that matches any of the provided strings or regexes.\r\n\r\n @default [/^utm_\\w+/i]\r\n\r\n @example\r\n ```\r\n normalizeUrl('www.sindresorhus.com?foo=bar&ref=test_ref', {\r\n\t\tremoveQueryParameters: ['ref']\r\n\t});\r\n //=> 'http://sindresorhus.com/?foo=bar'\r\n ```\r\n\r\n If a boolean is provided, `true` will remove all the query parameters.\r\n\r\n ```\r\n normalizeUrl('www.sindresorhus.com?foo=bar', {\r\n\t\tremoveQueryParameters: true\r\n\t});\r\n //=> 'http://sindresorhus.com'\r\n ```\r\n\r\n `false` will not remove any query parameter.\r\n\r\n ```\r\n normalizeUrl('www.sindresorhus.com?foo=bar&utm_medium=test&ref=test_ref', {\r\n\t\tremoveQueryParameters: false\r\n\t});\r\n //=> 'http://www.sindresorhus.com/?foo=bar&ref=test_ref&utm_medium=test'\r\n ```\r\n */\r\n readonly removeQueryParameters?: ReadonlyArray<RegExp | string> | boolean;\r\n\r\n /**\r\n Keeps only query parameters that matches any of the provided strings or regexes.\r\n\r\n __Note__: It overrides the `removeQueryParameters` option.\r\n\r\n @default undefined\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://sindresorhus.com?foo=bar&ref=unicorn', {\r\n\t\tkeepQueryParameters: ['ref']\r\n\t});\r\n //=> 'https://sindresorhus.com/?ref=unicorn'\r\n ```\r\n */\r\n readonly keepQueryParameters?: ReadonlyArray<RegExp | string>;\r\n\r\n /**\r\n Removes trailing slash.\r\n\r\n __Note__: Trailing slash is always removed if the URL doesn't have a pathname unless the `removeSingleSlash` option is set to `false`.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('http://sindresorhus.com/redirect/');\r\n //=> 'http://sindresorhus.com/redirect'\r\n\r\n normalizeUrl('http://sindresorhus.com/redirect/', {removeTrailingSlash: false});\r\n //=> 'http://sindresorhus.com/redirect/'\r\n\r\n normalizeUrl('http://sindresorhus.com/', {removeTrailingSlash: false});\r\n //=> 'http://sindresorhus.com'\r\n ```\r\n */\r\n readonly removeTrailingSlash?: boolean;\r\n\r\n /**\r\n Remove a sole `/` pathname in the output. This option is independent of `removeTrailingSlash`.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('https://sindresorhus.com/');\r\n //=> 'https://sindresorhus.com'\r\n\r\n normalizeUrl('https://sindresorhus.com/', {removeSingleSlash: false});\r\n //=> 'https://sindresorhus.com/'\r\n ```\r\n */\r\n readonly removeSingleSlash?: boolean;\r\n\r\n /**\r\n Removes the default directory index file from path that matches any of the provided strings or regexes.\r\n When `true`, the regex `/^index\\.[a-z]+$/` is used.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('www.sindresorhus.com/foo/default.php', {\r\n\t\tremoveDirectoryIndex: [/^default\\.[a-z]+$/]\r\n\t});\r\n //=> 'http://sindresorhus.com/foo'\r\n ```\r\n */\r\n removeDirectoryIndex?: boolean | ReadonlyArray<RegExp | string>;\r\n\r\n /**\r\n Removes an explicit port number from the URL.\r\n\r\n Port 443 is always removed from HTTPS URLs and 80 is always removed from HTTP URLs regardless of this option.\r\n\r\n @default false\r\n\r\n @example\r\n ```\r\n normalizeUrl('sindresorhus.com:123', {\r\n\t\tremoveExplicitPort: true\r\n\t});\r\n //=> 'http://sindresorhus.com'\r\n ```\r\n */\r\n readonly removeExplicitPort?: boolean;\r\n\r\n /**\r\n Sorts the query parameters alphabetically by key.\r\n\r\n @default true\r\n\r\n @example\r\n ```\r\n normalizeUrl('www.sindresorhus.com?b=two&a=one&c=three', {\r\n\t\tsortQueryParameters: false\r\n\t});\r\n //=> 'http://sindresorhus.com/?b=two&a=one&c=three'\r\n ```\r\n */\r\n readonly sortQueryParameters?: boolean;\r\n};\r\n\r\nconst testParameter = (name: string, filters: RegExp[]) => filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);\r\n\r\nconst supportedProtocols = new Set([\r\n 'https:',\r\n 'http:',\r\n 'file:',\r\n]);\r\n\r\nconst hasCustomProtocol = (urlString: string) => {\r\n try {\r\n const {protocol} = new URL(urlString);\r\n return protocol.endsWith(':') && !supportedProtocols.has(protocol);\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\nconst normalizeDataURL = (urlString: string, option: { stripHash: boolean }) => {\r\n const match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString);\r\n\r\n if (!match) {\r\n throw new Error(`Invalid URL: ${urlString}`);\r\n }\r\n\r\n //@ts-ignore\r\n let {type, data, hash} = match.groups;\r\n const mediaType = type.split(';') as string[];\r\n hash = option.stripHash ? '' : hash;\r\n\r\n let isBase64 = false;\r\n if (mediaType[mediaType.length - 1] === 'base64') {\r\n mediaType.pop();\r\n isBase64 = true;\r\n }\r\n\r\n // Lowercase MIME type\r\n const mimeType = mediaType.shift()?.toLowerCase() ?? '';\r\n const attributes = mediaType\r\n .map(attribute => {\r\n let [key, value = ''] = attribute.split('=').map(item => item.trim());\r\n\r\n // Lowercase `charset`\r\n if (key === 'charset') {\r\n value = value.toLowerCase();\r\n\r\n if (value === DATA_URL_DEFAULT_CHARSET) {\r\n return '';\r\n }\r\n }\r\n\r\n return `${key}${value ? `=${value}` : ''}`;\r\n })\r\n .filter(Boolean);\r\n\r\n const normalizedMediaType = [\r\n ...attributes,\r\n ];\r\n\r\n if (isBase64) {\r\n normalizedMediaType.push('base64');\r\n }\r\n\r\n if (normalizedMediaType.length > 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) {\r\n normalizedMediaType.unshift(mimeType);\r\n }\r\n\r\n return `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`;\r\n};\r\n\r\nexport function normalizeUrl(urlString: string, options?: NormalizeOptions) {\r\n options = {\r\n defaultProtocol: 'http',\r\n normalizeProtocol: true,\r\n forceHttp: false,\r\n forceHttps: false,\r\n stripAuthentication: true,\r\n stripHash: false,\r\n stripTextFragment: true,\r\n stripWWW: true,\r\n removeQueryParameters: [/^utm_\\w+/i],\r\n removeTrailingSlash: true,\r\n removeSingleSlash: true,\r\n removeDirectoryIndex: false,\r\n removeExplicitPort: false,\r\n sortQueryParameters: true,\r\n ...options,\r\n };\r\n urlString = urlString.replace('\\\\\\\\', '//')\r\n\r\n // Legacy: Append `:` to the protocol if missing.\r\n if (typeof options.defaultProtocol === 'string' && !options.defaultProtocol.endsWith(':')) {\r\n options.defaultProtocol = `${options.defaultProtocol}:`;\r\n }\r\n\r\n urlString = urlString.trim();\r\n\r\n // Data URL\r\n if (/^data:/i.test(urlString)) {\r\n return normalizeDataURL(urlString, {stripHash: options.stripHash ?? false});\r\n }\r\n\r\n if (hasCustomProtocol(urlString)) {\r\n return urlString;\r\n }\r\n\r\n const hasRelativeProtocol = urlString.startsWith('//');\r\n const isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString);\r\n\r\n // Prepend protocol\r\n if (!isRelativeUrl) {\r\n urlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, options.defaultProtocol!);\r\n }\r\n\r\n const urlObject = new URL(urlString);\r\n\r\n if (options.forceHttp && options.forceHttps) {\r\n throw new Error('The `forceHttp` and `forceHttps` options cannot be used together');\r\n }\r\n\r\n if (options.forceHttp && urlObject.protocol === 'https:') {\r\n urlObject.protocol = 'http:';\r\n }\r\n\r\n if (options.forceHttps && urlObject.protocol === 'http:') {\r\n urlObject.protocol = 'https:';\r\n }\r\n\r\n // Remove auth\r\n if (options.stripAuthentication) {\r\n urlObject.username = '';\r\n urlObject.password = '';\r\n }\r\n\r\n // Remove hash\r\n if (options.stripHash) {\r\n urlObject.hash = '';\r\n } else if (options.stripTextFragment) {\r\n urlObject.hash = urlObject.hash.replace(/#?:~:text.*?$/i, '');\r\n }\r\n\r\n // Remove duplicate slashes if not preceded by a protocol\r\n // NOTE: This could be implemented using a single negative lookbehind\r\n // regex, but we avoid that to maintain compatibility with older js engines\r\n // which do not have support for that feature.\r\n if (urlObject.pathname) {\r\n // TODO: Replace everything below with `urlObject.pathname = urlObject.pathname.replace(/(?<!\\b[a-z][a-z\\d+\\-.]{1,50}:)\\/{2,}/g, '/');` when Safari supports negative lookbehind.\r\n\r\n // Split the string by occurrences of this protocol regex, and perform\r\n // duplicate-slash replacement on the strings between those occurrences\r\n // (if any).\r\n const protocolRegex = /\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g;\r\n\r\n let lastIndex = 0;\r\n let result = '';\r\n for (; ;) {\r\n const match = protocolRegex.exec(urlObject.pathname);\r\n if (!match) {\r\n break;\r\n }\r\n\r\n const protocol = match[0];\r\n const protocolAtIndex = match.index;\r\n const intermediate = urlObject.pathname.slice(lastIndex, protocolAtIndex);\r\n\r\n result += intermediate.replace(/\\/{2,}/g, '/');\r\n result += protocol;\r\n lastIndex = protocolAtIndex + protocol.length;\r\n }\r\n\r\n const remnant = urlObject.pathname.slice(lastIndex, urlObject.pathname.length);\r\n result += remnant.replace(/\\/{2,}/g, '/');\r\n\r\n urlObject.pathname = result;\r\n }\r\n\r\n // Decode URI octets\r\n if (urlObject.pathname) {\r\n try {\r\n urlObject.pathname = decodeURI(urlObject.pathname);\r\n } catch {\r\n }\r\n }\r\n\r\n // Remove directory index\r\n if (options.removeDirectoryIndex === true) {\r\n options.removeDirectoryIndex = [/^index\\.[a-z]+$/];\r\n }\r\n\r\n if (Array.isArray(options.removeDirectoryIndex) && options.removeDirectoryIndex.length > 0) {\r\n let pathComponents = urlObject.pathname.split('/');\r\n const lastComponent = pathComponents[pathComponents.length - 1];\r\n\r\n if (testParameter(lastComponent, options.removeDirectoryIndex)) {\r\n pathComponents = pathComponents.slice(0, -1);\r\n urlObject.pathname = pathComponents.slice(1).join('/') + '/';\r\n }\r\n }\r\n\r\n if (urlObject.hostname) {\r\n // Remove trailing dot\r\n urlObject.hostname = urlObject.hostname.replace(/\\.$/, '');\r\n\r\n // Remove `www.`\r\n if (options.stripWWW && /^www\\.(?!www\\.)[a-z\\-\\d]{1,63}\\.[a-z.\\-\\d]{2,63}$/.test(urlObject.hostname)) {\r\n // Each label should be max 63 at length (min: 1).\r\n // Source: https://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names\r\n // Each TLD should be up to 63 characters long (min: 2).\r\n // It is technically possible to have a single character TLD, but none currently exist.\r\n urlObject.hostname = urlObject.hostname.replace(/^www\\./, '');\r\n }\r\n }\r\n\r\n // Remove query unwanted parameters\r\n if (Array.isArray(options.removeQueryParameters)) {\r\n // eslint-disable-next-line unicorn/no-useless-spread -- We are intentionally spreading to get a copy.\r\n for (const key of [...urlObject.searchParams.keys()]) {\r\n if (testParameter(key, options.removeQueryParameters)) {\r\n urlObject.searchParams.delete(key);\r\n }\r\n }\r\n }\r\n\r\n if (!Array.isArray(options.keepQueryParameters) && options.removeQueryParameters === true) {\r\n urlObject.search = '';\r\n }\r\n\r\n // Keep wanted query parameters\r\n if (Array.isArray(options.keepQueryParameters) && options.keepQueryParameters.length > 0) {\r\n // eslint-disable-next-line unicorn/no-useless-spread -- We are intentionally spreading to get a copy.\r\n for (const key of [...urlObject.searchParams.keys()]) {\r\n if (!testParameter(key, options.keepQueryParameters)) {\r\n urlObject.searchParams.delete(key);\r\n }\r\n }\r\n }\r\n\r\n // Sort query parameters\r\n if (options.sortQueryParameters) {\r\n urlObject.searchParams.sort();\r\n\r\n // Calling `.sort()` encodes the search parameters, so we need to decode them again.\r\n try {\r\n urlObject.search = decodeURIComponent(urlObject.search);\r\n } catch {\r\n }\r\n }\r\n\r\n if (options.removeTrailingSlash) {\r\n urlObject.pathname = urlObject.pathname.replace(/\\/$/, '');\r\n }\r\n\r\n // Remove an explicit port number, excluding a default port number, if applicable\r\n if (options.removeExplicitPort && urlObject.port) {\r\n urlObject.port = '';\r\n }\r\n\r\n const oldUrlString = urlString;\r\n\r\n // Take advantage of many of the Node `url` normalizations\r\n urlString = urlObject.toString();\r\n\r\n if (!options.removeSingleSlash && urlObject.pathname === '/' && !oldUrlString.endsWith('/') && urlObject.hash === '') {\r\n urlString = urlString.replace(/\\/$/, '');\r\n }\r\n\r\n // Remove ending `/` unless removeSingleSlash is false\r\n if ((options.removeTrailingSlash || urlObject.pathname === '/') && urlObject.hash === '' && options.removeSingleSlash) {\r\n urlString = urlString.replace(/\\/$/, '');\r\n }\r\n\r\n // Restore relative protocol, if applicable\r\n if (hasRelativeProtocol && !options.normalizeProtocol) {\r\n urlString = urlString.replace(/^http:\\/\\//, '//');\r\n }\r\n\r\n // Remove http/https\r\n if (options.stripProtocol) {\r\n urlString = urlString.replace(/^(?:https?:)?\\/\\//, '');\r\n }\r\n\r\n return urlString;\r\n}\r\n","import { WidgetPackage } from '../model/WidgetPackage';\r\nimport { WidgetParams } from '../model/WidgetParams';\r\nimport { normalizeUrl } from './normalizeUrl';\r\n\r\nexport class WidgetUrlUtils {\r\n static getWidgetUrl(widgetUrl: string, widgetPackage: WidgetPackage, widgetParams: WidgetParams) {\r\n let url = '';\r\n const arr = [];\r\n if (widgetUrl.startsWith('http')) {\r\n url = widgetUrl;\r\n } else {\r\n url = widgetPackage.getIndexUrl() + widgetUrl;\r\n }\r\n arr.push(url)\r\n if (url.includes('?')) {\r\n arr.push('&')\r\n } else {\r\n arr.push('?')\r\n }\r\n arr.push(widgetParams.toUrlParams().toString())\r\n return normalizeUrl(arr.join('')).replaceAll('//', '/');\r\n }\r\n\r\n static getWidgetPackageUrl(url: string, entry: string, hash: boolean,path:string = ''): string {\r\n const arr = [url];\r\n if (url.startsWith('http')) {\r\n if (hash) {\r\n arr.push('#');\r\n }\r\n } else {\r\n arr.push(`/${entry}`);\r\n if (hash) {\r\n arr.push('#');\r\n }\r\n }\r\n arr.push(path)\r\n return arr.join('');\r\n }\r\n}\r\n","import { Widget } from './Widget';\nimport { WidgetUrlUtils } from '../utils/WidgetUrlUtils';\nimport { LanguageCode, LanguageTextMap } from '../lang/LanguageCode';\nimport { getTextByLanguageCode } from '../utils/LanguageUtils';\nimport { WidgetPermission } from '../permission/permission';\nimport { Page } from './Page';\n\nexport interface LocalPackageUrlInfo {\n /**\n * 入口文件,默认为index.html,也可以是/\n * @example remote package: https://rtugeek.gitee.io/hotspot/index.html\n * @example local package: index.html\n */\n entry?: string;\n /**\n * 是否使用hash路由\n */\n hash: boolean;\n}\n\nexport interface RemotePackageUrlInfo extends LocalPackageUrlInfo {\n /**\n * 部署到服务器的base path,只在远程组件包中生效,需以/开始\n * @example /hotspot\n */\n base?: string;\n}\n\nexport interface WidgetPackageOptions extends LocalPackageUrlInfo {\n name: string;\n version?: string;\n author: string;\n homepage?: string;\n title: LanguageTextMap;\n permissions?: WidgetPermission[];\n description: LanguageTextMap;\n /**\n * 远程组件包入口文件\n * @deprecated 使用 remote.entry 替代\n */\n remoteEntry?: string;\n remotePackage?: string;\n remote?: RemotePackageUrlInfo;\n icon?: string;\n lang?: LanguageCode;\n widgets?: Widget[];\n devOptions?: DevOptions;\n}\n\nexport class WidgetPackage implements RemotePackageUrlInfo {\n /**\n * 组件包名,一般为域名倒写,e.g. com.example\n */\n readonly name!: string;\n /**\n * 组件包版本,可以为空,默认采用package.json里的版本\n * e.g. 1.0.2\n */\n version?: string;\n /**\n * 组件作者署名\n */\n readonly author!: string;\n /**\n * 组件首页\n */\n readonly homepage?: string;\n /**\n * 组件描述\n */\n readonly title!: { [key: LanguageCode | string]: string };\n /**\n * 组件描述\n */\n readonly description!: { [key: LanguageCode | string]: string };\n /**\n * 本地组件入口文件,通常为 index.html\n */\n entry!: string | 'index.html';\n /**\n * 远程组件包入口文件\n * @deprecated 使用 remote.entry 替代\n */\n remoteEntry?: string;\n /**\n * 组件包json文件路径\n * @example https://rtugeek.gitee.io/hotspot/widget.json\n */\n readonly remotePackage?: string;\n readonly local?: LocalPackageUrlInfo;\n readonly remote?: RemotePackageUrlInfo;\n /**\n * 组件包图标\n */\n readonly icon?: string;\n /**\n * Hash路由模式,默认为true\n */\n readonly hash: boolean = true;\n /**\n * 可能是网络地址,或者本地路径(解压后的文件夹路径),\n * 网络地址:https://www.bilibili.com\n * 本地地址:file:///C:/Users/neo/Desktop\n * 在测试时。地址通常为: http://127.0.0.1:8080\n */\n url!: string;\n readonly widgets: Widget[] = [];\n readonly pages: Page[] = [];\n devOptions?: DevOptions;\n\n constructor(options: WidgetPackageOptions) {\n this.name = options.name;\n this.version = options.version;\n this.author = options.author;\n this.homepage = options.homepage;\n this.title = options.title;\n this.description = options.description;\n this.entry = options.entry ?? 'index.html';\n this.remoteEntry = options.remoteEntry;\n this.remotePackage = options.remotePackage;\n this.hash = options.hash;\n this.url = '';\n this.icon = options.icon;\n this.devOptions = options.devOptions;\n this.remote = options.remote;\n if (options.widgets) {\n for (let widget of options.widgets) {\n this.widgets.push(widget);\n }\n }\n }\n\n static parseJSON(json: string): WidgetPackage {\n const object = JSON.parse(json);\n return this.parseObject(object);\n }\n\n static parseObject(obj: any): WidgetPackage {\n let widgetPackage = new WidgetPackage({\n author: '',\n description: {\n 'zh-CN': '',\n },\n entry: '',\n hash: false,\n homepage: '',\n name: '',\n title: {\n 'zh-CN': '',\n },\n version: '',\n });\n Object.assign(widgetPackage, obj);\n const widgets: Widget[] = [];\n if (widgetPackage.widgets) {\n for (let jsonWidget of widgetPackage.widgets) {\n let widget = new Widget({\n previewImage: '',\n path: '',\n description: { 'zh-CN': '' },\n height: 0,\n keywords: [],\n lang: 'zh-CN',\n name: '',\n title: { 'zh-CN': '' },\n width: 0,\n });\n Object.assign(widget, jsonWidget);\n widgets.push(widget);\n }\n }\n widgetPackage.widgets.splice(0, widgetPackage.widgets.length);\n widgetPackage.widgets.push(...widgets);\n return widgetPackage;\n }\n\n /**\n * 获取组件包标题\n * @param lang 语言环境,不传则获取默认语言\n */\n getTitle(lang?: LanguageCode): string | undefined {\n return getTextByLanguageCode(this.title, lang);\n }\n\n /**\n * 获取组件包描述\n * @param lang 语言环境,不传则获取默认标题\n */\n getDescription(lang?: LanguageCode): string | undefined {\n return getTextByLanguageCode(this.description, lang);\n }\n\n /**\n * 获取组件完整路径\n * 如果url是http链接,直接返回链接\n * 如果是本地组件:file://链接,则返回 url+entry,\n * 如果是远程组件:http://链接,则返回 entry,\n * @example file://C:/users/neo/desktop/index.html#\n * @example file://C:/users/neo/desktop/index.html#\n */\n getIndexUrl(hash?: boolean) {\n return WidgetUrlUtils.getWidgetPackageUrl(this.url, this.entry, hash == null ? this.hash : hash);\n }\n\n getUrl(path:string, hash?: boolean) {\n return WidgetUrlUtils.getWidgetPackageUrl(this.url, this.entry, hash == null ? this.hash : hash,path);\n }\n}\n\nexport type DevOptions = {\n folder?: string;\n route?: boolean;\n devUrl?: string;\n remoteEntry?: string;\n};\n","export class ElectronUtils {\r\n static hasElectronApi(): boolean {\r\n return this.getAPI() != null;\r\n }\r\n\r\n /**\r\n * 获取ElectronAPI\r\n * windows api\r\n */\r\n static getAPI() {\r\n if (Reflect.has(window, \"electronAPI\")) {\r\n //@ts-ignore\r\n return window.electronAPI;\r\n } else if (Reflect.has(window.parent, \"electronAPI\")) {\r\n //@ts-ignore\r\n return window.parent.electronAPI;\r\n }\r\n return null\r\n }\r\n\r\n static async invokeMethod(channel: string, method: string, ...args: any[]): Promise<any> {\r\n return this.getAPI()?.invoke(channel, method, ...args);\r\n }\r\n\r\n static async invoke(channel: string, ...args: any[]): Promise<any> {\r\n return this.getAPI()?.invoke(channel, ...args);\r\n }\r\n}\r\n","export interface IGridRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nexport class GridRect implements IGridRect {\n top: number;\n left: number;\n width: number;\n height: number;\n\n constructor(left: number, top: number, width: number, height: number) {\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n }\n\n get right(): number {\n return this.left + this.width;\n }\n\n get bottom(): number {\n return this.top + this.height;\n }\n}\n\nexport class GridSystem extends GridRect {\n cellSize: number;\n horizontalCellCount: number;\n verticalCellCount: number;\n screenWidth: number;\n screenHeight: number;\n /**\n * 屏幕x坐标,用于解决多块屏幕坐标计算问题\n */\n screenLeft?: number;\n /**\n * 屏幕y坐标,用于解决多块屏幕坐标计算问题\n */\n screenTop?: number;\n canvasScreenTop: number;\n canvasScreenLeft: number;\n\n /**\n *\n * @param cellSize\n * @param padding 至少保留的边距\n * @param screenWidth\n * @param screenHeight\n * @param screenX\n * @param screenY\n */\n constructor(\n cellSize: number,\n padding: number,\n screenWidth: number,\n screenHeight: number,\n screenX?: number,\n screenY?: number,\n ) {\n let gridMaxWidth = screenWidth - padding * 2;\n let gridMaxHeight = screenHeight - padding * 2;\n let horizontalPadding = (gridMaxWidth % cellSize) / 2 + padding;\n let verticalPadding = (gridMaxHeight % cellSize) / 2 + padding;\n const horizontalCellCount = Math.floor(gridMaxWidth / cellSize);\n const verticalCellCount = Math.floor(gridMaxHeight / cellSize);\n super(horizontalPadding, verticalPadding, horizontalCellCount * cellSize, verticalCellCount * cellSize);\n this.canvasScreenLeft = horizontalPadding + (screenX ?? 0);\n this.canvasScreenTop = verticalPadding + (screenY ?? 0);\n this.cellSize = cellSize;\n this.screenWidth = screenWidth;\n this.screenHeight = screenHeight;\n this.horizontalCellCount = horizontalCellCount;\n this.verticalCellCount = verticalCellCount;\n this.screenLeft = screenX;\n this.screenTop = screenY;\n }\n\n /**\n * 将坐标对齐到网格上\n * @param x\n * @param y\n * @param gridSystem\n */\n snapCanvasPosition(x: number, y: number): number[] {\n //转为0坐标系\n let newX = this.getRangeValue(x - this.left, 0, this.right);\n let newY = this.getRangeValue(y - this.top, 0, this.bottom);\n return this.snapPosition(newX, newY);\n }\n\n private snapPosition(newX: number, newY: number) {\n const diffX = newX % this.cellSize;\n if (diffX >= this.cellSize / 2) {\n newX = newX + this.cellSize - diffX;\n } else {\n newX = newX - diffX;\n }\n\n const diffY = newY % this.cellSize;\n if (diffY >= this.cellSize / 2) {\n newY = newY + this.cellSize - diffY;\n } else {\n newY = newY - diffY;\n }\n return [newX + this.left, newY + this.top];\n }\n\n snapSize(width: number, height: number): number[] {\n let newWidth = Math.floor(width);\n let newHeight = Math.floor(height);\n let diffWidth = newWidth % this.cellSize;\n let diffHeight = newHeight % this.cellSize;\n if (diffWidth > this.cellSize / 2) {\n newWidth = width + this.cellSize - diffWidth;\n } else {\n newWidth = width - diffWidth;\n }\n\n if (diffHeight > this.cellSize / 2) {\n newHeight = height + this.cellSize - diffHeight;\n } else {\n newHeight = height - diffHeight;\n }\n\n return [newWidth, newHeight];\n }\n\n /**\n * 将矩形对齐到网格上\n * @param rect\n * @param minWidth\n * @param maxWidth\n * @param minHeight\n * @param maxHeight\n */\n snapCanvasRect(rect: GridRect, minWidth: number, maxWidth: number, minHeight: number, maxHeight: number): IGridRect {\n let [newX, newY] = this.snapCanvasPosition(rect.left, rect.top);\n return this.snapRect(rect, minWidth, maxWidth, minHeight, maxHeight, newX, newY);\n }\n\n private snapRect(\n rect: GridRect,\n minWidth: number,\n maxWidth: number,\n minHeight: number,\n maxHeight: number,\n newX: number,\n newY: number,\n ) {\n let [newWidth, newHeight] = this.snapSize(rect.width, rect.height);\n newWidth = this.getRangeValue(newWidth, minWidth, maxWidth);\n newHeight = this.getRangeValue(newHeight, minHeight, maxHeight);\n\n if (newX + newWidth > this.right) {\n newX = this.right - newWidth;\n }\n if (newY + newHeight > this.bottom) {\n newY = this.bottom - newHeight;\n }\n return new GridRect(newX, newY, newWidth, newHeight);\n }\n\n /**\n * 将矩形对齐到网格上,与snapRect的区别是,这个会加上屏幕x和y坐标,用于适配多个显示器\n * @param rect\n * @param minWidth\n * @param maxWidth\n * @param minHeight\n * @param maxHeight\n */\n snapWindow(rect: GridRect, minWidth: number, maxWidth: number, minHeight: number, maxHeight: number): IGridRect {\n rect.left = rect.left - (this.screenLeft ?? 0);\n rect.top = rect.top - (this.screenTop ?? 0);\n let result = this.snapCanvasRect(rect, minWidth, maxWidth, minHeight, maxHeight);\n return new GridRect(\n result.left + (this.screenLeft ?? 0),\n result.top + (this.screenTop ?? 0),\n result.width,\n result.height,\n );\n }\n\n /**\n * 限制值不超出屏幕\n * @param value\n * @param min\n * @param max\n * @private\n */\n private getRangeValue(value: number, min: number, max: number) {\n if (value < min) {\n return min;\n }\n if (value > max) {\n return max;\n }\n return value;\n }\n\n getWidth() {\n return this.width;\n }\n\n getHeight() {\n return this.height;\n }\n}\n","import {ElectronUtils} from \"../utils/ElectronUtils\";\r\n\r\nexport class ElectronApi {\r\n static async addIpcListener(key: String, f: Function) {\r\n await ElectronUtils.getAPI()?.addIpcListener(key, f);\r\n }\r\n\r\n static async removeIpcListener(key: String) {\r\n await ElectronUtils.getAPI()?.removeIpcListener(key);\r\n }\r\n\r\n}\r\n","import localforage from 'localforage';\nimport { BroadcastEvent } from '../model/event/BroadcastEvent';\nimport { WidgetData } from '../model/WidgetData';\nimport { BroadcastApi } from './BroadcastApi';\nimport { WidgetApiEvent } from './WidgetApi';\n\nexport interface SaveWidgetOption {\n sendBroadcast?: boolean;\n id?: string;\n}\n\nexport interface IWidgetDataApi {\n findByName<T extends WidgetData>(\n name: string,\n type: {\n new (name: string, id?: string): T;\n },\n ): Promise<T | undefined>;\n\n findByName<T extends WidgetData>(data: T): Promise<T | undefined>;\n\n save(data: WidgetData,options?: SaveWidgetOption): Promise<string>;\n\n getStore(name: string): LocalForage;\n\n saveByName<T extends WidgetData>(data: T, options?: SaveWidgetOption): Promise<string>;\n\n find<T extends WidgetData>(\n name: string,\n id: string,\n type: {\n new (name: string, id?: string): T;\n },\n ): Promise<T | undefined>;\n}\n\ntype WidgetDataApiMethods = keyof IWidgetDataApi;\n\nclass WidgetDataApiImpl implements IWidgetDataApi {\n private stores = new Map<string, LocalForage>();\n\n /**\n * 保存组件数据\n * @param data\n * @param options\n */\n public async save(data: WidgetData, options: SaveWidgetOption = { sendBroadcast: true }) {\n let store = this.getStore(data.name);\n let json = JSON.stringify(data);\n const result = await store.setItem(this.getKey(data.name, data.id), json);\n if (options.sendBroadcast) {\n const broadcastEvent = new BroadcastEvent({\n event: WidgetApiEvent.DATA_CHANGED,\n payload: { name: data.name, json },\n });\n await BroadcastApi.send(broadcastEvent);\n }\n return result;\n }\n\n /**\n * 获取组件 LocalForage 存储实例\n * @param name\n */\n public getStore(name: string): LocalForage {\n if (this.stores.has(name)) {\n return this.stores.get(name)!;\n }\n const store = localforage.createInstance({ name: name });\n this.stores.set(name, store);\n return store;\n }\n\n /**\n * 通过组件名保存组件信息,通常用于存储可以在同类组件中共用的数据\n * @param data\n * @param options\n */\n public async saveByName<T extends WidgetData>(data: T, options: SaveWidgetOption = { sendBroadcast: true }) {\n const store = this.getStore(data.name);\n const json = JSON.stringify(data);\n const result = await store.setItem(data.name, json);\n if (options?.sendBroadcast) {\n const broadcastEvent = new BroadcastEvent({\n event: WidgetApiEvent.DATA_CHANGED,\n payload: { name: data.name, json },\n });\n await BroadcastApi.send(broadcastEvent);\n }\n return result;\n }\n\n public async findByName<T extends WidgetData>(...args: any[]): Promise<T | undefined> {\n let name = '';\n let dbStr: string | null = '';\n let data: T;\n if (args.length === 2) {\n name = args[0];\n const type = args[1];\n data = new type(name);\n } else {\n data = args[0] as T;\n name = data.name;\n }\n let store = this.getStore(name);\n dbStr = await store.getItem<string>(name);\n if (dbStr) {\n data.parseJSON(JSON.parse(dbStr));\n return data;\n }\n return undefined;\n }\n\n public async find<T extends WidgetData>(\n name: string,\n id: string,\n type: {\n new (name: string, id?: string): T;\n },\n ): Promise<T | undefined> {\n let store = this.getStore(name);\n let result = await store.getItem<string>(this.getKey(name, id));\n if (result) {\n const widgetData = new type(name, id);\n widgetData.parseJSON(JSON.parse(result));\n return widgetData;\n }\n return undefined;\n }\n\n private getKey(name: string, id?: string) {\n return `${name}@${id}`;\n }\n}\n\nconst WidgetDataApi: IWidgetDataApi = new WidgetDataApiImpl();\nexport { WidgetDataApi, WidgetDataApiMethods };\n","export enum Channel {\r\n NOTIFICATION = \"channel::cn.widgetjs.core.notification\",\r\n BROWSER_WINDOW = \"channel::cn.widgetjs.core.browser_window\",\r\n BROADCAST = \"channel::cn.widgetjs.core.broadcast\",\r\n WIDGET = \"channel::cn.widgetjs.core.widget\",\r\n DEPLOYED_WIDGET = \"channel::cn.widgetjs.core.deployed_widget\",\r\n APP = \"channel::cn.widgetjs.core.app\",\r\n DIALOG = \"channel::cn.widgetjs.core.dialog\",\r\n CLIPBOARD = \"channel::cn.widgetjs.core.clipboard\",\r\n FILE = \"channel::cn.widgetjs.core.file\",\r\n SCREEN = \"channel::cn.widgetjs.core.screen\",\r\n SHORTCUT = \"channel::cn.widgetjs.core.shortcut\",\r\n LOG = \"channel::cn.widgetjs.core.log\",\r\n\r\n DEVICE = \"channel::cn.widgetjs.core.device\",\r\n MOUSE = \"channel::cn.widgetjs.core.mouse\",\r\n KEYBOARD = \"channel::cn.widgetjs.core.keyboard\",\r\n STORE = \"channel::cn.widgetjs.core.store\",\r\n\r\n PROCESS = \"channel::cn.widgetjs.core.process\",\r\n}\r\n","import {ElectronUtils} from \"../utils/ElectronUtils\";\r\n\r\nexport abstract class BaseApi<T extends string> {\r\n\r\n abstract getChannel(): string\r\n\r\n protected async invokeMethod(method: T, ...args: any[]): Promise<any> {\r\n return await ElectronUtils.invokeMethod(this.getChannel(), method, ...args);\r\n }\r\n\r\n protected async invoke(...args: any[]): Promise<any> {\r\n return await ElectronUtils.invoke(this.getChannel(), ...args);\r\n }\r\n}\r\n","import {BroadcastEvent} from \"../model/event/BroadcastEvent\";\r\nimport {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\nimport {WidgetApiEvent} from \"./WidgetApi\";\r\nimport {ShortcutApiEvent} from \"./ShortcutApi\";\r\nimport {ClipboardApiEvent} from \"./ClipboardApi\";\r\nimport {BrowserWindowApiEvent} from \"./BrowserWindowApi\";\r\n\r\ntype BroadcastEventType = WidgetApiEvent | BrowserWindowApiEvent | ShortcutApiEvent | ClipboardApiEvent | string\r\n\r\ninterface IBroadcastApi {\r\n send(event: BroadcastEvent): Promise<void>;\r\n\r\n register(...event: BroadcastEventType[]): Promise<void>;\r\n\r\n unregister(...event: BroadcastEventType[]): Promise<void>;\r\n}\r\n\r\ntype BroadcastApiMethods = keyof IBroadcastApi;\r\n\r\nclass BroadcastApiImpl extends BaseApi<BroadcastApiMethods> implements IBroadcastApi {\r\n async send(event: BroadcastEvent) {\r\n await this.invokeMethod('send', event);\r\n }\r\n\r\n async register(...event: BroadcastEventType[]) {\r\n await this.invokeMethod('register', event)\r\n }\r\n\r\n async unregister(...event: BroadcastEventType[]) {\r\n await this.invokeMethod('unregister', event)\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.BROADCAST;\r\n }\r\n\r\n}\r\n\r\nconst BroadcastApi: IBroadcastApi = new BroadcastApiImpl();\r\n\r\nexport {BroadcastApi, BroadcastApiMethods, BroadcastEventType}\r\n","import { Widget } from '../model/Widget';\r\nimport { WidgetPackage } from '../model/WidgetPackage';\r\nimport { Channel } from './Channel';\r\nimport { WidgetParams } from '../model/WidgetParams';\r\nimport { WidgetUrlUtils } from '../utils/WidgetUrlUtils';\r\nimport { BaseApi } from './BaseApi';\r\n\r\ninterface IWidgetApi {\r\n registerWidgets(widgets: Widget[]): Promise<void>;\r\n\r\n registerWidgetPackage(widgetPackage: WidgetPackage): Promise<void>;\r\n\r\n getWidgets(): Promise<Widget[]>;\r\n\r\n getWidget(name: string): Promise<Widget>;\r\n\r\n getWidgetPackage(name: string): Promise<WidgetPackage>;\r\n\r\n getWidgetPackages(): Promise<WidgetPackage[]>;\r\n\r\n getWidgetUrl(widgetName: string, widgetParams: WidgetParams): Promise<string | null>;\r\n\r\n getWidgetPackageIndexUrl(packageName: string, hash?: boolean): Promise<string | null>;\r\n\r\n getWidgetConfigUrl(widgetName: string, widgetParams: WidgetParams): Promise<string | null>;\r\n\r\n openConfigPage(id: string): Promise<void>;\r\n\r\n openConfigPageByName(name: string): Promise<void>;\r\n\r\n reload(): Promise<void>;\r\n\r\n getWidgetPackageUrl(packageName: string): Promise<string | null>;\r\n}\r\n\r\ntype WidgetApiMethods = keyof IWidgetApi;\r\n\r\nenum WidgetApiEvent {\r\n DATA_CHANGED = 'event::cn.widgetjs.core.widget.data-changed',\r\n EDIT_DESKTOP_WIDGETS = 'event::cn.widgetjs.core.widget.desktop.edit',\r\n}\r\n\r\nclass WidgetApiImpl extends BaseApi<WidgetApiMethods> implements IWidgetApi {\r\n reload(): Promise<void> {\r\n return this.invokeMethod('reload');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.WIDGET;\r\n }\r\n\r\n async registerWidgets(widgets: Widget[]) {\r\n return this.invokeMethod('registerWidgets', JSON.stringify(widgets));\r\n }\r\n\r\n async registerWidgetPackage(widgetPackage: WidgetPackage) {\r\n return this.invokeMethod('registerWidgetPackage', JSON.stringify(widgetPackage));\r\n }\r\n\r\n async getWidgets(): Promise<Widget[]> {\r\n const data = await this.invokeMethod('getWidgets');\r\n const widgets: Widget[] = [];\r\n if (data) {\r\n for (const item of data) {\r\n widgets.push(Widget.parseObject(item));\r\n }\r\n }\r\n return widgets;\r\n }\r\n\r\n async openConfigPage(widgetId: string) {\r\n return this.invokeMethod('openConfigPage', widgetId);\r\n }\r\n\r\n async openConfigPageByName(widgetName: string) {\r\n return this.invokeMethod('openConfigPageByName', widgetName);\r\n }\r\n\r\n async getWidgetPackages(): Promise<WidgetPackage[]> {\r\n return await this.invokeMethod('getWidgetPackages');\r\n }\r\n\r\n /**\r\n *\r\n * @param name package name\r\n */\r\n async getWidget(name: string): Promise<Widget> {\r\n return Widget.parseObject(await this.invokeMethod('getWidget', name));\r\n }\r\n\r\n /**\r\n *\r\n * @param name package name\r\n */\r\n async getWidgetPackage(name: string): Promise<WidgetPackage> {\r\n return WidgetPackage.parseObject(await this.invokeMethod('getWidgetPackage', name));\r\n }\r\n\r\n /**\r\n * 获取组件配置地址\r\n * @param widgetName\r\n */\r\n async getWidgetConfigUrl(widgetName: string, widgetParams: WidgetParams): Promise<string | null> {\r\n const widget = await this.getWidget(widgetName);\r\n if (!widget) return null;\r\n const configPagePath = widget.configPagePath;\r\n if (!configPagePath) return null;\r\n const widgetPackage = await this.getWidgetPackage(widget.packageName!);\r\n if (!widgetPackage) return null;\r\n return WidgetUrlUtils.getWidgetUrl(configPagePath, widgetPackage, widgetParams);\r\n }\r\n\r\n async getWidgetUrl(widgetName: string, widgetParams: WidgetParams): Promise<string | null> {\r\n const widget = await this.getWidget(widgetName);\r\n if (!widget) return null;\r\n const widgetPackage = await this.getWidgetPackage(widget.packageName!);\r\n if (!widgetPackage) return null;\r\n return WidgetUrlUtils.getWidgetUrl(widget.path, widgetPackage, widgetParams);\r\n }\r\n\r\n async getWidgetPackageIndexUrl(packageName: string, hash?: boolean): Promise<string | null> {\r\n const widgetPackage = await this.getWidgetPackage(packageName!);\r\n if (!widgetPackage) return null;\r\n return widgetPackage.getIndexUrl(hash);\r\n }\r\n\r\n async getWidgetPackageUrl(packageName: string): Promise<string | null> {\r\n const widgetPackage = await this.getWidgetPackage(packageName!);\r\n if (!widgetPackage) return null;\r\n return widgetPackage.url;\r\n }\r\n\r\n // /**\r\n // * 通过组件名保存组件信息,通常用于存储可以在同类组件中共用的数据\r\n // * @param data\r\n // * @param options\r\n // */\r\n // public async saveDataByName<T extends WidgetData>(data: T, options: SaveWidgetOption = {sendBroadcast: true}) {\r\n // const store = this.getStore(data.name);\r\n // const json = JSON.stringify(data);\r\n // const result = await store.setItem(data.name, json);\r\n // if (options.sendBroadcast) {\r\n // const broadcastEvent = new BroadcastEvent({\r\n // event: WidgetApiEvent.DATA_CHANGED,\r\n // payload: {\r\n // name: data.name,\r\n // id: options.id,\r\n // json\r\n // }\r\n // });\r\n // await BroadcastApi.send(broadcastEvent);\r\n // }\r\n // return result;\r\n // }\r\n //\r\n // private stores = new Map<string, LocalForage>()\r\n //\r\n // /**\r\n // * 获取组件 LocalForage 存储实例\r\n // * @param name\r\n // */\r\n // public getStore(name: string): LocalForage {\r\n // if (this.stores.has(name)) {\r\n // return this.stores.get(name)!\r\n // }\r\n // const store = localforage.createInstance({name: name});\r\n // this.stores.set(name, store);\r\n // return store;\r\n // }\r\n}\r\n\r\nconst WidgetApi = new WidgetApiImpl();\r\nexport { WidgetApi, WidgetApiEvent, WidgetApiMethods };\r\n","import { Channel } from './Channel';\r\nimport { ElectronUtils } from '../utils/ElectronUtils';\r\nimport { Rectangle } from '../model/interface/Rectangle';\r\nimport { Position } from '../model/msic/graphics';\r\nimport { BaseApi } from './BaseApi';\r\nimport type { Config } from 'electron';\r\n\r\ninterface IBrowserWindowApi {\r\n setIgnoreMouseEvent(ignore: boolean): Promise<void>;\r\n\r\n show(): Promise<void>;\r\n\r\n hide(): Promise<void>;\r\n\r\n close(): Promise<void>;\r\n\r\n showInactive(): Promise<void>;\r\n\r\n center(): Promise<void>;\r\n\r\n startDraggingWindow(): Promise<void>;\r\n\r\n minimize(): Promise<void>;\r\n\r\n restore(): Promise<void>;\r\n\r\n isMinimized(): Promise<boolean>;\r\n\r\n isMaximized(): Promise<boolean>;\r\n\r\n maximize(): Promise<void>;\r\n\r\n stopDraggingWindow(): Promise<void>;\r\n\r\n setAlwaysOnTop(alwaysOnTop: boolean): Promise<void>;\r\n\r\n isAlwaysOnTop(): Promise<boolean>;\r\n\r\n openUrl(url: string, option?: OpenUrlOptions): Promise<void>;\r\n\r\n moveTop(): Promise<void>;\r\n\r\n unmaximize(): Promise<void>;\r\n\r\n reload(): Promise<void>;\r\n\r\n setSize(width: number, height: number, animate?: boolean): Promise<void>;\r\n\r\n openDevTools(): Promise<void>;\r\n\r\n setPosition(options: SetPositionOptions): Promise<void>;\r\n\r\n getPosition(): Promise<Position>;\r\n\r\n blur(): Promise<void>;\r\n\r\n focus(): Promise<void>;\r\n\r\n setResizable(resizable: boolean): Promise<void>;\r\n\r\n setMovable(movable: boolean): Promise<void>;\r\n\r\n getBounds(): Promise<Rectangle>;\r\n\r\n setBounds(bounds: Partial<Rectangle>, animate: boolean): Promise<void>;\r\n\r\n alignToScreen(align: AlignPosition): Promise<void>;\r\n\r\n existsByUrl(url: string): Promise<boolean>;\r\n\r\n getMaximumSize(): Promise<number[]>;\r\n\r\n getMinimumSize(): Promise<number[]>;\r\n\r\n setMaximumSize(width: number, height: number): Promise<void>;\r\n\r\n setMinimumSize(width: number, height: number): Promise<void>;\r\n\r\n setZoomLevel(level: number): Promise<void>;\r\n\r\n setZoomFactor(factor: number): Promise<void>;\r\n\r\n setProxy(config: Config): Promise<void>;\r\n\r\n isFocused(): Promise<boolean>;\r\n}\r\n\r\ntype BrowserWindowApiMethods = keyof IBrowserWindowApi;\r\ntype AlignPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';\r\n\r\ninterface OpenUrlOptions {\r\n partition?: string;\r\n external?: boolean;\r\n}\r\n\r\ninterface SetPositionOptions {\r\n x?: number;\r\n y?: number;\r\n /**\r\n * 只有在 macOS 上有效\r\n */\r\n animation?: boolean;\r\n}\r\n\r\nenum BrowserWindowApiEvent {\r\n BLUR = 'event::cn.widgetjs.core.browser-window.blur',\r\n MOVED = 'event::cn.widgetjs.core.browser-window.moved',\r\n FOCUS = 'event::cn.widgetjs.core.browser-window.focus',\r\n SNAP_TO_EDGE = 'event::cn.widgetjs.core.browser-window.snap_to_edge',\r\n RESIZED = 'event::cn.widgetjs.core.browser-window.resized',\r\n CANCEL_SNAP_TO_EDGE = 'event::cn.widgetjs.core.browser-window.cancel_snap_to_edge',\r\n}\r\n\r\ninterface SetupOptions {\r\n width: number;\r\n height: number;\r\n minWidth?: number;\r\n minHeight?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n resizable?: boolean;\r\n movable?: boolean;\r\n center?: boolean;\r\n alwaysOnTop?: boolean;\r\n}\r\n\r\nclass BrowserWindowApiImpl extends BaseApi<BrowserWindowApiMethods> implements IBrowserWindowApi {\r\n getChannel(): string {\r\n return Channel.BROWSER_WINDOW;\r\n }\r\n\r\n async setIgnoreMouseEvent(ignore: boolean) {\r\n await this.invokeMethod('setIgnoreMouseEvent', ignore);\r\n }\r\n\r\n async show() {\r\n await this.invokeMethod('show', true);\r\n }\r\n\r\n async showInactive() {\r\n await this.invokeMethod('showInactive', true);\r\n }\r\n\r\n async hide() {\r\n await this.invokeMethod('hide', false);\r\n }\r\n\r\n async center() {\r\n await this.invokeMethod('center', false);\r\n }\r\n\r\n async setAlwaysOnTop(alwaysOnTop: boolean) {\r\n await this.invokeMethod('setAlwaysOnTop', alwaysOnTop);\r\n }\r\n\r\n async isAlwaysOnTop(): Promise<boolean> {\r\n return await this.invokeMethod('isAlwaysOnTop');\r\n }\r\n\r\n async openUrl(url: string, option?: OpenUrlOptions) {\r\n if (ElectronUtils.hasElectronApi()) {\r\n await this.invokeMethod('openUrl', url, option);\r\n } else {\r\n window.open(url, '_blank');\r\n }\r\n }\r\n\r\n async moveTop() {\r\n await this.invokeMethod('moveTop');\r\n }\r\n\r\n async openDevTools() {\r\n await this.invokeMethod('openDevTools');\r\n }\r\n\r\n async setPosition(options: SetPositionOptions) {\r\n await this.invokeMethod('setPosition', options);\r\n }\r\n\r\n async getPosition(): Promise<Position> {\r\n return await this.invokeMethod('getPosition');\r\n }\r\n\r\n async blur() {\r\n return await this.invokeMethod('blur');\r\n }\r\n\r\n async focus() {\r\n return await this.invokeMethod('focus');\r\n }\r\n\r\n /**\r\n * 设置窗口是否可以拉伸\r\n * @param resizable\r\n */\r\n async setResizable(resizable: boolean) {\r\n return await this.invokeMethod('setResizable', resizable);\r\n }\r\n\r\n async getBounds(): Promise<Rectangle> {\r\n return await this.invokeMethod('getBounds');\r\n }\r\n\r\n async setBounds(bounds: Partial<Rectangle>, animate?: boolean): Promise<void> {\r\n return await this.invokeMethod('setBounds', bounds, animate);\r\n }\r\n\r\n async alignToScreen(align: AlignPosition) {\r\n return await this.invokeMethod('alignToScreen', align);\r\n }\r\n\r\n async startDraggingWindow() {\r\n return await this.invokeMethod('startDraggingWindow');\r\n }\r\n\r\n async stopDraggingWindow() {\r\n return await this.invokeMethod('stopDraggingWindow');\r\n }\r\n\r\n /**\r\n * 通过url检测窗口是否存在\r\n * @param url\r\n */\r\n async existsByUrl(url: string): Promise<boolean> {\r\n return await this.invokeMethod('existsByUrl', url);\r\n }\r\n\r\n async getMaximumSize(): Promise<number[]> {\r\n return await this.invokeMethod('getMaximumSize');\r\n }\r\n\r\n async minimize(): Promise<void> {\r\n return await this.invokeMethod('minimize');\r\n }\r\n\r\n async maximize(): Promise<void> {\r\n return await this.invokeMethod('maximize');\r\n }\r\n\r\n async isMaximized(): Promise<boolean> {\r\n return await this.invokeMethod('isMaximized');\r\n }\r\n\r\n async isMinimized(): Promise<boolean> {\r\n return await this.invokeMethod('isMinimized');\r\n }\r\n\r\n async restore(): Promise<void> {\r\n return await this.invokeMethod('restore');\r\n }\r\n\r\n async unmaximize(): Promise<void> {\r\n return await this.invokeMethod('unmaximize');\r\n }\r\n\r\n async setZoomLevel(level: number): Promise<void> {\r\n return await this.invokeMethod('setZoomLevel');\r\n }\r\n\r\n async reload(): Promise<void> {\r\n return await this.invokeMethod('reload');\r\n }\r\n\r\n async setMovable(movable: boolean): Promise<void> {\r\n return await this.invokeMethod('setMovable', movable);\r\n }\r\n\r\n async setSize(width: number, height: number, animate?: boolean): Promise<void> {\r\n return this.invokeMethod('setSize', width, height, animate);\r\n }\r\n\r\n async isFocused(): Promise<boolean> {\r\n return this.invokeMethod('isFocused');\r\n }\r\n\r\n async setMaximumSize(width: number, height: number): Promise<void> {\r\n return this.invokeMethod('setMaximumSize', width, height);\r\n }\r\n\r\n async setMinimumSize(width: number, height: number): Promise<void> {\r\n return this.invokeMethod('setMinimumSize', width, height);\r\n }\r\n\r\n getMinimumSize(): Promise<number[]> {\r\n return this.invokeMethod('getMinimumSize');\r\n }\r\n\r\n close(): Promise<void> {\r\n return this.invokeMethod('close');\r\n }\r\n\r\n setZoomFactor(factor: number): Promise<void> {\r\n return this.invokeMethod('setZoomFactor', factor);\r\n }\r\n\r\n async setup(options: SetupOptions): Promise<void> {\r\n if (options.alwaysOnTop) {\r\n await this.setAlwaysOnTop(true);\r\n }\r\n await this.setResizable(!!options.resizable);\r\n await this.setMovable(!!options.movable);\r\n if (options.width && options.height) {\r\n await this.setSize(options.width, options.height);\r\n }\r\n if (options.minWidth && options.minHeight) {\r\n await this.setMinimumSize(options.minWidth, options.minHeight);\r\n }\r\n if (options.maxWidth && options.maxHeight) {\r\n await this.setMaximumSize(options.maxWidth, options.maxHeight);\r\n }\r\n if (options.center) {\r\n await this.center();\r\n }\r\n }\r\n\r\n async setProxy(config: Config): Promise<void> {\r\n return await this.invokeMethod('setProxy',config);\r\n }\r\n}\r\n\r\nconst BrowserWindowApi = new BrowserWindowApiImpl();\r\nexport {\r\n BrowserWindowApi,\r\n BrowserWindowApiMethods,\r\n OpenUrlOptions,\r\n SetPositionOptions,\r\n BrowserWindowApiEvent,\r\n AlignPosition,\r\n};\r\n","import {AppNotification} from \"../model/AppNotification\";\r\nimport {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\n\r\ninterface INotificationApi {\r\n send(notification: AppNotification): Promise<void>;\r\n\r\n hide(): Promise<void>;\r\n}\r\n\r\ntype NotificationApiMethods = keyof INotificationApi\r\n\r\nenum NotificationApiEvent {\r\n CONFIRM = \"event::cn.widgetjs.core.notification.confirm\",\r\n CANCEL = \"event::cn.widgetjs.core.notification.cancel\",\r\n HIDE = \"event::cn.widgetjs.core.notification.hide\",\r\n}\r\n\r\nclass NotificationApiImpl extends BaseApi<NotificationApiMethods> implements INotificationApi {\r\n\r\n // static async url(url: string, duration: number = -1) {\r\n // this.invoke(Channel.NOTIFICATION, new AppNotification({\r\n // url, message: \"\",\r\n // duration,\r\n // type: \"url\",\r\n // }));\r\n // }\r\n\r\n /**\r\n * 来电\r\n * @param avatar 头像地址\r\n * @param audio 音频地址\r\n * @param title 标题文件\r\n * @param message 初始消息\r\n * @param lyric 歌词字符串\r\n */\r\n async call(avatar: string, audio: string, title: string, message: string, lyric: string) {\r\n await this.invoke(new AppNotification({\r\n avatar,\r\n audio,\r\n message,\r\n title,\r\n duration: -1,\r\n lyric,\r\n type: \"call\",\r\n }));\r\n }\r\n\r\n async send(notification: AppNotification) {\r\n return this.invokeMethod('send', notification);\r\n }\r\n\r\n async reminder(title: string, message: string, icon: string, cancelButtonText: string,\r\n confirmButtonText: string, cancelBroadcast: string, confirmBroadcast: string, duration: number = 5000) {\r\n return await this.send(new AppNotification({\r\n icon,\r\n message,\r\n title,\r\n duration,\r\n cancelButtonText,\r\n confirmButtonText,\r\n cancelBroadcast,\r\n confirmBroadcast,\r\n type: \"reminder\",\r\n }))\r\n }\r\n\r\n async advanceCountdown(message: string, targetTime: string, title?: string) {\r\n return await this.send(new AppNotification({\r\n title,\r\n message,\r\n targetTime,\r\n type: \"advance-countdown\"\r\n }))\r\n }\r\n\r\n async countdown(message: string, targetTime: string) {\r\n await this.send(new AppNotification({\r\n message,\r\n targetTime,\r\n backgroundColor: 'rgba(0,0,0,0.5)',\r\n duration: -1,\r\n type: \"countdown\"\r\n }));\r\n }\r\n\r\n async success(message: string, duration: number = 5000) {\r\n await this.send(new AppNotification({\r\n message,\r\n type: \"success\",\r\n icon: \"check_circle_line\",\r\n duration\r\n }));\r\n }\r\n\r\n async error(message: string, duration: number = 5000) {\r\n await this.send(new AppNotification({\r\n message,\r\n type: \"error\",\r\n icon: \"close_circle_line\",\r\n duration\r\n }));\r\n }\r\n\r\n async warning(message: string, duration: number = 5000) {\r\n await this.send(new AppNotification({\r\n message,\r\n type: \"warning\",\r\n icon: \"warning_line\",\r\n duration\r\n }));\r\n }\r\n\r\n async info(message: string, duration: number = 5000) {\r\n await this.send(new AppNotification({\r\n message,\r\n type: \"info\",\r\n icon: \"information_line\",\r\n duration\r\n }));\r\n }\r\n\r\n /**\r\n * 隐藏通知\r\n */\r\n async hide() {\r\n await this.invokeMethod('hide');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.NOTIFICATION;\r\n }\r\n}\r\n\r\nconst NotificationApi: NotificationApiImpl = new NotificationApiImpl();\r\nexport {NotificationApi, NotificationApiMethods, NotificationApiEvent}\r\n","import {Channel} from \"./Channel\";\r\nimport {WidgetParams} from \"../model/WidgetParams\";\r\nimport {BaseApi} from \"./BaseApi\";\r\nimport {DeployMode} from '../model/DeployMode';\r\nimport {Widget} from '../model/Widget';\r\nimport {DeployedWidget} from \"../model/DeployedWidget\";\r\n\r\ninterface IDeployedWidgetApi {\r\n removeDeployedWidget(id: string): Promise<void>;\r\n\r\n removeDeployedWidgetByName(name: string): Promise<DeployedWidget[]>;\r\n\r\n getDeployedWidgets(): Promise<DeployedWidget[]>;\r\n\r\n openDevTools(id: string): Promise<void>;\r\n\r\n openConfigPage(id: string): Promise<void>;\r\n\r\n registerActiveShortcut(id: string, shortcut: string): Promise<boolean>;\r\n\r\n setProxy(id: string, proxy: string): Promise<boolean>;\r\n\r\n getDeployedWidget(id: string): Promise<DeployedWidget>;\r\n\r\n addWidget(widgetName: string, hostMode: DeployMode): Promise<Widget[]>;\r\n}\r\n\r\ntype DeployedWidgetApiMethods = keyof IDeployedWidgetApi;\r\n\r\nclass DeployedWidgetApiImpl extends BaseApi<DeployedWidgetApiMethods> implements IDeployedWidgetApi {\r\n getChannel(): string {\r\n return Channel.DEPLOYED_WIDGET;\r\n }\r\n\r\n /**\r\n * 移除组件\r\n * @param id\r\n */\r\n async removeDeployedWidget(id: string) {\r\n return this.invokeMethod('removeDeployedWidget', id)\r\n }\r\n\r\n\r\n addWidget(widgetName: string, hostMode: DeployMode): Promise<Widget[]> {\r\n return this.invokeMethod('addWidget', widgetName, hostMode);\r\n }\r\n\r\n /**\r\n * 通过组件名移除已添加的组件\r\n * @param name 组件名\r\n */\r\n async removeDeployedWidgetByName(name: string): Promise<DeployedWidget[]> {\r\n return this.invokeMethod('removeDeployedWidgetByName', name)\r\n }\r\n\r\n /**\r\n * 获取已添加的组件\r\n * @param name 组件名,可以不传\r\n */\r\n async getDeployedWidgets(name?: string): Promise<DeployedWidget[]> {\r\n return this.invokeMethod('getDeployedWidgets', name)\r\n }\r\n\r\n async getDeployedWidget(id: string): Promise<DeployedWidget> {\r\n return this.invokeMethod('getDeployedWidget', id)\r\n }\r\n\r\n /**\r\n * Opens the dev tools for a widget with the specified ID.\r\n *\r\n * @param {string} widgetId - The ID of the widget to open the dev tools for.\r\n * @return {Promise} A Promise that resolves when the dev tools are opened.\r\n */\r\n async openDevTools(widgetId: string) {\r\n return this.invokeMethod('openDevTools', widgetId)\r\n }\r\n\r\n async openConfigPage(widgetId: string, params?: WidgetParams) {\r\n return this.invokeMethod('openConfigPage', widgetId, params)\r\n }\r\n\r\n /**\r\n * 注册激活、呼出、置顶组件快捷键\r\n * @param widgetId 组件id\r\n * @param shortcut 如果传空或者不传,则会取消快捷键。更多快捷键配置,请查看Accelerator用法\r\n * https://www.electronjs.org/docs/latest/api/accelerator\r\n */\r\n async registerActiveShortcut(widgetId: string, shortcut?: string): Promise<boolean> {\r\n return this.invokeMethod('registerActiveShortcut', widgetId, shortcut)\r\n }\r\n\r\n async setProxy(widgetId: string, proxy: string): Promise<boolean> {\r\n return this.invokeMethod('setProxy', widgetId, proxy)\r\n }\r\n\r\n}\r\n\r\nconst DeployedWidgetApi = new DeployedWidgetApiImpl();\r\nexport {DeployedWidgetApi, DeployedWidgetApiMethods}\r\n","import {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\nimport {Point} from \"../model/msic/graphics\";\r\n\r\ninterface IDeviceApi {\r\n getCursorScreenPoint(): Promise<Point>;\r\n\r\n isAllKeyReleased(): Promise<boolean>;\r\n}\r\n\r\ntype DeviceApiMethods = keyof IDeviceApi;\r\n\r\nclass DeviceApiImpl extends BaseApi<DeviceApiMethods> implements IDeviceApi {\r\n\r\n /**\r\n * 获取当前鼠标位置\r\n */\r\n async getCursorScreenPoint(): Promise<Point> {\r\n return this.invokeMethod('getCursorScreenPoint');\r\n }\r\n\r\n /**\r\n * 判断是否所有按键都已经释放\r\n */\r\n async isAllKeyReleased(): Promise<boolean> {\r\n return this.invokeMethod('isAllKeyReleased');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.DEVICE;\r\n }\r\n}\r\n\r\n\r\nconst DeviceApi: IDeviceApi = new DeviceApiImpl();\r\n\r\nexport {DeviceApi, DeviceApiMethods}\r\n","import {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\n\r\n\r\ninterface IClipboardApi {\r\n getSelectedText(): Promise<string | undefined>;\r\n\r\n getText(): Promise<string | undefined>;\r\n}\r\n\r\ntype ClipboardApiMethods = keyof IClipboardApi;\r\n\r\nenum ClipboardApiEvent {\r\n CHANGED = 'clipboard-changed'\r\n}\r\n\r\nclass ClipboardApiImpl extends BaseApi<ClipboardApiMethods> implements IClipboardApi {\r\n\r\n async getSelectedText(): Promise<string | undefined> {\r\n return this.invokeMethod('getSelectedText');\r\n }\r\n\r\n async getText(): Promise<string | undefined> {\r\n return this.invokeMethod('getText');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.CLIPBOARD;\r\n }\r\n\r\n}\r\n\r\n\r\nconst ClipboardApi: IClipboardApi = new ClipboardApiImpl();\r\n\r\nexport {ClipboardApi, ClipboardApiMethods, ClipboardApiEvent}\r\n","export class ApiConstants {\r\n static readonly CONFIG_LAUNCH_AT_STARTUP = \"CONFIG_LAUNCH_AT_STARTUP\";\r\n static readonly CONFIG_WIDGET_TITLE_COLOR = \"CONFIG_WIDGET_TITLE_COLOR\";\r\n static readonly CONFIG_DEBUG_MODE = \"cn.widgetjs.config.debug\";\r\n static readonly CONFIG_GRID_CELL_SIZE = \"cn.widgetjs.config.grid.size\";\r\n static readonly SHORTCUT_PIN_DESKTOP_WIDGETS = \"cn.widgetjs.config.shortcut.pin_desktop_widgets\";\r\n}\r\n","import {BaseApi} from \"./BaseApi\";\r\nimport {Channel} from \"./Channel\";\r\n\r\ninterface IShortcutApi {\r\n /**\r\n * register shortcut for widget, if registered successful, {@link BroadcastEvent} will be sent once shortcut hits\r\n * @see https://www.electronjs.org/docs/latest/api/accelerator\r\n * @example Ctrl+Meta+Y, Meta for windows key\r\n * @param shortcut\r\n * @return true if register success\r\n */\r\n register(shortcut: string): Promise<boolean>\r\n\r\n unregister(shortcut: string): void\r\n}\r\n\r\ntype ShortcutApiMethods = keyof IShortcutApi;\r\n\r\nenum ShortcutApiEvent {\r\n TRIGGERED = \"channel::cn.widgetjs.core.shortcut.triggered\"\r\n}\r\n\r\n\r\nclass ShortcutApiImpl extends BaseApi<ShortcutApiMethods> implements IShortcutApi {\r\n getChannel(): string {\r\n return Channel.SHORTCUT;\r\n }\r\n\r\n async register(shortcut: string):Promise<boolean> {\r\n return await this.invokeMethod('register', shortcut);\r\n }\r\n\r\n async unregister(shortcut: string) {\r\n return await this.invokeMethod('unregister', shortcut);\r\n }\r\n\r\n}\r\n\r\nconst ShortcutApi: IShortcutApi = new ShortcutApiImpl();\r\nexport {ShortcutApi, ShortcutApiMethods, ShortcutApiEvent}\r\n","import {Channel} from './Channel';\r\nimport {BaseApi} from './BaseApi';\r\nimport type {\r\n CPUUsage,\r\n IOCounters,\r\n BlinkMemoryInfo,\r\n HeapStatistics,\r\n ProcessMemoryInfo,\r\n SystemMemoryInfo\r\n} from 'electron';\r\n\r\ninterface IProcessApi {\r\n getCPUUsage(): Promise<CPUUsage>;\r\n\r\n getIOCounters(): Promise<IOCounters>;\r\n\r\n getBlinkMemoryInfo(): Promise<BlinkMemoryInfo>;\r\n\r\n getHeapStatistics(): Promise<HeapStatistics>;\r\n\r\n /**\r\n * // On macOS -> '10.13.6'\r\n * // On Windows -> '10.0.17763'\r\n * // On Linux -> '4.15.0-45-generic'\r\n */\r\n getSystemVersion(): Promise<string>;\r\n\r\n getProcessMemoryInfo(): Promise<ProcessMemoryInfo>;\r\n\r\n getSystemMemoryInfo(): Promise<SystemMemoryInfo>\r\n}\r\n\r\ntype ProcessApiMethods = keyof IProcessApi;\r\n\r\nclass ProcessApiImpl extends BaseApi<ProcessApiMethods> implements IProcessApi {\r\n getChannel(): string {\r\n return Channel.PROCESS;\r\n }\r\n\r\n getBlinkMemoryInfo(): Promise<BlinkMemoryInfo> {\r\n return this.invokeMethod('getBlinkMemoryInfo')\r\n }\r\n\r\n getCPUUsage(): Promise<CPUUsage> {\r\n return this.invokeMethod('getCPUUsage');\r\n }\r\n\r\n getHeapStatistics(): Promise<HeapStatistics> {\r\n return this.invokeMethod('getHeapStatistics');\r\n }\r\n\r\n getIOCounters(): Promise<IOCounters> {\r\n return this.invokeMethod('getIOCounters');\r\n }\r\n\r\n getProcessMemoryInfo(): Promise<ProcessMemoryInfo> {\r\n return this.invokeMethod('getProcessMemoryInfo');\r\n }\r\n\r\n getSystemMemoryInfo(): Promise<SystemMemoryInfo> {\r\n return this.invokeMethod('getSystemMemoryInfo');\r\n }\r\n\r\n getSystemVersion(): Promise<string> {\r\n return this.invokeMethod('getSystemVersion');\r\n }\r\n\r\n}\r\n\r\nconst ProcessApi: IProcessApi = new ProcessApiImpl();\r\n\r\nexport {ProcessApi, ProcessApiMethods};\r\n","import { Channel } from './Channel';\r\nimport { BaseApi } from './BaseApi';\r\nimport {key} from \"localforage\";\r\nimport {ElectronUtils} from \"../utils/ElectronUtils\";\r\n\r\ninterface IAppApi {\r\n setConfig(key: string, value: string | number | boolean): Promise<any>;\r\n\r\n getConfig(key: string, defaultValue: string | number | boolean): Promise<string | number | boolean>;\r\n\r\n getVersion(): Promise<string>;\r\n\r\n getPreloadPath(): Promise<string>;\r\n\r\n getAppPath(): Promise<string>;\r\n\r\n openAddWidgetWindow(): Promise<void>;\r\n\r\n openSettingWindow(): Promise<void>;\r\n\r\n getIconFile(): Promise<string>;\r\n\r\n /**\r\n * 应用是否是从微软商店下载\r\n */\r\n isWindowsStore(): Promise<boolean>;\r\n\r\n}\r\n\r\ntype AppApiMethods = keyof IAppApi;\r\n\r\nenum AppApiEvent {\r\n CONFIG_CHANGED = 'event::cn.widgetjs.core.app.config.changed',\r\n MOVING_GRID_WINDOW = 'event::cn.widgetjs.core.app.moving.grid.window',\r\n STOP_MOVING_GRID_WINDOW = 'event::cn.widgetjs.core.app.moving.grid.window.stop',\r\n}\r\n\r\nenum AppApiConstants {\r\n CONFIG_GRID_CELL_SIZE = 'cn.widgetjs.config.grid.size',\r\n}\r\n\r\nclass AppApiImpl extends BaseApi<AppApiMethods> implements IAppApi {\r\n isWindowsStore(): Promise<boolean> {\r\n return this.invokeMethod('isWindowsStore');\r\n }\r\n getAppPath(): Promise<string> {\r\n return this.invokeMethod('getAppPath');\r\n }\r\n\r\n async getIconFile(): Promise<string> {\r\n return this.invokeMethod('getIconFile');\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.APP;\r\n }\r\n\r\n async setConfig(key: string, value: string | number | boolean) {\r\n return await this.invokeMethod('setConfig', key, value);\r\n }\r\n\r\n async getConfig(\r\n key: string | AppApiConstants,\r\n defaultValue: string | number | boolean,\r\n ): Promise<string | number | boolean> {\r\n const value = await this.invokeMethod('getConfig', key);\r\n if (value === null || value === undefined) {\r\n return defaultValue;\r\n }\r\n if (typeof defaultValue == 'boolean') {\r\n return value === 'true';\r\n }\r\n\r\n if (typeof defaultValue == 'number') {\r\n return Number(value);\r\n }\r\n return value;\r\n }\r\n\r\n async openAddWidgetWindow() {\r\n return this.invokeMethod('openAddWidgetWindow');\r\n }\r\n\r\n /**\r\n * 获取应用版本号,格式为 x.y.z\r\n */\r\n async getVersion(): Promise<string> {\r\n return this.invokeMethod('getVersion');\r\n }\r\n\r\n async getPreloadPath(): Promise<string> {\r\n return this.invokeMethod('getPreloadPath');\r\n }\r\n\r\n async openSettingWindow() {\r\n return this.invokeMethod('openSettingWindow');\r\n }\r\n\r\n}\r\n\r\nconst AppApi: IAppApi = new AppApiImpl();\r\n\r\nexport {AppApi, AppApiEvent, AppApiMethods, AppApiConstants};\r\n","import {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\n\r\ninterface IDialogApi {\r\n pickFile(extensions?: string[]): Promise<string | undefined>\r\n\r\n pickFolder(): Promise<string | undefined>\r\n}\r\n\r\ntype DialogApiMethods = keyof IDialogApi;\r\n\r\nclass DialogApiImpl extends BaseApi<DialogApiMethods> implements IDialogApi {\r\n\r\n getChannel(): string {\r\n return Channel.DIALOG;\r\n }\r\n\r\n /**\r\n * 选取单个文件\r\n * @param extensions 允许的文件后缀格式,如:[\"txt\",\"docx\",\"gif\"]\r\n */\r\n pickFile(extensions: string[] | undefined): Promise<string | undefined> {\r\n return this.invokeMethod('pickFile', extensions);\r\n }\r\n\r\n pickFolder(): Promise<string | undefined> {\r\n return this.invokeMethod('pickFolder');\r\n }\r\n\r\n}\r\n\r\n\r\nconst DialogApi: IDialogApi = new DialogApiImpl();\r\nexport {DialogApiMethods, DialogApi,}\r\n","import {BaseApi} from './BaseApi';\r\nimport {Channel} from './Channel';\r\n\r\ntype BaseType = string | number | boolean\r\n\r\ninterface IStoreApi {\r\n get<T extends BaseType>(key: string, defaultValue?: T): Promise<T | null>;\r\n\r\n set(key: string, value: BaseType | object): Promise<string>;\r\n\r\n getObject<T>(key: string, defaultValue?: T): Promise<T | undefined>;\r\n\r\n delete(key: string): Promise<void>;\r\n}\r\n\r\ntype StoreApiMethods = keyof IStoreApi;\r\n\r\nclass StoreApiImpl extends BaseApi<StoreApiMethods> implements IStoreApi {\r\n getChannel(): string {\r\n return Channel.STORE;\r\n }\r\n\r\n async delete(key: string): Promise<void> {\r\n return this.invokeMethod('delete', key);\r\n }\r\n\r\n async get<T extends BaseType>(key: string, defaultValue?: T): Promise<T | null> {\r\n const result = await this.invokeMethod('get', key);\r\n if (result == null && defaultValue != undefined) {\r\n return defaultValue;\r\n }\r\n return result\r\n }\r\n\r\n async getObject<T>(key: string, defaultValue?: T): Promise<T | undefined> {\r\n const result = await this.invokeMethod('get', key)\r\n if (result) {\r\n return JSON.parse(result)\r\n }\r\n if (defaultValue != undefined) {\r\n return defaultValue;\r\n }\r\n return undefined;\r\n }\r\n\r\n async set(key: string, value: BaseType | object): Promise<string> {\r\n if (typeof value == 'object') {\r\n return this.invokeMethod('set', key, JSON.stringify(value))\r\n }\r\n return this.invokeMethod('set', key, value)\r\n }\r\n\r\n}\r\n\r\nconst StoreApi: IStoreApi = new StoreApiImpl();\r\nexport {StoreApi, StoreApiMethods}\r\n","import {Channel} from \"./Channel\";\r\nimport {BaseApi} from \"./BaseApi\";\r\n\r\ninterface ILogApi {\r\n info(...data: any[]): void;\r\n\r\n error(...data: any[]): void;\r\n\r\n warn(...data: any[]): void;\r\n\r\n log(...data: any[]): void;\r\n\r\n json(data: any): void;\r\n}\r\n\r\ntype LogApiMethods = keyof ILogApi;\r\n\r\nclass LogApiImpl extends BaseApi<LogApiMethods> implements ILogApi {\r\n\r\n getChannel(): string {\r\n return Channel.LOG\r\n }\r\n\r\n info(...data: any[]) {\r\n console.info(...data)\r\n this.invokeMethod('info', ...data)\r\n }\r\n\r\n error(...data: any[]) {\r\n console.error(...data)\r\n this.invokeMethod('error', ...data)\r\n }\r\n\r\n warn(...data: any[]) {\r\n console.warn(...data)\r\n this.invokeMethod('warn', ...data)\r\n }\r\n\r\n log(...data: any[]) {\r\n console.log(...data)\r\n this.invokeMethod('log', ...data)\r\n }\r\n\r\n json(data: any): void {\r\n const json = JSON.stringify(data, null, 2);\r\n this.log(json)\r\n }\r\n}\r\n\r\nconst LogApi: ILogApi = new LogApiImpl();\r\nexport {LogApi, LogApiMethods}\r\n","import { Channel } from './Channel';\r\nimport { BaseApi } from './BaseApi';\r\nimport { FileTypeResult } from 'file-type';\r\nimport { Metadata } from '../types';\r\n\r\nexport interface SystemFile {\r\n isDir: boolean;\r\n name: string;\r\n absolutePath: string;\r\n /**\r\n * mine type\r\n */\r\n type: string;\r\n children?: SystemFile[];\r\n}\r\n\r\nexport interface FileInfo {\r\n isDir: boolean;\r\n name: string;\r\n absolutePath: string;\r\n /**\r\n * mine类型\r\n */\r\n type?: string;\r\n /**\r\n * 格式\r\n */\r\n extension?: string;\r\n}\r\n\r\nexport interface ReadDirOptions {\r\n ignoreDir?: boolean;\r\n traverseDir?: boolean;\r\n}\r\n\r\nexport interface DownloadUrlOptions {\r\n url: string;\r\n savePath: string;\r\n fileName: string;\r\n /**\r\n * true - overwrite existing\r\n * false - ignore\r\n */\r\n overwrite?: boolean;\r\n}\r\n\r\ninterface IFileApi {\r\n readDirectory(path: string, options?: ReadDirOptions): Promise<SystemFile>;\r\n\r\n isDirectory(filePath: string): Promise<boolean>;\r\n\r\n getMimeType(absoluteFilePath: string): Promise<FileTypeResult>;\r\n\r\n downloadUrl(option: DownloadUrlOptions): Promise<string>;\r\n\r\n exists(filePath: string): Promise<boolean>;\r\n\r\n delete(filePath: string): Promise<boolean>;\r\n\r\n getInfo(absoluteFilePath: string): Promise<FileInfo>;\r\n\r\n /**\r\n * 显示系统文件夹\r\n * @param absoluteFolderPath\r\n */\r\n showSystemFolder(absoluteFolderPath: string): void;\r\n\r\n /**\r\n * @param childPath\r\n * @example childPath = \"/images/\" will return \"C:/Users/username/Documents/widgets/com/exmaple/widget/images\"\r\n * @see https://sharp.pixelplumbing.com/api-input\r\n * @return folder relative to system user's documents folder\r\n */\r\n getDocumentFolder(childPath?: string): Promise<string>;\r\n\r\n /**\r\n *\r\n * @param filePath absolute path\r\n */\r\n getPictureMetadata(filePath: string): Promise<Metadata>;\r\n\r\n /**\r\n * 移动文件\r\n * @param form\r\n * @param to\r\n */\r\n move(form: string, to: string): Promise<string>;\r\n\r\n /**\r\n * read file contents\r\n * @param filePath\r\n * @return base64 encoded string\r\n */\r\n readFile(filePath: string): Promise<string>;\r\n}\r\n\r\ntype FileApiMethods = keyof IFileApi;\r\n\r\nclass FileApiImpl extends BaseApi<FileApiMethods> implements IFileApi {\r\n async delete(filePath: string): Promise<boolean> {\r\n return this.invokeMethod('delete', filePath);\r\n }\r\n\r\n async getPictureMetadata(filePath: string): Promise<Metadata> {\r\n return this.invokeMethod('getPictureMetadata', filePath);\r\n }\r\n\r\n async move(form: string, to: string): Promise<string> {\r\n return this.invokeMethod('move', form, to);\r\n }\r\n\r\n async isDirectory(filePath: string): Promise<boolean> {\r\n return this.invokeMethod('isDirectory', filePath);\r\n }\r\n\r\n getChannel(): string {\r\n return Channel.FILE;\r\n }\r\n\r\n async readDirectory(path: string, options?: ReadDirOptions): Promise<SystemFile> {\r\n return this.invokeMethod('readDirectory', path, options);\r\n }\r\n\r\n asyncdelete(filePath: string): Promise<boolean> {\r\n return this.invokeMethod('delete', filePath);\r\n }\r\n\r\n async downloadUrl(options: DownloadUrlOptions): Promise<string> {\r\n return this.invokeMethod('downloadUrl', options);\r\n }\r\n\r\n async exists(filePath: string): Promise<boolean> {\r\n return this.invokeMethod('exists', filePath);\r\n }\r\n\r\n async readFile(filePath: string): Promise<string> {\r\n return this.invokeMethod('readFile', filePath);\r\n }\r\n\r\n async getDocumentFolder(filePath?: string): Promise<string> {\r\n return this.invokeMethod('getDocumentFolder', filePath);\r\n }\r\n\r\n async getMimeType(absoluteFilePath: string): Promise<FileTypeResult> {\r\n return this.invokeMethod('getMimeType', absoluteFilePath);\r\n }\r\n\r\n async getInfo(absoluteFilePath: string): Promise<FileInfo> {\r\n return this.invokeMethod('getInfo', absoluteFilePath);\r\n }\r\n\r\n async showSystemFolder(absoluteFolderPath: string): Promise<void> {\r\n return this.invokeMethod('showSystemFolder', absoluteFolderPath);\r\n }\r\n}\r\n\r\n\r\nconst FileApi: IFileApi = new FileApiImpl();\r\n\r\nexport {FileApi, FileApiMethods}\r\n"],"mappings":"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","names":["HostedMode","DeployMode","langCode","WidgetKeyword","WebSocketEventType","value","ThemeMode","NotificationSize","Gravity","Channel","WidgetApiEvent","BrowserWindowApiEvent","NotificationApiEvent","ClipboardApiEvent","ShortcutApiEvent","AppApiEvent","AppApiConstants"]}
|