@blueking/bk-weweb 0.0.36-beta.19 → 0.0.36-beta.20

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common/state.ts","../src/context/cache.ts","../src/typings/source.ts","../src/typings/model.ts","../src/typings/sandbox.ts","../src/utils/common.ts","../src/utils/custom.ts","../src/utils/fetch.ts","../src/entry/style.ts","../src/mode/instance.ts","../src/entry/script.ts","../src/utils/element.ts","../src/context/document.ts","../src/context/event.ts","../src/context/function.ts","../src/context/window.ts","../src/context/sandbox.ts","../src/mode/app.ts","../src/utils/load-source.ts","../src/entry/entry.ts","../src/cache/app-cache.ts","../src/base-app/element.ts","../src/base-app/collect-source.ts","../src/context/element.ts","../src/lifecycle/before-load.ts","../src/lifecycle/activated.ts","../src/lifecycle/deactivated.ts","../src/lifecycle/load.ts","../src/lifecycle/unmount.ts","../src/component/web-component.ts","../src/lifecycle/mount.ts","../src/lifecycle/unload.ts","../src/preload/preload.ts","../src/index.ts"],"sourcesContent":["/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 应用状态常量\n * 定义微前端应用的生命周期状态\n */\nexport const AppState = {\n /** 未设置状态 */\n UNSET: 'UNSET',\n /** 加载中 */\n LOADING: 'LOADING',\n /** 加载完成 */\n LOADED: 'LOADED',\n /** 挂载中 */\n MOUNTING: 'MOUNTING',\n /** 挂载完成 */\n MOUNTED: 'MOUNTED',\n /** 激活状态 */\n ACTIVATED: 'ACTIVATED',\n /** 未激活状态 */\n DEACTIVATED: 'DEACTIVATED',\n /** 卸载状态 */\n UNMOUNT: 'UNMOUNT',\n /** 错误状态 */\n ERROR: 'ERROR',\n} as const;\n\nexport type KeyOfAppState = keyof typeof AppState;\nexport type ValueOfAppState = (typeof AppState)[KeyOfAppState];\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport type { BaseModel } from '../typings';\n\n// 应用实例管理\nlet currentRunningApp: BaseModel | null = null;\n\nexport const getCurrentRunningApp = () => currentRunningApp;\nexport const setCurrentRunningApp = (appInstance: BaseModel | null) => {\n currentRunningApp = appInstance;\n};\n\nexport const SCOPED_CSS_STYLE_ID = 'SCOPED_CSS_STYLE_ID';\nexport const windowNativeFuncMap = new Map<PropertyKey, true>();\n\n// 提前注入全局上下文字段\nconst GLOBAL_CONTEXT_VARIABLES = [\n 'Array',\n 'ArrayBuffer',\n 'Boolean',\n 'constructor',\n 'DataView',\n 'Date',\n 'decodeURI',\n 'decodeURIComponent',\n 'encodeURI',\n 'encodeURIComponent',\n 'Error',\n 'escape',\n 'eval',\n 'EvalError',\n 'Float32Array',\n 'Float64Array',\n 'Function',\n 'hasOwnProperty',\n 'Infinity',\n 'Int16Array',\n 'Int32Array',\n 'Int8Array',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'JSON',\n 'Map',\n 'Math',\n 'NaN',\n 'Number',\n 'Object',\n 'parseFloat',\n 'parseInt',\n 'Promise',\n 'propertyIsEnumerable',\n 'Proxy',\n 'RangeError',\n 'ReferenceError',\n 'Reflect',\n 'RegExp',\n 'Set',\n 'String',\n 'Symbol',\n 'SyntaxError',\n 'toLocaleString',\n 'toString',\n 'TypeError',\n 'Uint16Array',\n 'Uint32Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'undefined',\n 'unescape',\n 'URIError',\n 'valueOf',\n 'WeakMap',\n 'WeakSet',\n 'requestAnimationFrame',\n 'cancelAnimationFrame',\n 'requestIdleCallback',\n 'cancelIdleCallback',\n] as const;\n\n/**\n * 获取全局上下文代码\n */\nexport const getGlobalContextCode = () => `const { ${GLOBAL_CONTEXT_VARIABLES.join(',')} } = this;`;\n\n/**\n * 检查函数是否为原生代码\n */\nconst isNativeFunction = (func: unknown): boolean => {\n if (typeof func !== 'function') return false;\n try {\n return Function.prototype.toString.call(func).includes('[native code]');\n } catch {\n return false;\n }\n};\n\n/**\n * 收集原生window方法\n */\nconst collectNativeWindowFunc = (): void => {\n const windowKeys = Object.getOwnPropertyNames(window);\n\n for (const key of windowKeys) {\n if (\n !windowNativeFuncMap.has(key) &&\n /^[A-Z]/.test(key) &&\n isNativeFunction((window as unknown as Record<string, unknown>)[key])\n ) {\n windowNativeFuncMap.set(key, true);\n }\n }\n};\n\n// 初始化收集原生方法\ncollectNativeWindowFunc();\n","/**\n * 资源加载相关类型定义\n * @description 定义了样式、脚本等资源的配置选项和相关类型\n */\n\n/**\n * 样式资源配置选项接口\n * @description 定义样式文件的加载配置和属性信息\n */\nexport interface IStyleOption {\n /** 样式代码内容 */\n code: string;\n /** 是否来自 HTML 页面内联样式 */\n fromHtml: boolean;\n /** 是否为初始样式 */\n initial?: boolean;\n /** 是否预取样式资源 */\n prefetch?: boolean;\n /** 是否预加载样式资源 */\n preload?: boolean;\n /** 样式文件的 URL 地址 */\n url?: string;\n}\n\n/**\n * 脚本资源配置选项接口\n * @description 定义脚本文件的加载配置和属性信息\n */\nexport interface IScriptOption {\n /** 是否为异步加载脚本 */\n async: boolean;\n /** 脚本代码内容 */\n code: string;\n /** 是否为延迟执行脚本 */\n defer: boolean;\n /** 是否从 HTML 页面中提取的脚本 */\n fromHtml: boolean;\n /** 是否为初始脚本 */\n initial?: boolean;\n /** 是否为 ES6 模块类型脚本 */\n isModule: boolean;\n /** 脚本文件的 URL 地址 */\n url?: string;\n}\n\n/**\n * CSS 属性键名常量\n * @description 用于标识 CSS 样式元素的属性名\n */\nexport const CSS_ATTRIBUTE_KEY = 'id';\n\n/**\n * CSS 规则类型枚举\n * @description 定义了不同类型的 CSS 规则类型常量\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CSSRule/type\n */\nexport enum CssRuleEnum {\n /** 样式规则 */\n STYLE_RULE = 1,\n /** @media 媒体查询规则 */\n MEDIA_RULE = 4,\n /** @supports 规则 */\n SUPPORTS_RULE = 12,\n}\n\n/**\n * 工具类型:获取对象所有值的联合类型\n * @template T - 要提取值类型的对象类型\n * @description 提取对象类型中所有属性值的联合类型\n */\nexport type ValueOf<T> = T[keyof T];\n\n/**\n * Document 事件监听器类型\n * @description 定义了 Document 对象事件监听器的函数签名\n * @param this - Document 对象上下文\n * @param ev - Document 事件映射中任意事件类型的值\n * @returns 任意类型的返回值\n */\nexport type DocumentEventListener = (this: Document, ev: ValueOf<DocumentEventMap>) => any;\n","import type { ValueOfAppState } from '../common';\nimport { WewebCustomAttrs } from '../component/web-component';\nimport type SandBox from '../context/sandbox';\nimport type { EntrySource } from '../entry/entry';\nimport type { fetchSource } from '../utils/fetch';\nimport type { SourceType } from '../utils/load-source';\n\n/** WEWEB运行模式 */\nexport enum WewebMode {\n /** 微应用模式 */\n APP = 'app',\n /** 配置模式 */\n CONFIG = 'config',\n /** 微模块模式 */\n INSTANCE = 'js',\n}\n\n/** 容器类型 */\nexport type ContainerType = HTMLElement | ShadowRoot;\n\n/** 通用回调函数类型 */\nexport type CallbackFunction<T = unknown> = (instance: BaseModel, exportInstance?: T) => void;\n\n/** Web Component 属性接口 */\nexport interface IComponentProps {\n /** 传递给子应用的数据 */\n [WewebCustomAttrs.data]?: string;\n /** 运行模式 */\n [WewebCustomAttrs.mode]?: WewebMode;\n /** 是否共享主应用路由 */\n [WewebCustomAttrs.scopeLocation]?: boolean;\n /** 是否使用 ShadowDOM */\n [WewebCustomAttrs.setShadowDom]?: boolean;\n /** 是否显示源码 */\n [WewebCustomAttrs.showSourceCode]?: boolean;\n /** 应用URL */\n [WewebCustomAttrs.url]: string;\n}\n\n/** 基础模型属性接口 */\nexport interface IBaseModelProps {\n /** 运行模式 */\n [WewebCustomAttrs.mode]?: WewebMode;\n /** 应用URL */\n [WewebCustomAttrs.url]: string;\n /** 应用ID */\n id?: string | null;\n /** 是否预加载 */\n isPreLoad?: boolean;\n /** 获取资源的函数 */\n fetchSource?: typeof fetchSource;\n}\n\n/** 微应用模式属性配置 */\nexport interface IAppModelProps extends IBaseModelProps {\n /** 传递给子应用的数据 */\n [WewebCustomAttrs.data]?: Record<string, unknown>;\n /** 是否缓存DOM */\n [WewebCustomAttrs.keepAlive]?: boolean;\n /** 是否启用样式隔离 */\n [WewebCustomAttrs.scopeCss]?: boolean;\n /** 是否使用沙盒隔离 */\n [WewebCustomAttrs.scopeJs]?: boolean;\n /** 是否共享主应用路由 */\n [WewebCustomAttrs.scopeLocation]?: boolean;\n /** 是否使用 ShadowDOM */\n [WewebCustomAttrs.setShadowDom]?: boolean;\n /** 是否显示源码 */\n [WewebCustomAttrs.showSourceCode]?: boolean;\n /** 容器元素 */\n container?: ContainerType | null;\n /** 初始化资源 */\n initSource?: SourceType;\n}\n\n/** 微模块模式属性配置 */\nexport interface IJsModelProps extends IBaseModelProps {\n /** 传递给模块的数据 */\n [WewebCustomAttrs.data]?: Record<string, unknown>;\n /** 是否显示源码 */\n [WewebCustomAttrs.showSourceCode]?: boolean;\n /** 容器元素 */\n container?: ContainerType | null;\n /** 初始化资源 */\n initSource?: SourceType;\n /** 是否缓存DOM */\n keepAlive?: boolean;\n /** 是否启用样式隔离 */\n scopeCss?: boolean;\n /** 是否使用沙盒隔离 */\n scopeJs?: boolean;\n}\n\n/** 基础模型接口 */\nexport interface BaseModel {\n /** 应用缓存键 */\n readonly appCacheKey: string;\n /** 容器元素 */\n container?: ContainerType;\n /** 初始化资源 */\n initSource?: SourceType;\n /** 是否为模块应用 */\n isModuleApp?: boolean;\n /** 是否预加载 */\n isPreLoad: boolean;\n /** 是否保持活跃 */\n keepAlive?: boolean;\n /** 应用名称 */\n name: string;\n /** 沙盒实例 */\n sandBox?: SandBox;\n /** 是否启用样式隔离 */\n scopeCss?: boolean;\n /** 是否使用JS隔离 */\n scopeJs: boolean;\n /** 是否显示源码 */\n showSourceCode?: boolean;\n /** 入口资源 */\n source?: EntrySource;\n /** 应用URL */\n url: string;\n /** 获取资源的函数 */\n fetchSource?: typeof fetchSource;\n /** 传递给应用的数据 */\n data: Record<string, unknown>;\n\n /** 激活应用 */\n activated<T = unknown>(container: ContainerType, callback?: CallbackFunction<T>): void;\n /** 停用应用 */\n deactivated(): void;\n /** 挂载应用 */\n mount<T = unknown>(container?: ContainerType, callback?: CallbackFunction<T>): void;\n /** 错误处理 */\n onError(): void;\n /** 挂载处理 */\n onMount(): void;\n /** 注册运行中的应用 */\n registerRunningApp(): void;\n /** 启动应用 */\n start(): Promise<void>;\n /** 卸载应用 */\n unmount(needDestroy?: boolean): void;\n /** 获取应用状态 */\n get status(): ValueOfAppState;\n /** 设置应用状态 */\n set status(value: ValueOfAppState);\n}\n","/**\n * 沙箱环境配置类型定义\n */\n\n/**\n * 注入到子应用 window 对象的属性接口\n * @description 定义了 BK WEWEB 平台注入到子应用环境中的必要属性\n */\nexport interface IInjectWindowAttrs {\n /** BK WEWEB平台的应用唯一标识 */\n __BK_WEWEB_APP_KEY__: string;\n /** BK WEWEB的附加数据 */\n __BK_WEWEB_DATA__: Record<string, unknown>;\n /** 标识页面是否由BK WEWEB驱动 */\n __POWERED_BY_BK_WEWEB__: boolean;\n __BK_WEWEB_HAS_REWRITE__?: boolean;\n /** 原始 document 对象的引用 */\n rawDocument: Document;\n /** 原始 window 对象的引用 */\n rawWindow: Window;\n}\n\n/**\n * 沙箱环境白名单配置\n * @description 允许子应用访问的 window 属性列表\n */\nexport const WINDOW_WHITE_LIST: readonly PropertyKey[] = [\n 'System', // SystemJS 模块加载器\n '__cjsWrapper', // SystemJS CommonJS 包装器\n // 开发环境下允许 React DevTools\n ...(process.env.NODE_ENV !== 'production' ? ['__REACT_DEVTOOLS_GLOBAL_HOOK__'] : []),\n] as const;\n\n/**\n * BK WEWEB 注入属性列表\n * @description 需要在子应用自身上下文中获取的 BK WEWEB 相关属性\n */\nexport const BK_WEWEB_INJECT_KEY_LIST: readonly PropertyKey[] = [\n '__POWERED_BY_BK_WEWEB__',\n '__BK_WEWEB_APP_KEY__',\n '__BK_WEWEB_DATA__',\n] as const;\n\n/**\n * Window 对象别名列表\n * @description 在沙箱环境中需要处理的 window 对象的所有别名\n */\nexport const WINDOW_ALIAS_LIST: readonly PropertyKey[] = ['window', 'self', 'globalThis'] as const;\n\n/**\n * 路由相关属性列表\n * @description 设置了 scopedLocation 后需要监听的路由相关属性\n */\nexport const BK_WEWEB_LOCATION_KEY_LIST: readonly PropertyKey[] = ['location', 'history'] as const;\n\n/**\n * 通用微应用 Window 键映射\n * @description 所有环境下都需要的微应用相关的 window 属性\n */\nconst COMMON_MICRO_APP_WINDOW_KEY_MAP = {\n __bk_pop_manager: true,\n __bk_zIndex_manager: true,\n i18n: true,\n} as const;\n\n/**\n * 开发环境微应用 Window 键映射\n * @description 根据环境动态生成的微应用 window 属性映射表\n */\nexport const DEV_MICRO_APP_WINDOW_KEY_MAP: Record<PropertyKey, true> =\n process.env.NODE_ENV !== 'production'\n ? {\n // 开发环境标识\n __DEV__: true,\n\n // Vue DevTools 相关\n __VUE_DEVTOOLS_GLOBAL_HOOK__: true,\n __VUE_DEVTOOLS_HOOK_REPLAY__: true,\n __VUE_DEVTOOLS_PLUGINS__: true,\n\n // Vue I18n 相关\n __VUE_I18N_FULL_INSTALL__: true,\n __VUE_I18N_LEGACY_API__: true,\n\n // Vue 配置相关\n __VUE_OPTIONS_API__: true,\n\n // Core-js 相关\n '__core-js_shared__': true,\n\n // Webpack 相关\n webpackChunkapm: true,\n webpackChunkpc: true,\n webpackChunktrace: true,\n webpackJsonp: true,\n\n // 包含通用配置\n ...COMMON_MICRO_APP_WINDOW_KEY_MAP,\n }\n : COMMON_MICRO_APP_WINDOW_KEY_MAP;\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nconst PROTOCOL_REGEX = /^((((ht|f)tps?)|file):)?\\/\\//;\nconst DATA_BLOB_REGEX = /^(data|blob):/;\nconst FILE_EXTENSION_REGEX = /\\.(\\w+)$/;\nconst JS_EXTENSION_REGEX = /\\.js$/;\nconst RANDOM_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\n/**\n * 使用 nextTask 函数将回调函数添加到下一个任务队列中执行\n * @param cb 回调函数\n * @returns Promise 对象,用于异步处理回调函数\n */\nexport const nextTask = (cb: () => void): Promise<void> => Promise.resolve().then(cb);\n\n/**\n * 使用 nextTick 函数将回调函数添加到全局任务队列中执行\n * 如果已经有任务在等待执行,则不会重复添加任务\n * @param cb 回调函数\n */\nlet globalTaskPending = false;\nexport const nextTick = (cb: () => void): void => {\n if (globalTaskPending) return;\n\n globalTaskPending = true;\n nextTask(() => {\n cb();\n globalTaskPending = false;\n });\n};\n\n/**\n * 给 URL 添加协议头\n * @param url 要添加协议头的 URL\n * @returns 添加了协议头后的 URL\n */\nexport const addUrlProtocol = (url: string): string => {\n if (url.startsWith('//')) return `${location.protocol}${url}`;\n if (!url.startsWith('http')) return `${location.protocol}//${url}`;\n return url;\n};\n\n/**\n * 填充完整路径\n * @param path 路径\n * @param baseURI 基础路径\n * @returns 完整的URL路径\n */\nexport const fillUpPath = (path: string, baseURI: string): string => {\n if (!path || PROTOCOL_REGEX.test(path) || DATA_BLOB_REGEX.test(path)) {\n return path;\n }\n\n const { origin, pathname } = new URL(addUrlProtocol(baseURI));\n const basePath = `${origin}${pathname}`.replace(FILE_EXTENSION_REGEX, '/');\n return new URL(path, basePath).toString();\n};\n\n/**\n * 生成随机字符串\n * @param length 生成字符串的长度\n * @param chars 生成字符串的字符范围\n * @returns 随机字符串\n */\nexport const random = (length: number, chars: string = RANDOM_CHARS): string => {\n const charsLength = chars.length;\n return Array.from({ length }, () => chars[Math.floor(Math.random() * charsLength)]).join('');\n};\n\n/**\n * 生成随机URL\n * @returns 随机URL字符串\n */\nexport const randomUrl = (): string => `inline-${random(16)}`;\n\n/**\n * requestIdleCallback polyfill\n */\nexport const requestIdleCallback =\n window.requestIdleCallback ??\n ((cb: (deadline: { didTimeout: boolean; timeRemaining: () => number }) => void) => {\n const start = Date.now();\n return setTimeout(() => {\n cb({\n didTimeout: false,\n timeRemaining: () => Math.max(0, 50 - (Date.now() - start)),\n });\n }, 1);\n });\n\n/**\n * cancelIdleCallback polyfill\n */\nexport const cancelIdleCallback = window.cancelIdleCallback ?? ((id: number) => clearTimeout(id));\n\n/**\n * 判断是否是JSONP请求\n * @param url 要检查的URL\n * @returns 是否为JSONP请求\n */\nexport const isJsonpUrl = (url: null | string): boolean => {\n if (!url) return false;\n\n try {\n const { pathname } = new URL(addUrlProtocol(url));\n return !JS_EXTENSION_REGEX.test(pathname);\n } catch {\n // URL 解析失败时,使用原始逻辑\n return !JS_EXTENSION_REGEX.test(url);\n }\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n// 事件目标属性名称列表\nconst ELEMENT_TARGET_NAMES = ['currentTarget', 'srcElement', 'target'] as const;\n\ntype SupportedElement = HTMLLinkElement | HTMLScriptElement;\n\ntype PropertyDescriptors = Record<string, PropertyDescriptor>;\n\n/** 为事件对象添加元素属性 */\nexport const defineEventSourceElement = (element: SupportedElement, eventName = 'custom'): Event => {\n const targetProperties: PropertyDescriptors = ELEMENT_TARGET_NAMES.reduce((properties, targetName) => {\n properties[targetName] = {\n get: () => element,\n enumerable: true,\n configurable: true,\n };\n return properties;\n }, {} satisfies PropertyDescriptors);\n\n return Object.defineProperties(new CustomEvent(eventName), targetProperties);\n};\n\n/** 触发link或script元素的onload事件 */\nexport const dispatchLinkOrScriptLoad = (element: SupportedElement): void => {\n const loadEvent = defineEventSourceElement(element, 'load');\n\n if (typeof element.onload === 'function') {\n element.onload.call(element, loadEvent);\n return;\n }\n element.dispatchEvent(loadEvent);\n};\n\n/** 触发link或script元素的onerror事件 */\nexport const dispatchLinkOrScriptError = (element: SupportedElement): void => {\n const errorEvent = defineEventSourceElement(element, 'error');\n\n if (typeof element.onerror === 'function') {\n element.onerror.call(element, errorEvent);\n return;\n }\n element.dispatchEvent(errorEvent);\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport weWeb from '..';\n\nimport type { BaseModel } from '../typings';\n\ntype FetchOptions = Record<string, unknown>;\n\n/**\n * 统一的资源获取方法,支持应用级别和全局级别的自定义fetch\n * 优先级:应用级fetchSource > 全局fetchSource > 原生fetch\n * @param url 要获取的资源URL\n * @param options fetch请求选项,默认为空对象\n * @param app 可选的应用实例,如果提供且有自定义fetchSource则优先使用\n * @returns Promise<string> 返回资源内容的Promise,失败时返回空字符串\n */\nexport const fetchSource = async (url: string, options: FetchOptions = {}, app?: BaseModel): Promise<string> => {\n // 优先使用应用级别的自定义fetch方法\n if (typeof app?.fetchSource === 'function') {\n try {\n return await app.fetchSource(url, options);\n } catch {\n return '';\n }\n }\n\n // 其次使用全局自定义fetch方法\n if (weWeb.fetchSource) {\n return weWeb.fetchSource(url, options);\n }\n\n // 最后使用原生fetch方法\n try {\n const response = await window.fetch(url, options as RequestInit);\n return await response.text();\n } catch {\n return '';\n }\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { appCache } from '../cache/app-cache';\n// import { disabledStyleDom } from '../context/cache';\nimport { type BaseModel, CssRuleEnum, type IStyleOption } from '../typings';\nimport { setMarkElement } from '../utils';\nimport { addUrlProtocol, fillUpPath } from '../utils/common';\nimport { dispatchLinkOrScriptError, dispatchLinkOrScriptLoad } from '../utils/custom';\nimport { fetchSource } from '../utils/fetch';\n\nconst CSS_SELECTORS = {\n ROOT_SELECTOR: /^((html[\\s>~,]+body)|(html|body|:root))$/,\n BUILT_IN_ROOT_SELECTOR: /(^|\\s+)((html[\\s>~]+body)|(html|body|:root))(?=[\\s>~]+|$)/,\n FONT_FACE: /@font-face\\s*\\{[^}]+\\}/g,\n URL_PATTERN: /url\\([\"']?([^)\"']+)[\"']?\\)/gm,\n DATA_BLOB_PROTOCOL: /^(data|blob):/,\n HTTP_PROTOCOL: /^(https?:)?\\/\\//,\n RELATIVE_PATH: /^((\\.\\.?\\/)|[^/])/,\n ROOT_HOST_PATTERN: /(:?:root|html)/gm,\n} as const;\n\nconst STYLE_ATTRIBUTES = {\n TYPE: 'text/css',\n POWERED_BY: 'bk-weweb',\n LINKED_FROM_BASE: 'linked-from-base',\n ORIGIN_SRC: 'origin-src',\n} as const;\n\nconst PACK_RULE_NAMES = {\n MEDIA: 'media',\n SUPPORTS: 'supports',\n} as const;\n\ntype PackRuleType = CSSMediaRule | CSSSupportsRule;\ntype MutationObserverConfig = MutationObserverInit;\n\n/**\n * 样式处理类\n */\nexport class Style {\n code = '';\n fromHtml: boolean;\n initial: boolean;\n prefetch = false;\n preload = false;\n scoped: boolean;\n scopedCode = '';\n url: string | undefined;\n\n constructor({ code, fromHtml, initial, prefetch, preload, url }: IStyleOption) {\n this.scoped = false;\n this.code = code;\n this.prefetch = prefetch ?? false;\n this.preload = preload ?? false;\n this.url = url;\n this.fromHtml = fromHtml;\n this.initial = initial ?? false;\n }\n\n /**\n * 通用样式作用域处理\n * @param styleElement 样式元素\n * @param app 应用实例\n */\n commonScoped(styleElement: HTMLStyleElement, app: BaseModel): void {\n if (app.scopeCss && !(app.container instanceof ShadowRoot)) {\n this.applyScopedCSS(styleElement, app);\n } else {\n this.applyUnscopedCSS(styleElement, app);\n }\n this.scoped = true;\n }\n\n /**\n * 创建样式元素\n */\n createStyleElement(): HTMLStyleElement {\n const styleElement = document.createElement('style');\n if (styleElement.__BK_WEWEB_APP_KEY__) {\n styleElement.__BK_WEWEB_APP_KEY__ = undefined;\n }\n return styleElement;\n }\n\n /**\n * 执行样式代码\n * @param app 应用实例\n * @returns 返回执行后的style标签\n */\n async executeCode(app: BaseModel): Promise<HTMLStyleElement> {\n app.registerRunningApp();\n let styleElement = this.createStyleElement();\n styleElement.setAttribute('type', STYLE_ATTRIBUTES.TYPE);\n styleElement.textContent = this.code;\n\n try {\n if (!this.code) {\n await this.getCode(app);\n }\n styleElement = this.scopedStyleCSS(app, styleElement);\n this.scoped = true;\n } catch (error) {\n console.error('scoped style error', error);\n }\n\n return styleElement;\n }\n\n /**\n * 获取样式代码\n */\n async getCode(app?: BaseModel): Promise<string> {\n if (this.code.length || !this.url) {\n return this.code;\n }\n\n const code = this.getCodeFromAppSource(app) || this.getCodeFromCache() || (await this.fetchCodeFromRemote(app));\n\n this.code = code;\n return code;\n }\n\n /**\n * 检查并链接基础应用样式\n * @param styleElement 样式元素\n * @param app 应用实例\n * @returns 是否已链接基础样式\n */\n linkedBaseStyle(styleElement: HTMLStyleElement, app: BaseModel): boolean {\n if (\n !(app.container instanceof ShadowRoot) &&\n styleElement.textContent &&\n appCache.getBaseAppStyle(styleElement.textContent)\n ) {\n this.clearStyleElement(styleElement);\n styleElement.setAttribute(STYLE_ATTRIBUTES.LINKED_FROM_BASE, 'true');\n return true;\n }\n return false;\n }\n\n /**\n * 重置包装规则\n */\n resetPackRule(rule: PackRuleType, prefix: string, packName: string): string {\n const result = this.scopeRule(Array.from(rule.cssRules), prefix);\n return `@${packName} ${rule.conditionText} {${result}}`;\n }\n\n /**\n * 重置URL地址\n */\n resetUrlHost(cssText: string, uri: string, linkPath?: string): string {\n let baseURI = uri;\n return cssText.replace(CSS_SELECTORS.URL_PATTERN, (text, matchedUrl) => {\n if (CSS_SELECTORS.DATA_BLOB_PROTOCOL.test(matchedUrl) || CSS_SELECTORS.HTTP_PROTOCOL.test(matchedUrl)) {\n return text;\n }\n\n if (CSS_SELECTORS.RELATIVE_PATH.test(matchedUrl) && linkPath) {\n baseURI = this.buildBaseURI(linkPath);\n }\n\n return `url(\"${fillUpPath(matchedUrl, baseURI)}\")`;\n });\n }\n\n /**\n * css rule 处理\n */\n scopeRule(rules: CSSRule[], cssPrefix: string): string {\n let result = '';\n\n for (const rule of rules) {\n switch (rule.type) {\n case CssRuleEnum.STYLE_RULE:\n result += this.scopeStyleRule(rule as CSSStyleRule, cssPrefix);\n break;\n case CssRuleEnum.MEDIA_RULE:\n result += this.resetPackRule(rule as CSSMediaRule, cssPrefix, PACK_RULE_NAMES.MEDIA);\n break;\n case CssRuleEnum.SUPPORTS_RULE:\n result += this.resetPackRule(rule as CSSSupportsRule, cssPrefix, PACK_RULE_NAMES.SUPPORTS);\n break;\n default:\n result += rule.cssText;\n break;\n }\n }\n\n return result.replace(/^\\s+/, '');\n }\n\n /**\n * style rule 处理\n */\n scopeStyleRule(rule: CSSStyleRule, prefix: string): string {\n const { cssText, selectorText } = rule;\n\n if (CSS_SELECTORS.ROOT_SELECTOR.test(selectorText)) {\n return cssText.replace(CSS_SELECTORS.ROOT_SELECTOR, prefix);\n }\n\n if (selectorText === '*') {\n return cssText.replace('*', `${prefix} *`);\n }\n\n return cssText.replace(/^[\\s\\S]+{/, selectors =>\n selectors.replace(/(^|,)([^,]+)/g, (all, delimiter, selector) => {\n if (CSS_SELECTORS.BUILT_IN_ROOT_SELECTOR.test(selector)) {\n return all.replace(CSS_SELECTORS.BUILT_IN_ROOT_SELECTOR, prefix);\n }\n return `${delimiter} ${prefix} ${selector.replace(/^\\s*/, '')}`;\n }),\n );\n }\n\n /**\n * link style 处理\n */\n scopedLinkCSS(app: BaseModel, linkElement: HTMLLinkElement): HTMLStyleElement {\n const styleElement = this.createStyleElement();\n styleElement.setAttribute('type', STYLE_ATTRIBUTES.TYPE);\n\n const needKeepAlive = !!app.keepAlive && !(app.container instanceof ShadowRoot);\n setMarkElement(styleElement, app, needKeepAlive);\n const container = needKeepAlive ? document.head : app.container;\n\n try {\n if (this.code) {\n this.handleExistingCode(styleElement, app, container, linkElement);\n } else if (linkElement.getAttribute('href')) {\n this.handleHrefAttribute(styleElement, app, container, linkElement);\n } else {\n this.handleMissingHref(styleElement, app, container, linkElement);\n }\n } catch {\n linkElement && dispatchLinkOrScriptError(linkElement);\n }\n\n return styleElement;\n }\n\n /**\n * 隔离 style\n */\n scopedStyleCSS(app: BaseModel, styleElement: HTMLStyleElement): HTMLStyleElement {\n const needKeepAlive = !!app.keepAlive && !(app.container instanceof ShadowRoot);\n setMarkElement(styleElement, app, needKeepAlive);\n\n if (this.code || styleElement.textContent) {\n this.processExistingContent(styleElement, app);\n } else {\n this.observeContentChanges(styleElement, app);\n }\n\n if (this.url) {\n styleElement.setAttribute(STYLE_ATTRIBUTES.ORIGIN_SRC, this.url);\n }\n\n return styleElement;\n }\n\n /**\n * 应用隔离 style\n */\n private applyScopedCSS(styleElement: HTMLStyleElement, app: BaseModel): void {\n const cssStyleSheet = new CSSStyleSheet({ disabled: true });\n cssStyleSheet.replaceSync(styleElement.textContent || this.code);\n const rules: CSSRule[] = Array.from(cssStyleSheet?.cssRules ?? []);\n const cssPrefix = `#${app.name}`;\n const scopedCss = this.scopeRule(rules, cssPrefix);\n const cssText = this.resetUrlHost(scopedCss, app.url, this.url);\n styleElement.textContent = cssText;\n this.scopedCode = cssText;\n }\n\n private applyUnscopedCSS(styleElement: HTMLStyleElement, app: BaseModel): void {\n const cssText = this.resetUrlHost(styleElement.textContent || this.code || '', app.url, this.url);\n\n // fix https://bugs.chromium.org/p/chromium/issues/detail?id=336876\n if (cssText && app.container instanceof ShadowRoot) {\n this.handleShadowRootFonts(cssText, app);\n }\n\n styleElement.textContent = cssText.replace(CSS_SELECTORS.ROOT_HOST_PATTERN, ':host');\n }\n\n /**\n * 处理ShadowRoot中的字体\n */\n private handleShadowRootFonts(cssText: string, app: BaseModel): void {\n let fontContent = '';\n const fontFaces = cssText.match(CSS_SELECTORS.FONT_FACE) || [];\n\n for (const fontFace of fontFaces) {\n fontContent += `${fontFace}\\n`;\n }\n\n const rawDocument = app.sandBox?.rawDocument;\n if (rawDocument && fontContent) {\n const fontStyle = rawDocument.createElement('style');\n fontStyle.setAttribute('type', STYLE_ATTRIBUTES.TYPE);\n fontStyle.setAttribute('powered-by', STYLE_ATTRIBUTES.POWERED_BY);\n fontStyle.textContent = fontContent;\n rawDocument?.head?.append(fontStyle);\n }\n }\n\n private getCodeFromAppSource(app?: BaseModel): string {\n if (this.url && app?.source?.styles?.has(this.url)) {\n return app.source.styles.get(this.url)?.code || '';\n }\n return '';\n }\n private getCodeFromCache(): string {\n if (this.url && appCache.getCacheStyle(this.url)) {\n const style = appCache.getCacheStyle(this.url);\n return style?.code || '';\n }\n return '';\n }\n private async fetchCodeFromRemote(app?: BaseModel): Promise<string> {\n return await fetchSource(this.url!, {}, app).catch(() => '');\n }\n private clearStyleElement(styleElement: HTMLStyleElement): void {\n styleElement.textContent = '';\n styleElement.innerHTML = '';\n }\n private buildBaseURI(linkPath: string): string {\n const pathArr = linkPath.split('/');\n pathArr.pop();\n return addUrlProtocol(`${pathArr.join('/')}/`);\n }\n private handleExistingCode(\n styleElement: HTMLStyleElement,\n app: BaseModel,\n container: Element | ShadowRoot | null | undefined,\n linkElement: HTMLLinkElement,\n ): void {\n this.commonScoped(styleElement, app);\n container?.prepend(styleElement);\n linkElement && dispatchLinkOrScriptLoad(linkElement);\n }\n\n /**\n * 处理href属性\n */\n private handleHrefAttribute(\n styleElement: HTMLStyleElement,\n app: BaseModel,\n container: Element | ShadowRoot | null | undefined,\n linkElement: HTMLLinkElement,\n ): void {\n this.url = fillUpPath(linkElement.getAttribute('href')!, app.url);\n this.getCode(app).then(() => {\n this.scopedStyleCSS(app, styleElement);\n linkElement.remove();\n container?.prepend(styleElement);\n linkElement && dispatchLinkOrScriptLoad(linkElement);\n this.scoped = true;\n });\n }\n\n /**\n * 处理缺失的href\n */\n private handleMissingHref(\n styleElement: HTMLStyleElement,\n app: BaseModel,\n container: Element | ShadowRoot | null | undefined,\n linkElement: HTMLLinkElement,\n ): void {\n const observer = new MutationObserver(() => {\n const href = linkElement.getAttribute('href');\n if (!href) return;\n observer.disconnect();\n this.url = fillUpPath(href, app.url);\n this.getCode(app).then(() => {\n this.scopedStyleCSS(app, styleElement);\n linkElement.remove();\n container?.prepend(styleElement);\n linkElement && dispatchLinkOrScriptLoad(linkElement);\n this.scoped = true;\n });\n });\n\n const observerConfig: MutationObserverConfig = {\n attributeFilter: ['href'],\n childList: false,\n subtree: false,\n };\n\n observer.observe(linkElement, observerConfig);\n }\n\n private processExistingContent(styleElement: HTMLStyleElement, app: BaseModel): void {\n if (styleElement.textContent) {\n this.clearStyleElement(styleElement);\n }\n if (!this.linkedBaseStyle(styleElement, app)) {\n this.commonScoped(styleElement, app);\n }\n }\n private observeContentChanges(styleElement: HTMLStyleElement, app: BaseModel): void {\n const observer = new MutationObserver(() => {\n if (!(styleElement.textContent || styleElement.sheet?.cssRules?.length)) return;\n observer.disconnect();\n if (!this.linkedBaseStyle(styleElement, app)) {\n this.commonScoped(styleElement, app);\n }\n });\n\n const observerConfig: MutationObserverConfig = {\n attributes: false,\n characterData: true,\n childList: true,\n subtree: true,\n };\n\n observer.observe(styleElement, observerConfig);\n }\n}\n\n/**\n * 执行应用样式\n */\nexport async function executeAppStyles(app: BaseModel, container?: Element | ShadowRoot): Promise<void> {\n const styleList: Style[] = Array.from(app.source?.styles?.values() || []);\n const promiseList: Promise<HTMLStyleElement>[] = [];\n\n for (const style of styleList) {\n promiseList.push(style.executeCode(app));\n }\n\n await Promise.all(promiseList).then((styleElementList: HTMLStyleElement[]) => {\n const parentElement = container || app.container;\n if (app.keepAlive && !(parentElement instanceof ShadowRoot)) {\n document.head.append(...styleElementList);\n } else {\n parentElement?.append(...styleElementList);\n }\n });\n}\n","/* eslint-disable @typescript-eslint/member-ordering */\n/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState, type ValueOfAppState } from '../common';\nimport { setCurrentRunningApp } from '../context/cache';\nimport SandBox from '../context/sandbox';\nimport { EntrySource } from '../entry/entry';\nimport { execAppScripts } from '../entry/script';\nimport { executeAppStyles } from '../entry/style';\nimport { CSS_ATTRIBUTE_KEY } from '../typings';\nimport { random } from '../utils/common';\n\nimport type { BaseModel, CallbackFunction, ContainerType, IJsModelProps } from '../typings';\nimport type { fetchSource } from '../utils/fetch';\nimport type { SourceType } from '../utils/load-source';\n\nconst DEFAULT_RANDOM_LENGTH = 5;\nconst WRAPPER_SUFFIX = '-wrapper';\n\ninterface RenderableInstance {\n render?: (container: HTMLElement, data: Record<string, unknown>) => void;\n}\n\ninterface ScriptInstanceInfo {\n exportInstance?: RenderableInstance & Record<string, unknown>;\n}\n\n/** BK-WEWEB 微模块模式类 */\nexport class MicroInstanceModel implements BaseModel {\n private state: ValueOfAppState = AppState.UNSET;\n\n appCacheKey: string;\n container?: ContainerType;\n data: Record<string, unknown>;\n fetchSource?: typeof fetchSource;\n initSource: SourceType;\n isPreLoad = false;\n keepAlive: boolean;\n name: string;\n sandBox?: SandBox;\n scopeCss = true;\n scopeJs = false;\n showSourceCode = true;\n source?: EntrySource;\n url: string;\n\n constructor(props: IJsModelProps & { fetchSource?: typeof fetchSource }) {\n this.name = props.id !== props.url ? props.id! : random(DEFAULT_RANDOM_LENGTH);\n this.appCacheKey = props.id || this.name;\n this.url = props.url;\n this.container = props.container ?? undefined;\n this.scopeJs = props.scopeJs ?? true;\n this.showSourceCode = props.showSourceCode ?? true;\n this.scopeCss = props.scopeCss ?? true;\n this.keepAlive = props.keepAlive ?? false;\n this.data = props.data ?? {};\n this.initSource = props.initSource ?? [];\n this.fetchSource = props.fetchSource;\n\n this.initializeSandBox();\n }\n\n /** 激活微模块 */\n activated<T = unknown>(container: ContainerType, callback?: CallbackFunction<T>): void {\n this.isPreLoad = false;\n this.state = AppState.ACTIVATED;\n\n if (this.container && container) {\n this.setContainerAttribute(container);\n this.transferNodes(container);\n this.container = container;\n this.initShadowRootContainer();\n this.sandBox?.activated();\n\n const scriptInfo = this.getScriptInfo();\n callback?.(this, scriptInfo?.exportInstance as T);\n }\n }\n\n /** 停用微模块 */\n deactivated(): void {\n this.state = AppState.DEACTIVATED;\n this.sandBox?.deactivated();\n }\n\n /** 挂载微模块 */\n mount<T = unknown>(container?: ContainerType, callback?: CallbackFunction<T>): void {\n this.isPreLoad = false;\n this.container = container ?? this.container!;\n this.initShadowRootContainer();\n this.state = AppState.MOUNTING;\n\n this.setContainerAttribute(this.container);\n this.setupContainer();\n this.executeStyles();\n this.sandBox?.activated();\n\n execAppScripts(this).finally(() => {\n this.state = AppState.MOUNTED;\n this.renderInstance();\n\n const scriptInfo = this.getScriptInfo();\n callback?.(this, scriptInfo?.exportInstance as T);\n });\n }\n\n /** 错误处理 */\n onError(): void {\n this.state = AppState.ERROR;\n }\n\n /** 挂载处理 */\n onMount(): void {\n if (this.isPreLoad) return;\n this.state = AppState.LOADED;\n this.mount();\n }\n\n /** 注册运行中的应用 */\n registerRunningApp(): void {\n setCurrentRunningApp(this);\n Promise.resolve().then(() => setCurrentRunningApp(null));\n }\n\n /** 启动微模块 */\n async start(): Promise<void> {\n if (!this.source || this.needsReload()) {\n this.source = new EntrySource(this.url);\n await this.source.importEntry(this);\n }\n }\n\n /** 卸载微模块 */\n unmount(needDestroy?: boolean): void {\n this.state = AppState.UNMOUNT;\n this.sandBox?.deactivated();\n\n if (needDestroy) {\n appCache.deleteApp(this.url);\n }\n\n if (this.container) {\n this.container.innerHTML = '';\n this.container = undefined;\n }\n }\n\n /** 初始化ShadowRoot容器 */\n initShadowRootContainer(): void {\n if (this.container instanceof ShadowRoot) {\n // inject echarts in shadowRoot\n Object.defineProperties(this.container, {\n getBoundingClientRect: {\n get() {\n return this.host.getBoundingClientRect;\n },\n },\n });\n }\n }\n\n set status(value: ValueOfAppState) {\n this.state = value;\n }\n\n get status(): ValueOfAppState {\n return this.state;\n }\n\n /** 初始化沙盒 */\n private initializeSandBox(): void {\n if (this.scopeJs) {\n this.sandBox = new SandBox(this);\n }\n }\n\n /** 设置容器属性 */\n private setContainerAttribute(container: ContainerType): void {\n if (container instanceof HTMLElement) {\n container.setAttribute(CSS_ATTRIBUTE_KEY, this.name);\n }\n }\n\n /** 转移节点到新容器 */\n private transferNodes(container: ContainerType): void {\n if (!this.container) return;\n\n const fragment = document.createDocumentFragment();\n const nodeList = Array.from(this.container.childNodes);\n\n for (const node of nodeList) {\n fragment.appendChild(node);\n }\n\n container.appendChild(fragment);\n }\n\n /** 设置容器 */\n private setupContainer(): void {\n if (this.container) {\n this.container.innerHTML = '';\n const instanceWrapper = this.createInstanceWrapper();\n this.container.appendChild(instanceWrapper);\n }\n }\n\n /** 执行样式 */\n private executeStyles(): void {\n if (this.source?.styles.size && this.container) {\n executeAppStyles(this, this.container);\n }\n }\n\n /** 创建实例包装器 */\n private createInstanceWrapper(): HTMLDivElement {\n const wrapper = document.createElement('div');\n wrapper.id = `${this.name}${WRAPPER_SUFFIX}`;\n return wrapper;\n }\n\n /** 渲染实例 */\n private renderInstance(): void {\n const scriptInfo = this.getScriptInfo();\n if (scriptInfo?.exportInstance?.render && this.container) {\n const targetContainer = this.container.querySelector(`#${this.name}${WRAPPER_SUFFIX}`) as HTMLElement;\n\n if (targetContainer) {\n scriptInfo.exportInstance.render(targetContainer, this.data);\n }\n }\n }\n\n /** 获取脚本信息 */\n private getScriptInfo(): ScriptInstanceInfo | undefined {\n const script = this.source?.getScript(this.url);\n return script\n ? { exportInstance: script.exportInstance as RenderableInstance & Record<string, unknown> }\n : undefined;\n }\n\n /** 检查是否需要重新加载 */\n private needsReload(): boolean {\n return this.status === AppState.ERROR || this.status === AppState.UNSET;\n }\n}\n\nexport const createInstance = (props: IJsModelProps): void => {\n const instance = new MicroInstanceModel(props);\n appCache.setApp(instance);\n instance.start().finally(() => instance.onMount());\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { getGlobalContextCode } from '../context/cache';\nimport { MicroAppModel } from '../mode/app';\nimport { MicroInstanceModel } from '../mode/instance';\nimport { setMarkElement } from '../utils';\nimport { fetchSource } from '../utils/fetch';\n\nimport type { BaseModel, IScriptOption } from '../typings';\n\n// 全局属性标记变量\nlet firstGlobalProp: string | undefined;\nlet secondGlobalProp: string | undefined;\nlet lastGlobalProp: string | undefined;\n\nconst STRICT_MODE_REGEX = /^\"use\\sstrict\";$/gim;\n\ntype ExecuteResult = Comment | HTMLScriptElement | undefined;\n\n/** Script脚本实例类 */\nexport class Script {\n async = false;\n code = '';\n defer = false;\n exportInstance?: unknown;\n fromHtml: boolean;\n blobUrl?: string;\n initial: boolean;\n isModule = false;\n scoped: boolean;\n url: string | undefined;\n\n constructor({ async, code, defer, fromHtml, initial, isModule, url }: IScriptOption) {\n this.code = code?.replace(STRICT_MODE_REGEX, '');\n this.async = async;\n this.defer = defer;\n this.isModule = isModule;\n this.url = url;\n this.scoped = false;\n this.fromHtml = fromHtml ?? false;\n this.initial = initial ?? false;\n this.blobUrl = undefined;\n }\n\n /** 执行脚本代码 */\n async executeCode(app: BaseModel, needReplaceScriptElement = false): Promise<ExecuteResult> {\n try {\n if (!this.code) await this.getCode(app);\n\n if (app instanceof MicroInstanceModel) {\n const globalWindow = app.scopeJs ? app.sandBox?.proxyWindow || window : window;\n noteGlobalProps(globalWindow);\n }\n\n const scopedCode = this.transformCode(app);\n if (this.isModule) {\n app.registerRunningApp();\n const scriptElement = document.createElement('script');\n let blobUrl = '';\n if (scriptElement.__BK_WEWEB_APP_KEY__) {\n scriptElement.__BK_WEWEB_APP_KEY__ = undefined;\n }\n if (this.url) {\n blobUrl = `${this.url.replace(/^\\//, `${app.url}/`)}?key=${Date.now()}`;\n } else {\n const blob = new Blob([scopedCode], { type: 'text/javascript' });\n blobUrl = URL.createObjectURL(blob);\n }\n scriptElement.src = blobUrl;\n scriptElement.type = 'module';\n if (needReplaceScriptElement) return scriptElement;\n const needKeepAlive = !!app.keepAlive && !(app.container instanceof ShadowRoot);\n const container = needKeepAlive ? document.head : app.container!;\n setMarkElement(scriptElement, app, needKeepAlive);\n container.appendChild(scriptElement);\n URL.revokeObjectURL(blobUrl);\n } else if (app.showSourceCode) {\n const scriptElement = document.createElement('script');\n if (scriptElement.__BK_WEWEB_APP_KEY__) {\n scriptElement.__BK_WEWEB_APP_KEY__ = undefined;\n }\n app.registerRunningApp();\n this.executeSourceScript(scriptElement, scopedCode);\n if (needReplaceScriptElement) return scriptElement;\n const needKeepAlive = !!app.keepAlive && !(app.container instanceof ShadowRoot);\n const container = needKeepAlive ? document.head : app.container!;\n setMarkElement(scriptElement, app, needKeepAlive);\n container.appendChild(scriptElement);\n } else {\n this.executeMemoryScript(app, scopedCode);\n if (needReplaceScriptElement) return document.createComment('【bk-weweb】dynamic script');\n }\n\n if (app instanceof MicroInstanceModel) {\n const globalWindow = app.scopeJs ? app.sandBox?.proxyWindow || window : window;\n // 判断是否是 iife var 的函数模块\n const isIifeVar = !!this.code.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').match(/^\\s*var\\s/);\n const exportProp = getGlobalProp(globalWindow, isIifeVar);\n if (exportProp) {\n this.exportInstance = (globalWindow as unknown as Record<string, unknown>)[exportProp];\n // window 下需清除全局副作用\n if (!app.scopeJs) {\n const descriptor = Object.getOwnPropertyDescriptor(globalWindow, exportProp);\n if (descriptor?.configurable) {\n delete (globalWindow as unknown as Record<string, unknown>)[exportProp];\n }\n }\n }\n }\n } catch (error) {\n console.error('execute script code error', error);\n }\n return;\n }\n\n /** 内存脚本执行 */\n executeMemoryScript(app: BaseModel, scopedCode: string): void {\n try {\n const isScopedLocation = app instanceof MicroAppModel && app.scopeLocation;\n app.registerRunningApp();\n\n new Function('window', 'location', 'history', scopedCode)(\n app.sandBox!.proxyWindow || window,\n isScopedLocation ? app.iframe!.contentWindow!.location : window.location,\n isScopedLocation ? app.iframe!.contentWindow!.history : window.history,\n );\n } catch (error) {\n console.error(error);\n }\n }\n\n /** 脚本标签执行 */\n executeSourceScript(scriptElement: HTMLScriptElement, scopedCode: string): void {\n if (this.isModule) {\n scriptElement.src = `${this.url}?key=${Date.now()}`;\n scriptElement.setAttribute('type', 'module');\n } else {\n scriptElement.textContent = scopedCode;\n }\n this.url && scriptElement.setAttribute('origin-src', this.url);\n }\n\n /** 获取脚本内容 */\n async getCode(app?: BaseModel): Promise<string> {\n if (this.code.length || !this.url || this.isModule) {\n return this.code;\n }\n\n let code = '';\n if (app?.source?.getScript(this.url)) {\n code = app.source.getScript(this.url)?.code || '';\n }\n if (!code && appCache.getCacheScript(this.url)) {\n code = appCache.getCacheScript(this.url)?.code || '';\n }\n if (!code) {\n code = await fetchSource(this.url, {}, app).catch(error => {\n console.error(`fetch script ${this.url} error`, error);\n return '';\n });\n }\n\n code = code.replace(STRICT_MODE_REGEX, '');\n this.code = code;\n return code;\n }\n\n setCode(code: string): void {\n this.code = code;\n }\n\n /** 转换脚本内容 */\n transformCode(app: BaseModel): string {\n const sourceMapUrl = this.url ? `//# sourceURL=${this.url}\\n` : '';\n if (app.sandBox) {\n if (this.isModule) {\n if (this.url) {\n return this.code;\n }\n const importList = this.code.match(/import\\s*.*(?:from)?\\s*\"([^\"]+)\";/gm);\n for (const item of importList || []) {\n this.code = this.code.replace(item, item.replace(/\"\\//, `\"${app.url}/`).replace(/\"$/, `?key=${Date.now()}\"`));\n }\n return `\n ${this.code};\n `;\n }\n if (app.showSourceCode) {\n return `;(function(window, self, globalThis){\n with(window){\n ${getGlobalContextCode()}\\n\n ${this.code}\\n\n ${sourceMapUrl}\n }\n }).call(window['${app.sandBox.windowSymbolKey}'],\n window['${app.sandBox.windowSymbolKey}'], window['${app.sandBox.windowSymbolKey}'], window['${app.sandBox.windowSymbolKey}']);`;\n }\n return `\n with(window) {\n try {\n ${getGlobalContextCode()}\\n\n ${this.code}\\n\n ${sourceMapUrl}\n }\n catch(e) {\n console.error(e)\n }\n }\n `;\n }\n return this.code;\n }\n}\n\n/** 全局属性是否跳过标记 */\nexport function shouldSkipProperty(global: Window, property: number | string): boolean {\n const globalWindow = global as unknown as Record<string, unknown>;\n return (\n // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>\n !global.hasOwnProperty(property) ||\n (!Number.isNaN(property) && (property as number) < global.length) ||\n (typeof navigator !== 'undefined' &&\n navigator.userAgent.indexOf('Trident') !== -1 &&\n Boolean(globalWindow[property]) &&\n typeof window !== 'undefined' &&\n (globalWindow[property] as { parent?: Window })?.parent === window)\n );\n}\n\n/** 获取脚本执行后绑定的export实例 */\nexport function getGlobalProp(global: Window, useFirstGlobalProp?: boolean): string | undefined {\n let cnt = 0;\n let foundLastProp: boolean | undefined;\n let result: string | undefined;\n\n for (const property in global) {\n // do not check frames cause it could be removed during import\n if (shouldSkipProperty(global, property)) continue;\n\n if ((cnt === 0 && property !== firstGlobalProp) || (cnt === 1 && property !== secondGlobalProp)) {\n return property;\n }\n\n if (foundLastProp) {\n lastGlobalProp = property;\n result = (useFirstGlobalProp && result) || property;\n } else {\n foundLastProp = property === lastGlobalProp;\n }\n cnt += 1;\n }\n\n return result;\n}\n\n/** 标记全局属性 */\nexport function noteGlobalProps(global: Window): string | undefined {\n secondGlobalProp = undefined;\n firstGlobalProp = secondGlobalProp;\n\n for (const property in global) {\n if (shouldSkipProperty(global, property)) continue;\n\n if (!firstGlobalProp) {\n firstGlobalProp = property;\n } else if (!secondGlobalProp) {\n secondGlobalProp = property;\n }\n lastGlobalProp = property;\n }\n\n return lastGlobalProp;\n}\n\n/**\n * app初始化dom脚本执行\n */\nexport async function execAppScripts(app: BaseModel): Promise<void> {\n // const appInitialScriptList = Array.from(app.source!.scripts.values()).filter(script => script.initial);\n // // 初始化脚本最先执行\n // if (appInitialScriptList.length) {\n // await Promise.all(appInitialScriptList.map(script => script.executeCode(app)));\n // }\n\n const appScriptList = Array.from(app.source!.scripts.values()).filter(script => script.fromHtml || script.initial);\n const commonList = appScriptList.filter(\n script => (!script.async && !script.defer) || (script.isModule && !script.fromHtml),\n );\n\n // 保证同步脚本和module类型最先执行\n await Promise.all(commonList.map(script => script.getCode(app)));\n await Promise.all(commonList.map(script => script.executeCode(app)));\n\n // 最后执行defer和async脚本\n const deferScriptList: Promise<ExecuteResult>[] = [];\n const asyncScriptList: Promise<ExecuteResult>[] = [];\n\n // async defer 脚本执行\n for (const script of appScriptList) {\n if (script.defer || script.async) {\n if (!script.code && script.defer) {\n deferScriptList.push(script.executeCode(app));\n } else {\n asyncScriptList.push(script.executeCode(app));\n }\n }\n }\n\n await Promise.all([...asyncScriptList, ...deferScriptList]).catch(error => {\n console.error(error);\n });\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { appCache } from '../cache/app-cache';\nimport { getCurrentRunningApp } from '../context/cache';\nimport { Script } from '../entry/script';\nimport { Style } from '../entry/style';\nimport { isJsonpUrl, randomUrl } from './common';\nimport { dispatchLinkOrScriptLoad } from './custom';\n\nimport type { BaseModel } from '../typings';\n\nexport type DOMMethod = <T extends Node = Node>(this: HTMLElement | Node, ...args: unknown[]) => T;\ntype SpecialElement = HTMLLinkElement | HTMLScriptElement | HTMLStyleElement;\n\n// 原生DOM方法缓存\nconst { appendChild: bodyAppendChild } = HTMLBodyElement.prototype;\n\n/** 处理样式元素 */\nconst handleStyleElement = (child: HTMLStyleElement, app: BaseModel): Node => {\n if (child.hasAttribute('exclude')) {\n return document.createComment('【bk-weweb】style with exclude attribute is ignored');\n }\n\n if (child.textContent) {\n // 父级应用样式已生效情况下,忽略子应用对应样式(web component的隔离下优化不生效)\n if (!(app.container instanceof ShadowRoot) && appCache.getBaseAppStyle(child.textContent)) {\n return document.createComment('【bk-weweb】style is effective in base app');\n }\n }\n\n if (!child.hasAttribute('ignore')) {\n const styleInstance = new Style({\n code: child.textContent || '',\n fromHtml: false,\n url: '',\n });\n app.source?.setStyle(randomUrl(), styleInstance);\n styleInstance.scopedStyleCSS(app, child);\n }\n\n return child;\n};\n\n/** 处理链接元素 */\nconst handleLinkElement = (child: HTMLLinkElement, parent: Node, app: BaseModel): Node => {\n const result = app.source?.collectLink(child, parent, true);\n if (!result) return child;\n\n if (result.style) {\n result.style.scopedLinkCSS(app, child);\n }\n\n return result.replace !== child ? result.replace : child;\n};\n\n/** 处理动态脚本观察器 */\nconst createScriptObserver = (child: HTMLScriptElement, parent: Node, app: BaseModel): MutationObserver => {\n const observer = new MutationObserver(() => {\n if (child.getAttribute('src')) {\n observer.disconnect();\n const scriptInfo = app.source!.collectScript(child, parent, true);\n\n if (scriptInfo?.replace) {\n bodyAppendChild.call(app.container, scriptInfo.replace);\n }\n\n // 处理异步JSONP\n if (isJsonpUrl(child.getAttribute('src'))) {\n app.container?.append(child);\n return;\n }\n\n if (scriptInfo?.script) {\n scriptInfo.script.executeCode(app);\n }\n child.remove();\n } else if (child.textContent) {\n observer.disconnect();\n const scriptInstance = new Script({\n async: false,\n code: child.textContent,\n defer: child.type === 'module',\n fromHtml: false,\n isModule: child.type === 'module',\n });\n\n app.source!.scripts.set(randomUrl(), scriptInstance);\n\n try {\n scriptInstance.executeCode(app);\n } catch (error) {\n console.error(error);\n } finally {\n if (!scriptInstance.isModule) {\n dispatchLinkOrScriptLoad(child);\n }\n child.remove();\n }\n }\n });\n\n return observer;\n};\n\n/** 处理脚本元素 */\nconst handleScriptElement = (child: HTMLScriptElement, parent: Node, app: BaseModel): Node => {\n const replaceInfo = app.source!.collectScript(child, parent, true);\n if (!replaceInfo) {\n return child;\n }\n\n if (replaceInfo.script) {\n replaceInfo.script.executeCode(app);\n }\n\n if (replaceInfo.replace !== child) {\n return replaceInfo.replace;\n }\n\n // 处理动态脚本\n if (app.scopeJs && !child.getAttribute('src') && !child.textContent) {\n const observer = createScriptObserver(child, parent, app);\n observer.observe(child, { attributeFilter: ['src'], childList: true, subtree: false });\n return document.createComment('【bk-weweb】dynamic script or module');\n }\n\n return child;\n};\n\n/** 重置新元素,根据元素类型进行相应处理 */\nexport const resetNewElement = (parent: Node, child: Node, app: BaseModel): Node => {\n if (child instanceof HTMLStyleElement) {\n return handleStyleElement(child, app);\n }\n\n if (child instanceof HTMLLinkElement) {\n return handleLinkElement(child, parent, app);\n }\n\n if (child instanceof HTMLScriptElement) {\n return handleScriptElement(child, parent, app);\n }\n\n return child;\n};\n\n/** 判断是否为特殊元素(script、style、link) */\nexport const isSpecialElement = (node: Node): node is SpecialElement => {\n return node instanceof HTMLScriptElement || node instanceof HTMLStyleElement || node instanceof HTMLLinkElement;\n};\n\n/** 获取目标容器 */\nconst getTargetContainer = (app: BaseModel, isSpecial: boolean): Node => {\n const needKeepAlive = isSpecial && !!app.keepAlive && !(app.container instanceof ShadowRoot);\n return needKeepAlive ? document.head : app.container!;\n};\n\n/**\n * 元素添加处理器\n * @param parent 父节点\n * @param newChild 新子节点\n * @param rawMethod 原始方法\n * @returns 处理结果\n */\nexport const elementAppendHandler = (parent: Node, newChild: Node, rawMethod: DOMMethod): Node => {\n if (!newChild.__BK_WEWEB_APP_KEY__) {\n return rawMethod.call(parent, newChild);\n }\n const app = appCache.getApp(newChild.__BK_WEWEB_APP_KEY__) || getCurrentRunningApp();\n if (!app?.container) {\n return rawMethod.call(parent, newChild);\n }\n\n const targetChild = resetNewElement(parent, newChild, app);\n const isSpecial = isSpecialElement(newChild);\n const needKeepAlive = isSpecial && !!app.keepAlive && !(app.container instanceof ShadowRoot);\n const container = getTargetContainer(app, isSpecial);\n\n setMarkElement(targetChild as Element, app, needKeepAlive);\n return rawMethod.call(container, targetChild);\n};\n\n/**\n * 元素插入处理器\n * @param parent 父节点\n * @param newChild 新子节点\n * @param passiveChild 参考节点\n * @param rawMethod 原始方法\n * @returns 处理结果\n */\nexport const elementInsertHandler = (\n parent: Node,\n newChild: Node,\n passiveChild: Node | null,\n rawMethod: DOMMethod,\n): Node => {\n if (!newChild.__BK_WEWEB_APP_KEY__) {\n return rawMethod.call(parent, newChild, passiveChild);\n }\n\n const app = appCache.getApp(newChild.__BK_WEWEB_APP_KEY__) || getCurrentRunningApp();\n if (!app?.container) {\n return rawMethod.call(parent, newChild, passiveChild);\n }\n\n const isSpecial = isSpecialElement(newChild);\n const needKeepAlive = isSpecial && app.keepAlive && !(app.container instanceof ShadowRoot);\n const container = getTargetContainer(app, isSpecial);\n const targetChild = resetNewElement(parent, newChild, app);\n\n if (needKeepAlive) {\n setMarkElement(targetChild as Element, app, needKeepAlive);\n }\n\n if (passiveChild && !container.contains(passiveChild)) {\n return bodyAppendChild.call(container, targetChild);\n }\n\n return rawMethod.call(container, targetChild, passiveChild);\n};\n\n/**\n * 设置元素标记\n * @param element 元素\n * @param app 应用实例\n * @param keepAlive 是否保持活跃\n * @returns 标记后的元素\n */\nexport const setMarkElement = <T extends Element>(element: T, app?: BaseModel, keepAlive?: boolean): T => {\n if (keepAlive && app) {\n element.__KEEP_ALIVE__ = app.appCacheKey;\n element.setAttribute('data-from', app.name);\n element.setAttribute('data-keep-alive', 'true');\n }\n element.setAttribute?.('powered-by', 'bk-weweb');\n return element;\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * Document 代理模块\n * @description 为微前端应用创建代理 document 对象,实现 DOM 隔离和沙箱环境\n */\n\nimport { fillUpPath } from '../utils';\n\nimport type { BaseModel } from '../typings/model';\n\n/**\n * 特殊元素标签名称\n * @description 这些标签在查询时需要特殊处理,通常指向宿主环境的元素\n */\nconst SPECIAL_ELEMENT_TAGS = ['body', 'html', 'head'] as const;\n\n/**\n * 应用容器键名\n * @description 用于标记元素所属的微前端应用\n */\nconst APP_KEY_PROPERTY = '__BK_WEWEB_APP_KEY__' as const;\n\n/**\n * 插入位置类型映射\n * @description 定义 insertAdjacentHTML 方法支持的插入位置\n */\ntype InsertPosition = 'afterbegin' | 'afterend' | 'beforebegin' | 'beforeend';\n\n/**\n * ShadowRoot insertAdjacentHTML 实现\n * @description 在 ShadowRoot 环境下实现 insertAdjacentHTML 方法\n * @param app - 应用实例\n * @param where - 插入位置\n * @param domString - 要插入的 HTML 字符串\n */\nfunction createShadowRootInsertAdjacentHTML(app: BaseModel) {\n return function shadowRootInsertAdjacentHTML(where: InsertPosition, domString: string): void {\n const temporaryContainer = document.createElement('div');\n temporaryContainer.innerHTML = domString;\n const elements = Array.from(temporaryContainer.childNodes);\n const shadow = app.container! as ShadowRoot;\n\n switch (where) {\n case 'beforebegin':\n for (const item of elements) {\n shadow.host.parentNode?.insertBefore(item, shadow.host);\n }\n break;\n case 'afterbegin':\n for (const item of elements.reverse()) {\n shadow.insertBefore(item, shadow.firstChild);\n }\n break;\n case 'beforeend':\n for (const item of elements) {\n shadow.appendChild(item);\n }\n break;\n case 'afterend':\n for (const item of elements) {\n shadow.host.parentNode?.insertBefore(item, shadow.host.nextSibling);\n }\n break;\n }\n };\n}\n\n/**\n * 创建代理 body 对象\n * @description 为微前端应用创建隔离的 body 代理对象\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @returns ProxyHandler<{}> - body 代理对象\n */\nfunction createProxyBody(rawDocument: Document, app: BaseModel) {\n return new Proxy(\n {},\n {\n get(_, key) {\n // ShadowRoot 环境处理\n if (app.container instanceof ShadowRoot) {\n if (key === 'insertAdjacentHTML') {\n return createShadowRootInsertAdjacentHTML(app);\n }\n\n const value = Reflect.get(app.container, key);\n if (typeof value === 'function') {\n return value.bind(app.container);\n }\n if (value !== undefined) {\n return value;\n }\n }\n\n // 默认使用原始 document.body\n const value = Reflect.get(rawDocument.body, key);\n return typeof value === 'function' ? value.bind(rawDocument.body) : value;\n },\n\n set(_, key, value) {\n if (app.container instanceof ShadowRoot) {\n Reflect.set(app.container, key, value);\n return true;\n }\n\n Reflect.set(rawDocument.body, key, value);\n return true;\n },\n },\n );\n}\n\n/**\n * 创建元素并标记应用归属\n * @description 重写 createElement 方法,为创建的元素标记所属应用\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @returns createElement 函数\n */\nfunction createElementWithAppKey(rawDocument: Document, app: BaseModel) {\n return function createElement<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n options?: ElementCreationOptions | undefined,\n ) {\n const element = rawDocument.createElement(tagName, options);\n\n // 为元素标记所属应用\n (element as HTMLElement & { [APP_KEY_PROPERTY]: string })[APP_KEY_PROPERTY] = app.appCacheKey;\n\n // 处理图片元素的 src 属性\n if (element instanceof HTMLImageElement) {\n Object.defineProperty(element, 'src', {\n get() {\n return element.getAttribute('src');\n },\n set(value) {\n element.setAttribute('src', fillUpPath(value, app.url));\n },\n });\n }\n\n return element;\n };\n}\n\n/**\n * 检查是否为特殊元素标签\n * @description 判断选择器是否匹配特殊元素标签\n * @param selector - CSS 选择器字符串\n * @returns boolean - 是否为特殊元素标签\n */\nfunction isSpecialElementTag(selector: string): boolean {\n return (SPECIAL_ELEMENT_TAGS as readonly string[]).includes(selector);\n}\n\n/**\n * 安全执行查询选择器\n * @description 在容器中安全执行查询,捕获可能的异常\n * @param container - 查询容器\n * @param selector - CSS 选择器\n * @returns Element | null - 查询结果\n */\nfunction safeQuerySelector(container: Element | ShadowRoot | null | undefined, selector: string): Element | null {\n try {\n return container?.querySelector(selector) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * 安全执行查询所有选择器\n * @description 在容器中安全执行查询所有,捕获可能的异常\n * @param container - 查询容器\n * @param selector - CSS 选择器\n * @returns NodeListOf<Element> - 查询结果集合\n */\nfunction safeQuerySelectorAll(\n container: Element | ShadowRoot | null | undefined,\n selector: string,\n): NodeListOf<Element> {\n try {\n return container?.querySelectorAll(selector) ?? ([] as unknown as NodeListOf<Element>);\n } catch {\n return [] as unknown as NodeListOf<Element>;\n }\n}\n\n/**\n * 创建代理查询选择器方法\n * @description 重写 querySelector 方法,支持容器隔离\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @param proxyBody - 代理 body 对象\n * @returns querySelector 函数\n */\nfunction createProxyQuerySelector(rawDocument: Document, app: BaseModel, proxyBody: unknown) {\n return function querySelectorNew(this: Document, selectors: string): Element | null {\n if (selectors === proxyBody) {\n return app.container instanceof ShadowRoot ? (app.container as unknown as Element) : rawDocument.body;\n }\n\n if (isSpecialElementTag(selectors)) {\n if (app?.container instanceof ShadowRoot) {\n return app?.container as unknown as Element;\n }\n return rawDocument.querySelector.call(this, selectors);\n }\n\n return safeQuerySelector(app?.container, selectors);\n };\n}\n\n/**\n * 创建代理查询所有选择器方法\n * @description 重写 querySelectorAll 方法,支持容器隔离\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @returns querySelectorAll 函数\n */\nfunction createProxyQuerySelectorAll(rawDocument: Document, app: BaseModel) {\n return function querySelectorAllNew(selectors: string): NodeListOf<Element> {\n if (isSpecialElementTag(selectors)) {\n if (app?.container instanceof ShadowRoot) {\n return [app?.container] as unknown as NodeListOf<Element>;\n }\n const result = rawDocument.querySelector(selectors);\n return result ? ([result] as unknown as NodeListOf<Element>) : ([] as unknown as NodeListOf<Element>);\n }\n\n return safeQuerySelectorAll(app?.container, selectors);\n };\n}\n\n/**\n * 创建代理 getElementById 方法\n * @description 重写 getElementById 方法,支持容器隔离\n * @param rawDocument - 原始 document 对象\n * @param querySelector - 代理的 querySelector 方法\n * @returns getElementById 函数\n */\nfunction createProxyGetElementById(\n rawDocument: Document,\n querySelector: (this: Document, selectors: string) => Element | null,\n) {\n return function getElementByIdNew(id: string): HTMLElement | null {\n return querySelector.call(rawDocument, `#${id}`) as HTMLElement | null;\n };\n}\n\n/**\n * 创建代理 getElementsByClassName 方法\n * @description 重写 getElementsByClassName 方法,支持容器隔离\n * @param querySelectorAll - 代理的 querySelectorAll 方法\n * @returns getElementsByClassName 函数\n */\nfunction createProxyGetElementsByClassName(querySelectorAll: (selectors: string) => NodeListOf<Element>) {\n return function getElementsByClassName(className: string): HTMLCollectionOf<Element> {\n return querySelectorAll(`.${className}`) as unknown as HTMLCollectionOf<Element>;\n };\n}\n\n/**\n * 创建代理 getElementsByTagName 方法\n * @description 重写 getElementsByTagName 方法,支持容器隔离\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @param querySelectorAll - 代理的 querySelectorAll 方法\n * @returns getElementsByTagName 函数\n */\nfunction createProxyGetElementsByTagName(\n rawDocument: Document,\n app: BaseModel,\n querySelectorAll: (selectors: string) => NodeListOf<Element>,\n) {\n return function getElementsByTagName<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n ): HTMLCollectionOf<HTMLElementTagNameMap[K]> {\n if (isSpecialElementTag(tagName) || (!app?.showSourceCode && tagName.toLowerCase() === 'script')) {\n return rawDocument.getElementsByTagName(tagName);\n }\n\n return querySelectorAll(tagName) as unknown as HTMLCollectionOf<HTMLElementTagNameMap[K]>;\n };\n}\n\n/**\n * 创建代理 getElementsByName 方法\n * @description 重写 getElementsByName 方法,支持容器隔离\n * @param querySelectorAll - 代理的 querySelectorAll 方法\n * @returns getElementsByName 函数\n */\nfunction createProxyGetElementsByName(querySelectorAll: (selectors: string) => NodeListOf<Element>) {\n return function getElementsByNameNew(name: string): NodeListOf<HTMLElement> {\n return querySelectorAll(`[name=\"${name}\"]`) as unknown as NodeListOf<HTMLElement>;\n };\n}\n\n/**\n * 创建代理 document 方法映射\n * @description 创建所有需要代理的 document 方法\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @param proxyBody - 代理 body 对象\n * @returns 代理方法映射对象\n */\nfunction createProxyMethodMap(rawDocument: Document, app: BaseModel, proxyBody: unknown) {\n const createElement = createElementWithAppKey(rawDocument, app);\n const querySelector = createProxyQuerySelector(rawDocument, app, proxyBody);\n const querySelectorAll = createProxyQuerySelectorAll(rawDocument, app);\n const getElementById = createProxyGetElementById(rawDocument, querySelector);\n const getElementsByClassName = createProxyGetElementsByClassName(querySelectorAll);\n const getElementsByTagName = createProxyGetElementsByTagName(rawDocument, app, querySelectorAll);\n const getElementsByName = createProxyGetElementsByName(querySelectorAll);\n\n return {\n createElement: createElement.bind(rawDocument),\n querySelector: querySelector.bind(rawDocument),\n querySelectorAll: querySelectorAll.bind(rawDocument),\n getElementById: getElementById.bind(rawDocument),\n getElementsByClassName: getElementsByClassName.bind(rawDocument),\n getElementsByTagName: getElementsByTagName.bind(rawDocument),\n getElementsByName: getElementsByName.bind(rawDocument),\n };\n}\n\n/**\n * 创建代理 document 对象\n * @description 为微前端应用创建隔离的 document 代理对象,实现 DOM 隔离\n *\n * 主要功能:\n * 1. 代理 body 对象,支持 ShadowRoot 环境\n * 2. 重写 DOM 查询方法,实现容器隔离\n * 3. 标记创建的元素归属,便于应用管理\n * 4. 支持特殊元素标签的原生访问\n *\n * @param rawDocument - 原始 document 对象\n * @param app - 微前端应用实例\n * @returns Document - 代理后的 document 对象\n *\n * @example\n * ```typescript\n * const proxyDoc = createProxyDocument(document, appInstance);\n * // 使用代理后的 document 进行 DOM 操作\n * const element = proxyDoc.createElement('div');\n * const result = proxyDoc.querySelector('.my-class');\n * ```\n */\nexport const createProxyDocument = (rawDocument: Document, app: BaseModel): Document => {\n const fakeDocument = {};\n const proxyBody = createProxyBody(rawDocument, app);\n const methodMap = createProxyMethodMap(rawDocument, app, proxyBody);\n\n return new Proxy(fakeDocument, {\n get(_, key: string | symbol) {\n if (key === 'body') {\n return proxyBody;\n }\n\n if (typeof key === 'string' && key in methodMap) {\n return methodMap[key as keyof typeof methodMap];\n }\n\n // 默认处理:获取原始 document 的属性或方法\n const result = Reflect.get(rawDocument, key);\n return typeof result === 'function' ? result.bind(rawDocument) : result;\n },\n }) as Document;\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getCurrentRunningApp } from './cache';\n\nimport type { DocumentEventListener } from '../typings';\n\n/**\n * 重写document和body的事件监听器\n * 支持微前端应用的事件隔离和keepAlive模式\n */\nexport function rewriteDocumentAndBodyEvent(): { resetDocumentAndBodyEvent: () => void } {\n // 保存原始的事件方法\n const { addEventListener, removeEventListener } = window.document;\n const { addEventListener: bodyAddEventListener, removeEventListener: bodyRemoveEventListener } = window.document.body;\n\n // 存储keepAlive模式下的事件监听器\n const documentListenerMap = new Map<keyof DocumentEventMap, DocumentEventListener[]>();\n\n // 重写document.addEventListener\n document.addEventListener = function <K extends keyof DocumentEventMap>(\n type: K,\n listener: DocumentEventListener,\n options?: AddEventListenerOptions | boolean | undefined,\n ): void {\n const app = getCurrentRunningApp();\n // keepAlive模式下保存监听器\n if (app?.keepAlive) {\n const listeners = documentListenerMap.get(type) || [];\n documentListenerMap.set(type, [...listeners, listener]);\n }\n // ShadowRoot容器特殊处理\n addEventListener.call(app?.container instanceof ShadowRoot ? app.container : this, type, listener, options);\n };\n\n // body使用相同的addEventListener\n document.body.addEventListener = document.addEventListener;\n\n // 重写document.removeEventListener\n document.removeEventListener = function <K extends keyof DocumentEventMap>(\n type: K,\n listener: DocumentEventListener,\n options?: AddEventListenerOptions | boolean,\n ): void {\n const app = getCurrentRunningApp();\n // keepAlive模式下移除保存的监听器\n if (app?.keepAlive) {\n const listeners = documentListenerMap.get(type) || [];\n if (listeners.length && listeners.some(l => l === listener)) {\n listeners.splice(listeners.indexOf(listener), 1);\n }\n }\n removeEventListener.call(app?.container instanceof ShadowRoot ? app.container : this, type, listener, options);\n };\n\n // body使用相同的removeEventListener\n document.body.removeEventListener = document.removeEventListener;\n\n /**\n * 重置事件监听器,恢复原始方法\n */\n function resetDocumentAndBodyEvent(): void {\n const app = getCurrentRunningApp();\n // 清理keepAlive模式下保存的事件监听器\n if (app?.keepAlive && documentListenerMap.values()) {\n for (const [type, listeners] of documentListenerMap.entries()) {\n for (const listener of listeners || []) {\n document.removeEventListener.call(document, type, listener);\n }\n }\n }\n // 恢复原始方法\n document.addEventListener = addEventListener;\n document.body.addEventListener = bodyAddEventListener;\n document.removeEventListener = removeEventListener;\n document.body.removeEventListener = bodyRemoveEventListener;\n documentListenerMap.clear();\n }\n\n return {\n resetDocumentAndBodyEvent,\n };\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n// 匹配类定义的正则\nconst CLASS_REGEX = /^class\\b/;\n\n// 匹配构造函数的正则(以大写字母开头的function)\nconst COMMON_CONSTRUCT_FU_REGEX = /^function\\b\\s[A-Z].*/;\n\n// 缓存构造函数判断结果\nconst ConstructFunCacheMap = new WeakMap<CallableFunction, boolean>();\n\n/**\n * 判断是否为构造函数\n */\nexport function isConstructFun(fn: CallableFunction) {\n if (fn.prototype?.constructor === fn && Object.getOwnPropertyNames(fn.prototype).length > 1) {\n return true;\n }\n\n if (ConstructFunCacheMap.has(fn)) {\n return ConstructFunCacheMap.get(fn);\n }\n\n const constructable = COMMON_CONSTRUCT_FU_REGEX.test(fn.toString()) || CLASS_REGEX.test(fn.toString());\n ConstructFunCacheMap.set(fn, constructable);\n return constructable;\n}\n\n// 存储函数绑定关系的映射\nconst functionBoundedValueMap = new WeakMap<CallableFunction, CallableFunction>();\n\n/**\n * 绑定函数到原始window\n */\nexport default function bindFunctionToRawWindow(rawWindow: Window, value: unknown): unknown {\n if (functionBoundedValueMap.has(value as CallableFunction)) {\n return functionBoundedValueMap.get(value as CallableFunction);\n }\n\n if (typeof value === 'function' && !isConstructFun(value)) {\n const boundValue = Function.prototype.bind.call(value, rawWindow);\n\n for (const key in value) {\n boundValue[key] = value[key];\n }\n\n if (Object.hasOwn(value, 'prototype') && !Object.hasOwn(boundValue, 'prototype')) {\n Object.defineProperty(boundValue, 'prototype', {\n enumerable: false,\n value: value.prototype,\n writable: true,\n });\n }\n\n if (typeof value.toString === 'function') {\n const valueHasInstanceToString = Object.hasOwn(value, 'toString') && !Object.hasOwn(boundValue, 'toString');\n const boundValueHasPrototypeToString = boundValue.toString === Function.prototype.toString;\n\n if (valueHasInstanceToString || boundValueHasPrototypeToString) {\n const originToStringDescriptor = Object.getOwnPropertyDescriptor(\n valueHasInstanceToString ? value : Function.prototype,\n 'toString',\n );\n\n Object.defineProperty(boundValue, 'toString', {\n ...originToStringDescriptor,\n ...(originToStringDescriptor?.get ? null : { value: () => value.toString() }),\n });\n }\n }\n\n functionBoundedValueMap.set(value, boundValue);\n return boundValue;\n }\n\n return value;\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n// 扩展的 Window 类型\nexport type FakeWindow = Window & Record<string, unknown>;\n\n/**\n * 重写 Window 对象的方法,实现事件监听器和定时器的管理\n * 用于微前端应用卸载时清理资源\n */\nexport function rewriteWindowFunction(fakeWindow: FakeWindow): Record<string, CallableFunction> {\n // 存储事件监听器映射\n const windowEventListenerMap = new Map<keyof WindowEventMap, EventListenerOrEventListenerObject[]>();\n // 存储定时器列表\n const intervalTimerList: number[] = [];\n const rawWindow = window;\n const { addEventListener, clearInterval, removeEventListener, setInterval } = window;\n\n // 重写 addEventListener 方法\n fakeWindow.addEventListener = <K extends keyof WindowEventMap>(\n type: K,\n listener: EventListenerOrEventListenerObject,\n options?: AddEventListenerOptions | boolean,\n ): void => {\n windowEventListenerMap.set(type, [...(windowEventListenerMap.get(type) || []), listener]);\n addEventListener.call(rawWindow, type, listener, options);\n };\n\n // 重写 removeEventListener 方法\n fakeWindow.removeEventListener = <K extends keyof WindowEventMap>(\n type: K,\n listener: EventListenerOrEventListenerObject,\n options?: AddEventListenerOptions | boolean,\n ): void => {\n const listenerList = windowEventListenerMap.get(type);\n if (listenerList?.length) {\n const index = listenerList.indexOf(listener);\n index > -1 && listenerList.splice(index, 1);\n }\n removeEventListener.call(rawWindow, type, listener, options);\n };\n\n // 重写 setInterval 方法\n fakeWindow.setInterval = (\n handler: TimerHandler | string,\n timeout?: number | undefined,\n ...args: unknown[]\n ): number => {\n const timer = setInterval(handler as TimerHandler, timeout, ...(args as []));\n intervalTimerList.push(timer as number);\n return timer as number;\n };\n\n // 重写 clearInterval 方法\n fakeWindow.clearInterval = (timer: number) => {\n const index = intervalTimerList.indexOf(timer);\n index > -1 && intervalTimerList.splice(index, 1);\n clearInterval.call(rawWindow, timer as unknown as NodeJS.Timeout);\n };\n\n /**\n * 重置窗口函数,清理所有事件监听器和定时器\n * 在应用卸载时调用\n */\n function resetWindowFunction() {\n // 清理窗口事件监听器\n if (windowEventListenerMap.size) {\n windowEventListenerMap.forEach((listenerList, type) => {\n for (const listener of listenerList) {\n removeEventListener.call(rawWindow, type, listener);\n }\n });\n windowEventListenerMap.clear();\n }\n // 清理定时器\n if (intervalTimerList.length) {\n for (const timer of intervalTimerList) {\n clearInterval.call(rawWindow, timer);\n }\n }\n }\n\n return {\n resetWindowFunction,\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\n/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/** 微前端沙箱模块,提供应用间的环境隔离 */\n\nimport { MicroAppModel } from '../mode/app';\nimport {\n BK_WEWEB_INJECT_KEY_LIST,\n BK_WEWEB_LOCATION_KEY_LIST,\n type BaseModel,\n DEV_MICRO_APP_WINDOW_KEY_MAP,\n type IInjectWindowAttrs,\n WINDOW_ALIAS_LIST,\n WINDOW_WHITE_LIST,\n} from '../typings';\n// import { random } from '../utils/common';\nimport { windowNativeFuncMap } from './cache';\nimport { createProxyDocument } from './document';\nimport { rewriteDocumentAndBodyEvent } from './event';\nimport bindFunctionToRawWindow from './function';\nimport { rewriteWindowFunction, type FakeWindow } from './window';\n\n/**\n * 微前端沙箱\n * @description 提供应用间的环境隔离,防止全局变量污染,支持多应用并存运行\n */\nexport default class SandBox {\n /** 沙箱激活状态标识 */\n private active = false;\n\n /** 记录在原始 window 上新增的属性键集合 */\n private readonly inRawWindowKeySet = new Set<PropertyKey>();\n\n /** 重置文档和 body 事件的函数 */\n private resetDocumentAndBodyEvent?: CallableFunction;\n\n /** 重置 window 函数的方法 */\n private readonly resetWindowFunction: CallableFunction;\n\n /** 记录与原始 window 相同的属性键集合 */\n private readonly sameRawWindowKeySet = new Set<PropertyKey>();\n\n /** 伪造的 window 对象 */\n public readonly fakeWindow: FakeWindow & IInjectWindowAttrs;\n\n /** 代理的 document 对象 */\n public proxyDocument: any;\n\n /** 代理的 window 对象 */\n public readonly proxyWindow: WindowProxy & IInjectWindowAttrs;\n\n /** 原始 document 对象 */\n public rawDocument: Record<string, any>;\n\n /** 原始 window 对象 */\n public readonly rawWindow: Window;\n\n /** 在 window 上的唯一标识键 */\n public readonly windowSymbolKey: keyof Window;\n\n /** 初始化沙箱环境 */\n constructor(public readonly app: BaseModel) {\n // 存储 window 描述符的集合\n const windowDescriptorSet = new Set<PropertyKey>();\n const rawWindow = window;\n this.rawWindow = rawWindow;\n const rawDocument = (window as unknown as IInjectWindowAttrs).rawDocument || document;\n // 创建代理 document\n this.rawDocument = createProxyDocument(rawDocument, app);\n\n // 创建fake window 对象\n const fakeWindow = Object.create({});\n fakeWindow.__BK_WEWEB_APP_KEY__ = app.appCacheKey;\n fakeWindow.__POWERED_BY_BK_WEWEB__ = true;\n fakeWindow.rawDocument = rawDocument;\n fakeWindow.rawWindow = rawWindow;\n fakeWindow.__proto__ = Window;\n this.fakeWindow = fakeWindow as FakeWindow & IInjectWindowAttrs;\n\n // 重写 window 函数\n const { resetWindowFunction } = rewriteWindowFunction(this.fakeWindow);\n this.resetWindowFunction = resetWindowFunction;\n\n // 生成唯一的 window 标识键\n // const appIdentifier = (app.name || app.appCacheKey).replace(/[-,:~'\"]/g, '_');\n this.windowSymbolKey = `${app.name || app.appCacheKey}` as keyof Window;\n\n // 创建 window 代理对象\n this.proxyWindow = new Proxy(this.fakeWindow, {\n defineProperty: (target: Window, key: PropertyKey, value: PropertyDescriptor): boolean => {\n if (windowDescriptorSet.has(key)) {\n return Reflect.defineProperty(rawWindow, key, value);\n }\n return Reflect.defineProperty(target, key, value);\n },\n\n deleteProperty: (target: Window, key: PropertyKey): boolean => {\n if (Object.hasOwn(target, key)) {\n // 清理相关键集合\n if (this.sameRawWindowKeySet.has(key)) {\n this.sameRawWindowKeySet.delete(key);\n }\n if (this.inRawWindowKeySet.has(key)) {\n Reflect.deleteProperty(rawWindow, key);\n }\n return Reflect.deleteProperty(target, key);\n }\n return true;\n },\n\n get: (target: Window, key: string | symbol): unknown => {\n return this.handleProxyGet(target, key, rawWindow);\n },\n\n getOwnPropertyDescriptor: (target: any, key: PropertyKey): PropertyDescriptor | undefined => {\n if (Object.hasOwn(target, key)) {\n return Object.getOwnPropertyDescriptor(target, key);\n }\n\n if (Object.hasOwn(rawWindow, key)) {\n windowDescriptorSet.add(key);\n const descriptor = Object.getOwnPropertyDescriptor(rawWindow, key);\n if (descriptor && !descriptor.configurable) {\n descriptor.configurable = true;\n }\n return descriptor;\n }\n\n return undefined;\n },\n\n has: (target: Window & any, key: PropertyKey): boolean =>\n windowNativeFuncMap.has(key) || key in target || key in rawWindow,\n\n ownKeys: (target: Window & any): Array<string | symbol> =>\n Array.from(new Set(Reflect.ownKeys(rawWindow).concat(Reflect.ownKeys(target)))),\n\n set: (target: any, key: PropertyKey, value: unknown): boolean => {\n return this.handleProxySet(target, key, value, rawWindow);\n },\n });\n rawWindow[this.windowSymbolKey] = this.proxyWindow as never;\n\n // if (app.showSourceCode) {\n // }\n }\n\n /** 处理代理对象的 get 操作 */\n private handleProxyGet(target: Window, key: string | symbol, rawWindow: Window): unknown {\n // 处理 Symbol.unscopables 和原生函数\n if (key === Symbol.unscopables || windowNativeFuncMap.has(key)) {\n return rawWindow[key as any];\n }\n\n // 处理开发环境特殊键\n if (DEV_MICRO_APP_WINDOW_KEY_MAP[key]) {\n return this.fakeWindow[key as any];\n }\n\n // 处理 window 别名\n if (WINDOW_ALIAS_LIST.includes(key as string)) {\n return this.proxyWindow;\n }\n\n // 处理 document 访问\n if (key === 'document') {\n this.app.registerRunningApp();\n return this.rawDocument;\n }\n\n // 处理 eval 函数\n if (key === 'eval') {\n this.app.registerRunningApp();\n // biome-ignore lint/security/noGlobalEval: 这里需要返回 eval\n return eval;\n }\n\n // 处理 location 相关属性(iframe 沙盒)\n if (this.shouldUseIframeLocation(key)) {\n if (this.app instanceof MicroAppModel && this.app.iframe?.contentWindow) {\n return this.app.iframe.contentWindow[key as keyof Window];\n }\n return undefined;\n }\n\n // 重写 hasOwnProperty 方法\n if (key === 'hasOwnProperty') {\n return (checkKey: PropertyKey) => Object.hasOwn(this.fakeWindow, checkKey) || Object.hasOwn(rawWindow, checkKey);\n }\n\n // 处理 top 和 parent 属性\n if (key === 'top' || key === 'parent') {\n if (rawWindow === rawWindow.parent) {\n return this.proxyWindow;\n }\n return Reflect.get(rawWindow, key); // iframe 情况\n }\n\n // 重写 getComputedStyle 方法\n if (key === 'getComputedStyle') {\n return this.createGetComputedStyleProxy(rawWindow);\n }\n\n // 优先返回目标对象的属性\n if (Reflect.has(target, key) || BK_WEWEB_INJECT_KEY_LIST.includes(key as string)) {\n return Reflect.get(target, key);\n }\n\n // 从原始 window 获取属性并绑定上下文\n const rawValue = Reflect.get(rawWindow, key);\n return bindFunctionToRawWindow(rawWindow, rawValue);\n }\n\n /**\n * 处理代理对象的 set 操作\n * @description 统一处理代理对象属性设置的复杂逻辑\n * @param target - 目标对象\n * @param key - 属性键\n * @param value - 属性值\n * @param rawWindow - 原始 window 对象\n * @returns boolean - 设置是否成功\n * @private\n */\n private handleProxySet(target: any, key: PropertyKey, value: unknown, rawWindow: Window): boolean {\n if (!this.active) {\n return true;\n }\n\n // 处理 iframe 沙盒下的 location 设置\n if (this.shouldUseIframeLocation(key)) {\n const iframe = this.app instanceof MicroAppModel ? this.app.iframe : null;\n return iframe?.contentWindow ? Reflect.set(iframe.contentWindow, key, value) : true;\n }\n\n // 共享主应用 location\n if (key === 'location') {\n Reflect.set(rawWindow, key, value);\n } else if (this.shouldSetOnTarget(target, key, rawWindow)) {\n this.setPropertyOnTarget(target, key, value, rawWindow);\n } else {\n Reflect.set(target, key, value);\n this.sameRawWindowKeySet.add(key);\n }\n\n // 处理白名单属性\n this.handleWhiteListProperty(key, value, rawWindow);\n\n return true;\n }\n\n /**\n * 判断是否应该使用 iframe 的 location\n * @description 检查是否在 iframe 模式下访问 location 相关属性\n * @param key - 属性键\n * @returns boolean - 是否使用 iframe location\n * @private\n */\n private shouldUseIframeLocation(key: PropertyKey): boolean {\n return !!(\n BK_WEWEB_LOCATION_KEY_LIST.includes(key as string) &&\n this.app instanceof MicroAppModel &&\n this.app.iframe &&\n this.app.scopeLocation\n );\n }\n\n /**\n * 创建 getComputedStyle 方法的代理\n * @description 为 getComputedStyle 方法创建安全的代理实现\n * @param rawWindow - 原始 window 对象\n * @returns Function - 代理后的 getComputedStyle 方法\n * @private\n */\n private createGetComputedStyleProxy(\n rawWindow: Window,\n ): (element: Element, pseudoElt?: null | string) => CSSStyleDeclaration {\n return (element: Element, pseudoElt?: null | string) => {\n if (element instanceof Element) {\n return rawWindow.getComputedStyle(element, pseudoElt);\n }\n return rawWindow.getComputedStyle(document.body, pseudoElt);\n };\n }\n\n /**\n * 判断是否应该在目标对象上设置属性\n * @description 检查属性设置的逻辑条件\n * @param target - 目标对象\n * @param key - 属性键\n * @param rawWindow - 原始 window 对象\n * @returns boolean - 是否在目标对象上设置\n * @private\n */\n private shouldSetOnTarget(target: any, key: PropertyKey, rawWindow: Window): boolean {\n return (\n !Object.hasOwn(target, key) && Object.hasOwn(rawWindow, key) && !BK_WEWEB_INJECT_KEY_LIST.includes(key as string)\n );\n }\n\n /**\n * 在目标对象上设置属性\n * @description 安全地在目标对象上设置属性,保持描述符特性\n * @param target - 目标对象\n * @param key - 属性键\n * @param value - 属性值\n * @param rawWindow - 原始 window 对象\n * @private\n */\n private setPropertyOnTarget(target: any, key: PropertyKey, value: unknown, rawWindow: Window): void {\n const descriptor = Object.getOwnPropertyDescriptor(rawWindow, key);\n\n if (!descriptor) {\n return; // 如果没有描述符,直接返回\n }\n\n const { configurable, enumerable, writable } = descriptor;\n\n if (writable) {\n Object.defineProperty(target, key, {\n configurable,\n enumerable,\n value,\n writable,\n });\n this.sameRawWindowKeySet.add(key);\n }\n }\n\n /**\n * 处理白名单属性\n * @description 处理需要在原始 window 上设置的白名单属性\n * @param key - 属性键\n * @param value - 属性值\n * @param rawWindow - 原始 window 对象\n * @private\n */\n private handleWhiteListProperty(key: PropertyKey, value: unknown, rawWindow: Window): void {\n if (\n WINDOW_WHITE_LIST.includes(key as string) &&\n !Reflect.has(rawWindow, key) &&\n !BK_WEWEB_INJECT_KEY_LIST.includes(key as string)\n ) {\n Reflect.set(rawWindow, key, value);\n this.inRawWindowKeySet.add(key);\n }\n }\n\n /**\n * 激活沙箱\n * @description 启动沙箱环境,初始化代理对象和事件处理\n * @param data - 传递给沙箱的数据(可选)\n */\n activated(data?: Record<string, unknown>): void {\n if (!this.active) {\n this.active = true;\n this.rawDocument = createProxyDocument(document, this.app);\n this.fakeWindow.__BK_WEWEB_DATA__ = data ?? {};\n\n const { resetDocumentAndBodyEvent } = rewriteDocumentAndBodyEvent();\n this.resetDocumentAndBodyEvent = resetDocumentAndBodyEvent;\n }\n }\n\n /**\n * 停用沙箱\n * @description 关闭沙箱环境,清理所有副作用和修改\n */\n deactivated(): void {\n if (!this.active) return;\n\n this.active = false;\n\n // 重置 window 函数\n this.resetWindowFunction();\n\n // 清理在原始 window 上新增的属性\n for (const key of this.inRawWindowKeySet) {\n Reflect.deleteProperty(window, key);\n }\n this.inRawWindowKeySet.clear();\n\n // 重置文档和 body 事件\n this.resetDocumentAndBodyEvent?.();\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n/* eslint-disable @typescript-eslint/member-ordering */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState, type ValueOfAppState } from '../common';\nimport { setCurrentRunningApp } from '../context/cache';\nimport SandBox from '../context/sandbox';\nimport { EntrySource } from '../entry/entry';\nimport { execAppScripts } from '../entry/script';\nimport {\n type BaseModel,\n type CallbackFunction,\n type ContainerType,\n CSS_ATTRIBUTE_KEY,\n type IAppModelProps,\n WewebMode,\n} from '../typings';\nimport { addUrlProtocol, random } from '../utils/common';\n\nimport type { SourceType } from '../utils/load-source';\n\nconst IFRAME_CONSTANTS = {\n BLANK_ORIGIN: 'about:blank',\n STYLE_HIDDEN: 'display: none;',\n CHROME_USER_AGENT: 'Chrome',\n DEFAULT_HTML: '<head></head><body></body>',\n POLLING_INTERVAL: 0,\n} as const;\n\nconst DEFAULT_RANDOM_LENGTH = 5;\n\n/** BK-WEWEB 微应用模式类 */\nexport class MicroAppModel implements BaseModel {\n private state: ValueOfAppState = AppState.UNSET;\n\n container?: ContainerType;\n public data: Record<string, unknown>;\n iframe: HTMLIFrameElement | null = null;\n initSource: SourceType;\n isModuleApp = false;\n isPreLoad = false;\n keepAlive: boolean;\n mode: WewebMode = WewebMode.APP;\n name: string;\n sandBox?: SandBox;\n scopeCss: boolean;\n scopeJs: boolean;\n scopeLocation: boolean;\n showSourceCode: boolean;\n source?: EntrySource;\n url: string;\n\n constructor(props: IAppModelProps) {\n this.name = props.id !== props.url ? props.id || random(DEFAULT_RANDOM_LENGTH) : random(DEFAULT_RANDOM_LENGTH);\n this.mode = props.mode ?? WewebMode.APP;\n this.container = props.container ?? undefined;\n this.showSourceCode = props.showSourceCode ?? false;\n this.url = props.url;\n this.data = props.data || {};\n this.scopeJs = props.scopeJs ?? true;\n this.scopeCss = props.scopeCss ?? true;\n this.scopeLocation = props.scopeLocation ?? false;\n this.isPreLoad = props.isPreLoad ?? false;\n this.keepAlive = props.keepAlive ?? false;\n this.initSource = props.initSource ?? [];\n\n this.initializeSandBox();\n this.setContainerAttribute();\n }\n\n /** 激活微应用 */\n activated<T = unknown>(container: ContainerType, callback?: CallbackFunction<T>): void {\n this.isPreLoad = false;\n this.state = AppState.ACTIVATED;\n\n if (container && this.container) {\n this.setContainerAttribute(container);\n this.transferNodes(container);\n this.container = container;\n this.initShadowRootContainer();\n this.sandBox?.activated(this.data);\n callback?.(this);\n }\n }\n\n /** 创建隔离iframe */\n createIframe(): Promise<HTMLIFrameElement> {\n return new Promise(resolve => {\n const iframe = this.createIframeElement();\n document.body.appendChild(iframe);\n\n if (this.isChromeUserAgent()) {\n setTimeout(() => resolve(iframe), IFRAME_CONSTANTS.POLLING_INTERVAL);\n } else {\n this.handleNonChromeIframe(iframe, resolve);\n }\n });\n }\n\n /** 停用微应用 */\n deactivated(): void {\n this.state = AppState.DEACTIVATED;\n this.sandBox?.deactivated();\n }\n\n /** 初始化ShadowRoot容器 */\n initShadowRootContainer(): void {\n if (this.container instanceof ShadowRoot) {\n // inject echarts in shadowRoot\n Object.defineProperties(this.container, {\n getBoundingClientRect: {\n get() {\n return this.host.getBoundingClientRect;\n },\n },\n });\n }\n }\n\n /** 挂载微应用 */\n mount<T = unknown>(container?: ContainerType, callback?: CallbackFunction<T>): void {\n this.isPreLoad = false;\n this.container = container ?? this.container;\n this.initShadowRootContainer();\n this.state = AppState.MOUNTING;\n\n if (this.container) {\n this.setContainerAttribute(this.container);\n this.renderAppContent();\n this.sandBox?.activated(this.data);\n\n execAppScripts(this).finally(() => {\n this.state = AppState.MOUNTED;\n callback?.(this);\n });\n }\n }\n\n /** 错误处理 */\n onError(): void {\n this.state = AppState.ERROR;\n }\n\n /** 挂载处理 */\n onMount(): void {\n if (this.isPreLoad) return;\n this.state = AppState.LOADED;\n this.mount();\n }\n\n /** 注册运行中的微应用 */\n registerRunningApp(): void {\n setCurrentRunningApp(this);\n Promise.resolve().then(() => setCurrentRunningApp(null));\n }\n\n /** 启动微应用 */\n async start(): Promise<void> {\n if (!this.source || this.needsReload()) {\n this.state = AppState.LOADING;\n\n if (this.scopeLocation || this.isModuleApp) {\n const iframe = await this.createIframe();\n this.iframe = iframe;\n }\n\n this.source = new EntrySource(this.url);\n await this.source.importEntry(this);\n }\n }\n\n /** 卸载微应用 */\n unmount(needDestroy = false): void {\n this.state = AppState.UNMOUNT;\n this.sandBox?.deactivated();\n\n if (needDestroy) {\n appCache.deleteApp(this.url);\n }\n\n if (this.container) {\n this.container.innerHTML = '';\n this.container = undefined;\n }\n }\n\n get appCacheKey(): string {\n return this.url;\n }\n\n get status(): ValueOfAppState {\n return this.state;\n }\n\n set status(value: ValueOfAppState) {\n this.state = value;\n }\n\n /** 初始化沙盒 */\n private initializeSandBox(): void {\n if (this.scopeJs) {\n this.sandBox = new SandBox(this);\n }\n }\n\n /** 设置容器属性 */\n private setContainerAttribute(container?: ContainerType): void {\n const targetContainer = container || this.container;\n if (targetContainer instanceof HTMLElement) {\n targetContainer.setAttribute(CSS_ATTRIBUTE_KEY, this.name);\n }\n }\n\n /** 转移节点到新容器 */\n private transferNodes(container: ContainerType): void {\n if (!this.container) return;\n\n const fragment = document.createDocumentFragment();\n const nodeList = Array.from(this.container.childNodes);\n\n for (const node of nodeList) {\n this.setupNodeProperties(node);\n fragment.appendChild(node);\n }\n\n container.innerHTML = '';\n container.appendChild(fragment);\n }\n\n /** 设置节点属性 */\n private setupNodeProperties(node: Node): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const app = this;\n const nodeWithProps = node as Node & {\n __KEEP_ALIVE__?: string;\n __BK_WEWEB_APP_KEY__?: string;\n data?: unknown;\n };\n\n nodeWithProps.__BK_WEWEB_APP_KEY__ = this.appCacheKey;\n\n // 设置 ownerDocument 属性,这是关键的沙盒功能\n Object.defineProperties(node, {\n ownerDocument: {\n get() {\n return app.sandBox?.rawDocument;\n },\n },\n });\n }\n\n /** 创建iframe元素 */\n private createIframeElement(): HTMLIFrameElement {\n const iframe = document.createElement('iframe');\n const url = new URL(addUrlProtocol(this.url));\n\n iframe.src = this.buildIframeSrc(url);\n iframe.style.cssText = IFRAME_CONSTANTS.STYLE_HIDDEN;\n\n return iframe;\n }\n\n /** 构建iframe源地址 */\n private buildIframeSrc(url: URL): string {\n const isChrome = this.isChromeUserAgent();\n return `${isChrome ? IFRAME_CONSTANTS.BLANK_ORIGIN : location.origin}${url.pathname || '/'}${url.search}${url.hash}`;\n }\n\n /** 检查是否为Chrome浏览器 */\n private isChromeUserAgent(): boolean {\n return navigator.userAgent.includes(IFRAME_CONSTANTS.CHROME_USER_AGENT);\n }\n\n /** 处理非Chrome浏览器iframe */\n private handleNonChromeIframe(iframe: HTMLIFrameElement, resolve: (iframe: HTMLIFrameElement) => void): void {\n // 其他浏览器在about:blank下会出现同源检测安全错误 换另一种方式来做location保持\n const interval = setInterval(() => {\n if (iframe.contentWindow && iframe.contentWindow.location.href !== IFRAME_CONSTANTS.BLANK_ORIGIN) {\n iframe.contentWindow.stop();\n iframe.contentDocument!.body.parentElement!.innerHTML = IFRAME_CONSTANTS.DEFAULT_HTML;\n clearInterval(interval);\n resolve(iframe);\n }\n }, IFRAME_CONSTANTS.POLLING_INTERVAL);\n }\n\n /** 渲染应用内容 */\n private renderAppContent(): void {\n if (!this.source) return;\n\n const clonedNode = this.source.html!.cloneNode(true);\n const fragment = document.createDocumentFragment();\n\n for (const node of Array.from(clonedNode.childNodes)) {\n this.setupNodeProperties(node);\n fragment.appendChild(node);\n }\n\n this.container!.innerHTML = '';\n this.container!.appendChild(fragment);\n }\n\n /** 检查是否需要重新加载 */\n private needsReload(): boolean {\n return this.status === AppState.ERROR || this.status === AppState.UNSET;\n }\n}\n\nexport const createApp = (props: IAppModelProps): void => {\n appCache.deleteApp(props.url);\n const instance = new MicroAppModel(props);\n appCache.setApp(instance);\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { appCache } from '../cache/app-cache';\nimport { Script } from '../entry/script';\nimport { Style } from '../entry/style';\n\nexport type SourceFuncType = () => Promise<string[]>;\nexport type SourceType = SourceFuncType | string[];\n\ninterface CollectResult {\n collectScript?: Map<string, Script>;\n collectStyle?: Map<string, Style>;\n}\n\nconst JS_FILE_REGEX = /\\.js$/;\nconst CSS_FILE_REGEX = /\\.css$/;\n\n/**\n * 创建脚本实例\n * @param url 脚本URL\n * @returns Script实例\n */\nconst createScriptInstance = (url: string): Script => {\n const cachedScript = appCache.getCacheScript(url);\n return new Script({\n async: false,\n code: cachedScript?.code || '',\n defer: false,\n fromHtml: false,\n initial: true,\n isModule: false,\n url,\n });\n};\n\n/**\n * 创建样式实例\n * @param url 样式URL\n * @returns Style实例\n */\nconst createStyleInstance = (url: string): Style => {\n const cachedStyle = appCache.getCacheStyle(url);\n return new Style({\n code: cachedStyle?.code || '',\n fromHtml: true,\n initial: true,\n prefetch: false,\n preload: false,\n url,\n });\n};\n\n/**\n * 处理单个资源URL\n * @param url 资源URL字符串\n * @param collectScript 脚本收集Map\n * @param collectStyle 样式收集Map\n */\nconst processResourceUrl = (\n url: string,\n collectScript: Map<string, Script>,\n collectStyle: Map<string, Style>,\n): void => {\n try {\n const urlObj = new URL(url);\n const { pathname } = urlObj;\n\n if (JS_FILE_REGEX.test(pathname)) {\n collectScript.set(url, createScriptInstance(url));\n } else if (CSS_FILE_REGEX.test(pathname)) {\n collectStyle.set(url, createStyleInstance(url));\n }\n } catch {\n console.error(`【bk-weweb】: ${url} is invalid URL`);\n }\n};\n\n/**\n * 收集和解析资源\n * @param sourceList 资源列表,可以是数组或返回数组的函数\n * @returns 包含收集到的脚本和样式的对象\n */\nexport const collectSource = async (sourceList: SourceType): Promise<CollectResult> => {\n const source: string[] = typeof sourceList === 'function' ? await sourceList() : sourceList || [];\n if (!source.length) return {};\n const collectScript = new Map<string, Script>();\n const collectStyle = new Map<string, Style>();\n\n // 处理每个资源URL\n for (const url of source) {\n processResourceUrl(url, collectScript, collectStyle);\n }\n return { collectScript, collectStyle };\n};\n\n/**\n * 加载全局静态资源\n * @param sourceList 资源列表,可以是数组或返回数组的函数\n * @throws 如果资源加载失败则抛出错误\n */\nexport const loadGlobalSource = async (sourceList: SourceType): Promise<void> => {\n const { collectScript, collectStyle } = await collectSource(sourceList);\n const loadPromises: Promise<string>[] = [];\n\n // 处理脚本资源\n if (collectScript) {\n for (const [url, script] of collectScript.entries()) {\n loadPromises.push(script.getCode());\n appCache.setBaseAppScript(url, script);\n }\n }\n\n // 处理样式资源\n if (collectStyle) {\n for (const [url, style] of collectStyle.entries()) {\n loadPromises.push(style.getCode());\n appCache.setBaseAppStyle(url, style);\n }\n }\n\n // 等待所有资源加载完成\n await Promise.all(loadPromises);\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { appCache } from '../cache/app-cache';\nimport { MicroAppModel } from '../mode/app';\nimport { MicroInstanceModel } from '../mode/instance';\nimport { addUrlProtocol, fillUpPath, randomUrl } from '../utils/common';\nimport { fetchSource } from '../utils/fetch';\nimport { collectSource } from '../utils/load-source';\nimport { Script } from './script';\nimport { Style, executeAppStyles } from './style';\n\nimport type { BaseModel, IScriptOption } from '../typings';\n\nconst SCRIPT_TYPE_NAMES = [\n 'text/javascript',\n 'text/ecmascript',\n 'application/javascript',\n 'application/ecmascript',\n 'module',\n] as const;\n\nconst ICON_REL_TYPES = ['apple-touch-icon', 'icon', 'prefetch', 'preload', 'prerender'] as const;\n\ntype IconRelType = (typeof ICON_REL_TYPES)[number];\ntype ScriptTypeName = (typeof SCRIPT_TYPE_NAMES)[number];\n\nconst HTML_FILTER_REGEX = {\n HEAD: /<\\/?head>/gim,\n BODY: /<\\/?body>/i,\n TS_EXTENSION: /\\.ts$/,\n} as const;\n\n// 收集结果\ninterface CollectResult {\n replace: Comment | Element; // 替换元素\n style?: Style; // 样式\n script?: Script; // 脚本\n}\n\nexport class EntrySource {\n html: HTMLElement | null = null;\n rawHtml?: string;\n scripts: Map<string, Script>;\n styles: Map<string, Style>;\n\n constructor(public url: string) {\n this.scripts = new Map();\n this.styles = new Map();\n }\n\n /** 收集链接元素 */\n collectLink = (\n link: HTMLLinkElement,\n parent: Node,\n needReplaceElement = false,\n ): { replace: Comment | Element; style?: Style } => {\n if (link.hasAttribute('exclude')) {\n return {\n replace: document.createComment('【bk-weweb】style with exclude attribute is ignored'),\n };\n }\n\n if (link.hasAttribute('ignore')) {\n return { replace: link };\n }\n\n const rel = link.getAttribute('rel');\n const href = link.getAttribute('href');\n\n if (rel === 'stylesheet' && href) {\n return this.handleStylesheetLink(link, parent, href, needReplaceElement);\n }\n\n if (rel && ICON_REL_TYPES.includes(rel as IconRelType)) {\n return this.handleIconLink(link, parent, rel, href, needReplaceElement);\n }\n\n if (href) {\n link.setAttribute('href', fillUpPath(href, this.url));\n }\n\n return { replace: link };\n };\n\n /** 收集脚本元素 */\n collectScript = (script: HTMLScriptElement, parent: Node, needReplaceElement = false): CollectResult | undefined => {\n if (this.shouldIgnoreScript(script)) {\n return;\n }\n\n if (script.hasAttribute('exclude')) {\n return this.handleExcludedScript(script, parent, needReplaceElement);\n }\n\n const src = script.getAttribute('src');\n if (src) {\n return this.handleExternalScript(script, parent, src, needReplaceElement);\n }\n\n if (script.textContent) {\n return this.handleInlineScript(script, parent, needReplaceElement);\n }\n\n return { replace: script };\n };\n\n /** 收集样式和脚本 */\n collectScriptAndStyle = (parent: HTMLElement): void => {\n this.processLinks(parent);\n this.processStyles(parent);\n this.processScripts(parent);\n this.processMetas(parent);\n this.processImages(parent);\n };\n\n getScript = (url: string): Script | undefined => this.scripts.get(url);\n\n getStyle = (urlOrCode: string): Style | undefined => {\n return this.styles.get(urlOrCode) || Array.from(this.styles.values()).find(style => style.code === urlOrCode);\n };\n\n /** html entry */\n async importEntry(app: BaseModel): Promise<void> {\n await this.loadInitialSources(app);\n\n if (app instanceof MicroAppModel) {\n await this.importHtmlEntry(app);\n } else if (app instanceof MicroInstanceModel) {\n await this.importInstanceEntry(app);\n }\n }\n\n /** 微应用入口 */\n async importHtmlEntry(app: MicroAppModel): Promise<void> {\n const htmlStr = await this.fetchHtmlContent(app);\n if (!htmlStr) {\n console.error('load app entry error, place check');\n return Promise.reject();\n }\n\n this.rawHtml = htmlStr;\n const wrapElement = this.createWrapElement(htmlStr);\n\n this.collectScriptAndStyle(wrapElement);\n await executeAppStyles(app, wrapElement);\n\n this.html = wrapElement;\n }\n\n /** 微模块入口 */\n async importInstanceEntry(app: BaseModel): Promise<void> {\n const jsStr = await this.fetchJsContent(app);\n if (!jsStr) {\n console.error('load app entry error, place check');\n return Promise.reject();\n }\n\n this.scripts.set(\n this.url,\n new Script({\n async: false,\n code: jsStr,\n defer: false,\n fromHtml: true,\n isModule: HTML_FILTER_REGEX.TS_EXTENSION.test(this.url),\n url: this.url,\n }),\n );\n }\n\n setScript = (url: string, script: IScriptOption | Script): void => {\n this.scripts.set(url, script instanceof Script ? script : new Script(script));\n };\n\n setStyle = (url: string, style: Style): void => {\n this.styles.set(url, style);\n };\n\n /** 处理样式表链接 */\n private handleStylesheetLink = (link: HTMLLinkElement, parent: Node, href: string, needReplaceElement: boolean) => {\n const fullHref = fillUpPath(href, this.url);\n const replaceElement = document.createComment(`【bk-weweb】style with href=${fullHref}`);\n\n let styleInstance = this.getStyle(fullHref);\n if (!styleInstance) {\n styleInstance = new Style({\n code: '',\n fromHtml: !needReplaceElement,\n prefetch: !!link.getAttribute('prefetch'),\n preload: !!link.getAttribute('preload'),\n url: fullHref,\n });\n this.styles.set(fullHref, styleInstance);\n }\n\n if (!needReplaceElement) {\n parent.replaceChild(replaceElement, link);\n }\n\n return { replace: replaceElement, style: styleInstance };\n };\n\n /**\n * 处理图标链接\n */\n private handleIconLink = (\n link: HTMLLinkElement,\n parent: Node,\n rel: string,\n href: null | string,\n needReplaceElement: boolean,\n ) => {\n const replaceElement = document.createComment(`【bk-weweb】style with rel=${rel}${href ? ` & href=${href}` : ''}`);\n\n if (!needReplaceElement) {\n parent.removeChild(link);\n }\n\n return { replace: replaceElement };\n };\n\n /**\n * 检查是否应该忽略脚本\n */\n private shouldIgnoreScript = (script: HTMLScriptElement): boolean => {\n return (\n script.hasAttribute('ignore') ||\n // (script.type !== 'module' && isJsonpUrl(script.getAttribute('src'))) ||\n (script.hasAttribute('type') && !SCRIPT_TYPE_NAMES.includes(script.type as ScriptTypeName))\n );\n };\n\n /**\n * 处理被排除的脚本\n */\n private handleExcludedScript = (\n script: HTMLScriptElement,\n parent: Node,\n needReplaceElement: boolean,\n ): CollectResult => {\n const replaceElement = document.createComment('【bk-weweb】script element with exclude attribute is removed');\n\n if (!needReplaceElement) {\n parent.replaceChild(replaceElement, script);\n }\n\n return { replace: replaceElement };\n };\n\n /**\n * 处理外部脚本\n */\n private handleExternalScript = (\n script: HTMLScriptElement,\n parent: Node,\n src: string,\n needReplaceElement: boolean,\n ): CollectResult => {\n const fullSrc = fillUpPath(src, this.url);\n\n let scriptInstance = this.getScript(fullSrc);\n if (!scriptInstance) {\n scriptInstance = new Script({\n async: script.hasAttribute('async'),\n code: '',\n defer: script.defer || script.type === 'module',\n fromHtml: !needReplaceElement,\n isModule: script.type === 'module',\n url: fullSrc,\n });\n this.scripts.set(fullSrc, scriptInstance);\n }\n\n const replaceElement = document.createComment(`【bk-weweb】script with src='${fullSrc}'`);\n\n if (!needReplaceElement) {\n parent.replaceChild(replaceElement, script);\n }\n\n return { replace: replaceElement, script: scriptInstance };\n };\n\n /**\n * 处理内联脚本\n */\n private handleInlineScript = (\n script: HTMLScriptElement,\n parent: Node,\n needReplaceElement: boolean,\n ): CollectResult => {\n const nonceStr = randomUrl();\n const scriptInstance = new Script({\n async: false,\n code: script.textContent || '',\n defer: script.type === 'module',\n fromHtml: !needReplaceElement,\n initial: false,\n isModule: script.type === 'module',\n url: nonceStr,\n });\n\n this.scripts.set(nonceStr, scriptInstance);\n const replaceElement = document.createComment('【bk-weweb】script with text content');\n\n if (!needReplaceElement) {\n parent.replaceChild(replaceElement, script);\n }\n\n return { replace: replaceElement, script: scriptInstance };\n };\n\n /**\n * 处理链接元素\n */\n private processLinks = (parent: HTMLElement): void => {\n const links = Array.from(parent.querySelectorAll('link'));\n for (const link of links) {\n link.parentElement && this.collectLink(link, link.parentElement);\n }\n };\n\n /**\n * 处理样式元素\n */\n private processStyles = (parent: HTMLElement): void => {\n const styles = Array.from(parent.querySelectorAll('style'));\n for (const style of styles) {\n if (!style.hasAttribute('exclude') && !style.hasAttribute('ignore')) {\n this.styles.set(\n randomUrl(),\n new Style({\n code: style.textContent || '',\n fromHtml: true,\n url: '',\n }),\n );\n style.remove();\n }\n }\n };\n\n /**\n * 处理脚本元素\n */\n private processScripts = (parent: HTMLElement): void => {\n const scripts = Array.from(parent.querySelectorAll('script'));\n for (const script of scripts) {\n script.parentElement && this.collectScript(script, script.parentElement);\n }\n };\n\n /**\n * 处理Meta元素\n */\n private processMetas = (parent: HTMLElement): void => {\n const metas = Array.from(parent.querySelectorAll('meta'));\n for (const meta of metas) {\n meta.parentElement?.removeChild(meta);\n }\n };\n\n /**\n * 处理图片元素\n */\n private processImages = (parent: HTMLElement): void => {\n const imgs = Array.from(parent.querySelectorAll('img'));\n for (const img of imgs) {\n if (img.hasAttribute('src')) {\n img.setAttribute('src', fillUpPath(img.getAttribute('src') || '', this.url));\n }\n }\n };\n\n /**\n * 加载初始资源\n */\n private async loadInitialSources(app: BaseModel): Promise<void> {\n if (!app.initSource?.length) return;\n\n const { collectScript, collectStyle } = await collectSource(app.initSource);\n\n if (collectScript) {\n this.scripts = collectScript;\n }\n if (collectStyle) {\n this.styles = collectStyle;\n }\n }\n\n /**\n * 获取HTML content\n */\n private async fetchHtmlContent(app: MicroAppModel): Promise<string> {\n let htmlStr = appCache.getCacheHtml(this.url);\n\n if (!htmlStr) {\n htmlStr = await fetchSource(addUrlProtocol(this.url), { cache: 'no-cache' }, app);\n }\n\n return htmlStr;\n }\n\n /**\n * 创建顶层 root 元素\n */\n private createWrapElement(htmlStr: string): HTMLDivElement {\n const wrapElement = document.createElement('div');\n\n if (wrapElement.__BK_WEWEB_APP_KEY__) {\n wrapElement.__BK_WEWEB_APP_KEY__ = undefined;\n }\n\n wrapElement.innerHTML = htmlStr.replace(HTML_FILTER_REGEX.HEAD, '').replace(HTML_FILTER_REGEX.BODY, '');\n\n return wrapElement;\n }\n\n /**\n * 获取JS content\n */\n private async fetchJsContent(app: BaseModel): Promise<string> {\n let jsStr = appCache.getCacheScript(this.url)?.code;\n\n if (!jsStr) {\n jsStr = await fetchSource(this.url, { cache: 'no-cache' }, app);\n }\n\n return jsStr;\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 应用缓存管理模块\n * @description 提供微应用实例、资源缓存和全局状态管理功能\n */\n\nimport { AppState } from '../common';\nimport { EntrySource } from '../entry/entry';\n\nimport type { Script } from '../entry/script';\nimport type { Style } from '../entry/style';\nimport type { BaseModel } from '../typings';\n\n/**\n * 应用缓存管理器\n * @description 负责管理所有微应用实例的缓存、资源共享和状态跟踪\n */\nexport class AppCache {\n /** 基础资源源,用于主应用共享资源包 */\n private readonly baseSource: EntrySource;\n\n /** 应用实例缓存映射表 */\n private readonly cache: Map<string, BaseModel>;\n\n /**\n * 构造函数\n * @description 初始化应用缓存管理器\n */\n constructor() {\n this.cache = new Map();\n this.baseSource = new EntrySource(location.href);\n }\n\n /**\n * 设置应用实例到缓存\n * @description 将应用实例添加到缓存中,使用应用的缓存键作为标识\n * @param app - 要缓存的应用实例\n */\n setApp(app: BaseModel): void {\n this.cache.set(app.appCacheKey, app);\n }\n\n /**\n * 获取缓存的应用实例\n * @description 根据名称或ID获取已缓存的应用实例\n * @param name - 应用名称或ID,为空时返回 undefined\n * @returns BaseModel | undefined - 应用实例或 undefined\n */\n getApp(name?: null | string): BaseModel | undefined {\n if (!name) return undefined;\n\n // 首先尝试直接从缓存键获取\n const app = this.cache.get(name);\n if (app) return app;\n\n // 如果未找到,则通过应用名称查找\n return Array.from(this.cache.values()).find((item: BaseModel) => item.name === name);\n }\n\n /**\n * 删除缓存的应用实例\n * @description 从缓存中移除指定URL的应用实例\n * @param url - 要删除的应用URL标识\n */\n deleteApp(url: string): void {\n this.cache.delete(url);\n }\n\n /**\n * 获取缓存的HTML内容\n * @description 根据URL获取已缓存的HTML内容\n * @param url - 应用的URL\n * @returns string - HTML内容,未找到时返回空字符串\n */\n getCacheHtml(url: string): string {\n const list = Array.from(this.cache.values());\n const app = list.find(item => item.url === url);\n\n if (app) return app.source?.rawHtml || '';\n return '';\n }\n\n /**\n * 设置基础应用脚本\n * @description 将脚本添加到基础资源源中,供多个应用共享\n * @param url - 脚本的URL\n * @param script - 脚本实例\n */\n setBaseAppScript(url: string, script: Script): void {\n this.baseSource.setScript(url, script);\n }\n\n /**\n * 获取缓存的脚本资源\n * @description 从基础资源源或应用缓存中获取脚本资源\n * @param url - 脚本的URL\n * @returns Script | undefined - 脚本实例或 undefined\n */\n getCacheScript(url: string): Script | undefined {\n // 首先从基础资源源中查找\n let script: Script | undefined = this.baseSource.getScript(url);\n if (script) return script;\n\n // 从应用缓存中查找\n const list = Array.from(this.cache.values());\n list.some(app => {\n script = app.source?.getScript(url);\n return !!script;\n });\n\n return script;\n }\n\n /**\n * 设置基础应用样式\n * @description 将样式添加到基础资源源中,供多个应用共享\n * @param url - 样式的URL\n * @param style - 样式实例\n */\n setBaseAppStyle(url: string, style: Style): void {\n this.baseSource.setStyle(url, style);\n }\n\n /**\n * 获取基础应用样式\n * @description 从基础资源源中获取样式资源\n * @param urlOrCode - 样式的URL或代码\n * @returns Style | undefined - 样式实例或 undefined\n */\n getBaseAppStyle(urlOrCode: string): Style | undefined {\n return this.baseSource.getStyle(urlOrCode);\n }\n\n /**\n * 获取缓存的样式资源\n * @description 从基础资源源或应用缓存中获取样式资源\n * @param url - 样式的URL\n * @returns Style | undefined - 样式实例或 undefined\n */\n getCacheStyle(url: string): Style | undefined {\n // 首先从基础资源源中查找\n let style: Style | undefined = this.baseSource.getStyle(url);\n if (style) return style;\n\n // 从应用缓存中查找\n const list = Array.from(this.cache.values());\n list.some(app => {\n style = app.source?.getStyle(url);\n return !!style;\n });\n\n return style;\n }\n\n /**\n * 检查是否存在活跃的应用\n * @description 判断当前是否有处于非卸载状态的应用实例\n * @returns boolean - 存在活跃应用时返回 true\n */\n get hasActiveApp(): boolean {\n return Array.from(this.cache.values()).some((app: BaseModel) => app.status !== AppState.UNMOUNT);\n }\n}\n\n/**\n * 全局应用缓存实例\n */\nconst appCache = new AppCache();\n\n/**\n * 注册全局应用获取方法\n * @description 在 window 对象上注册获取缓存应用或实例的方法\n */\nwindow.__getAppOrInstance__ = (id?: string) => {\n if (!id) return appCache;\n return appCache.getApp(id);\n};\n\nexport { appCache };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * @description 处理主应用中 DOM 元素的动态添加,特别是样式和脚本资源的拦截和转换\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { Script } from '../entry/script';\nimport { Style } from '../entry/style';\nimport { setMarkElement } from '../utils';\nimport { fillUpPath } from '../utils/common';\nimport { dispatchLinkOrScriptError, dispatchLinkOrScriptLoad } from '../utils/custom';\nimport { fetchSource } from '../utils/fetch';\n\ntype DOMMethodSignature = (...args: any[]) => any;\n\n/**\n * 获取样式静态资源并创建替换元素\n * @description 将 link 标签转换为 style 标签,异步加载样式静态资源\n * @param url - 样式资源的 URL 地址\n * @param style - 样式实例对象\n * @param originLink - 原始的 link 标签元素\n * @returns HTMLStyleElement - 返回用于替换的 style 标签\n */\nfunction getStyleSource(url: string, style: Style, originLink: HTMLLinkElement): HTMLStyleElement {\n const replaceStyle = document.createElement('style');\n setMarkElement(replaceStyle);\n\n fetchSource(url)\n .then((data: string) => {\n style.code = data;\n appCache.setBaseAppStyle(url, style);\n replaceStyle.textContent = data;\n dispatchLinkOrScriptLoad(originLink);\n })\n .catch(error => {\n console.error('Failed to load style resource:', error);\n dispatchLinkOrScriptError(originLink);\n });\n\n return replaceStyle;\n}\n\n/**\n * 获取脚本资源并创建替换元素\n * @description 异步加载脚本内容并创建新的 script 标签\n * @param url - 脚本资源的 URL 地址\n * @param script - 脚本实例对象\n * @param originScript - 原始的 script 标签元素\n * @returns Comment | HTMLScriptElement - 返回用于替换的 script 标签或注释节点\n */\nfunction getScriptSource(url: string, script: Script, originScript: HTMLScriptElement): Comment | HTMLScriptElement {\n const replaceScript: HTMLScriptElement = document.createElement('script');\n setMarkElement(replaceScript);\n\n fetchSource(url)\n .then((code: string) => {\n script.setCode(code);\n\n try {\n replaceScript.textContent = code;\n\n // 为非内联脚本设置原始 src 属性\n if (!url.startsWith('inline-')) {\n originScript.setAttribute('origin-src', url);\n }\n } catch (error) {\n console.error('Failed to set script content:', error, url);\n }\n\n dispatchLinkOrScriptLoad(originScript);\n })\n .catch(error => {\n console.error('Failed to load script resource:', error);\n dispatchLinkOrScriptError(originScript);\n });\n\n return replaceScript;\n}\n\n/**\n * 处理 link 标签转换\n * @description 将 link 标签转换为 style 标签并处理样式加载\n * @param linkElement - link 标签元素\n * @returns Node - 转换后的节点或原节点\n */\nfunction processLinkElement(linkElement: HTMLLinkElement): Node {\n const rel = linkElement.getAttribute('rel');\n let href = linkElement.getAttribute('href');\n\n if (rel === 'stylesheet' && href) {\n href = fillUpPath(href, location.origin);\n\n const replaceStyle = document.createElement('style');\n const styleInstance = new Style({\n code: '',\n fromHtml: false,\n url: href,\n });\n\n getStyleSource(href, styleInstance, linkElement);\n return replaceStyle;\n }\n\n return linkElement;\n}\n\n/**\n * 处理 script 标签转换\n * @description 处理脚本标签的加载和转换逻辑\n * @param scriptElement - script 标签元素\n * @returns Node - 转换后的节点或原节点\n */\nfunction processScriptElement(scriptElement: HTMLScriptElement): Node {\n let src = scriptElement.getAttribute('src');\n\n if (src && scriptElement.type !== 'module') {\n src = fillUpPath(src, location.origin);\n\n const script = new Script({\n async: scriptElement.hasAttribute('async'),\n code: '',\n defer: scriptElement.defer || scriptElement.type === 'module',\n fromHtml: false,\n isModule: false,\n });\n\n appCache.setBaseAppScript(src, script);\n const replaceElement = getScriptSource(src, script, scriptElement);\n return replaceElement || scriptElement;\n }\n\n return scriptElement;\n}\n\n/**\n * 创建新的替换节点\n * @description 根据节点类型创建相应的替换节点,主要处理 link 和 script 标签\n * @param child - 要处理的子节点\n * @returns Node - 返回替换后的节点或原节点\n */\nfunction createNewNode(child: Node): Node {\n if (child instanceof HTMLLinkElement) {\n return processLinkElement(child);\n }\n\n if (child instanceof HTMLScriptElement) {\n return processScriptElement(child);\n }\n\n return child;\n}\n\n/**\n * 检查节点是否为 link 或 script 标签\n * @description 判断给定节点是否需要特殊处理\n * @param node - 要检查的节点\n * @returns boolean - 如果是 link 或 script 标签则返回 true\n */\nfunction isLinkOrScript(node: Node): boolean {\n return node instanceof HTMLLinkElement || node instanceof HTMLScriptElement;\n}\n\n/**\n * 处理 insertBefore 操作的基础元素插入\n * @description 拦截并处理 DOM 的 insertBefore 操作,对 link 和 script 标签进行特殊处理\n * @param parent - 父节点\n * @param newChild - 要插入的新节点\n * @param referenceChild - 参考节点(插入位置的下一个兄弟节点)\n * @param rawMethod - 原始的 DOM 操作方法\n * @returns Node - 返回原始方法的执行结果\n */\nexport function baseElementInertHandle<T extends Node>(\n parent: Node,\n newChild: Node,\n referenceChild: Node | null,\n rawMethod: DOMMethodSignature,\n): T {\n if (isLinkOrScript(newChild)) {\n const targetChild = createNewNode(newChild);\n return rawMethod.call(parent, targetChild, referenceChild);\n }\n\n return rawMethod.call(parent, newChild, referenceChild);\n}\n\n/**\n * 处理 appendChild 操作的基础元素添加\n * @description 拦截并处理 DOM 的 appendChild 操作,对 link 和 script 标签进行特殊处理\n * @param parent - 父节点\n * @param newChild - 要添加的新节点\n * @param rawMethod - 原始的 DOM 操作方法\n * @returns Node - 返回原始方法的执行结果\n */\nexport function baseElementAppendHandle<T extends Node>(parent: T, newChild: T, rawMethod: DOMMethodSignature): T {\n if (isLinkOrScript(newChild)) {\n const targetChild = createNewNode(newChild);\n return rawMethod.call(parent, targetChild);\n }\n\n return rawMethod.call(parent, newChild);\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 主应用资源收集模块\n * @description 收集和管理主应用的样式资源,为微应用提供基础资源共享能力\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { Style } from '../entry/style';\nimport { randomUrl } from '../utils/common';\nimport { baseElementAppendHandle, baseElementInertHandle } from './element';\n\n/**\n * 缓存原始 DOM 操作方法\n * @description 获取并缓存原始的 DOM 操作方法\n * @returns OriginalDOMMethodsCache - 原始方法缓存对象\n */\nfunction cacheOriginalDOMMethods() {\n return {\n rawBodyAppendChild: HTMLBodyElement.prototype.appendChild,\n rawHeadAppendChild: HTMLHeadElement.prototype.appendChild,\n rawHeadInsertBefore: HTMLHeadElement.prototype.insertBefore,\n };\n}\nexport type OriginalDOMMethodsCache = ReturnType<typeof cacheOriginalDOMMethods>;\n/**\n * 重写 DOM 操作方法\n * @description 重写 body 和 head 的 DOM 操作方法\n * @param originalMethods - 原始方法缓存对象\n */\nfunction overrideDOMMethods(originalMethods: OriginalDOMMethodsCache): void {\n const { rawBodyAppendChild, rawHeadAppendChild, rawHeadInsertBefore } = originalMethods;\n\n // 重写 HTMLBodyElement 的 appendChild 方法\n HTMLBodyElement.prototype.appendChild = function <T extends Node>(newChild: T): T {\n return baseElementAppendHandle<Node>(this, newChild, rawBodyAppendChild) as unknown as T;\n };\n\n // 重写 HTMLHeadElement 的 appendChild 方法\n HTMLHeadElement.prototype.appendChild = function <T extends Node>(newChild: T): T {\n return baseElementAppendHandle<Node>(this, newChild, rawHeadAppendChild) as unknown as T;\n };\n\n // 重写 HTMLHeadElement 的 insertBefore 方法\n HTMLHeadElement.prototype.insertBefore = function <T extends Node>(newChild: T, refChild: Node | null): T {\n return baseElementInertHandle<Node>(this, newChild, refChild, rawHeadInsertBefore) as unknown as T;\n };\n}\n\n/**\n * @description 收集主应用的样式资源\n */\nfunction collectExistingStyles(): void {\n const styleNodes = document.head.querySelectorAll('style');\n\n for (const styleNode of Array.from(styleNodes)) {\n const textContent = styleNode.textContent;\n\n if (textContent) {\n try {\n const style = new Style({\n code: textContent,\n fromHtml: false,\n url: '',\n });\n\n appCache.setBaseAppStyle(randomUrl(), style);\n } catch (error) {\n console.warn('Failed to collect style element:', error);\n }\n }\n }\n}\n\n/**\n * @description 在页面加载完成后开始收集主应用的资源\n */\nfunction setupLoadEventListener(): void {\n window.addEventListener('load', collectExistingStyles);\n}\n\n/**\n * 收集主应用的静态资源\n * @description 主要入口函数,用于初始化主应用静态资源收集机制\n *\n * 功能包括:\n * 1. 重写 DOM 操作方法以拦截新增的样式和脚本元素\n * 2. 收集页面加载时已存在的样式元素\n * 3. 将收集到的资源存储到基础应用缓存中\n *\n *\n * @example\n * ```typescript\n * // 在主应用初始化时调用\n * collectBaseSource();\n * ```\n */\nexport function collectBaseSource(): void {\n // 缓存原始 DOM 操作方法\n const originalMethods = cacheOriginalDOMMethods();\n\n // 重写 DOM 操作方法以拦截资源添加\n overrideDOMMethods(originalMethods);\n\n // 设置页面加载完成后的资源收集\n setupLoadEventListener();\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * DOM 元素方法重写模块\n * @description 重写 Body 和 Header 的 DOM 操作方法,实现微前端应用的 DOM 隔离和资源路径处理\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { fillUpPath } from '../utils/common';\nimport { elementInsertHandler, elementAppendHandler, isSpecialElement, type DOMMethod } from '../utils/element';\nimport { getCurrentRunningApp, setCurrentRunningApp } from './cache';\n\n/**\n * 支持的资源属性名称\n * @description 需要进行路径补全处理的属性\n */\nconst RESOURCE_ATTRIBUTES = ['src', 'srcset'];\n\n/**\n * 支持的链接属性名称\n * @description 链接元素需要进行路径补全处理的属性\n */\nconst LINK_ATTRIBUTES = ['href'];\n\n/**\n * 支持资源属性的标签名称\n * @description 这些标签的资源属性需要进行路径补全\n */\nconst RESOURCE_TAG_NAMES = ['IMG', 'SCRIPT'];\n\n/**\n * 支持链接属性的标签名称\n * @description 这些标签的链接属性需要进行路径补全\n */\nconst LINK_TAG_NAMES = ['LINK'];\n\n// 保存原始的 DOM 方法\nconst { setAttribute } = Element.prototype;\n\nconst {\n append,\n appendChild: bodyAppendChild,\n insertBefore: bodyInsertBefore,\n removeChild: bodyRemoveChild,\n} = HTMLBodyElement.prototype;\n\nconst {\n appendChild: headAppendChild,\n insertBefore: headInsertBefore,\n removeChild: headRemoveChild,\n} = HTMLHeadElement.prototype;\n\nconst rawHead = document.head;\nlet hasRewrite = false;\n\n/**\n * 检查是否需要处理资源路径\n * @description 判断元素属性是否需要进行路径补全处理\n * @param key - 属性名称\n * @param tagName - 元素标签名称\n * @returns boolean - 是否需要处理\n */\nfunction shouldProcessResourcePath(key: string, tagName: string): boolean {\n const upperTagName = tagName.toUpperCase();\n\n return (\n (RESOURCE_ATTRIBUTES.includes(key) && RESOURCE_TAG_NAMES.includes(upperTagName)) ||\n (LINK_ATTRIBUTES.includes(key) && LINK_TAG_NAMES.includes(upperTagName))\n );\n}\n\n/**\n * 获取元素的应用信息\n * @description 根据元素的应用标识获取对应的应用实例\n * @param element - 元素对象\n * @returns 应用实例或 null\n */\nfunction getElementApp(element: Element) {\n if (!element.__BK_WEWEB_APP_KEY__) {\n return null;\n }\n\n return appCache.getApp(element.__BK_WEWEB_APP_KEY__) || getCurrentRunningApp();\n}\n\n/**\n * 创建重写的 setAttribute 方法\n * @description 重写 setAttribute 方法,处理资源路径补全\n * @returns 重写后的 setAttribute 方法\n */\nfunction createOverriddenSetAttribute() {\n return function (this: Element, key: string, value: string): void {\n const tagName = this.tagName.toUpperCase();\n\n // 处理需要路径补全的资源属性\n if (shouldProcessResourcePath(key, tagName) && this.__BK_WEWEB_APP_KEY__) {\n const app = getElementApp(this);\n\n if (app) {\n // 补全相对路径\n setAttribute.call(this, key, fillUpPath(value, app.url));\n return;\n }\n }\n\n // 默认调用原始方法\n setAttribute.call(this, key, value);\n };\n}\n\n/**\n * 处理 keepAlive 模式的特殊元素\n * @description 将 keepAlive 模式的特殊元素添加到 head 中\n * @param newChild - 要添加的子元素\n * @returns 添加的元素或 null\n */\nfunction handleKeepAliveElement<T extends Node>(newChild: T): T | null {\n if (newChild.__KEEP_ALIVE__ && isSpecialElement(newChild)) {\n return headAppendChild.call(rawHead, newChild) as T;\n }\n\n return null;\n}\n\n/**\n * 创建重写的 appendChild 方法\n * @description 重写 appendChild 方法,支持 DOM 隔离和 keepAlive 处理\n * @returns 重写后的 appendChild 方法\n */\nfunction createOverriddenAppendChild() {\n return function <T extends Node>(this: HTMLElement, newChild: T): T {\n // keepAlive 模式的特殊元素放到 head 中\n const keepAliveResult = handleKeepAliveElement(newChild);\n if (keepAliveResult) {\n return keepAliveResult;\n }\n\n // 使用元素处理器进行常规处理\n const node = elementAppendHandler(this, newChild, bodyAppendChild as DOMMethod);\n\n if ((node as unknown as HTMLElement)?.tagName === 'STYLE') {\n (node as unknown as HTMLElement).insertAdjacentElement = createOverriddenInsertAdjacentElement();\n }\n return node as T;\n };\n}\n\n/**\n * 创建重写的 append 方法\n * @description 重写 append 方法,支持多节点添加和 keepAlive 处理\n * @returns 重写后的 append 方法\n */\nfunction createOverriddenAppend() {\n return function <T extends Node>(this: HTMLElement, ...nodes: T[]): void {\n // biome-ignore lint/complexity/noForEach: <explanation>\n nodes.forEach(node => {\n // keepAlive 模式的特殊元素放到 head 中\n const keepAliveResult = handleKeepAliveElement(node);\n if (keepAliveResult) {\n return;\n }\n\n // 使用元素处理器进行常规处理\n elementAppendHandler(this, node as Node, bodyAppendChild as DOMMethod);\n });\n };\n}\n\n/**\n * 创建重写的 insertBefore 方法\n * @description 重写 insertBefore 方法,支持 DOM 隔离\n * @returns 重写后的 insertBefore 方法\n */\nfunction createOverriddenInsertBefore() {\n return function <T extends Node>(this: HTMLElement, newChild: T, refChild: Node | null): T {\n return elementInsertHandler(this, newChild, refChild, headInsertBefore as DOMMethod) as T;\n };\n}\n\n/**\n * 创建重写的 removeChild 方法\n * @description 重写 removeChild 方法,支持从应用容器中移除元素\n * @returns 重写后的 removeChild 方法\n */\nfunction createOverriddenRemoveChild() {\n return function <T extends Node>(this: HTMLElement, oldChild: T): T {\n const app = oldChild.__BK_WEWEB_APP_KEY__ ? appCache.getApp(oldChild.__BK_WEWEB_APP_KEY__) : null;\n\n // 从应用容器中移除\n if (app?.container?.contains(oldChild)) {\n return bodyRemoveChild.call(app.container, oldChild) as T;\n }\n\n // 从当前容器中移除\n if (this.contains(oldChild)) {\n return bodyRemoveChild.call(this, oldChild) as T;\n }\n\n return oldChild;\n };\n}\nconst insertAdjacentElement = createOverriddenInsertAdjacentElement();\n\nfunction createOverriddenInsertAdjacentElement() {\n return function (this: HTMLElement, _where: InsertPosition, element: Element): Element | null {\n const node = elementAppendHandler(this, element, headAppendChild as DOMMethod) as Element | null;\n // vite项目使用 如果节点是样式元素,则重写 insertAdjacentElement 方法\n if ((node as unknown as HTMLElement)?.tagName === 'STYLE') {\n (node as unknown as HTMLElement).insertAdjacentElement = insertAdjacentElement;\n }\n return node;\n };\n}\n\n/**\n * 重写 Body 和 Header 的 DOM 操作方法\n * @description 实现微前端应用的 DOM 隔离和资源路径处理\n *\n * 主要功能:\n * 1. 重写 setAttribute 方法,自动补全资源路径\n * 2. 重写 appendChild 和 append 方法,支持 DOM 隔离\n * 3. 重写 insertBefore 方法,支持元素插入隔离\n * 4. 重写 removeChild 方法,支持从应用容器中移除元素\n * 5. 支持 keepAlive 模式的特殊元素处理\n *\n *\n * @example\n * ```typescript\n * // 在微前端应用初始化时调用\n * rewriteBodyAndHeaderMethods();\n * ```\n */\nexport function rewriteBodyAndHeaderMethods(): void {\n if (hasRewrite) {\n return;\n }\n\n hasRewrite = true;\n\n // 重写 Element 的 setAttribute 方法\n Element.prototype.setAttribute = createOverriddenSetAttribute();\n\n // 重写 HTMLBodyElement 的方法\n HTMLBodyElement.prototype.appendChild = createOverriddenAppendChild();\n HTMLBodyElement.prototype.append = createOverriddenAppend();\n HTMLBodyElement.prototype.insertBefore = createOverriddenInsertBefore();\n HTMLBodyElement.prototype.removeChild = createOverriddenRemoveChild();\n\n // 重写 HTMLHeadElement 的方法(复用 Body 的实现)\n HTMLHeadElement.prototype.appendChild = HTMLBodyElement.prototype.appendChild;\n HTMLHeadElement.prototype.insertBefore = createOverriddenInsertBefore();\n HTMLHeadElement.prototype.removeChild = HTMLBodyElement.prototype.removeChild;\n}\n\n/**\n * 重置 Body 和 Header 方法\n * @description 恢复原始 DOM 操作方法,清理微前端相关的修改\n *\n * 主要功能:\n * 1. 恢复所有被重写的 DOM 方法到原始状态\n * 2. 清理当前运行的应用状态\n * 3. 重置重写状态标识\n *\n *\n * @example\n * ```typescript\n * // 在微前端应用卸载时调用\n * resetBodyAndHeaderMethods();\n * ```\n */\nexport function resetBodyAndHeaderMethods(): void {\n setCurrentRunningApp(null);\n\n // 恢复所有原始方法\n Element.prototype.setAttribute = setAttribute;\n HTMLBodyElement.prototype.appendChild = bodyAppendChild;\n HTMLBodyElement.prototype.append = append;\n HTMLBodyElement.prototype.removeChild = bodyRemoveChild;\n HTMLBodyElement.prototype.insertBefore = bodyInsertBefore;\n HTMLHeadElement.prototype.appendChild = headAppendChild;\n HTMLHeadElement.prototype.insertBefore = headInsertBefore;\n HTMLHeadElement.prototype.removeChild = headRemoveChild;\n hasRewrite = false;\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 加载前预处理模块\n * @description 提供应用加载前的初始化和预处理功能\n */\n\nimport { rewriteBodyAndHeaderMethods } from '../context/element';\n\n/**\n * 加载前的预处理操作\n * @description 在应用加载前执行必要的初始化操作,包括重写 DOM 操作方法\n */\nexport function beforeLoad(): void {\n rewriteBodyAndHeaderMethods();\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 激活生命周期模块\n * @description 提供应用激活和重新挂载功能,支持 keep-alive 模式\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { nextTask } from '../utils/common';\nimport { beforeLoad } from './before-load';\n\nimport type { BaseModel } from '../typings';\n\n/**\n * 激活指定应用\n * @description 激活已失活的应用或挂载新应用,支持 keep-alive 模式的应用状态恢复\n * @template T - 导出实例的类型\n * @param appKey - 应用的唯一标识符\n * @param container - 挂载容器,HTMLElement 或 ShadowRoot\n * @param callback - 激活完成后的回调函数(可选)\n */\nexport function activated<T>(\n appKey: string,\n container: HTMLElement | ShadowRoot,\n callback?: <M extends BaseModel>(instance: M, exportInstance?: T) => void,\n): void {\n const app = appCache.getApp(appKey);\n\n if (app?.status === AppState.DEACTIVATED && app.keepAlive) {\n // 如果应用已失活且支持 keep-alive,执行激活操作\n nextTask(() => {\n beforeLoad();\n app.activated(container, callback);\n });\n } else if (app) {\n // 否则执行常规挂载操作\n nextTask(() => {\n beforeLoad();\n app.mount(container, callback);\n });\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 失活生命周期模块\n * @description 提供应用失活和状态保持功能,支持 keep-alive 模式\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { resetBodyAndHeaderMethods } from '../context/element';\n\n/**\n * deactivated 指定应用\n * @description 将指定应用设置为失活状态,根据 keep-alive 配置决定\n */\nexport function deactivated(appKey: string) {\n const app = appCache.getApp(appKey);\n\n if (app && [AppState.ACTIVATED, AppState.MOUNTED].some(status => status === app.status)) {\n app.keepAlive ? app.deactivated() : app.unmount();\n }\n\n if (!appCache.hasActiveApp) {\n resetBodyAndHeaderMethods();\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 加载生命周期模块\n * @description 提供微应用和模块实例的加载功能,支持不同模式的资源加载和状态管理\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { MicroAppModel } from '../mode/app';\nimport { MicroInstanceModel } from '../mode/instance';\nimport { type BaseModel, type IAppModelProps, type IBaseModelProps, type IJsModelProps, WewebMode } from '../typings';\nimport { beforeLoad } from './before-load';\n\n/**\n * 应用状态检查间隔时间(毫秒)\n */\nconst STATUS_CHECK_INTERVAL = 300;\n\n/**\n * 根据配置模式加载相应的应用或模块实例\n * @description 统一的加载入口,根据模式参数决定加载应用还是模块实例\n * @param props - 基础模型配置参数\n * @returns Promise<BaseModel> - 返回加载的模型实例\n */\nexport async function load(props: IBaseModelProps): Promise<BaseModel> {\n beforeLoad();\n\n if (props.mode === WewebMode.INSTANCE) {\n return await loadInstance(props);\n }\n\n return await loadApp(props);\n}\n\n/**\n * 加载微应用\n * @description 加载或获取已存在的微应用实例,并启动应用\n * @param props - 应用模型配置参数\n * @returns Promise<MicroAppModel> - 返回微应用模型实例\n */\nexport async function loadApp(props: IAppModelProps): Promise<MicroAppModel> {\n beforeLoad();\n\n let instance = appCache.getApp(props.id);\n\n if (!instance) {\n instance = new MicroAppModel(props);\n appCache.setApp(instance);\n } else {\n instance.data = props.data || instance.data || {};\n }\n await instance.start();\n return instance as MicroAppModel;\n}\n\n/**\n * 加载模块实例\n * @description 加载或获取已存在的模块实例,支持状态监听和异步等待\n * @param props - 模块实例配置参数\n * @returns Promise<MicroInstanceModel> - 返回模块实例模型\n */\nexport function loadInstance(props: IJsModelProps): Promise<MicroInstanceModel> {\n beforeLoad();\n\n return new Promise(resolve => {\n let instance = appCache.getApp(props.id);\n\n // 如果实例不存在,创建新实例\n if (!instance) {\n instance = new MicroInstanceModel(props);\n appCache.setApp(instance);\n instance.start().then(() => resolve(instance as MicroInstanceModel));\n return;\n }\n // 如果实例正在挂载或未设置状态,等待状态变更\n if (instance.status in [AppState.MOUNTING, AppState.UNSET]) {\n const timer = setInterval(() => {\n if (instance.status in [AppState.ERROR, AppState.MOUNTED]) {\n resolve(instance as MicroInstanceModel);\n clearInterval(timer);\n }\n }, STATUS_CHECK_INTERVAL);\n return;\n }\n instance.data = props.data || instance.data || {};\n // 实例已存在且状态正常,直接返回\n resolve(instance as MicroInstanceModel);\n });\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 卸载生命周期模块\n * @description 提供应用卸载和清理功能\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { resetBodyAndHeaderMethods } from '../context/element';\n\n/**\n * 卸载指定应用\n * @description 卸载指定的应用实例,并在没有活跃应用时重置全局方法\n * @param appKey - 应用的唯一标识符\n */\nexport function unmount(appKey: string): void {\n const app = appCache.getApp(appKey);\n\n if (app && app.status !== AppState.UNMOUNT) {\n app.unmount();\n }\n\n if (!appCache.hasActiveApp) {\n resetBodyAndHeaderMethods();\n }\n}\n","/* eslint-disable @typescript-eslint/member-ordering */\n\n/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * BK WEWEB 自定义 Web Component 模块\n * @description 提供基于 Web Components 标准的微应用容器组件\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { activated } from '../lifecycle/activated';\nimport { deactivated } from '../lifecycle/deactivated';\nimport { load } from '../lifecycle/load';\nimport { unmount } from '../lifecycle/unmount';\nimport { type IAppModelProps, type IJsModelProps, WewebMode } from '../typings';\n\n/**\n * BK WEWEB 支持的自定义属性枚举\n * @description 定义了 bk-weweb 自定义元素支持的所有属性配置\n */\nexport enum WewebCustomAttrs {\n /** 传递给子应用的数据 */\n data = 'data',\n /** 应用唯一标识符 */\n id = 'id',\n /** 是否启用缓存模式 */\n keepAlive = 'keepAlive',\n /** 应用运行模式 */\n mode = 'mode',\n /** 是否开启 CSS 样式隔离 */\n scopeCss = 'scopeCss',\n /** 是否开启 JavaScript 隔离 */\n scopeJs = 'scopeJs',\n /** 是否开启 location 路由隔离 */\n scopeLocation = 'scopeLocation',\n /** 是否启用 Shadow DOM */\n setShadowDom = 'setShadowDom',\n /** @deprecated 请使用 setShadowDom 代替 */\n setShodowDom = 'setShodowDom',\n /** 是否显示源码 */\n showSourceCode = 'showSourceCode',\n /** 应用资源 URL */\n url = 'url',\n}\n\n/**\n * BK WEWEB 自定义元素类\n * @description 基于 Web Components 标准实现的微应用容器组件\n */\nexport default class BkWewebElement extends HTMLElement {\n /** 应用 URL 缓存 */\n private appUrl = '';\n\n /** 组件连接状态标识 */\n private connected = false;\n\n /**\n * 观察的属性列表\n * @description 定义需要监听变化的属性名称列表\n * @returns string[] - 属性名称数组\n */\n static get observedAttributes(): string[] {\n return [WewebCustomAttrs.url];\n }\n\n /**\n * 获取布尔类型属性值\n * @description 解析布尔类型的自定义属性,支持驼峰和短横线命名\n * @param name - 属性名称\n * @returns boolean | undefined - 属性值或 undefined\n * @private\n */\n private getBooleanAttr(name: string): boolean | undefined {\n const hasAttr = this.hasAttribute(name) || this.hasAttribute(name.replace(/([A-Z])/g, '-$1').toLocaleLowerCase());\n return hasAttr ? this.getAttribute(name) !== 'false' : undefined;\n }\n\n /**\n * 处理属性变化的内部逻辑\n * @description 当属性发生变化时执行的处理逻辑\n * @returns Promise<void>\n * @private\n */\n private async handleAttributeChanged(): Promise<void> {\n if (!this.appKey) return;\n\n // 如果需要 Shadow DOM,则创建\n if (this.setShadowDomAttr) {\n this.attachShadow({ mode: 'open' });\n }\n\n const app = appCache.getApp(this.appKey);\n\n // 如果应用已存在且 URL 匹配,且是预加载或已卸载状态,则激活\n if (app && app.url === this.appUrl && (app.isPreLoad || app.status === AppState.UNMOUNT)) {\n activated(this.appKey, this.shadowRoot ?? this);\n return;\n }\n\n // 否则重新加载应用\n await load(this.appProps);\n }\n\n /**\n * 属性变化回调\n * @description 当观察的属性发生变化时触发\n * @param attr - 变化的属性名\n * @param _oldVal - 旧值(未使用)\n * @param newVal - 新值\n */\n attributeChangedCallback(attr: WewebCustomAttrs, _oldVal: string, newVal: string): void {\n // 只处理 URL 属性变化,且值确实发生改变,且组件已连接\n if (attr !== WewebCustomAttrs.url || this[attr] === newVal || !this.connected) return;\n\n this.appUrl = newVal;\n const cacheApp = appCache.getApp(this.appKey!);\n\n // 如果组件已连接或存在缓存应用,则处理属性变化\n if (this.connected || cacheApp) {\n this.handleAttributeChanged();\n }\n }\n /**\n * 获取是否启用 Shadow DOM 属性\n * @description 获取是否启用 Shadow DOM 属性 兼容旧版使用\n * @returns boolean | undefined - 是否启用 Shadow DOM 属性\n */\n get setShadowDomAttr(): boolean | undefined {\n return this.getBooleanAttr(WewebCustomAttrs.setShadowDom) ?? this.getBooleanAttr(WewebCustomAttrs.setShodowDom);\n }\n /**\n * 组件连接到 DOM 时的回调\n * @description 当自定义元素被插入到 DOM 时触发\n * @returns Promise<void>\n */\n async connectedCallback(): Promise<void> {\n // 如果需要且尚未创建 Shadow DOM,则创建\n if (this.setShadowDomAttr && !this.shadowRoot) {\n this.attachShadow({ delegatesFocus: false, mode: 'open' });\n }\n\n // 加载应用\n await load(this.appProps);\n\n // 激活应用\n activated(this.appKey!, this.shadowRoot ?? this);\n\n // 标记为已连接\n this.connected = true;\n }\n\n /**\n * 组件从 DOM 断开时的回调\n * @description 当自定义元素从 DOM 中移除时触发\n */\n disconnectedCallback(): void {\n this.connected = false;\n\n // 根据 keepAlive 配置决定失活还是卸载\n if (this.appProps.keepAlive) {\n deactivated(this.appKey!);\n } else {\n unmount(this.appKey!);\n }\n }\n\n /**\n * 获取应用数据\n * @description 解析 data 属性中的 JSON 数据\n * @returns Record<string, unknown> - 应用数据对象\n */\n get appData(): Record<string, unknown> {\n if (this.hasAttribute(WewebCustomAttrs.data)) {\n try {\n return JSON.parse(this.getAttribute(WewebCustomAttrs.data)!);\n } catch {\n // JSON 解析失败时返回空对象\n }\n }\n return {};\n }\n\n /**\n * 获取应用标识符\n * @description 优先使用 id 属性,其次使用 url 属性作为应用标识\n * 考虑到 JS 模式下需要 JS bundle 的复用性,需用户设置 id 属性\n * 如果是单实例应用则可以不用配置 id\n * @returns string | null - 应用标识符或 null\n */\n get appKey(): null | string {\n return this.getAttribute(WewebCustomAttrs.id) || this.getAttribute(WewebCustomAttrs.url);\n }\n\n /**\n * 获取应用配置属性\n * @description 根据模式返回相应的应用配置对象\n * @returns IAppModelProps | IJsModelProps - 应用配置对象\n */\n get appProps(): IAppModelProps | IJsModelProps {\n const commonProps = {\n container: this.shadowRoot ?? this,\n data: this.appData,\n id: this.appKey!,\n keepAlive: this.getBooleanAttr(WewebCustomAttrs.keepAlive),\n showSourceCode: this.getBooleanAttr(WewebCustomAttrs.showSourceCode),\n url: this.getAttribute(WewebCustomAttrs.url)!,\n };\n\n // 根据模式返回不同的配置\n if (this.getAttribute('mode') === WewebMode.INSTANCE) {\n return {\n ...commonProps,\n mode: WewebMode.INSTANCE,\n scopeCss: this.getBooleanAttr(WewebCustomAttrs.scopeCss) && !this.setShadowDomAttr,\n scopeJs: this.getBooleanAttr(WewebCustomAttrs.scopeJs),\n };\n }\n\n return {\n ...commonProps,\n mode: WewebMode.APP,\n scopeCss: !this.setShadowDomAttr,\n scopeJs: !this.getBooleanAttr(WewebCustomAttrs.scopeJs),\n scopeLocation: this.getBooleanAttr(WewebCustomAttrs.scopeLocation),\n };\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 挂载生命周期模块\n * @description 提供应用挂载到指定容器的功能\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { nextTask } from '../utils/common';\nimport { beforeLoad } from './before-load';\n\nimport type { BaseModel } from '../typings';\n\n/**\n * 挂载应用到指定容器\n * @description 将已加载的应用挂载到指定的 DOM 容器或 ShadowRoot 中\n * @template T - 导出实例的类型\n * @param appKey - 应用的唯一标识符\n * @param container - 挂载容器,可以是 HTMLElement 或 ShadowRoot(可选)\n * @param callback - 挂载完成后的回调函数(可选)\n */\nexport function mount<T>(\n appKey: string,\n container?: HTMLElement | ShadowRoot,\n callback?: <M extends BaseModel>(instance: M, exportInstance?: T) => void,\n): void {\n const app = appCache.getApp(appKey);\n\n if (app) {\n nextTask(() => {\n beforeLoad();\n app.mount(container, callback);\n });\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 卸载生命周期模块\n * @description 提供应用完全卸载和清理功能\n */\n\nimport { appCache } from '../cache/app-cache';\n\n/**\n * 卸载并删除指定应用\n * @description 从缓存中完全删除指定的应用实例,释放相关资源\n * @param url - 应用的 URL 标识符,用于定位要删除的应用\n */\nexport function unload(url: string): void {\n appCache.deleteApp(url);\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 预加载模块\n * @description 提供微应用、模块实例和资源的预加载功能,利用浏览器空闲时间进行资源预加载以提升性能\n */\n\n/* eslint-disable @typescript-eslint/no-misused-promises */\nimport { loadApp, loadInstance } from '../lifecycle/load';\nimport { requestIdleCallback } from '../utils/common';\nimport { type SourceType, loadGlobalSource } from '../utils/load-source';\n\nimport type { IAppModelProps, IJsModelProps } from '../typings';\n\n/**\n * 预加载模块实例\n * @description 在浏览器空闲时预加载指定的模块实例,提前准备资源以提升后续加载性能\n * @param options - 模块加载配置参数\n * @param options.isPreLoad - 将被自动设置为 true,标识这是预加载操作\n * @example\n * ```typescript\n * preLoadInstance({\n * name: 'my-module',\n * url: 'https://example.com/module.js'\n * });\n * ```\n */\nexport function preLoadInstance(options: IJsModelProps): void {\n requestIdleCallback(() =>\n loadInstance({\n ...options,\n isPreLoad: true,\n }),\n );\n}\n\n/**\n * 预加载微应用\n * @description 在浏览器空闲时预加载指定的微应用,提前准备应用资源以提升后续加载性能\n * @param options - 应用加载配置参数\n * @param options.isPreLoad - 将被自动设置为 true,标识这是预加载操作\n * @example\n * ```typescript\n * preLoadApp({\n * name: 'my-app',\n * entry: 'https://example.com/app/'\n * });\n * ```\n */\nexport function preLoadApp(options: IAppModelProps): void {\n requestIdleCallback(() =>\n loadApp({\n ...options,\n isPreLoad: true,\n }),\n );\n}\n\n/**\n * 预加载全局资源\n * @description 在浏览器空闲时预加载指定的全局资源列表,包括样式文件、脚本文件等\n * @param sourceList - 要预加载的资源列表,可以是单个资源或资源数组\n * @example\n * ```typescript\n * // 预加载单个资源\n * preLoadSource('https://example.com/style.css');\n *\n * // 预加载多个资源\n * preLoadSource([\n * 'https://example.com/style.css',\n * 'https://example.com/script.js'\n * ]);\n * ```\n */\nexport function preLoadSource(sourceList: SourceType): void {\n requestIdleCallback(() => {\n loadGlobalSource(sourceList);\n });\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { collectBaseSource } from './base-app/collect-source';\nimport BkWewebElement from './component/web-component';\nimport './context/cache';\n\nimport type { FetchSourceType, IStartOption } from './typings';\nexport * from './lifecycle/activated';\nexport * from './lifecycle/deactivated';\nexport * from './lifecycle/load';\nexport * from './lifecycle/mount';\nexport * from './lifecycle/unload';\nexport * from './lifecycle/unmount';\nexport * from './preload/preload';\nexport { WewebMode } from './typings';\n\nconst CUSTOM_ELEMENT_TAG = 'bk-weweb';\n\nexport class WeWeb {\n fetchSource?: FetchSourceType;\n webComponentTag = CUSTOM_ELEMENT_TAG;\n\n constructor() {\n if (!window.customElements.get(CUSTOM_ELEMENT_TAG)) {\n window.customElements.define(CUSTOM_ELEMENT_TAG, BkWewebElement);\n }\n }\n\n /** 设置自定义DOM标签名 */\n setWebComponentTag() {\n if (!window.customElements.get(this.webComponentTag)) {\n window.customElements.define(this.webComponentTag, BkWewebElement);\n }\n }\n\n /** 启动WeWeb */\n start(option?: IStartOption) {\n if (option?.collectBaseSource) {\n collectBaseSource();\n }\n if (typeof option?.fetchSource === 'function') {\n this.fetchSource = option.fetchSource;\n }\n this.webComponentTag = option?.webComponentTag || CUSTOM_ELEMENT_TAG;\n this.setWebComponentTag();\n }\n}\n\nconst weWeb = new WeWeb();\nexport default weWeb;\n"],"mappings":"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","names":["WewebMode","value","clearInterval","setInterval","DEFAULT_RANDOM_LENGTH","bodyAppendChild"]}
1
+ {"version":3,"sources":["../src/common/state.ts","../src/context/cache.ts","../src/typings/source.ts","../src/typings/model.ts","../src/typings/sandbox.ts","../src/utils/common.ts","../src/utils/custom.ts","../src/utils/fetch.ts","../src/entry/style.ts","../src/mode/instance.ts","../src/entry/script.ts","../src/utils/element.ts","../src/context/document.ts","../src/context/event.ts","../src/context/function.ts","../src/context/window.ts","../src/context/sandbox.ts","../src/mode/app.ts","../src/utils/load-source.ts","../src/entry/entry.ts","../src/cache/app-cache.ts","../src/base-app/element.ts","../src/base-app/collect-source.ts","../src/context/element.ts","../src/lifecycle/before-load.ts","../src/lifecycle/activated.ts","../src/lifecycle/deactivated.ts","../src/lifecycle/load.ts","../src/lifecycle/unmount.ts","../src/component/web-component.ts","../src/lifecycle/mount.ts","../src/lifecycle/unload.ts","../src/preload/preload.ts","../src/index.ts"],"sourcesContent":["/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 应用状态常量\n * 定义微前端应用的生命周期状态\n */\nexport const AppState = {\n /** 未设置状态 */\n UNSET: 'UNSET',\n /** 加载中 */\n LOADING: 'LOADING',\n /** 加载完成 */\n LOADED: 'LOADED',\n /** 挂载中 */\n MOUNTING: 'MOUNTING',\n /** 挂载完成 */\n MOUNTED: 'MOUNTED',\n /** 激活状态 */\n ACTIVATED: 'ACTIVATED',\n /** 未激活状态 */\n DEACTIVATED: 'DEACTIVATED',\n /** 卸载状态 */\n UNMOUNT: 'UNMOUNT',\n /** 错误状态 */\n ERROR: 'ERROR',\n} as const;\n\nexport type KeyOfAppState = keyof typeof AppState;\nexport type ValueOfAppState = (typeof AppState)[KeyOfAppState];\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport type { BaseModel } from '../typings';\n\n// 应用实例管理\nlet currentRunningApp: BaseModel | null = null;\n\nexport const getCurrentRunningApp = () => currentRunningApp;\nexport const setCurrentRunningApp = (appInstance: BaseModel | null) => {\n currentRunningApp = appInstance;\n};\n\nexport const SCOPED_CSS_STYLE_ID = 'SCOPED_CSS_STYLE_ID';\nexport const windowNativeFuncMap = new Map<PropertyKey, true>();\n\n// 提前注入全局上下文字段\nconst GLOBAL_CONTEXT_VARIABLES = [\n 'Array',\n 'ArrayBuffer',\n 'Boolean',\n 'constructor',\n 'DataView',\n 'Date',\n 'decodeURI',\n 'decodeURIComponent',\n 'encodeURI',\n 'encodeURIComponent',\n 'Error',\n 'escape',\n 'eval',\n 'EvalError',\n 'Float32Array',\n 'Float64Array',\n 'Function',\n 'hasOwnProperty',\n 'Infinity',\n 'Int16Array',\n 'Int32Array',\n 'Int8Array',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'JSON',\n 'Map',\n 'Math',\n 'NaN',\n 'Number',\n 'Object',\n 'parseFloat',\n 'parseInt',\n 'Promise',\n 'propertyIsEnumerable',\n 'Proxy',\n 'RangeError',\n 'ReferenceError',\n 'Reflect',\n 'RegExp',\n 'Set',\n 'String',\n 'Symbol',\n 'SyntaxError',\n 'toLocaleString',\n 'toString',\n 'TypeError',\n 'Uint16Array',\n 'Uint32Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'undefined',\n 'unescape',\n 'URIError',\n 'valueOf',\n 'WeakMap',\n 'WeakSet',\n 'requestAnimationFrame',\n 'cancelAnimationFrame',\n 'requestIdleCallback',\n 'cancelIdleCallback',\n] as const;\n\n/**\n * 获取全局上下文代码\n */\nexport const getGlobalContextCode = () => `const { ${GLOBAL_CONTEXT_VARIABLES.join(',')} } = this;`;\n\n/**\n * 检查函数是否为原生代码\n */\nconst isNativeFunction = (func: unknown): boolean => {\n if (typeof func !== 'function') return false;\n try {\n return Function.prototype.toString.call(func).includes('[native code]');\n } catch {\n return false;\n }\n};\n\n/**\n * 收集原生window方法\n */\nconst collectNativeWindowFunc = (): void => {\n const windowKeys = Object.getOwnPropertyNames(window);\n\n for (const key of windowKeys) {\n if (\n !windowNativeFuncMap.has(key) &&\n /^[A-Z]/.test(key) &&\n isNativeFunction((window as unknown as Record<string, unknown>)[key])\n ) {\n windowNativeFuncMap.set(key, true);\n }\n }\n};\n\n// 初始化收集原生方法\ncollectNativeWindowFunc();\n","/**\n * 资源加载相关类型定义\n * @description 定义了样式、脚本等资源的配置选项和相关类型\n */\n\n/**\n * 样式资源配置选项接口\n * @description 定义样式文件的加载配置和属性信息\n */\nexport interface IStyleOption {\n /** 样式代码内容 */\n code: string;\n /** 是否来自 HTML 页面内联样式 */\n fromHtml: boolean;\n /** 是否为初始样式 */\n initial?: boolean;\n /** 是否预取样式资源 */\n prefetch?: boolean;\n /** 是否预加载样式资源 */\n preload?: boolean;\n /** 样式文件的 URL 地址 */\n url?: string;\n}\n\n/**\n * 脚本资源配置选项接口\n * @description 定义脚本文件的加载配置和属性信息\n */\nexport interface IScriptOption {\n /** 是否为异步加载脚本 */\n async: boolean;\n /** 脚本代码内容 */\n code: string;\n /** 是否为延迟执行脚本 */\n defer: boolean;\n /** 是否从 HTML 页面中提取的脚本 */\n fromHtml: boolean;\n /** 是否为初始脚本 */\n initial?: boolean;\n /** 是否为 ES6 模块类型脚本 */\n isModule: boolean;\n /** 脚本文件的 URL 地址 */\n url?: string;\n}\n\n/**\n * CSS 属性键名常量\n * @description 用于标识 CSS 样式元素的属性名\n */\nexport const CSS_ATTRIBUTE_KEY = 'id';\n\n/**\n * CSS 规则类型枚举\n * @description 定义了不同类型的 CSS 规则类型常量\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CSSRule/type\n */\nexport enum CssRuleEnum {\n /** 样式规则 */\n STYLE_RULE = 1,\n /** @media 媒体查询规则 */\n MEDIA_RULE = 4,\n /** @supports 规则 */\n SUPPORTS_RULE = 12,\n}\n\n/**\n * 工具类型:获取对象所有值的联合类型\n * @template T - 要提取值类型的对象类型\n * @description 提取对象类型中所有属性值的联合类型\n */\nexport type ValueOf<T> = T[keyof T];\n\n/**\n * Document 事件监听器类型\n * @description 定义了 Document 对象事件监听器的函数签名\n * @param this - Document 对象上下文\n * @param ev - Document 事件映射中任意事件类型的值\n * @returns 任意类型的返回值\n */\nexport type DocumentEventListener = (this: Document, ev: ValueOf<DocumentEventMap>) => any;\n","import type { ValueOfAppState } from '../common';\nimport { WewebCustomAttrs } from '../component/web-component';\nimport type SandBox from '../context/sandbox';\nimport type { EntrySource } from '../entry/entry';\nimport type { fetchSource } from '../utils/fetch';\nimport type { SourceType } from '../utils/load-source';\n\n/** WEWEB运行模式 */\nexport enum WewebMode {\n /** 微应用模式 */\n APP = 'app',\n /** 配置模式 */\n CONFIG = 'config',\n /** 微模块模式 */\n INSTANCE = 'js',\n}\n\n/** 容器类型 */\nexport type ContainerType = HTMLElement | ShadowRoot;\n\n/** 通用回调函数类型 */\nexport type CallbackFunction<T = unknown> = (instance: BaseModel, exportInstance?: T) => void;\n\n/** Web Component 属性接口 */\nexport interface IComponentProps {\n /** 传递给子应用的数据 */\n [WewebCustomAttrs.data]?: string;\n /** 运行模式 */\n [WewebCustomAttrs.mode]?: WewebMode;\n /** 是否共享主应用路由 */\n [WewebCustomAttrs.scopeLocation]?: boolean;\n /** 是否使用 ShadowDOM */\n [WewebCustomAttrs.setShadowDom]?: boolean;\n /** 是否显示源码 */\n [WewebCustomAttrs.showSourceCode]?: boolean;\n /** 应用URL */\n [WewebCustomAttrs.url]: string;\n}\n\n/** 基础模型属性接口 */\nexport interface IBaseModelProps {\n /** 运行模式 */\n [WewebCustomAttrs.mode]?: WewebMode;\n /** 应用URL */\n [WewebCustomAttrs.url]: string;\n /** 应用ID */\n id?: string | null;\n /** 是否预加载 */\n isPreLoad?: boolean;\n /** 获取资源的函数 */\n fetchSource?: typeof fetchSource;\n}\n\n/** 微应用模式属性配置 */\nexport interface IAppModelProps extends IBaseModelProps {\n /** 传递给子应用的数据 */\n [WewebCustomAttrs.data]?: Record<string, unknown>;\n /** 是否缓存DOM */\n [WewebCustomAttrs.keepAlive]?: boolean;\n /** 是否启用样式隔离 */\n [WewebCustomAttrs.scopeCss]?: boolean;\n /** 是否使用沙盒隔离 */\n [WewebCustomAttrs.scopeJs]?: boolean;\n /** 是否共享主应用路由 */\n [WewebCustomAttrs.scopeLocation]?: boolean;\n /** 是否使用 ShadowDOM */\n [WewebCustomAttrs.setShadowDom]?: boolean;\n /** 是否显示源码 */\n [WewebCustomAttrs.showSourceCode]?: boolean;\n /** 容器元素 */\n container?: ContainerType | null;\n /** 初始化资源 */\n initSource?: SourceType;\n}\n\n/** 微模块模式属性配置 */\nexport interface IJsModelProps extends IBaseModelProps {\n /** 传递给模块的数据 */\n [WewebCustomAttrs.data]?: Record<string, unknown>;\n /** 是否显示源码 */\n [WewebCustomAttrs.showSourceCode]?: boolean;\n /** 容器元素 */\n container?: ContainerType | null;\n /** 初始化资源 */\n initSource?: SourceType;\n /** 是否缓存DOM */\n keepAlive?: boolean;\n /** 是否启用样式隔离 */\n scopeCss?: boolean;\n /** 是否使用沙盒隔离 */\n scopeJs?: boolean;\n}\n\n/** 基础模型接口 */\nexport interface BaseModel {\n /** 应用缓存键 */\n readonly appCacheKey: string;\n /** 容器元素 */\n container?: ContainerType;\n /** 初始化资源 */\n initSource?: SourceType;\n /** 是否为模块应用 */\n isModuleApp?: boolean;\n /** 是否预加载 */\n isPreLoad: boolean;\n /** 是否保持活跃 */\n keepAlive?: boolean;\n /** 应用名称 */\n name: string;\n /** 沙盒实例 */\n sandBox?: SandBox;\n /** 是否启用样式隔离 */\n scopeCss?: boolean;\n /** 是否使用JS隔离 */\n scopeJs: boolean;\n /** 是否显示源码 */\n showSourceCode?: boolean;\n /** 入口资源 */\n source?: EntrySource;\n /** 应用URL */\n url: string;\n /** 获取资源的函数 */\n fetchSource?: typeof fetchSource;\n /** 传递给应用的数据 */\n data: Record<string, unknown>;\n\n /** 激活应用 */\n activated<T = unknown>(container: ContainerType, callback?: CallbackFunction<T>): void;\n /** 停用应用 */\n deactivated(): void;\n /** 挂载应用 */\n mount<T = unknown>(container?: ContainerType, callback?: CallbackFunction<T>): void;\n /** 错误处理 */\n onError(): void;\n /** 挂载处理 */\n onMount(): void;\n /** 注册运行中的应用 */\n registerRunningApp(): void;\n /** 启动应用 */\n start(): Promise<void>;\n /** 卸载应用 */\n unmount(needDestroy?: boolean): void;\n /** 获取应用状态 */\n get status(): ValueOfAppState;\n /** 设置应用状态 */\n set status(value: ValueOfAppState);\n}\n","/**\n * 沙箱环境配置类型定义\n */\n\n/**\n * 注入到子应用 window 对象的属性接口\n * @description 定义了 BK WEWEB 平台注入到子应用环境中的必要属性\n */\nexport interface IInjectWindowAttrs {\n /** BK WEWEB平台的应用唯一标识 */\n __BK_WEWEB_APP_KEY__: string;\n /** BK WEWEB的附加数据 */\n __BK_WEWEB_DATA__: Record<string, unknown>;\n /** 标识页面是否由BK WEWEB驱动 */\n __POWERED_BY_BK_WEWEB__: boolean;\n __BK_WEWEB_HAS_REWRITE__?: boolean;\n /** 原始 document 对象的引用 */\n rawDocument: Document;\n /** 原始 window 对象的引用 */\n rawWindow: Window;\n}\n\n/**\n * 沙箱环境白名单配置\n * @description 允许子应用访问的 window 属性列表\n */\nexport const WINDOW_WHITE_LIST: readonly PropertyKey[] = [\n 'System', // SystemJS 模块加载器\n '__cjsWrapper', // SystemJS CommonJS 包装器\n // 开发环境下允许 React DevTools\n ...(process.env.NODE_ENV !== 'production' ? ['__REACT_DEVTOOLS_GLOBAL_HOOK__'] : []),\n] as const;\n\n/**\n * BK WEWEB 注入属性列表\n * @description 需要在子应用自身上下文中获取的 BK WEWEB 相关属性\n */\nexport const BK_WEWEB_INJECT_KEY_LIST: readonly PropertyKey[] = [\n '__POWERED_BY_BK_WEWEB__',\n '__BK_WEWEB_APP_KEY__',\n '__BK_WEWEB_DATA__',\n] as const;\n\n/**\n * Window 对象别名列表\n * @description 在沙箱环境中需要处理的 window 对象的所有别名\n */\nexport const WINDOW_ALIAS_LIST: readonly PropertyKey[] = ['window', 'self', 'globalThis'] as const;\n\n/**\n * 路由相关属性列表\n * @description 设置了 scopedLocation 后需要监听的路由相关属性\n */\nexport const BK_WEWEB_LOCATION_KEY_LIST: readonly PropertyKey[] = ['location', 'history'] as const;\n\n/**\n * 通用微应用 Window 键映射\n * @description 所有环境下都需要的微应用相关的 window 属性\n */\nconst COMMON_MICRO_APP_WINDOW_KEY_MAP = {\n __bk_pop_manager: true,\n __bk_zIndex_manager: true,\n i18n: true,\n} as const;\n\n/**\n * 开发环境微应用 Window 键映射\n * @description 根据环境动态生成的微应用 window 属性映射表\n */\nexport const DEV_MICRO_APP_WINDOW_KEY_MAP: Record<PropertyKey, true> =\n process.env.NODE_ENV !== 'production'\n ? {\n // 开发环境标识\n __DEV__: true,\n\n // Vue DevTools 相关\n __VUE_DEVTOOLS_GLOBAL_HOOK__: true,\n __VUE_DEVTOOLS_HOOK_REPLAY__: true,\n __VUE_DEVTOOLS_PLUGINS__: true,\n\n // Vue I18n 相关\n __VUE_I18N_FULL_INSTALL__: true,\n __VUE_I18N_LEGACY_API__: true,\n\n // Vue 配置相关\n __VUE_OPTIONS_API__: true,\n\n // Core-js 相关\n '__core-js_shared__': true,\n\n // Webpack 相关\n webpackChunkapm: true,\n webpackChunkpc: true,\n webpackChunktrace: true,\n webpackJsonp: true,\n\n // 包含通用配置\n ...COMMON_MICRO_APP_WINDOW_KEY_MAP,\n }\n : COMMON_MICRO_APP_WINDOW_KEY_MAP;\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nconst PROTOCOL_REGEX = /^((((ht|f)tps?)|file):)?\\/\\//;\nconst DATA_BLOB_REGEX = /^(data|blob):/;\nconst FILE_EXTENSION_REGEX = /\\.(\\w+)$/;\nconst JS_EXTENSION_REGEX = /\\.js$/;\nconst RANDOM_CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789';\n\n/**\n * 使用 nextTask 函数将回调函数添加到下一个任务队列中执行\n * @param cb 回调函数\n * @returns Promise 对象,用于异步处理回调函数\n */\nexport const nextTask = (cb: () => void): Promise<void> => Promise.resolve().then(cb);\n\n/**\n * 使用 nextTick 函数将回调函数添加到全局任务队列中执行\n * 如果已经有任务在等待执行,则不会重复添加任务\n * @param cb 回调函数\n */\nlet globalTaskPending = false;\nexport const nextTick = (cb: () => void): void => {\n if (globalTaskPending) return;\n\n globalTaskPending = true;\n nextTask(() => {\n cb();\n globalTaskPending = false;\n });\n};\n\n/**\n * 给 URL 添加协议头\n * @param url 要添加协议头的 URL\n * @returns 添加了协议头后的 URL\n */\nexport const addUrlProtocol = (url: string): string => {\n if (url.startsWith('//')) return `${location.protocol}${url}`;\n if (!url.startsWith('http')) return `${location.protocol}//${url}`;\n return url;\n};\n\n/**\n * 填充完整路径\n * @param path 路径\n * @param baseURI 基础路径\n * @returns 完整的URL路径\n */\nexport const fillUpPath = (path: string, baseURI: string): string => {\n if (!path || PROTOCOL_REGEX.test(path) || DATA_BLOB_REGEX.test(path)) {\n return path;\n }\n\n const { origin, pathname } = new URL(addUrlProtocol(baseURI));\n const basePath = `${origin}${pathname}`.replace(FILE_EXTENSION_REGEX, '/');\n return new URL(path, basePath).toString();\n};\n\n/**\n * 生成随机字符串\n * @param length 生成字符串的长度\n * @param chars 生成字符串的字符范围\n * @returns 随机字符串\n */\nexport const random = (length: number, chars: string = RANDOM_CHARS): string => {\n const charsLength = chars.length;\n return Array.from({ length }, () => chars[Math.floor(Math.random() * charsLength)]).join('');\n};\n\n/**\n * 生成随机URL\n * @returns 随机URL字符串\n */\nexport const randomUrl = (): string => `inline-${random(16)}`;\n\n/**\n * requestIdleCallback polyfill\n */\nexport const requestIdleCallback =\n window.requestIdleCallback ??\n ((cb: (deadline: { didTimeout: boolean; timeRemaining: () => number }) => void) => {\n const start = Date.now();\n return setTimeout(() => {\n cb({\n didTimeout: false,\n timeRemaining: () => Math.max(0, 50 - (Date.now() - start)),\n });\n }, 1);\n });\n\n/**\n * cancelIdleCallback polyfill\n */\nexport const cancelIdleCallback = window.cancelIdleCallback ?? ((id: number) => clearTimeout(id));\n\n/**\n * 判断是否是JSONP请求\n * @param url 要检查的URL\n * @returns 是否为JSONP请求\n */\nexport const isJsonpUrl = (url: null | string): boolean => {\n if (!url) return false;\n\n try {\n const { pathname } = new URL(addUrlProtocol(url));\n return !JS_EXTENSION_REGEX.test(pathname);\n } catch {\n // URL 解析失败时,使用原始逻辑\n return !JS_EXTENSION_REGEX.test(url);\n }\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n// 事件目标属性名称列表\nconst ELEMENT_TARGET_NAMES = ['currentTarget', 'srcElement', 'target'] as const;\n\ntype SupportedElement = HTMLLinkElement | HTMLScriptElement;\n\ntype PropertyDescriptors = Record<string, PropertyDescriptor>;\n\n/** 为事件对象添加元素属性 */\nexport const defineEventSourceElement = (element: SupportedElement, eventName = 'custom'): Event => {\n const targetProperties: PropertyDescriptors = ELEMENT_TARGET_NAMES.reduce((properties, targetName) => {\n properties[targetName] = {\n get: () => element,\n enumerable: true,\n configurable: true,\n };\n return properties;\n }, {} satisfies PropertyDescriptors);\n\n return Object.defineProperties(new CustomEvent(eventName), targetProperties);\n};\n\n/** 触发link或script元素的onload事件 */\nexport const dispatchLinkOrScriptLoad = (element: SupportedElement): void => {\n const loadEvent = defineEventSourceElement(element, 'load');\n\n if (typeof element.onload === 'function') {\n element.onload.call(element, loadEvent);\n return;\n }\n element.dispatchEvent(loadEvent);\n};\n\n/** 触发link或script元素的onerror事件 */\nexport const dispatchLinkOrScriptError = (element: SupportedElement): void => {\n const errorEvent = defineEventSourceElement(element, 'error');\n\n if (typeof element.onerror === 'function') {\n element.onerror.call(element, errorEvent);\n return;\n }\n element.dispatchEvent(errorEvent);\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport weWeb from '..';\n\nimport type { BaseModel } from '../typings';\n\ntype FetchOptions = Record<string, unknown>;\n\n/**\n * 统一的资源获取方法,支持应用级别和全局级别的自定义fetch\n * 优先级:应用级fetchSource > 全局fetchSource > 原生fetch\n * @param url 要获取的资源URL\n * @param options fetch请求选项,默认为空对象\n * @param app 可选的应用实例,如果提供且有自定义fetchSource则优先使用\n * @returns Promise<string> 返回资源内容的Promise,失败时返回空字符串\n */\nexport const fetchSource = async (url: string, options: FetchOptions = {}, app?: BaseModel): Promise<string> => {\n // 优先使用应用级别的自定义fetch方法\n if (typeof app?.fetchSource === 'function') {\n try {\n return await app.fetchSource(url, options);\n } catch {\n return '';\n }\n }\n\n // 其次使用全局自定义fetch方法\n if (weWeb.fetchSource) {\n return weWeb.fetchSource(url, options);\n }\n\n // 最后使用原生fetch方法\n try {\n const response = await window.fetch(url, options as RequestInit);\n return await response.text();\n } catch {\n return '';\n }\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { appCache } from '../cache/app-cache';\n// import { disabledStyleDom } from '../context/cache';\nimport { type BaseModel, CssRuleEnum, type IStyleOption } from '../typings';\nimport { setMarkElement } from '../utils';\nimport { addUrlProtocol, fillUpPath } from '../utils/common';\nimport { dispatchLinkOrScriptError, dispatchLinkOrScriptLoad } from '../utils/custom';\nimport { fetchSource } from '../utils/fetch';\n\nconst CSS_SELECTORS = {\n ROOT_SELECTOR: /^((html[\\s>~,]+body)|(html|body|:root))$/,\n BUILT_IN_ROOT_SELECTOR: /(^|\\s+)((html[\\s>~]+body)|(html|body|:root))(?=[\\s>~]+|$)/,\n FONT_FACE: /@font-face\\s*\\{[^}]+\\}/g,\n URL_PATTERN: /url\\([\"']?([^)\"']+)[\"']?\\)/gm,\n DATA_BLOB_PROTOCOL: /^(data|blob):/,\n HTTP_PROTOCOL: /^(https?:)?\\/\\//,\n RELATIVE_PATH: /^((\\.\\.?\\/)|[^/])/,\n ROOT_HOST_PATTERN: /(:?:root|html)/gm,\n} as const;\n\nconst STYLE_ATTRIBUTES = {\n TYPE: 'text/css',\n POWERED_BY: 'bk-weweb',\n LINKED_FROM_BASE: 'linked-from-base',\n ORIGIN_SRC: 'origin-src',\n} as const;\n\nconst PACK_RULE_NAMES = {\n MEDIA: 'media',\n SUPPORTS: 'supports',\n} as const;\n\ntype PackRuleType = CSSMediaRule | CSSSupportsRule;\ntype MutationObserverConfig = MutationObserverInit;\n\n/**\n * 样式处理类\n */\nexport class Style {\n code = '';\n fromHtml: boolean;\n initial: boolean;\n prefetch = false;\n preload = false;\n scoped: boolean;\n scopedCode = '';\n url: string | undefined;\n\n constructor({ code, fromHtml, initial, prefetch, preload, url }: IStyleOption) {\n this.scoped = false;\n this.code = code;\n this.prefetch = prefetch ?? false;\n this.preload = preload ?? false;\n this.url = url;\n this.fromHtml = fromHtml;\n this.initial = initial ?? false;\n }\n\n /**\n * 通用样式作用域处理\n * @param styleElement 样式元素\n * @param app 应用实例\n */\n commonScoped(styleElement: HTMLStyleElement, app: BaseModel): void {\n if (app.scopeCss && !(app.container instanceof ShadowRoot)) {\n this.applyScopedCSS(styleElement, app);\n } else {\n this.applyUnscopedCSS(styleElement, app);\n }\n this.scoped = true;\n }\n\n /**\n * 创建样式元素\n */\n createStyleElement(): HTMLStyleElement {\n const styleElement = document.createElement('style');\n if (styleElement.__BK_WEWEB_APP_KEY__) {\n styleElement.__BK_WEWEB_APP_KEY__ = undefined;\n }\n return styleElement;\n }\n\n /**\n * 执行样式代码\n * @param app 应用实例\n * @returns 返回执行后的style标签\n */\n async executeCode(app: BaseModel): Promise<HTMLStyleElement> {\n app.registerRunningApp();\n let styleElement = this.createStyleElement();\n styleElement.setAttribute('type', STYLE_ATTRIBUTES.TYPE);\n styleElement.textContent = this.code;\n\n try {\n if (!this.code) {\n await this.getCode(app);\n }\n styleElement = this.scopedStyleCSS(app, styleElement);\n this.scoped = true;\n } catch (error) {\n console.error('scoped style error', error);\n }\n\n return styleElement;\n }\n\n /**\n * 获取样式代码\n */\n async getCode(app?: BaseModel): Promise<string> {\n if (this.code.length || !this.url) {\n return this.code;\n }\n\n const code = this.getCodeFromAppSource(app) || this.getCodeFromCache() || (await this.fetchCodeFromRemote(app));\n\n this.code = code;\n return code;\n }\n\n /**\n * 检查并链接基础应用样式\n * @param styleElement 样式元素\n * @param app 应用实例\n * @returns 是否已链接基础样式\n */\n linkedBaseStyle(styleElement: HTMLStyleElement, app: BaseModel): boolean {\n if (\n !(app.container instanceof ShadowRoot) &&\n styleElement.textContent &&\n appCache.getBaseAppStyle(styleElement.textContent)\n ) {\n this.clearStyleElement(styleElement);\n styleElement.setAttribute(STYLE_ATTRIBUTES.LINKED_FROM_BASE, 'true');\n return true;\n }\n return false;\n }\n\n /**\n * 重置包装规则\n */\n resetPackRule(rule: PackRuleType, prefix: string, packName: string): string {\n const result = this.scopeRule(Array.from(rule.cssRules), prefix);\n return `@${packName} ${rule.conditionText} {${result}}`;\n }\n\n /**\n * 重置URL地址\n */\n resetUrlHost(cssText: string, uri: string, linkPath?: string): string {\n let baseURI = uri;\n return cssText.replace(CSS_SELECTORS.URL_PATTERN, (text, matchedUrl) => {\n if (CSS_SELECTORS.DATA_BLOB_PROTOCOL.test(matchedUrl) || CSS_SELECTORS.HTTP_PROTOCOL.test(matchedUrl)) {\n return text;\n }\n\n if (CSS_SELECTORS.RELATIVE_PATH.test(matchedUrl) && linkPath) {\n baseURI = this.buildBaseURI(linkPath);\n }\n\n return `url(\"${fillUpPath(matchedUrl, baseURI)}\")`;\n });\n }\n\n /**\n * css rule 处理\n */\n scopeRule(rules: CSSRule[], cssPrefix: string): string {\n let result = '';\n\n for (const rule of rules) {\n switch (rule.type) {\n case CssRuleEnum.STYLE_RULE:\n result += this.scopeStyleRule(rule as CSSStyleRule, cssPrefix);\n break;\n case CssRuleEnum.MEDIA_RULE:\n result += this.resetPackRule(rule as CSSMediaRule, cssPrefix, PACK_RULE_NAMES.MEDIA);\n break;\n case CssRuleEnum.SUPPORTS_RULE:\n result += this.resetPackRule(rule as CSSSupportsRule, cssPrefix, PACK_RULE_NAMES.SUPPORTS);\n break;\n default:\n result += rule.cssText;\n break;\n }\n }\n\n return result.replace(/^\\s+/, '');\n }\n\n /**\n * style rule 处理\n */\n scopeStyleRule(rule: CSSStyleRule, prefix: string): string {\n const { cssText, selectorText } = rule;\n\n if (CSS_SELECTORS.ROOT_SELECTOR.test(selectorText)) {\n return cssText.replace(CSS_SELECTORS.ROOT_SELECTOR, prefix);\n }\n\n if (selectorText === '*') {\n return cssText.replace('*', `${prefix} *`);\n }\n\n return cssText.replace(/^[\\s\\S]+{/, selectors =>\n selectors.replace(/(^|,)([^,]+)/g, (all, delimiter, selector) => {\n if (CSS_SELECTORS.BUILT_IN_ROOT_SELECTOR.test(selector)) {\n return all.replace(CSS_SELECTORS.BUILT_IN_ROOT_SELECTOR, prefix);\n }\n return `${delimiter} ${prefix} ${selector.replace(/^\\s*/, '')}`;\n }),\n );\n }\n\n /**\n * link style 处理\n */\n scopedLinkCSS(app: BaseModel, linkElement: HTMLLinkElement): HTMLStyleElement {\n const styleElement = this.createStyleElement();\n styleElement.setAttribute('type', STYLE_ATTRIBUTES.TYPE);\n\n const needKeepAlive = !!app.keepAlive && !(app.container instanceof ShadowRoot);\n setMarkElement(styleElement, app, needKeepAlive);\n const container = needKeepAlive ? document.head : app.container;\n\n try {\n if (this.code) {\n this.handleExistingCode(styleElement, app, container, linkElement);\n } else if (linkElement.getAttribute('href')) {\n this.handleHrefAttribute(styleElement, app, container, linkElement);\n } else {\n this.handleMissingHref(styleElement, app, container, linkElement);\n }\n } catch {\n linkElement && dispatchLinkOrScriptError(linkElement);\n }\n\n return styleElement;\n }\n\n /**\n * 隔离 style\n */\n scopedStyleCSS(app: BaseModel, styleElement: HTMLStyleElement): HTMLStyleElement {\n const needKeepAlive = !!app.keepAlive && !(app.container instanceof ShadowRoot);\n setMarkElement(styleElement, app, needKeepAlive);\n\n if (this.code || styleElement.textContent) {\n this.processExistingContent(styleElement, app);\n } else {\n this.observeContentChanges(styleElement, app);\n }\n\n if (this.url) {\n styleElement.setAttribute(STYLE_ATTRIBUTES.ORIGIN_SRC, this.url);\n }\n\n return styleElement;\n }\n\n /**\n * 应用隔离 style\n */\n private applyScopedCSS(styleElement: HTMLStyleElement, app: BaseModel): void {\n const cssStyleSheet = new CSSStyleSheet({ disabled: true });\n cssStyleSheet.replaceSync(styleElement.textContent || this.code);\n const rules: CSSRule[] = Array.from(cssStyleSheet?.cssRules ?? []);\n const cssPrefix = `#${app.name}`;\n const scopedCss = this.scopeRule(rules, cssPrefix);\n const cssText = this.resetUrlHost(scopedCss, app.url, this.url);\n styleElement.textContent = cssText;\n this.scopedCode = cssText;\n }\n\n private applyUnscopedCSS(styleElement: HTMLStyleElement, app: BaseModel): void {\n const cssText = this.resetUrlHost(styleElement.textContent || this.code || '', app.url, this.url);\n\n // fix https://bugs.chromium.org/p/chromium/issues/detail?id=336876\n if (cssText && app.container instanceof ShadowRoot) {\n this.handleShadowRootFonts(cssText, app);\n }\n\n styleElement.textContent = cssText.replace(CSS_SELECTORS.ROOT_HOST_PATTERN, ':host');\n }\n\n /**\n * 处理ShadowRoot中的字体\n */\n private handleShadowRootFonts(cssText: string, app: BaseModel): void {\n let fontContent = '';\n const fontFaces = cssText.match(CSS_SELECTORS.FONT_FACE) || [];\n\n for (const fontFace of fontFaces) {\n fontContent += `${fontFace}\\n`;\n }\n\n const rawDocument = app.sandBox?.rawDocument;\n if (rawDocument && fontContent) {\n const fontStyle = rawDocument.createElement('style');\n fontStyle.setAttribute('type', STYLE_ATTRIBUTES.TYPE);\n fontStyle.setAttribute('powered-by', STYLE_ATTRIBUTES.POWERED_BY);\n fontStyle.textContent = fontContent;\n rawDocument?.head?.append(fontStyle);\n }\n }\n\n private getCodeFromAppSource(app?: BaseModel): string {\n if (this.url && app?.source?.styles?.has(this.url)) {\n return app.source.styles.get(this.url)?.code || '';\n }\n return '';\n }\n private getCodeFromCache(): string {\n if (this.url && appCache.getCacheStyle(this.url)) {\n const style = appCache.getCacheStyle(this.url);\n return style?.code || '';\n }\n return '';\n }\n private async fetchCodeFromRemote(app?: BaseModel): Promise<string> {\n return await fetchSource(this.url!, {}, app).catch(() => '');\n }\n private clearStyleElement(styleElement: HTMLStyleElement): void {\n styleElement.textContent = '';\n styleElement.innerHTML = '';\n }\n private buildBaseURI(linkPath: string): string {\n const pathArr = linkPath.split('/');\n pathArr.pop();\n return addUrlProtocol(`${pathArr.join('/')}/`);\n }\n private handleExistingCode(\n styleElement: HTMLStyleElement,\n app: BaseModel,\n container: Element | ShadowRoot | null | undefined,\n linkElement: HTMLLinkElement,\n ): void {\n this.commonScoped(styleElement, app);\n container?.prepend(styleElement);\n linkElement && dispatchLinkOrScriptLoad(linkElement);\n }\n\n /**\n * 处理href属性\n */\n private handleHrefAttribute(\n styleElement: HTMLStyleElement,\n app: BaseModel,\n container: Element | ShadowRoot | null | undefined,\n linkElement: HTMLLinkElement,\n ): void {\n this.url = fillUpPath(linkElement.getAttribute('href')!, app.url);\n this.getCode(app).then(() => {\n this.scopedStyleCSS(app, styleElement);\n linkElement.remove();\n container?.prepend(styleElement);\n linkElement && dispatchLinkOrScriptLoad(linkElement);\n this.scoped = true;\n });\n }\n\n /**\n * 处理缺失的href\n */\n private handleMissingHref(\n styleElement: HTMLStyleElement,\n app: BaseModel,\n container: Element | ShadowRoot | null | undefined,\n linkElement: HTMLLinkElement,\n ): void {\n const observer = new MutationObserver(() => {\n const href = linkElement.getAttribute('href');\n if (!href) return;\n observer.disconnect();\n this.url = fillUpPath(href, app.url);\n this.getCode(app).then(() => {\n this.scopedStyleCSS(app, styleElement);\n linkElement.remove();\n container?.prepend(styleElement);\n linkElement && dispatchLinkOrScriptLoad(linkElement);\n this.scoped = true;\n });\n });\n\n const observerConfig: MutationObserverConfig = {\n attributeFilter: ['href'],\n childList: false,\n subtree: false,\n };\n\n observer.observe(linkElement, observerConfig);\n }\n\n private processExistingContent(styleElement: HTMLStyleElement, app: BaseModel): void {\n if (styleElement.textContent) {\n this.clearStyleElement(styleElement);\n }\n if (!this.linkedBaseStyle(styleElement, app)) {\n this.commonScoped(styleElement, app);\n }\n }\n private observeContentChanges(styleElement: HTMLStyleElement, app: BaseModel): void {\n const observer = new MutationObserver(() => {\n if (!(styleElement.textContent || styleElement.sheet?.cssRules?.length)) return;\n observer.disconnect();\n if (!this.linkedBaseStyle(styleElement, app)) {\n this.commonScoped(styleElement, app);\n }\n });\n\n const observerConfig: MutationObserverConfig = {\n attributes: false,\n characterData: true,\n childList: true,\n subtree: true,\n };\n\n observer.observe(styleElement, observerConfig);\n }\n}\n\n/**\n * 执行应用样式\n */\nexport async function executeAppStyles(app: BaseModel, container?: Element | ShadowRoot): Promise<void> {\n const styleList: Style[] = Array.from(app.source?.styles?.values() || []);\n const promiseList: Promise<HTMLStyleElement>[] = [];\n\n for (const style of styleList) {\n promiseList.push(style.executeCode(app));\n }\n\n await Promise.all(promiseList).then((styleElementList: HTMLStyleElement[]) => {\n const parentElement = container || app.container;\n if (app.keepAlive && !(parentElement instanceof ShadowRoot)) {\n document.head.append(...styleElementList);\n } else {\n parentElement?.append(...styleElementList);\n }\n });\n}\n","/* eslint-disable @typescript-eslint/member-ordering */\n/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState, type ValueOfAppState } from '../common';\nimport { setCurrentRunningApp } from '../context/cache';\nimport SandBox from '../context/sandbox';\nimport { EntrySource } from '../entry/entry';\nimport { execAppScripts } from '../entry/script';\nimport { executeAppStyles } from '../entry/style';\nimport { CSS_ATTRIBUTE_KEY } from '../typings';\nimport { random } from '../utils/common';\n\nimport type { BaseModel, CallbackFunction, ContainerType, IJsModelProps } from '../typings';\nimport type { fetchSource } from '../utils/fetch';\nimport type { SourceType } from '../utils/load-source';\n\nconst DEFAULT_RANDOM_LENGTH = 5;\nconst WRAPPER_SUFFIX = '-wrapper';\n\ninterface RenderableInstance {\n render?: (container: HTMLElement, data: Record<string, unknown>) => void;\n}\n\ninterface ScriptInstanceInfo {\n exportInstance?: RenderableInstance & Record<string, unknown>;\n}\n\n/** BK-WEWEB 微模块模式类 */\nexport class MicroInstanceModel implements BaseModel {\n private state: ValueOfAppState = AppState.UNSET;\n\n appCacheKey: string;\n container?: ContainerType;\n data: Record<string, unknown>;\n fetchSource?: typeof fetchSource;\n initSource: SourceType;\n isPreLoad = false;\n keepAlive: boolean;\n name: string;\n sandBox?: SandBox;\n scopeCss = true;\n scopeJs = false;\n showSourceCode = true;\n source?: EntrySource;\n url: string;\n\n constructor(props: IJsModelProps & { fetchSource?: typeof fetchSource }) {\n this.name = props.id !== props.url ? props.id! : random(DEFAULT_RANDOM_LENGTH);\n this.appCacheKey = props.id || this.name;\n this.url = props.url;\n this.container = props.container ?? undefined;\n this.scopeJs = props.scopeJs ?? true;\n this.showSourceCode = props.showSourceCode ?? true;\n this.scopeCss = props.scopeCss ?? true;\n this.keepAlive = props.keepAlive ?? false;\n this.data = props.data ?? {};\n this.initSource = props.initSource ?? [];\n this.fetchSource = props.fetchSource;\n\n this.initializeSandBox();\n }\n\n /** 激活微模块 */\n activated<T = unknown>(container: ContainerType, callback?: CallbackFunction<T>): void {\n this.isPreLoad = false;\n this.state = AppState.ACTIVATED;\n\n if (this.container && container) {\n this.setContainerAttribute(container);\n this.transferNodes(container);\n this.container = container;\n this.initShadowRootContainer();\n this.sandBox?.activated();\n\n const scriptInfo = this.getScriptInfo();\n callback?.(this, scriptInfo?.exportInstance as T);\n }\n }\n\n /** 停用微模块 */\n deactivated(): void {\n this.state = AppState.DEACTIVATED;\n this.sandBox?.deactivated();\n }\n\n /** 挂载微模块 */\n mount<T = unknown>(container?: ContainerType, callback?: CallbackFunction<T>): void {\n this.isPreLoad = false;\n this.container = container ?? this.container!;\n this.initShadowRootContainer();\n this.state = AppState.MOUNTING;\n\n this.setContainerAttribute(this.container);\n this.setupContainer();\n this.executeStyles();\n this.sandBox?.activated();\n\n execAppScripts(this).finally(() => {\n this.state = AppState.MOUNTED;\n this.renderInstance();\n\n const scriptInfo = this.getScriptInfo();\n callback?.(this, scriptInfo?.exportInstance as T);\n });\n }\n\n /** 错误处理 */\n onError(): void {\n this.state = AppState.ERROR;\n }\n\n /** 挂载处理 */\n onMount(): void {\n if (this.isPreLoad) return;\n this.state = AppState.LOADED;\n this.mount();\n }\n\n /** 注册运行中的应用 */\n registerRunningApp(): void {\n setCurrentRunningApp(this);\n Promise.resolve().then(() => setCurrentRunningApp(null));\n }\n\n /** 启动微模块 */\n async start(): Promise<void> {\n if (!this.source || this.needsReload()) {\n this.source = new EntrySource(this.url);\n await this.source.importEntry(this);\n }\n }\n\n /** 卸载微模块 */\n unmount(needDestroy?: boolean): void {\n this.state = AppState.UNMOUNT;\n this.sandBox?.deactivated();\n\n if (needDestroy) {\n appCache.deleteApp(this.url);\n }\n\n if (this.container) {\n this.container.innerHTML = '';\n this.container = undefined;\n }\n }\n\n /** 初始化ShadowRoot容器 */\n initShadowRootContainer(): void {\n if (this.container instanceof ShadowRoot) {\n // inject echarts in shadowRoot\n Object.defineProperties(this.container, {\n getBoundingClientRect: {\n get() {\n return this.host.getBoundingClientRect;\n },\n },\n });\n }\n }\n\n set status(value: ValueOfAppState) {\n this.state = value;\n }\n\n get status(): ValueOfAppState {\n return this.state;\n }\n\n /** 初始化沙盒 */\n private initializeSandBox(): void {\n if (this.scopeJs) {\n this.sandBox = new SandBox(this);\n }\n }\n\n /** 设置容器属性 */\n private setContainerAttribute(container: ContainerType): void {\n if (container instanceof HTMLElement) {\n container.setAttribute(CSS_ATTRIBUTE_KEY, this.name);\n }\n }\n\n /** 转移节点到新容器 */\n private transferNodes(container: ContainerType): void {\n if (!this.container) return;\n\n const fragment = document.createDocumentFragment();\n const nodeList = Array.from(this.container.childNodes);\n\n for (const node of nodeList) {\n fragment.appendChild(node);\n }\n\n container.appendChild(fragment);\n }\n\n /** 设置容器 */\n private setupContainer(): void {\n if (this.container) {\n this.container.innerHTML = '';\n const instanceWrapper = this.createInstanceWrapper();\n this.container.appendChild(instanceWrapper);\n }\n }\n\n /** 执行样式 */\n private executeStyles(): void {\n if (this.source?.styles.size && this.container) {\n executeAppStyles(this, this.container);\n }\n }\n\n /** 创建实例包装器 */\n private createInstanceWrapper(): HTMLDivElement {\n const wrapper = document.createElement('div');\n wrapper.id = `${this.name}${WRAPPER_SUFFIX}`;\n return wrapper;\n }\n\n /** 渲染实例 */\n private renderInstance(): void {\n const scriptInfo = this.getScriptInfo();\n if (scriptInfo?.exportInstance?.render && this.container) {\n const targetContainer = this.container.querySelector(`#${this.name}${WRAPPER_SUFFIX}`) as HTMLElement;\n\n if (targetContainer) {\n scriptInfo.exportInstance.render(targetContainer, this.data);\n }\n }\n }\n\n /** 获取脚本信息 */\n private getScriptInfo(): ScriptInstanceInfo | undefined {\n const script = this.source?.getScript(this.url);\n return script\n ? { exportInstance: script.exportInstance as RenderableInstance & Record<string, unknown> }\n : undefined;\n }\n\n /** 检查是否需要重新加载 */\n private needsReload(): boolean {\n return this.status === AppState.ERROR || this.status === AppState.UNSET;\n }\n}\n\nexport const createInstance = (props: IJsModelProps): void => {\n const instance = new MicroInstanceModel(props);\n appCache.setApp(instance);\n instance.start().finally(() => instance.onMount());\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { getGlobalContextCode } from '../context/cache';\nimport { MicroAppModel } from '../mode/app';\nimport { MicroInstanceModel } from '../mode/instance';\nimport { setMarkElement } from '../utils';\nimport { fetchSource } from '../utils/fetch';\n\nimport type { BaseModel, IScriptOption } from '../typings';\n\n// 全局属性标记变量\nlet firstGlobalProp: string | undefined;\nlet secondGlobalProp: string | undefined;\nlet lastGlobalProp: string | undefined;\n\nconst STRICT_MODE_REGEX = /^\"use\\sstrict\";$/gim;\n\ntype ExecuteResult = Comment | HTMLScriptElement | undefined;\n\n/** Script脚本实例类 */\nexport class Script {\n async = false;\n code = '';\n defer = false;\n exportInstance?: unknown;\n fromHtml: boolean;\n blobUrl?: string;\n initial: boolean;\n isModule = false;\n scoped: boolean;\n url: string | undefined;\n\n constructor({ async, code, defer, fromHtml, initial, isModule, url }: IScriptOption) {\n this.code = code?.replace(STRICT_MODE_REGEX, '');\n this.async = async;\n this.defer = defer;\n this.isModule = isModule;\n this.url = url;\n this.scoped = false;\n this.fromHtml = fromHtml ?? false;\n this.initial = initial ?? false;\n this.blobUrl = undefined;\n }\n\n /** 执行脚本代码 */\n async executeCode(app: BaseModel, needReplaceScriptElement = false): Promise<ExecuteResult> {\n try {\n if (!this.code) await this.getCode(app);\n\n if (app instanceof MicroInstanceModel) {\n const globalWindow = app.scopeJs ? app.sandBox?.proxyWindow || window : window;\n noteGlobalProps(globalWindow);\n }\n\n const scopedCode = this.transformCode(app);\n if (this.isModule) {\n app.registerRunningApp();\n const scriptElement = document.createElement('script');\n let blobUrl = '';\n if (scriptElement.__BK_WEWEB_APP_KEY__) {\n scriptElement.__BK_WEWEB_APP_KEY__ = undefined;\n }\n if (this.url) {\n blobUrl = `${this.url.replace(/^\\//, `${app.url}/`)}?key=${Date.now()}`;\n } else {\n const blob = new Blob([scopedCode], { type: 'text/javascript' });\n blobUrl = URL.createObjectURL(blob);\n }\n scriptElement.src = blobUrl;\n scriptElement.type = 'module';\n if (needReplaceScriptElement) return scriptElement;\n const needKeepAlive = !!app.keepAlive && !(app.container instanceof ShadowRoot);\n const container = needKeepAlive ? document.head : app.container!;\n setMarkElement(scriptElement, app, needKeepAlive);\n container.appendChild(scriptElement);\n URL.revokeObjectURL(blobUrl);\n } else if (app.showSourceCode) {\n const scriptElement = document.createElement('script');\n if (scriptElement.__BK_WEWEB_APP_KEY__) {\n scriptElement.__BK_WEWEB_APP_KEY__ = undefined;\n }\n app.registerRunningApp();\n this.executeSourceScript(scriptElement, scopedCode);\n if (needReplaceScriptElement) return scriptElement;\n const needKeepAlive = !!app.keepAlive && !(app.container instanceof ShadowRoot);\n const container = needKeepAlive ? document.head : app.container!;\n setMarkElement(scriptElement, app, needKeepAlive);\n container.appendChild(scriptElement);\n } else {\n this.executeMemoryScript(app, scopedCode);\n if (needReplaceScriptElement) return document.createComment('【bk-weweb】dynamic script');\n }\n\n if (app instanceof MicroInstanceModel) {\n const globalWindow = app.scopeJs ? app.sandBox?.proxyWindow || window : window;\n // 判断是否是 iife var 的函数模块\n const isIifeVar = !!this.code.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').match(/^\\s*var\\s/);\n const exportProp = getGlobalProp(globalWindow, isIifeVar);\n if (exportProp) {\n this.exportInstance = (globalWindow as unknown as Record<string, unknown>)[exportProp];\n // window 下需清除全局副作用\n if (!app.scopeJs) {\n const descriptor = Object.getOwnPropertyDescriptor(globalWindow, exportProp);\n if (descriptor?.configurable) {\n delete (globalWindow as unknown as Record<string, unknown>)[exportProp];\n }\n }\n }\n }\n } catch (error) {\n console.error('execute script code error', error);\n }\n return;\n }\n\n /** 内存脚本执行 */\n executeMemoryScript(app: BaseModel, scopedCode: string): void {\n try {\n const isScopedLocation = app instanceof MicroAppModel && app.scopeLocation;\n app.registerRunningApp();\n\n new Function('window', 'location', 'history', scopedCode)(\n app.sandBox!.proxyWindow || window,\n isScopedLocation ? app.iframe!.contentWindow!.location : window.location,\n isScopedLocation ? app.iframe!.contentWindow!.history : window.history,\n );\n } catch (error) {\n console.error(error);\n }\n }\n\n /** 脚本标签执行 */\n executeSourceScript(scriptElement: HTMLScriptElement, scopedCode: string): void {\n if (this.isModule) {\n scriptElement.src = `${this.url}?key=${Date.now()}`;\n scriptElement.setAttribute('type', 'module');\n } else {\n scriptElement.textContent = scopedCode;\n }\n this.url && scriptElement.setAttribute('origin-src', this.url);\n }\n\n /** 获取脚本内容 */\n async getCode(app?: BaseModel): Promise<string> {\n if (this.code.length || !this.url || this.isModule) {\n return this.code;\n }\n\n let code = '';\n if (app?.source?.getScript(this.url)) {\n code = app.source.getScript(this.url)?.code || '';\n }\n if (!code && appCache.getCacheScript(this.url)) {\n code = appCache.getCacheScript(this.url)?.code || '';\n }\n if (!code) {\n code = await fetchSource(this.url, {}, app).catch(error => {\n console.error(`fetch script ${this.url} error`, error);\n return '';\n });\n }\n\n code = code.replace(STRICT_MODE_REGEX, '');\n this.code = code;\n return code;\n }\n\n setCode(code: string): void {\n this.code = code;\n }\n\n /** 转换脚本内容 */\n transformCode(app: BaseModel): string {\n const sourceMapUrl = this.url ? `//# sourceURL=${this.url}\\n` : '';\n if (app.sandBox) {\n if (this.isModule) {\n if (this.url) {\n return this.code;\n }\n const importList = this.code.match(/import\\s*.*(?:from)?\\s*\"([^\"]+)\";/gm);\n for (const item of importList || []) {\n this.code = this.code.replace(item, item.replace(/\"\\//, `\"${app.url}/`).replace(/\"$/, `?key=${Date.now()}\"`));\n }\n return `\n ${this.code};\n `;\n }\n if (app.showSourceCode) {\n return `;(function(window, self, globalThis){\n with(window){\n ${getGlobalContextCode()}\\n\n ${this.code}\\n\n ${sourceMapUrl}\n }\n }).call(window['${app.sandBox.windowSymbolKey}'],\n window['${app.sandBox.windowSymbolKey}'], window['${app.sandBox.windowSymbolKey}'], window['${app.sandBox.windowSymbolKey}']);`;\n }\n return `\n with(window) {\n try {\n ${getGlobalContextCode()}\\n\n ${this.code}\\n\n ${sourceMapUrl}\n }\n catch(e) {\n console.error(e)\n }\n }\n `;\n }\n return this.code;\n }\n}\n\n/** 全局属性是否跳过标记 */\nexport function shouldSkipProperty(global: Window, property: number | string): boolean {\n const globalWindow = global as unknown as Record<string, unknown>;\n return (\n // biome-ignore lint/suspicious/noPrototypeBuiltins: <explanation>\n !global.hasOwnProperty(property) ||\n (!Number.isNaN(property) && (property as number) < global.length) ||\n (typeof navigator !== 'undefined' &&\n navigator.userAgent.indexOf('Trident') !== -1 &&\n Boolean(globalWindow[property]) &&\n typeof window !== 'undefined' &&\n (globalWindow[property] as { parent?: Window })?.parent === window)\n );\n}\n\n/** 获取脚本执行后绑定的export实例 */\nexport function getGlobalProp(global: Window, useFirstGlobalProp?: boolean): string | undefined {\n let cnt = 0;\n let foundLastProp: boolean | undefined;\n let result: string | undefined;\n\n for (const property in global) {\n // do not check frames cause it could be removed during import\n if (shouldSkipProperty(global, property)) continue;\n\n if ((cnt === 0 && property !== firstGlobalProp) || (cnt === 1 && property !== secondGlobalProp)) {\n return property;\n }\n\n if (foundLastProp) {\n lastGlobalProp = property;\n result = (useFirstGlobalProp && result) || property;\n } else {\n foundLastProp = property === lastGlobalProp;\n }\n cnt += 1;\n }\n\n return result;\n}\n\n/** 标记全局属性 */\nexport function noteGlobalProps(global: Window): string | undefined {\n secondGlobalProp = undefined;\n firstGlobalProp = secondGlobalProp;\n\n for (const property in global) {\n if (shouldSkipProperty(global, property)) continue;\n\n if (!firstGlobalProp) {\n firstGlobalProp = property;\n } else if (!secondGlobalProp) {\n secondGlobalProp = property;\n }\n lastGlobalProp = property;\n }\n\n return lastGlobalProp;\n}\n\n/**\n * app初始化dom脚本执行\n */\nexport async function execAppScripts(app: BaseModel): Promise<void> {\n // const appInitialScriptList = Array.from(app.source!.scripts.values()).filter(script => script.initial);\n // // 初始化脚本最先执行\n // if (appInitialScriptList.length) {\n // await Promise.all(appInitialScriptList.map(script => script.executeCode(app)));\n // }\n\n const appScriptList = Array.from(app.source!.scripts.values()).filter(script => script.fromHtml || script.initial);\n const commonList = appScriptList.filter(\n script => (!script.async && !script.defer) || (script.isModule && !script.fromHtml),\n );\n\n // 保证同步脚本和module类型最先执行\n await Promise.all(commonList.map(script => script.getCode(app)));\n await Promise.all(commonList.map(script => script.executeCode(app)));\n\n // 最后执行defer和async脚本\n const deferScriptList: Promise<ExecuteResult>[] = [];\n const asyncScriptList: Promise<ExecuteResult>[] = [];\n\n // async defer 脚本执行\n for (const script of appScriptList) {\n if (script.defer || script.async) {\n if (!script.code && script.defer) {\n deferScriptList.push(script.executeCode(app));\n } else {\n asyncScriptList.push(script.executeCode(app));\n }\n }\n }\n\n await Promise.all([...asyncScriptList, ...deferScriptList]).catch(error => {\n console.error(error);\n });\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { appCache } from '../cache/app-cache';\nimport { getCurrentRunningApp } from '../context/cache';\nimport { Script } from '../entry/script';\nimport { Style } from '../entry/style';\nimport { isJsonpUrl, randomUrl } from './common';\nimport { dispatchLinkOrScriptLoad } from './custom';\n\nimport type { BaseModel } from '../typings';\n\nexport type DOMMethod = <T extends Node = Node>(this: HTMLElement | Node, ...args: unknown[]) => T;\ntype SpecialElement = HTMLLinkElement | HTMLScriptElement | HTMLStyleElement;\n\n// 原生DOM方法缓存\nconst { appendChild: bodyAppendChild } = HTMLBodyElement.prototype;\n\n/** 处理样式元素 */\nconst handleStyleElement = (child: HTMLStyleElement, app: BaseModel): Node => {\n if (child.hasAttribute('exclude')) {\n return document.createComment('【bk-weweb】style with exclude attribute is ignored');\n }\n\n if (child.textContent) {\n // 父级应用样式已生效情况下,忽略子应用对应样式(web component的隔离下优化不生效)\n if (!(app.container instanceof ShadowRoot) && appCache.getBaseAppStyle(child.textContent)) {\n return document.createComment('【bk-weweb】style is effective in base app');\n }\n }\n\n if (!child.hasAttribute('ignore')) {\n const styleInstance = new Style({\n code: child.textContent || '',\n fromHtml: false,\n url: '',\n });\n app.source?.setStyle(randomUrl(), styleInstance);\n styleInstance.scopedStyleCSS(app, child);\n }\n\n return child;\n};\n\n/** 处理链接元素 */\nconst handleLinkElement = (child: HTMLLinkElement, parent: Node, app: BaseModel): Node => {\n const result = app.source?.collectLink(child, parent, true);\n if (!result) return child;\n\n if (result.style) {\n result.style.scopedLinkCSS(app, child);\n }\n\n return result.replace !== child ? result.replace : child;\n};\n\n/** 处理动态脚本观察器 */\nconst createScriptObserver = (child: HTMLScriptElement, parent: Node, app: BaseModel): MutationObserver => {\n const observer = new MutationObserver(() => {\n if (child.getAttribute('src')) {\n observer.disconnect();\n const scriptInfo = app.source!.collectScript(child, parent, true);\n\n if (scriptInfo?.replace) {\n bodyAppendChild.call(app.container, scriptInfo.replace);\n }\n\n // 处理异步JSONP\n if (isJsonpUrl(child.getAttribute('src'))) {\n app.container?.append(child);\n return;\n }\n\n if (scriptInfo?.script) {\n scriptInfo.script.executeCode(app);\n }\n child.remove();\n } else if (child.textContent) {\n observer.disconnect();\n const scriptInstance = new Script({\n async: false,\n code: child.textContent,\n defer: child.type === 'module',\n fromHtml: false,\n isModule: child.type === 'module',\n });\n\n app.source!.scripts.set(randomUrl(), scriptInstance);\n\n try {\n scriptInstance.executeCode(app);\n } catch (error) {\n console.error(error);\n } finally {\n if (!scriptInstance.isModule) {\n dispatchLinkOrScriptLoad(child);\n }\n child.remove();\n }\n }\n });\n\n return observer;\n};\n\n/** 处理脚本元素 */\nconst handleScriptElement = (child: HTMLScriptElement, parent: Node, app: BaseModel): Node => {\n const replaceInfo = app.source!.collectScript(child, parent, true);\n if (!replaceInfo) {\n return child;\n }\n\n if (replaceInfo.script) {\n replaceInfo.script.executeCode(app);\n }\n\n if (replaceInfo.replace !== child) {\n return replaceInfo.replace;\n }\n\n // 处理动态脚本\n if (app.scopeJs && !child.getAttribute('src') && !child.textContent) {\n const observer = createScriptObserver(child, parent, app);\n observer.observe(child, { attributeFilter: ['src'], childList: true, subtree: false });\n return document.createComment('【bk-weweb】dynamic script or module');\n }\n\n return child;\n};\n\n/** 重置新元素,根据元素类型进行相应处理 */\nexport const resetNewElement = (parent: Node, child: Node, app: BaseModel): Node => {\n if (child instanceof HTMLStyleElement) {\n return handleStyleElement(child, app);\n }\n\n if (child instanceof HTMLLinkElement) {\n return handleLinkElement(child, parent, app);\n }\n\n if (child instanceof HTMLScriptElement) {\n return handleScriptElement(child, parent, app);\n }\n\n return child;\n};\n\n/** 判断是否为特殊元素(script、style、link) */\nexport const isSpecialElement = (node: Node): node is SpecialElement => {\n return node instanceof HTMLScriptElement || node instanceof HTMLStyleElement || node instanceof HTMLLinkElement;\n};\n\n/** 获取目标容器 */\nconst getTargetContainer = (app: BaseModel, isSpecial: boolean): Node => {\n const needKeepAlive = isSpecial && !!app.keepAlive && !(app.container instanceof ShadowRoot);\n return needKeepAlive ? document.head : app.container!;\n};\n\n/**\n * 元素添加处理器\n * @param parent 父节点\n * @param newChild 新子节点\n * @param rawMethod 原始方法\n * @returns 处理结果\n */\nexport const elementAppendHandler = (parent: Node, newChild: Node, rawMethod: DOMMethod): Node => {\n if (!newChild.__BK_WEWEB_APP_KEY__) {\n return rawMethod.call(parent, newChild);\n }\n const app = appCache.getApp(newChild.__BK_WEWEB_APP_KEY__) || getCurrentRunningApp();\n if (!app?.container) {\n return rawMethod.call(parent, newChild);\n }\n\n const targetChild = resetNewElement(parent, newChild, app);\n const isSpecial = isSpecialElement(newChild);\n const needKeepAlive = isSpecial && !!app.keepAlive && !(app.container instanceof ShadowRoot);\n const container = getTargetContainer(app, isSpecial);\n\n setMarkElement(targetChild as Element, app, needKeepAlive);\n return rawMethod.call(container, targetChild);\n};\n\n/**\n * 元素插入处理器\n * @param parent 父节点\n * @param newChild 新子节点\n * @param passiveChild 参考节点\n * @param rawMethod 原始方法\n * @returns 处理结果\n */\nexport const elementInsertHandler = (\n parent: Node,\n newChild: Node,\n passiveChild: Node | null,\n rawMethod: DOMMethod,\n): Node => {\n if (!newChild.__BK_WEWEB_APP_KEY__) {\n return rawMethod.call(parent, newChild, passiveChild);\n }\n\n const app = appCache.getApp(newChild.__BK_WEWEB_APP_KEY__) || getCurrentRunningApp();\n if (!app?.container) {\n return rawMethod.call(parent, newChild, passiveChild);\n }\n\n const isSpecial = isSpecialElement(newChild);\n const needKeepAlive = isSpecial && app.keepAlive && !(app.container instanceof ShadowRoot);\n const container = getTargetContainer(app, isSpecial);\n const targetChild = resetNewElement(parent, newChild, app);\n\n if (needKeepAlive) {\n setMarkElement(targetChild as Element, app, needKeepAlive);\n }\n\n if (passiveChild && !container.contains(passiveChild)) {\n return bodyAppendChild.call(container, targetChild);\n }\n\n return rawMethod.call(container, targetChild, passiveChild);\n};\n\n/**\n * 设置元素标记\n * @param element 元素\n * @param app 应用实例\n * @param keepAlive 是否保持活跃\n * @returns 标记后的元素\n */\nexport const setMarkElement = <T extends Element>(element: T, app?: BaseModel, keepAlive?: boolean): T => {\n if (keepAlive && app) {\n element.__KEEP_ALIVE__ = app.appCacheKey;\n element.setAttribute('data-from', app.name);\n element.setAttribute('data-keep-alive', 'true');\n }\n element.setAttribute?.('powered-by', 'bk-weweb');\n return element;\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * Document 代理模块\n * @description 为微前端应用创建代理 document 对象,实现 DOM 隔离和沙箱环境\n */\n\nimport { fillUpPath } from '../utils';\n\nimport type { BaseModel } from '../typings/model';\n\n/**\n * 特殊元素标签名称\n * @description 这些标签在查询时需要特殊处理,通常指向宿主环境的元素\n */\nconst SPECIAL_ELEMENT_TAGS = ['body', 'html', 'head'] as const;\n\n/**\n * 应用容器键名\n * @description 用于标记元素所属的微前端应用\n */\nconst APP_KEY_PROPERTY = '__BK_WEWEB_APP_KEY__' as const;\n\n/**\n * 插入位置类型映射\n * @description 定义 insertAdjacentHTML 方法支持的插入位置\n */\ntype InsertPosition = 'afterbegin' | 'afterend' | 'beforebegin' | 'beforeend';\n\n/**\n * ShadowRoot insertAdjacentHTML 实现\n * @description 在 ShadowRoot 环境下实现 insertAdjacentHTML 方法\n * @param app - 应用实例\n * @param where - 插入位置\n * @param domString - 要插入的 HTML 字符串\n */\nfunction createShadowRootInsertAdjacentHTML(app: BaseModel) {\n return function shadowRootInsertAdjacentHTML(where: InsertPosition, domString: string): void {\n const temporaryContainer = document.createElement('div');\n temporaryContainer.innerHTML = domString;\n const elements = Array.from(temporaryContainer.childNodes);\n const shadow = app.container! as ShadowRoot;\n\n switch (where) {\n case 'beforebegin':\n for (const item of elements) {\n shadow.host.parentNode?.insertBefore(item, shadow.host);\n }\n break;\n case 'afterbegin':\n for (const item of elements.reverse()) {\n shadow.insertBefore(item, shadow.firstChild);\n }\n break;\n case 'beforeend':\n for (const item of elements) {\n shadow.appendChild(item);\n }\n break;\n case 'afterend':\n for (const item of elements) {\n shadow.host.parentNode?.insertBefore(item, shadow.host.nextSibling);\n }\n break;\n }\n };\n}\n\n/**\n * 创建代理 body 对象\n * @description 为微前端应用创建隔离的 body 代理对象\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @returns ProxyHandler<{}> - body 代理对象\n */\nfunction createProxyBody(rawDocument: Document, app: BaseModel) {\n return new Proxy(\n {},\n {\n get(_, key) {\n // ShadowRoot 环境处理\n if (app.container instanceof ShadowRoot) {\n if (key === 'insertAdjacentHTML') {\n return createShadowRootInsertAdjacentHTML(app);\n }\n\n const value = Reflect.get(app.container, key);\n if (typeof value === 'function') {\n return value.bind(app.container);\n }\n if (value !== undefined) {\n return value;\n }\n }\n\n // 默认使用原始 document.body\n const value = Reflect.get(rawDocument.body, key);\n return typeof value === 'function' ? value.bind(rawDocument.body) : value;\n },\n\n set(_, key, value) {\n if (app.container instanceof ShadowRoot) {\n Reflect.set(app.container, key, value);\n return true;\n }\n\n Reflect.set(rawDocument.body, key, value);\n return true;\n },\n },\n );\n}\n\n/**\n * 创建元素并标记应用归属\n * @description 重写 createElement 方法,为创建的元素标记所属应用\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @returns createElement 函数\n */\nfunction createElementWithAppKey(rawDocument: Document, app: BaseModel) {\n return function createElement<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n options?: ElementCreationOptions | undefined,\n ) {\n const element = ((window as unknown as { rawDocument: Document }).rawDocument || rawDocument).createElement(\n tagName,\n options,\n );\n\n // 为元素标记所属应用\n (element as HTMLElement & { [APP_KEY_PROPERTY]: string })[APP_KEY_PROPERTY] = app.appCacheKey;\n\n // 处理图片元素的 src 属性\n if (element instanceof HTMLImageElement) {\n Object.defineProperty(element, 'src', {\n get() {\n return element.getAttribute('src');\n },\n set(value) {\n element.setAttribute('src', fillUpPath(value, app.url));\n },\n });\n }\n\n return element;\n };\n}\n\n/**\n * 检查是否为特殊元素标签\n * @description 判断选择器是否匹配特殊元素标签\n * @param selector - CSS 选择器字符串\n * @returns boolean - 是否为特殊元素标签\n */\nfunction isSpecialElementTag(selector: string): boolean {\n return (SPECIAL_ELEMENT_TAGS as readonly string[]).includes(selector);\n}\n\n/**\n * 安全执行查询选择器\n * @description 在容器中安全执行查询,捕获可能的异常\n * @param container - 查询容器\n * @param selector - CSS 选择器\n * @returns Element | null - 查询结果\n */\nfunction safeQuerySelector(container: Element | ShadowRoot | null | undefined, selector: string): Element | null {\n try {\n return container?.querySelector(selector) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * 安全执行查询所有选择器\n * @description 在容器中安全执行查询所有,捕获可能的异常\n * @param container - 查询容器\n * @param selector - CSS 选择器\n * @returns NodeListOf<Element> - 查询结果集合\n */\nfunction safeQuerySelectorAll(\n container: Element | ShadowRoot | null | undefined,\n selector: string,\n): NodeListOf<Element> {\n try {\n return container?.querySelectorAll(selector) ?? ([] as unknown as NodeListOf<Element>);\n } catch {\n return [] as unknown as NodeListOf<Element>;\n }\n}\n\n/**\n * 创建代理查询选择器方法\n * @description 重写 querySelector 方法,支持容器隔离\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @param proxyBody - 代理 body 对象\n * @returns querySelector 函数\n */\nfunction createProxyQuerySelector(rawDocument: Document, app: BaseModel, proxyBody: unknown) {\n return function querySelectorNew(this: Document, selectors: string): Element | null {\n if (selectors === proxyBody) {\n return app.container instanceof ShadowRoot ? (app.container as unknown as Element) : rawDocument.body;\n }\n\n if (isSpecialElementTag(selectors)) {\n if (app?.container instanceof ShadowRoot) {\n return app?.container as unknown as Element;\n }\n return rawDocument.querySelector.call(this, selectors);\n }\n\n return safeQuerySelector(app?.container, selectors);\n };\n}\n\n/**\n * 创建代理查询所有选择器方法\n * @description 重写 querySelectorAll 方法,支持容器隔离\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @returns querySelectorAll 函数\n */\nfunction createProxyQuerySelectorAll(rawDocument: Document, app: BaseModel) {\n return function querySelectorAllNew(selectors: string): NodeListOf<Element> {\n if (isSpecialElementTag(selectors)) {\n if (app?.container instanceof ShadowRoot) {\n return [app?.container] as unknown as NodeListOf<Element>;\n }\n const result = rawDocument.querySelector(selectors);\n return result ? ([result] as unknown as NodeListOf<Element>) : ([] as unknown as NodeListOf<Element>);\n }\n\n return safeQuerySelectorAll(app?.container, selectors);\n };\n}\n\n/**\n * 创建代理 getElementById 方法\n * @description 重写 getElementById 方法,支持容器隔离\n * @param rawDocument - 原始 document 对象\n * @param querySelector - 代理的 querySelector 方法\n * @returns getElementById 函数\n */\nfunction createProxyGetElementById(\n rawDocument: Document,\n querySelector: (this: Document, selectors: string) => Element | null,\n) {\n return function getElementByIdNew(id: string): HTMLElement | null {\n return querySelector.call(rawDocument, `#${id}`) as HTMLElement | null;\n };\n}\n\n/**\n * 创建代理 getElementsByClassName 方法\n * @description 重写 getElementsByClassName 方法,支持容器隔离\n * @param querySelectorAll - 代理的 querySelectorAll 方法\n * @returns getElementsByClassName 函数\n */\nfunction createProxyGetElementsByClassName(querySelectorAll: (selectors: string) => NodeListOf<Element>) {\n return function getElementsByClassName(className: string): HTMLCollectionOf<Element> {\n return querySelectorAll(`.${className}`) as unknown as HTMLCollectionOf<Element>;\n };\n}\n\n/**\n * 创建代理 getElementsByTagName 方法\n * @description 重写 getElementsByTagName 方法,支持容器隔离\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @param querySelectorAll - 代理的 querySelectorAll 方法\n * @returns getElementsByTagName 函数\n */\nfunction createProxyGetElementsByTagName(\n rawDocument: Document,\n app: BaseModel,\n querySelectorAll: (selectors: string) => NodeListOf<Element>,\n) {\n return function getElementsByTagName<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n ): HTMLCollectionOf<HTMLElementTagNameMap[K]> {\n if (isSpecialElementTag(tagName) || (!app?.showSourceCode && tagName.toLowerCase() === 'script')) {\n return rawDocument.getElementsByTagName(tagName);\n }\n\n return querySelectorAll(tagName) as unknown as HTMLCollectionOf<HTMLElementTagNameMap[K]>;\n };\n}\n\n/**\n * 创建代理 getElementsByName 方法\n * @description 重写 getElementsByName 方法,支持容器隔离\n * @param querySelectorAll - 代理的 querySelectorAll 方法\n * @returns getElementsByName 函数\n */\nfunction createProxyGetElementsByName(querySelectorAll: (selectors: string) => NodeListOf<Element>) {\n return function getElementsByNameNew(name: string): NodeListOf<HTMLElement> {\n return querySelectorAll(`[name=\"${name}\"]`) as unknown as NodeListOf<HTMLElement>;\n };\n}\n\n/**\n * 创建代理 document 方法映射\n * @description 创建所有需要代理的 document 方法\n * @param rawDocument - 原始 document 对象\n * @param app - 应用实例\n * @param proxyBody - 代理 body 对象\n * @returns 代理方法映射对象\n */\nfunction createProxyMethodMap(rawDocument: Document, app: BaseModel, proxyBody: unknown) {\n const createElement = createElementWithAppKey(rawDocument, app);\n const querySelector = createProxyQuerySelector(rawDocument, app, proxyBody);\n const querySelectorAll = createProxyQuerySelectorAll(rawDocument, app);\n const getElementById = createProxyGetElementById(rawDocument, querySelector);\n const getElementsByClassName = createProxyGetElementsByClassName(querySelectorAll);\n const getElementsByTagName = createProxyGetElementsByTagName(rawDocument, app, querySelectorAll);\n const getElementsByName = createProxyGetElementsByName(querySelectorAll);\n\n return {\n createElement: createElement.bind(rawDocument),\n querySelector: querySelector.bind(rawDocument),\n querySelectorAll: querySelectorAll.bind(rawDocument),\n getElementById: getElementById.bind(rawDocument),\n getElementsByClassName: getElementsByClassName.bind(rawDocument),\n getElementsByTagName: getElementsByTagName.bind(rawDocument),\n getElementsByName: getElementsByName.bind(rawDocument),\n };\n}\n\n/**\n * 创建代理 document 对象\n * @description 为微前端应用创建隔离的 document 代理对象,实现 DOM 隔离\n *\n * 主要功能:\n * 1. 代理 body 对象,支持 ShadowRoot 环境\n * 2. 重写 DOM 查询方法,实现容器隔离\n * 3. 标记创建的元素归属,便于应用管理\n * 4. 支持特殊元素标签的原生访问\n *\n * @param rawDocument - 原始 document 对象\n * @param app - 微前端应用实例\n * @returns Document - 代理后的 document 对象\n *\n * @example\n * ```typescript\n * const proxyDoc = createProxyDocument(document, appInstance);\n * // 使用代理后的 document 进行 DOM 操作\n * const element = proxyDoc.createElement('div');\n * const result = proxyDoc.querySelector('.my-class');\n * ```\n */\nexport const createProxyDocument = (rawDocument: Document, app: BaseModel): Document => {\n const fakeDocument = {};\n const proxyBody = createProxyBody(rawDocument, app);\n const methodMap = createProxyMethodMap(rawDocument, app, proxyBody);\n\n return new Proxy(fakeDocument, {\n get(_, key: string | symbol) {\n if (key === 'body') {\n return proxyBody;\n }\n\n if (typeof key === 'string' && key in methodMap) {\n return methodMap[key as keyof typeof methodMap];\n }\n\n // 默认处理:获取原始 document 的属性或方法\n const result = Reflect.get(rawDocument, key);\n return typeof result === 'function' ? result.bind(rawDocument) : result;\n },\n }) as Document;\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getCurrentRunningApp } from './cache';\n\nimport type { DocumentEventListener } from '../typings';\n\n/**\n * 重写document和body的事件监听器\n * 支持微前端应用的事件隔离和keepAlive模式\n */\nexport function rewriteDocumentAndBodyEvent(): { resetDocumentAndBodyEvent: () => void } {\n // 保存原始的事件方法\n const { addEventListener, removeEventListener } = window.document;\n const { addEventListener: bodyAddEventListener, removeEventListener: bodyRemoveEventListener } = window.document.body;\n\n // 存储keepAlive模式下的事件监听器\n const documentListenerMap = new Map<keyof DocumentEventMap, DocumentEventListener[]>();\n\n // 重写document.addEventListener\n document.addEventListener = function <K extends keyof DocumentEventMap>(\n type: K,\n listener: DocumentEventListener,\n options?: AddEventListenerOptions | boolean | undefined,\n ): void {\n const app = getCurrentRunningApp();\n // keepAlive模式下保存监听器\n if (app?.keepAlive) {\n const listeners = documentListenerMap.get(type) || [];\n documentListenerMap.set(type, [...listeners, listener]);\n }\n // ShadowRoot容器特殊处理\n addEventListener.call(app?.container instanceof ShadowRoot ? app.container : this, type, listener, options);\n };\n\n // body使用相同的addEventListener\n document.body.addEventListener = document.addEventListener;\n\n // 重写document.removeEventListener\n document.removeEventListener = function <K extends keyof DocumentEventMap>(\n type: K,\n listener: DocumentEventListener,\n options?: AddEventListenerOptions | boolean,\n ): void {\n const app = getCurrentRunningApp();\n // keepAlive模式下移除保存的监听器\n if (app?.keepAlive) {\n const listeners = documentListenerMap.get(type) || [];\n if (listeners.length && listeners.some(l => l === listener)) {\n listeners.splice(listeners.indexOf(listener), 1);\n }\n }\n removeEventListener.call(app?.container instanceof ShadowRoot ? app.container : this, type, listener, options);\n };\n\n // body使用相同的removeEventListener\n document.body.removeEventListener = document.removeEventListener;\n\n /**\n * 重置事件监听器,恢复原始方法\n */\n function resetDocumentAndBodyEvent(): void {\n const app = getCurrentRunningApp();\n // 清理keepAlive模式下保存的事件监听器\n if (app?.keepAlive && documentListenerMap.values()) {\n for (const [type, listeners] of documentListenerMap.entries()) {\n for (const listener of listeners || []) {\n document.removeEventListener.call(document, type, listener);\n }\n }\n }\n // 恢复原始方法\n document.addEventListener = addEventListener;\n document.body.addEventListener = bodyAddEventListener;\n document.removeEventListener = removeEventListener;\n document.body.removeEventListener = bodyRemoveEventListener;\n documentListenerMap.clear();\n }\n\n return {\n resetDocumentAndBodyEvent,\n };\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n// 匹配类定义的正则\nconst CLASS_REGEX = /^class\\b/;\n\n// 匹配构造函数的正则(以大写字母开头的function)\nconst COMMON_CONSTRUCT_FU_REGEX = /^function\\b\\s[A-Z].*/;\n\n// 缓存构造函数判断结果\nconst ConstructFunCacheMap = new WeakMap<CallableFunction, boolean>();\n\n/**\n * 判断是否为构造函数\n */\nexport function isConstructFun(fn: CallableFunction) {\n if (fn.prototype?.constructor === fn && Object.getOwnPropertyNames(fn.prototype).length > 1) {\n return true;\n }\n\n if (ConstructFunCacheMap.has(fn)) {\n return ConstructFunCacheMap.get(fn);\n }\n\n const constructable = COMMON_CONSTRUCT_FU_REGEX.test(fn.toString()) || CLASS_REGEX.test(fn.toString());\n ConstructFunCacheMap.set(fn, constructable);\n return constructable;\n}\n\n// 存储函数绑定关系的映射\nconst functionBoundedValueMap = new WeakMap<CallableFunction, CallableFunction>();\n\n/**\n * 绑定函数到原始window\n */\nexport default function bindFunctionToRawWindow(rawWindow: Window, value: unknown): unknown {\n if (functionBoundedValueMap.has(value as CallableFunction)) {\n return functionBoundedValueMap.get(value as CallableFunction);\n }\n\n if (typeof value === 'function' && !isConstructFun(value)) {\n const boundValue = Function.prototype.bind.call(value, rawWindow);\n\n for (const key in value) {\n boundValue[key] = value[key];\n }\n\n if (Object.hasOwn(value, 'prototype') && !Object.hasOwn(boundValue, 'prototype')) {\n Object.defineProperty(boundValue, 'prototype', {\n enumerable: false,\n value: value.prototype,\n writable: true,\n });\n }\n\n if (typeof value.toString === 'function') {\n const valueHasInstanceToString = Object.hasOwn(value, 'toString') && !Object.hasOwn(boundValue, 'toString');\n const boundValueHasPrototypeToString = boundValue.toString === Function.prototype.toString;\n\n if (valueHasInstanceToString || boundValueHasPrototypeToString) {\n const originToStringDescriptor = Object.getOwnPropertyDescriptor(\n valueHasInstanceToString ? value : Function.prototype,\n 'toString',\n );\n\n Object.defineProperty(boundValue, 'toString', {\n ...originToStringDescriptor,\n ...(originToStringDescriptor?.get ? null : { value: () => value.toString() }),\n });\n }\n }\n\n functionBoundedValueMap.set(value, boundValue);\n return boundValue;\n }\n\n return value;\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n// 扩展的 Window 类型\nexport type FakeWindow = Window & Record<string, unknown>;\n\n/**\n * 重写 Window 对象的方法,实现事件监听器和定时器的管理\n * 用于微前端应用卸载时清理资源\n */\nexport function rewriteWindowFunction(fakeWindow: FakeWindow): Record<string, CallableFunction> {\n // 存储事件监听器映射\n const windowEventListenerMap = new Map<keyof WindowEventMap, EventListenerOrEventListenerObject[]>();\n // 存储定时器列表\n const intervalTimerList: number[] = [];\n const rawWindow = window;\n const { addEventListener, clearInterval, removeEventListener, setInterval } = window;\n\n // 重写 addEventListener 方法\n fakeWindow.addEventListener = <K extends keyof WindowEventMap>(\n type: K,\n listener: EventListenerOrEventListenerObject,\n options?: AddEventListenerOptions | boolean,\n ): void => {\n windowEventListenerMap.set(type, [...(windowEventListenerMap.get(type) || []), listener]);\n addEventListener.call(rawWindow, type, listener, options);\n };\n\n // 重写 removeEventListener 方法\n fakeWindow.removeEventListener = <K extends keyof WindowEventMap>(\n type: K,\n listener: EventListenerOrEventListenerObject,\n options?: AddEventListenerOptions | boolean,\n ): void => {\n const listenerList = windowEventListenerMap.get(type);\n if (listenerList?.length) {\n const index = listenerList.indexOf(listener);\n index > -1 && listenerList.splice(index, 1);\n }\n removeEventListener.call(rawWindow, type, listener, options);\n };\n\n // 重写 setInterval 方法\n fakeWindow.setInterval = (\n handler: TimerHandler | string,\n timeout?: number | undefined,\n ...args: unknown[]\n ): number => {\n const timer = setInterval(handler as TimerHandler, timeout, ...(args as []));\n intervalTimerList.push(timer as number);\n return timer as number;\n };\n\n // 重写 clearInterval 方法\n fakeWindow.clearInterval = (timer: number) => {\n const index = intervalTimerList.indexOf(timer);\n index > -1 && intervalTimerList.splice(index, 1);\n clearInterval.call(rawWindow, timer as unknown as NodeJS.Timeout);\n };\n\n /**\n * 重置窗口函数,清理所有事件监听器和定时器\n * 在应用卸载时调用\n */\n function resetWindowFunction() {\n // 清理窗口事件监听器\n if (windowEventListenerMap.size) {\n windowEventListenerMap.forEach((listenerList, type) => {\n for (const listener of listenerList) {\n removeEventListener.call(rawWindow, type, listener);\n }\n });\n windowEventListenerMap.clear();\n }\n // 清理定时器\n if (intervalTimerList.length) {\n for (const timer of intervalTimerList) {\n clearInterval.call(rawWindow, timer);\n }\n }\n }\n\n return {\n resetWindowFunction,\n };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/member-ordering */\n/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/** 微前端沙箱模块,提供应用间的环境隔离 */\n\nimport { MicroAppModel } from '../mode/app';\nimport {\n BK_WEWEB_INJECT_KEY_LIST,\n BK_WEWEB_LOCATION_KEY_LIST,\n type BaseModel,\n DEV_MICRO_APP_WINDOW_KEY_MAP,\n type IInjectWindowAttrs,\n WINDOW_ALIAS_LIST,\n WINDOW_WHITE_LIST,\n} from '../typings';\n// import { random } from '../utils/common';\nimport { windowNativeFuncMap } from './cache';\nimport { createProxyDocument } from './document';\nimport { rewriteDocumentAndBodyEvent } from './event';\nimport bindFunctionToRawWindow from './function';\nimport { rewriteWindowFunction, type FakeWindow } from './window';\n\n/**\n * 微前端沙箱\n * @description 提供应用间的环境隔离,防止全局变量污染,支持多应用并存运行\n */\nexport default class SandBox {\n /** 沙箱激活状态标识 */\n private active = false;\n\n /** 记录在原始 window 上新增的属性键集合 */\n private readonly inRawWindowKeySet = new Set<PropertyKey>();\n\n /** 重置文档和 body 事件的函数 */\n private resetDocumentAndBodyEvent?: CallableFunction;\n\n /** 重置 window 函数的方法 */\n private readonly resetWindowFunction: CallableFunction;\n\n /** 记录与原始 window 相同的属性键集合 */\n private readonly sameRawWindowKeySet = new Set<PropertyKey>();\n\n /** 伪造的 window 对象 */\n public readonly fakeWindow: FakeWindow & IInjectWindowAttrs;\n\n /** 代理的 document 对象 */\n public proxyDocument: any;\n\n /** 代理的 window 对象 */\n public readonly proxyWindow: WindowProxy & IInjectWindowAttrs;\n\n /** 原始 document 对象 */\n public rawDocument: Document;\n\n /** 原始 window 对象 */\n public readonly rawWindow: Window;\n\n /** 在 window 上的唯一标识键 */\n public readonly windowSymbolKey: keyof Window;\n\n /** 初始化沙箱环境 */\n constructor(public readonly app: BaseModel) {\n // 存储 window 描述符的集合\n const windowDescriptorSet = new Set<PropertyKey>();\n const rawWindow = window;\n this.rawWindow = rawWindow;\n // 创建代理 document\n this.rawDocument = createProxyDocument(document, app);\n\n // 创建fake window 对象\n const fakeWindow = Object.create({});\n fakeWindow.__BK_WEWEB_APP_KEY__ = app.appCacheKey;\n fakeWindow.__POWERED_BY_BK_WEWEB__ = true;\n fakeWindow.rawDocument = document;\n fakeWindow.rawWindow = rawWindow;\n fakeWindow.__proto__ = Window;\n this.fakeWindow = fakeWindow as FakeWindow & IInjectWindowAttrs;\n\n // 重写 window 函数\n const { resetWindowFunction } = rewriteWindowFunction(this.fakeWindow);\n this.resetWindowFunction = resetWindowFunction;\n\n // 生成唯一的 window 标识键\n // const appIdentifier = (app.name || app.appCacheKey).replace(/[-,:~'\"]/g, '_');\n this.windowSymbolKey = `${app.name || app.appCacheKey}` as keyof Window;\n\n // 创建 window 代理对象\n this.proxyWindow = new Proxy(this.fakeWindow, {\n defineProperty: (target: Window, key: PropertyKey, value: PropertyDescriptor): boolean => {\n if (windowDescriptorSet.has(key)) {\n return Reflect.defineProperty(rawWindow, key, value);\n }\n return Reflect.defineProperty(target, key, value);\n },\n\n deleteProperty: (target: Window, key: PropertyKey): boolean => {\n if (Object.hasOwn(target, key)) {\n // 清理相关键集合\n if (this.sameRawWindowKeySet.has(key)) {\n this.sameRawWindowKeySet.delete(key);\n }\n if (this.inRawWindowKeySet.has(key)) {\n Reflect.deleteProperty(rawWindow, key);\n }\n return Reflect.deleteProperty(target, key);\n }\n return true;\n },\n\n get: (target: Window, key: string | symbol): unknown => {\n return this.handleProxyGet(target, key, rawWindow);\n },\n\n getOwnPropertyDescriptor: (target: any, key: PropertyKey): PropertyDescriptor | undefined => {\n if (Object.hasOwn(target, key)) {\n return Object.getOwnPropertyDescriptor(target, key);\n }\n\n if (Object.hasOwn(rawWindow, key)) {\n windowDescriptorSet.add(key);\n const descriptor = Object.getOwnPropertyDescriptor(rawWindow, key);\n if (descriptor && !descriptor.configurable) {\n descriptor.configurable = true;\n }\n return descriptor;\n }\n\n return undefined;\n },\n\n has: (target: Window & any, key: PropertyKey): boolean =>\n windowNativeFuncMap.has(key) || key in target || key in rawWindow,\n\n ownKeys: (target: Window & any): Array<string | symbol> =>\n Array.from(new Set(Reflect.ownKeys(rawWindow).concat(Reflect.ownKeys(target)))),\n\n set: (target: any, key: PropertyKey, value: unknown): boolean => {\n return this.handleProxySet(target, key, value, rawWindow);\n },\n });\n rawWindow[this.windowSymbolKey] = this.proxyWindow as never;\n\n // if (app.showSourceCode) {\n // }\n }\n\n /** 处理代理对象的 get 操作 */\n private handleProxyGet(target: Window, key: string | symbol, rawWindow: Window): unknown {\n // 处理 Symbol.unscopables 和原生函数\n if (key === Symbol.unscopables || windowNativeFuncMap.has(key)) {\n return rawWindow[key as any];\n }\n\n // 处理开发环境特殊键\n if (DEV_MICRO_APP_WINDOW_KEY_MAP[key]) {\n return this.fakeWindow[key as any];\n }\n\n // 处理 window 别名\n if (WINDOW_ALIAS_LIST.includes(key as string)) {\n return this.proxyWindow;\n }\n\n // 处理 document 访问\n if (key === 'document') {\n this.app.registerRunningApp();\n return this.rawDocument;\n }\n\n // 处理 eval 函数\n if (key === 'eval') {\n this.app.registerRunningApp();\n // biome-ignore lint/security/noGlobalEval: 这里需要返回 eval\n return eval;\n }\n\n // 处理 location 相关属性(iframe 沙盒)\n if (this.shouldUseIframeLocation(key)) {\n if (this.app instanceof MicroAppModel && this.app.iframe?.contentWindow) {\n return this.app.iframe.contentWindow[key as keyof Window];\n }\n return undefined;\n }\n\n // 重写 hasOwnProperty 方法\n if (key === 'hasOwnProperty') {\n return (checkKey: PropertyKey) => Object.hasOwn(this.fakeWindow, checkKey) || Object.hasOwn(rawWindow, checkKey);\n }\n\n // 处理 top 和 parent 属性\n if (key === 'top' || key === 'parent') {\n if (rawWindow === rawWindow.parent) {\n return this.proxyWindow;\n }\n return Reflect.get(rawWindow, key); // iframe 情况\n }\n\n // 重写 getComputedStyle 方法\n if (key === 'getComputedStyle') {\n return this.createGetComputedStyleProxy(rawWindow);\n }\n\n // 优先返回目标对象的属性\n if (Reflect.has(target, key) || BK_WEWEB_INJECT_KEY_LIST.includes(key as string)) {\n return Reflect.get(target, key);\n }\n\n // 从原始 window 获取属性并绑定上下文\n const rawValue = Reflect.get(rawWindow, key);\n return bindFunctionToRawWindow(rawWindow, rawValue);\n }\n\n /**\n * 处理代理对象的 set 操作\n * @description 统一处理代理对象属性设置的复杂逻辑\n * @param target - 目标对象\n * @param key - 属性键\n * @param value - 属性值\n * @param rawWindow - 原始 window 对象\n * @returns boolean - 设置是否成功\n * @private\n */\n private handleProxySet(target: any, key: PropertyKey, value: unknown, rawWindow: Window): boolean {\n if (!this.active) {\n return true;\n }\n\n // 处理 iframe 沙盒下的 location 设置\n if (this.shouldUseIframeLocation(key)) {\n const iframe = this.app instanceof MicroAppModel ? this.app.iframe : null;\n return iframe?.contentWindow ? Reflect.set(iframe.contentWindow, key, value) : true;\n }\n\n // 共享主应用 location\n if (key === 'location') {\n Reflect.set(rawWindow, key, value);\n } else if (this.shouldSetOnTarget(target, key, rawWindow)) {\n this.setPropertyOnTarget(target, key, value, rawWindow);\n } else {\n Reflect.set(target, key, value);\n this.sameRawWindowKeySet.add(key);\n }\n\n // 处理白名单属性\n this.handleWhiteListProperty(key, value, rawWindow);\n\n return true;\n }\n\n /**\n * 判断是否应该使用 iframe 的 location\n * @description 检查是否在 iframe 模式下访问 location 相关属性\n * @param key - 属性键\n * @returns boolean - 是否使用 iframe location\n * @private\n */\n private shouldUseIframeLocation(key: PropertyKey): boolean {\n return !!(\n BK_WEWEB_LOCATION_KEY_LIST.includes(key as string) &&\n this.app instanceof MicroAppModel &&\n this.app.iframe &&\n this.app.scopeLocation\n );\n }\n\n /**\n * 创建 getComputedStyle 方法的代理\n * @description 为 getComputedStyle 方法创建安全的代理实现\n * @param rawWindow - 原始 window 对象\n * @returns Function - 代理后的 getComputedStyle 方法\n * @private\n */\n private createGetComputedStyleProxy(\n rawWindow: Window,\n ): (element: Element, pseudoElt?: null | string) => CSSStyleDeclaration {\n return (element: Element, pseudoElt?: null | string) => {\n if (element instanceof Element) {\n return rawWindow.getComputedStyle(element, pseudoElt);\n }\n return rawWindow.getComputedStyle(document.body, pseudoElt);\n };\n }\n\n /**\n * 判断是否应该在目标对象上设置属性\n * @description 检查属性设置的逻辑条件\n * @param target - 目标对象\n * @param key - 属性键\n * @param rawWindow - 原始 window 对象\n * @returns boolean - 是否在目标对象上设置\n * @private\n */\n private shouldSetOnTarget(target: any, key: PropertyKey, rawWindow: Window): boolean {\n return (\n !Object.hasOwn(target, key) && Object.hasOwn(rawWindow, key) && !BK_WEWEB_INJECT_KEY_LIST.includes(key as string)\n );\n }\n\n /**\n * 在目标对象上设置属性\n * @description 安全地在目标对象上设置属性,保持描述符特性\n * @param target - 目标对象\n * @param key - 属性键\n * @param value - 属性值\n * @param rawWindow - 原始 window 对象\n * @private\n */\n private setPropertyOnTarget(target: any, key: PropertyKey, value: unknown, rawWindow: Window): void {\n const descriptor = Object.getOwnPropertyDescriptor(rawWindow, key);\n\n if (!descriptor) {\n return; // 如果没有描述符,直接返回\n }\n\n const { configurable, enumerable, writable } = descriptor;\n\n if (writable) {\n Object.defineProperty(target, key, {\n configurable,\n enumerable,\n value,\n writable,\n });\n this.sameRawWindowKeySet.add(key);\n }\n }\n\n /**\n * 处理白名单属性\n * @description 处理需要在原始 window 上设置的白名单属性\n * @param key - 属性键\n * @param value - 属性值\n * @param rawWindow - 原始 window 对象\n * @private\n */\n private handleWhiteListProperty(key: PropertyKey, value: unknown, rawWindow: Window): void {\n if (\n WINDOW_WHITE_LIST.includes(key as string) &&\n !Reflect.has(rawWindow, key) &&\n !BK_WEWEB_INJECT_KEY_LIST.includes(key as string)\n ) {\n Reflect.set(rawWindow, key, value);\n this.inRawWindowKeySet.add(key);\n }\n }\n\n /**\n * 激活沙箱\n * @description 启动沙箱环境,初始化代理对象和事件处理\n * @param data - 传递给沙箱的数据(可选)\n */\n activated(data?: Record<string, unknown>): void {\n if (!this.active) {\n this.active = true;\n this.rawDocument = createProxyDocument(document, this.app);\n this.fakeWindow.__BK_WEWEB_DATA__ = data ?? {};\n\n const { resetDocumentAndBodyEvent } = rewriteDocumentAndBodyEvent();\n this.resetDocumentAndBodyEvent = resetDocumentAndBodyEvent;\n }\n }\n\n /**\n * 停用沙箱\n * @description 关闭沙箱环境,清理所有副作用和修改\n */\n deactivated(): void {\n if (!this.active) return;\n\n this.active = false;\n\n // 重置 window 函数\n this.resetWindowFunction();\n\n // 清理在原始 window 上新增的属性\n for (const key of this.inRawWindowKeySet) {\n Reflect.deleteProperty(window, key);\n }\n this.inRawWindowKeySet.clear();\n\n // 重置文档和 body 事件\n this.resetDocumentAndBodyEvent?.();\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n/* eslint-disable @typescript-eslint/member-ordering */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState, type ValueOfAppState } from '../common';\nimport { setCurrentRunningApp } from '../context/cache';\nimport SandBox from '../context/sandbox';\nimport { EntrySource } from '../entry/entry';\nimport { execAppScripts } from '../entry/script';\nimport {\n type BaseModel,\n type CallbackFunction,\n type ContainerType,\n CSS_ATTRIBUTE_KEY,\n type IAppModelProps,\n WewebMode,\n} from '../typings';\nimport { addUrlProtocol, random } from '../utils/common';\n\nimport type { SourceType } from '../utils/load-source';\n\nconst IFRAME_CONSTANTS = {\n BLANK_ORIGIN: 'about:blank',\n STYLE_HIDDEN: 'display: none;',\n CHROME_USER_AGENT: 'Chrome',\n DEFAULT_HTML: '<head></head><body></body>',\n POLLING_INTERVAL: 0,\n} as const;\n\nconst DEFAULT_RANDOM_LENGTH = 5;\n\n/** BK-WEWEB 微应用模式类 */\nexport class MicroAppModel implements BaseModel {\n private state: ValueOfAppState = AppState.UNSET;\n\n container?: ContainerType;\n public data: Record<string, unknown>;\n iframe: HTMLIFrameElement | null = null;\n initSource: SourceType;\n isModuleApp = false;\n isPreLoad = false;\n keepAlive: boolean;\n mode: WewebMode = WewebMode.APP;\n name: string;\n sandBox?: SandBox;\n scopeCss: boolean;\n scopeJs: boolean;\n scopeLocation: boolean;\n showSourceCode: boolean;\n source?: EntrySource;\n url: string;\n\n constructor(props: IAppModelProps) {\n this.name = props.id !== props.url ? props.id || random(DEFAULT_RANDOM_LENGTH) : random(DEFAULT_RANDOM_LENGTH);\n this.mode = props.mode ?? WewebMode.APP;\n this.container = props.container ?? undefined;\n this.showSourceCode = props.showSourceCode ?? false;\n this.url = props.url;\n this.data = props.data || {};\n this.scopeJs = props.scopeJs ?? true;\n this.scopeCss = props.scopeCss ?? true;\n this.scopeLocation = props.scopeLocation ?? false;\n this.isPreLoad = props.isPreLoad ?? false;\n this.keepAlive = props.keepAlive ?? false;\n this.initSource = props.initSource ?? [];\n\n this.initializeSandBox();\n this.setContainerAttribute();\n }\n\n /** 激活微应用 */\n activated<T = unknown>(container: ContainerType, callback?: CallbackFunction<T>): void {\n this.isPreLoad = false;\n this.state = AppState.ACTIVATED;\n\n if (container && this.container) {\n this.setContainerAttribute(container);\n this.transferNodes(container);\n this.container = container;\n this.initShadowRootContainer();\n this.sandBox?.activated(this.data);\n callback?.(this);\n }\n }\n\n /** 创建隔离iframe */\n createIframe(): Promise<HTMLIFrameElement> {\n return new Promise(resolve => {\n const iframe = this.createIframeElement();\n document.body.appendChild(iframe);\n\n if (this.isChromeUserAgent()) {\n setTimeout(() => resolve(iframe), IFRAME_CONSTANTS.POLLING_INTERVAL);\n } else {\n this.handleNonChromeIframe(iframe, resolve);\n }\n });\n }\n\n /** 停用微应用 */\n deactivated(): void {\n this.state = AppState.DEACTIVATED;\n this.sandBox?.deactivated();\n }\n\n /** 初始化ShadowRoot容器 */\n initShadowRootContainer(): void {\n if (this.container instanceof ShadowRoot) {\n // inject echarts in shadowRoot\n Object.defineProperties(this.container, {\n getBoundingClientRect: {\n get() {\n return this.host.getBoundingClientRect;\n },\n },\n });\n }\n }\n\n /** 挂载微应用 */\n mount<T = unknown>(container?: ContainerType, callback?: CallbackFunction<T>): void {\n this.isPreLoad = false;\n this.container = container ?? this.container;\n this.initShadowRootContainer();\n this.state = AppState.MOUNTING;\n\n if (this.container) {\n this.setContainerAttribute(this.container);\n this.renderAppContent();\n this.sandBox?.activated(this.data);\n\n execAppScripts(this).finally(() => {\n this.state = AppState.MOUNTED;\n callback?.(this);\n });\n }\n }\n\n /** 错误处理 */\n onError(): void {\n this.state = AppState.ERROR;\n }\n\n /** 挂载处理 */\n onMount(): void {\n if (this.isPreLoad) return;\n this.state = AppState.LOADED;\n this.mount();\n }\n\n /** 注册运行中的微应用 */\n registerRunningApp(): void {\n setCurrentRunningApp(this);\n Promise.resolve().then(() => setCurrentRunningApp(null));\n }\n\n /** 启动微应用 */\n async start(): Promise<void> {\n if (!this.source || this.needsReload()) {\n this.state = AppState.LOADING;\n\n if (this.scopeLocation || this.isModuleApp) {\n const iframe = await this.createIframe();\n this.iframe = iframe;\n }\n\n this.source = new EntrySource(this.url);\n await this.source.importEntry(this);\n }\n }\n\n /** 卸载微应用 */\n unmount(needDestroy = false): void {\n this.state = AppState.UNMOUNT;\n this.sandBox?.deactivated();\n\n if (needDestroy) {\n appCache.deleteApp(this.url);\n }\n\n if (this.container) {\n this.container.innerHTML = '';\n this.container = undefined;\n }\n }\n\n get appCacheKey(): string {\n return this.url;\n }\n\n get status(): ValueOfAppState {\n return this.state;\n }\n\n set status(value: ValueOfAppState) {\n this.state = value;\n }\n\n /** 初始化沙盒 */\n private initializeSandBox(): void {\n if (this.scopeJs) {\n this.sandBox = new SandBox(this);\n }\n }\n\n /** 设置容器属性 */\n private setContainerAttribute(container?: ContainerType): void {\n const targetContainer = container || this.container;\n if (targetContainer instanceof HTMLElement) {\n targetContainer.setAttribute(CSS_ATTRIBUTE_KEY, this.name);\n }\n }\n\n /** 转移节点到新容器 */\n private transferNodes(container: ContainerType): void {\n if (!this.container) return;\n\n const fragment = document.createDocumentFragment();\n const nodeList = Array.from(this.container.childNodes);\n\n for (const node of nodeList) {\n this.setupNodeProperties(node);\n fragment.appendChild(node);\n }\n\n container.innerHTML = '';\n container.appendChild(fragment);\n }\n\n /** 设置节点属性 */\n private setupNodeProperties(node: Node): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const app = this;\n const nodeWithProps = node as Node & {\n __KEEP_ALIVE__?: string;\n __BK_WEWEB_APP_KEY__?: string;\n data?: unknown;\n };\n\n nodeWithProps.__BK_WEWEB_APP_KEY__ = this.appCacheKey;\n\n // 设置 ownerDocument 属性,这是关键的沙盒功能\n Object.defineProperties(node, {\n ownerDocument: {\n get() {\n return app.sandBox?.rawDocument;\n },\n },\n });\n }\n\n /** 创建iframe元素 */\n private createIframeElement(): HTMLIFrameElement {\n const iframe = document.createElement('iframe');\n const url = new URL(addUrlProtocol(this.url));\n\n iframe.src = this.buildIframeSrc(url);\n iframe.style.cssText = IFRAME_CONSTANTS.STYLE_HIDDEN;\n\n return iframe;\n }\n\n /** 构建iframe源地址 */\n private buildIframeSrc(url: URL): string {\n const isChrome = this.isChromeUserAgent();\n return `${isChrome ? IFRAME_CONSTANTS.BLANK_ORIGIN : location.origin}${url.pathname || '/'}${url.search}${url.hash}`;\n }\n\n /** 检查是否为Chrome浏览器 */\n private isChromeUserAgent(): boolean {\n return navigator.userAgent.includes(IFRAME_CONSTANTS.CHROME_USER_AGENT);\n }\n\n /** 处理非Chrome浏览器iframe */\n private handleNonChromeIframe(iframe: HTMLIFrameElement, resolve: (iframe: HTMLIFrameElement) => void): void {\n // 其他浏览器在about:blank下会出现同源检测安全错误 换另一种方式来做location保持\n const interval = setInterval(() => {\n if (iframe.contentWindow && iframe.contentWindow.location.href !== IFRAME_CONSTANTS.BLANK_ORIGIN) {\n iframe.contentWindow.stop();\n iframe.contentDocument!.body.parentElement!.innerHTML = IFRAME_CONSTANTS.DEFAULT_HTML;\n clearInterval(interval);\n resolve(iframe);\n }\n }, IFRAME_CONSTANTS.POLLING_INTERVAL);\n }\n\n /** 渲染应用内容 */\n private renderAppContent(): void {\n if (!this.source) return;\n\n const clonedNode = this.source.html!.cloneNode(true);\n const fragment = document.createDocumentFragment();\n\n for (const node of Array.from(clonedNode.childNodes)) {\n this.setupNodeProperties(node);\n fragment.appendChild(node);\n }\n\n this.container!.innerHTML = '';\n this.container!.appendChild(fragment);\n }\n\n /** 检查是否需要重新加载 */\n private needsReload(): boolean {\n return this.status === AppState.ERROR || this.status === AppState.UNSET;\n }\n}\n\nexport const createApp = (props: IAppModelProps): void => {\n appCache.deleteApp(props.url);\n const instance = new MicroAppModel(props);\n appCache.setApp(instance);\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { appCache } from '../cache/app-cache';\nimport { Script } from '../entry/script';\nimport { Style } from '../entry/style';\n\nexport type SourceFuncType = () => Promise<string[]>;\nexport type SourceType = SourceFuncType | string[];\n\ninterface CollectResult {\n collectScript?: Map<string, Script>;\n collectStyle?: Map<string, Style>;\n}\n\nconst JS_FILE_REGEX = /\\.js$/;\nconst CSS_FILE_REGEX = /\\.css$/;\n\n/**\n * 创建脚本实例\n * @param url 脚本URL\n * @returns Script实例\n */\nconst createScriptInstance = (url: string): Script => {\n const cachedScript = appCache.getCacheScript(url);\n return new Script({\n async: false,\n code: cachedScript?.code || '',\n defer: false,\n fromHtml: false,\n initial: true,\n isModule: false,\n url,\n });\n};\n\n/**\n * 创建样式实例\n * @param url 样式URL\n * @returns Style实例\n */\nconst createStyleInstance = (url: string): Style => {\n const cachedStyle = appCache.getCacheStyle(url);\n return new Style({\n code: cachedStyle?.code || '',\n fromHtml: true,\n initial: true,\n prefetch: false,\n preload: false,\n url,\n });\n};\n\n/**\n * 处理单个资源URL\n * @param url 资源URL字符串\n * @param collectScript 脚本收集Map\n * @param collectStyle 样式收集Map\n */\nconst processResourceUrl = (\n url: string,\n collectScript: Map<string, Script>,\n collectStyle: Map<string, Style>,\n): void => {\n try {\n const urlObj = new URL(url);\n const { pathname } = urlObj;\n\n if (JS_FILE_REGEX.test(pathname)) {\n collectScript.set(url, createScriptInstance(url));\n } else if (CSS_FILE_REGEX.test(pathname)) {\n collectStyle.set(url, createStyleInstance(url));\n }\n } catch {\n console.error(`【bk-weweb】: ${url} is invalid URL`);\n }\n};\n\n/**\n * 收集和解析资源\n * @param sourceList 资源列表,可以是数组或返回数组的函数\n * @returns 包含收集到的脚本和样式的对象\n */\nexport const collectSource = async (sourceList: SourceType): Promise<CollectResult> => {\n const source: string[] = typeof sourceList === 'function' ? await sourceList() : sourceList || [];\n if (!source.length) return {};\n const collectScript = new Map<string, Script>();\n const collectStyle = new Map<string, Style>();\n\n // 处理每个资源URL\n for (const url of source) {\n processResourceUrl(url, collectScript, collectStyle);\n }\n return { collectScript, collectStyle };\n};\n\n/**\n * 加载全局静态资源\n * @param sourceList 资源列表,可以是数组或返回数组的函数\n * @throws 如果资源加载失败则抛出错误\n */\nexport const loadGlobalSource = async (sourceList: SourceType): Promise<void> => {\n const { collectScript, collectStyle } = await collectSource(sourceList);\n const loadPromises: Promise<string>[] = [];\n\n // 处理脚本资源\n if (collectScript) {\n for (const [url, script] of collectScript.entries()) {\n loadPromises.push(script.getCode());\n appCache.setBaseAppScript(url, script);\n }\n }\n\n // 处理样式资源\n if (collectStyle) {\n for (const [url, style] of collectStyle.entries()) {\n loadPromises.push(style.getCode());\n appCache.setBaseAppStyle(url, style);\n }\n }\n\n // 等待所有资源加载完成\n await Promise.all(loadPromises);\n};\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { appCache } from '../cache/app-cache';\nimport { MicroAppModel } from '../mode/app';\nimport { MicroInstanceModel } from '../mode/instance';\nimport { addUrlProtocol, fillUpPath, randomUrl } from '../utils/common';\nimport { fetchSource } from '../utils/fetch';\nimport { collectSource } from '../utils/load-source';\nimport { Script } from './script';\nimport { Style, executeAppStyles } from './style';\n\nimport type { BaseModel, IScriptOption } from '../typings';\n\nconst SCRIPT_TYPE_NAMES = [\n 'text/javascript',\n 'text/ecmascript',\n 'application/javascript',\n 'application/ecmascript',\n 'module',\n] as const;\n\nconst ICON_REL_TYPES = ['apple-touch-icon', 'icon', 'prefetch', 'preload', 'prerender'] as const;\n\ntype IconRelType = (typeof ICON_REL_TYPES)[number];\ntype ScriptTypeName = (typeof SCRIPT_TYPE_NAMES)[number];\n\nconst HTML_FILTER_REGEX = {\n HEAD: /<\\/?head>/gim,\n BODY: /<\\/?body>/i,\n TS_EXTENSION: /\\.ts$/,\n} as const;\n\n// 收集结果\ninterface CollectResult {\n replace: Comment | Element; // 替换元素\n style?: Style; // 样式\n script?: Script; // 脚本\n}\n\nexport class EntrySource {\n html: HTMLElement | null = null;\n rawHtml?: string;\n scripts: Map<string, Script>;\n styles: Map<string, Style>;\n\n constructor(public url: string) {\n this.scripts = new Map();\n this.styles = new Map();\n }\n\n /** 收集链接元素 */\n collectLink = (\n link: HTMLLinkElement,\n parent: Node,\n needReplaceElement = false,\n ): { replace: Comment | Element; style?: Style } => {\n if (link.hasAttribute('exclude')) {\n return {\n replace: document.createComment('【bk-weweb】style with exclude attribute is ignored'),\n };\n }\n\n if (link.hasAttribute('ignore')) {\n return { replace: link };\n }\n\n const rel = link.getAttribute('rel');\n const href = link.getAttribute('href');\n\n if (rel === 'stylesheet' && href) {\n return this.handleStylesheetLink(link, parent, href, needReplaceElement);\n }\n\n if (rel && ICON_REL_TYPES.includes(rel as IconRelType)) {\n return this.handleIconLink(link, parent, rel, href, needReplaceElement);\n }\n\n if (href) {\n link.setAttribute('href', fillUpPath(href, this.url));\n }\n\n return { replace: link };\n };\n\n /** 收集脚本元素 */\n collectScript = (script: HTMLScriptElement, parent: Node, needReplaceElement = false): CollectResult | undefined => {\n if (this.shouldIgnoreScript(script)) {\n return;\n }\n\n if (script.hasAttribute('exclude')) {\n return this.handleExcludedScript(script, parent, needReplaceElement);\n }\n\n const src = script.getAttribute('src');\n if (src) {\n return this.handleExternalScript(script, parent, src, needReplaceElement);\n }\n\n if (script.textContent) {\n return this.handleInlineScript(script, parent, needReplaceElement);\n }\n\n return { replace: script };\n };\n\n /** 收集样式和脚本 */\n collectScriptAndStyle = (parent: HTMLElement): void => {\n this.processLinks(parent);\n this.processStyles(parent);\n this.processScripts(parent);\n this.processMetas(parent);\n this.processImages(parent);\n };\n\n getScript = (url: string): Script | undefined => this.scripts.get(url);\n\n getStyle = (urlOrCode: string): Style | undefined => {\n return this.styles.get(urlOrCode) || Array.from(this.styles.values()).find(style => style.code === urlOrCode);\n };\n\n /** html entry */\n async importEntry(app: BaseModel): Promise<void> {\n await this.loadInitialSources(app);\n\n if (app instanceof MicroAppModel) {\n await this.importHtmlEntry(app);\n } else if (app instanceof MicroInstanceModel) {\n await this.importInstanceEntry(app);\n }\n }\n\n /** 微应用入口 */\n async importHtmlEntry(app: MicroAppModel): Promise<void> {\n const htmlStr = await this.fetchHtmlContent(app);\n if (!htmlStr) {\n console.error('load app entry error, place check');\n return Promise.reject();\n }\n\n this.rawHtml = htmlStr;\n const wrapElement = this.createWrapElement(htmlStr);\n\n this.collectScriptAndStyle(wrapElement);\n await executeAppStyles(app, wrapElement);\n\n this.html = wrapElement;\n }\n\n /** 微模块入口 */\n async importInstanceEntry(app: BaseModel): Promise<void> {\n const jsStr = await this.fetchJsContent(app);\n if (!jsStr) {\n console.error('load app entry error, place check');\n return Promise.reject();\n }\n\n this.scripts.set(\n this.url,\n new Script({\n async: false,\n code: jsStr,\n defer: false,\n fromHtml: true,\n isModule: HTML_FILTER_REGEX.TS_EXTENSION.test(this.url),\n url: this.url,\n }),\n );\n }\n\n setScript = (url: string, script: IScriptOption | Script): void => {\n this.scripts.set(url, script instanceof Script ? script : new Script(script));\n };\n\n setStyle = (url: string, style: Style): void => {\n this.styles.set(url, style);\n };\n\n /** 处理样式表链接 */\n private handleStylesheetLink = (link: HTMLLinkElement, parent: Node, href: string, needReplaceElement: boolean) => {\n const fullHref = fillUpPath(href, this.url);\n const replaceElement = document.createComment(`【bk-weweb】style with href=${fullHref}`);\n\n let styleInstance = this.getStyle(fullHref);\n if (!styleInstance) {\n styleInstance = new Style({\n code: '',\n fromHtml: !needReplaceElement,\n prefetch: !!link.getAttribute('prefetch'),\n preload: !!link.getAttribute('preload'),\n url: fullHref,\n });\n this.styles.set(fullHref, styleInstance);\n }\n\n if (!needReplaceElement) {\n parent.replaceChild(replaceElement, link);\n }\n\n return { replace: replaceElement, style: styleInstance };\n };\n\n /**\n * 处理图标链接\n */\n private handleIconLink = (\n link: HTMLLinkElement,\n parent: Node,\n rel: string,\n href: null | string,\n needReplaceElement: boolean,\n ) => {\n const replaceElement = document.createComment(`【bk-weweb】style with rel=${rel}${href ? ` & href=${href}` : ''}`);\n\n if (!needReplaceElement) {\n parent.removeChild(link);\n }\n\n return { replace: replaceElement };\n };\n\n /**\n * 检查是否应该忽略脚本\n */\n private shouldIgnoreScript = (script: HTMLScriptElement): boolean => {\n return (\n script.hasAttribute('ignore') ||\n // (script.type !== 'module' && isJsonpUrl(script.getAttribute('src'))) ||\n (script.hasAttribute('type') && !SCRIPT_TYPE_NAMES.includes(script.type as ScriptTypeName))\n );\n };\n\n /**\n * 处理被排除的脚本\n */\n private handleExcludedScript = (\n script: HTMLScriptElement,\n parent: Node,\n needReplaceElement: boolean,\n ): CollectResult => {\n const replaceElement = document.createComment('【bk-weweb】script element with exclude attribute is removed');\n\n if (!needReplaceElement) {\n parent.replaceChild(replaceElement, script);\n }\n\n return { replace: replaceElement };\n };\n\n /**\n * 处理外部脚本\n */\n private handleExternalScript = (\n script: HTMLScriptElement,\n parent: Node,\n src: string,\n needReplaceElement: boolean,\n ): CollectResult => {\n const fullSrc = fillUpPath(src, this.url);\n\n let scriptInstance = this.getScript(fullSrc);\n if (!scriptInstance) {\n scriptInstance = new Script({\n async: script.hasAttribute('async'),\n code: '',\n defer: script.defer || script.type === 'module',\n fromHtml: !needReplaceElement,\n isModule: script.type === 'module',\n url: fullSrc,\n });\n this.scripts.set(fullSrc, scriptInstance);\n }\n\n const replaceElement = document.createComment(`【bk-weweb】script with src='${fullSrc}'`);\n\n if (!needReplaceElement) {\n parent.replaceChild(replaceElement, script);\n }\n\n return { replace: replaceElement, script: scriptInstance };\n };\n\n /**\n * 处理内联脚本\n */\n private handleInlineScript = (\n script: HTMLScriptElement,\n parent: Node,\n needReplaceElement: boolean,\n ): CollectResult => {\n const nonceStr = randomUrl();\n const scriptInstance = new Script({\n async: false,\n code: script.textContent || '',\n defer: script.type === 'module',\n fromHtml: !needReplaceElement,\n initial: false,\n isModule: script.type === 'module',\n url: nonceStr,\n });\n\n this.scripts.set(nonceStr, scriptInstance);\n const replaceElement = document.createComment('【bk-weweb】script with text content');\n\n if (!needReplaceElement) {\n parent.replaceChild(replaceElement, script);\n }\n\n return { replace: replaceElement, script: scriptInstance };\n };\n\n /**\n * 处理链接元素\n */\n private processLinks = (parent: HTMLElement): void => {\n const links = Array.from(parent.querySelectorAll('link'));\n for (const link of links) {\n link.parentElement && this.collectLink(link, link.parentElement);\n }\n };\n\n /**\n * 处理样式元素\n */\n private processStyles = (parent: HTMLElement): void => {\n const styles = Array.from(parent.querySelectorAll('style'));\n for (const style of styles) {\n if (!style.hasAttribute('exclude') && !style.hasAttribute('ignore')) {\n this.styles.set(\n randomUrl(),\n new Style({\n code: style.textContent || '',\n fromHtml: true,\n url: '',\n }),\n );\n style.remove();\n }\n }\n };\n\n /**\n * 处理脚本元素\n */\n private processScripts = (parent: HTMLElement): void => {\n const scripts = Array.from(parent.querySelectorAll('script'));\n for (const script of scripts) {\n script.parentElement && this.collectScript(script, script.parentElement);\n }\n };\n\n /**\n * 处理Meta元素\n */\n private processMetas = (parent: HTMLElement): void => {\n const metas = Array.from(parent.querySelectorAll('meta'));\n for (const meta of metas) {\n meta.parentElement?.removeChild(meta);\n }\n };\n\n /**\n * 处理图片元素\n */\n private processImages = (parent: HTMLElement): void => {\n const imgs = Array.from(parent.querySelectorAll('img'));\n for (const img of imgs) {\n if (img.hasAttribute('src')) {\n img.setAttribute('src', fillUpPath(img.getAttribute('src') || '', this.url));\n }\n }\n };\n\n /**\n * 加载初始资源\n */\n private async loadInitialSources(app: BaseModel): Promise<void> {\n if (!app.initSource?.length) return;\n\n const { collectScript, collectStyle } = await collectSource(app.initSource);\n\n if (collectScript) {\n this.scripts = collectScript;\n }\n if (collectStyle) {\n this.styles = collectStyle;\n }\n }\n\n /**\n * 获取HTML content\n */\n private async fetchHtmlContent(app: MicroAppModel): Promise<string> {\n let htmlStr = appCache.getCacheHtml(this.url);\n\n if (!htmlStr) {\n htmlStr = await fetchSource(addUrlProtocol(this.url), { cache: 'no-cache' }, app);\n }\n\n return htmlStr;\n }\n\n /**\n * 创建顶层 root 元素\n */\n private createWrapElement(htmlStr: string): HTMLDivElement {\n const wrapElement = document.createElement('div');\n\n if (wrapElement.__BK_WEWEB_APP_KEY__) {\n wrapElement.__BK_WEWEB_APP_KEY__ = undefined;\n }\n\n wrapElement.innerHTML = htmlStr.replace(HTML_FILTER_REGEX.HEAD, '').replace(HTML_FILTER_REGEX.BODY, '');\n\n return wrapElement;\n }\n\n /**\n * 获取JS content\n */\n private async fetchJsContent(app: BaseModel): Promise<string> {\n let jsStr = appCache.getCacheScript(this.url)?.code;\n\n if (!jsStr) {\n jsStr = await fetchSource(this.url, { cache: 'no-cache' }, app);\n }\n\n return jsStr;\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 应用缓存管理模块\n * @description 提供微应用实例、资源缓存和全局状态管理功能\n */\n\nimport { AppState } from '../common';\nimport { EntrySource } from '../entry/entry';\n\nimport type { Script } from '../entry/script';\nimport type { Style } from '../entry/style';\nimport type { BaseModel } from '../typings';\n\n/**\n * 应用缓存管理器\n * @description 负责管理所有微应用实例的缓存、资源共享和状态跟踪\n */\nexport class AppCache {\n /** 基础资源源,用于主应用共享资源包 */\n private readonly baseSource: EntrySource;\n\n /** 应用实例缓存映射表 */\n private readonly cache: Map<string, BaseModel>;\n\n /**\n * 构造函数\n * @description 初始化应用缓存管理器\n */\n constructor() {\n this.cache = new Map();\n this.baseSource = new EntrySource(location.href);\n }\n\n /**\n * 设置应用实例到缓存\n * @description 将应用实例添加到缓存中,使用应用的缓存键作为标识\n * @param app - 要缓存的应用实例\n */\n setApp(app: BaseModel): void {\n this.cache.set(app.appCacheKey, app);\n }\n\n /**\n * 获取缓存的应用实例\n * @description 根据名称或ID获取已缓存的应用实例\n * @param name - 应用名称或ID,为空时返回 undefined\n * @returns BaseModel | undefined - 应用实例或 undefined\n */\n getApp(name?: null | string): BaseModel | undefined {\n if (!name) return undefined;\n\n // 首先尝试直接从缓存键获取\n const app = this.cache.get(name);\n if (app) return app;\n\n // 如果未找到,则通过应用名称查找\n return Array.from(this.cache.values()).find((item: BaseModel) => item.name === name);\n }\n\n /**\n * 删除缓存的应用实例\n * @description 从缓存中移除指定URL的应用实例\n * @param url - 要删除的应用URL标识\n */\n deleteApp(url: string): void {\n this.cache.delete(url);\n }\n\n /**\n * 获取缓存的HTML内容\n * @description 根据URL获取已缓存的HTML内容\n * @param url - 应用的URL\n * @returns string - HTML内容,未找到时返回空字符串\n */\n getCacheHtml(url: string): string {\n const list = Array.from(this.cache.values());\n const app = list.find(item => item.url === url);\n\n if (app) return app.source?.rawHtml || '';\n return '';\n }\n\n /**\n * 设置基础应用脚本\n * @description 将脚本添加到基础资源源中,供多个应用共享\n * @param url - 脚本的URL\n * @param script - 脚本实例\n */\n setBaseAppScript(url: string, script: Script): void {\n this.baseSource.setScript(url, script);\n }\n\n /**\n * 获取缓存的脚本资源\n * @description 从基础资源源或应用缓存中获取脚本资源\n * @param url - 脚本的URL\n * @returns Script | undefined - 脚本实例或 undefined\n */\n getCacheScript(url: string): Script | undefined {\n // 首先从基础资源源中查找\n let script: Script | undefined = this.baseSource.getScript(url);\n if (script) return script;\n\n // 从应用缓存中查找\n const list = Array.from(this.cache.values());\n list.some(app => {\n script = app.source?.getScript(url);\n return !!script;\n });\n\n return script;\n }\n\n /**\n * 设置基础应用样式\n * @description 将样式添加到基础资源源中,供多个应用共享\n * @param url - 样式的URL\n * @param style - 样式实例\n */\n setBaseAppStyle(url: string, style: Style): void {\n this.baseSource.setStyle(url, style);\n }\n\n /**\n * 获取基础应用样式\n * @description 从基础资源源中获取样式资源\n * @param urlOrCode - 样式的URL或代码\n * @returns Style | undefined - 样式实例或 undefined\n */\n getBaseAppStyle(urlOrCode: string): Style | undefined {\n return this.baseSource.getStyle(urlOrCode);\n }\n\n /**\n * 获取缓存的样式资源\n * @description 从基础资源源或应用缓存中获取样式资源\n * @param url - 样式的URL\n * @returns Style | undefined - 样式实例或 undefined\n */\n getCacheStyle(url: string): Style | undefined {\n // 首先从基础资源源中查找\n let style: Style | undefined = this.baseSource.getStyle(url);\n if (style) return style;\n\n // 从应用缓存中查找\n const list = Array.from(this.cache.values());\n list.some(app => {\n style = app.source?.getStyle(url);\n return !!style;\n });\n\n return style;\n }\n\n /**\n * 检查是否存在活跃的应用\n * @description 判断当前是否有处于非卸载状态的应用实例\n * @returns boolean - 存在活跃应用时返回 true\n */\n get hasActiveApp(): boolean {\n return Array.from(this.cache.values()).some((app: BaseModel) => app.status !== AppState.UNMOUNT);\n }\n}\n\n/**\n * 全局应用缓存实例\n */\nconst appCache = new AppCache();\n\n/**\n * 注册全局应用获取方法\n * @description 在 window 对象上注册获取缓存应用或实例的方法\n */\nwindow.__getAppOrInstance__ = (id?: string) => {\n if (!id) return appCache;\n return appCache.getApp(id);\n};\n\nexport { appCache };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * @description 处理主应用中 DOM 元素的动态添加,特别是样式和脚本资源的拦截和转换\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { Script } from '../entry/script';\nimport { Style } from '../entry/style';\nimport { setMarkElement } from '../utils';\nimport { fillUpPath } from '../utils/common';\nimport { dispatchLinkOrScriptError, dispatchLinkOrScriptLoad } from '../utils/custom';\nimport { fetchSource } from '../utils/fetch';\n\ntype DOMMethodSignature = (...args: any[]) => any;\n\n/**\n * 获取样式静态资源并创建替换元素\n * @description 将 link 标签转换为 style 标签,异步加载样式静态资源\n * @param url - 样式资源的 URL 地址\n * @param style - 样式实例对象\n * @param originLink - 原始的 link 标签元素\n * @returns HTMLStyleElement - 返回用于替换的 style 标签\n */\nfunction getStyleSource(url: string, style: Style, originLink: HTMLLinkElement): HTMLStyleElement {\n const replaceStyle = document.createElement('style');\n setMarkElement(replaceStyle);\n\n fetchSource(url)\n .then((data: string) => {\n style.code = data;\n appCache.setBaseAppStyle(url, style);\n replaceStyle.textContent = data;\n dispatchLinkOrScriptLoad(originLink);\n })\n .catch(error => {\n console.error('Failed to load style resource:', error);\n dispatchLinkOrScriptError(originLink);\n });\n\n return replaceStyle;\n}\n\n/**\n * 获取脚本资源并创建替换元素\n * @description 异步加载脚本内容并创建新的 script 标签\n * @param url - 脚本资源的 URL 地址\n * @param script - 脚本实例对象\n * @param originScript - 原始的 script 标签元素\n * @returns Comment | HTMLScriptElement - 返回用于替换的 script 标签或注释节点\n */\nfunction getScriptSource(url: string, script: Script, originScript: HTMLScriptElement): Comment | HTMLScriptElement {\n const replaceScript: HTMLScriptElement = document.createElement('script');\n setMarkElement(replaceScript);\n\n fetchSource(url)\n .then((code: string) => {\n script.setCode(code);\n\n try {\n replaceScript.textContent = code;\n\n // 为非内联脚本设置原始 src 属性\n if (!url.startsWith('inline-')) {\n originScript.setAttribute('origin-src', url);\n }\n } catch (error) {\n console.error('Failed to set script content:', error, url);\n }\n\n dispatchLinkOrScriptLoad(originScript);\n })\n .catch(error => {\n console.error('Failed to load script resource:', error);\n dispatchLinkOrScriptError(originScript);\n });\n\n return replaceScript;\n}\n\n/**\n * 处理 link 标签转换\n * @description 将 link 标签转换为 style 标签并处理样式加载\n * @param linkElement - link 标签元素\n * @returns Node - 转换后的节点或原节点\n */\nfunction processLinkElement(linkElement: HTMLLinkElement): Node {\n const rel = linkElement.getAttribute('rel');\n let href = linkElement.getAttribute('href');\n\n if (rel === 'stylesheet' && href) {\n href = fillUpPath(href, location.origin);\n\n const replaceStyle = document.createElement('style');\n const styleInstance = new Style({\n code: '',\n fromHtml: false,\n url: href,\n });\n\n getStyleSource(href, styleInstance, linkElement);\n return replaceStyle;\n }\n\n return linkElement;\n}\n\n/**\n * 处理 script 标签转换\n * @description 处理脚本标签的加载和转换逻辑\n * @param scriptElement - script 标签元素\n * @returns Node - 转换后的节点或原节点\n */\nfunction processScriptElement(scriptElement: HTMLScriptElement): Node {\n let src = scriptElement.getAttribute('src');\n\n if (src && scriptElement.type !== 'module') {\n src = fillUpPath(src, location.origin);\n\n const script = new Script({\n async: scriptElement.hasAttribute('async'),\n code: '',\n defer: scriptElement.defer || scriptElement.type === 'module',\n fromHtml: false,\n isModule: false,\n });\n\n appCache.setBaseAppScript(src, script);\n const replaceElement = getScriptSource(src, script, scriptElement);\n return replaceElement || scriptElement;\n }\n\n return scriptElement;\n}\n\n/**\n * 创建新的替换节点\n * @description 根据节点类型创建相应的替换节点,主要处理 link 和 script 标签\n * @param child - 要处理的子节点\n * @returns Node - 返回替换后的节点或原节点\n */\nfunction createNewNode(child: Node): Node {\n if (child instanceof HTMLLinkElement) {\n return processLinkElement(child);\n }\n\n if (child instanceof HTMLScriptElement) {\n return processScriptElement(child);\n }\n\n return child;\n}\n\n/**\n * 检查节点是否为 link 或 script 标签\n * @description 判断给定节点是否需要特殊处理\n * @param node - 要检查的节点\n * @returns boolean - 如果是 link 或 script 标签则返回 true\n */\nfunction isLinkOrScript(node: Node): boolean {\n return node instanceof HTMLLinkElement || node instanceof HTMLScriptElement;\n}\n\n/**\n * 处理 insertBefore 操作的基础元素插入\n * @description 拦截并处理 DOM 的 insertBefore 操作,对 link 和 script 标签进行特殊处理\n * @param parent - 父节点\n * @param newChild - 要插入的新节点\n * @param referenceChild - 参考节点(插入位置的下一个兄弟节点)\n * @param rawMethod - 原始的 DOM 操作方法\n * @returns Node - 返回原始方法的执行结果\n */\nexport function baseElementInertHandle<T extends Node>(\n parent: Node,\n newChild: Node,\n referenceChild: Node | null,\n rawMethod: DOMMethodSignature,\n): T {\n if (isLinkOrScript(newChild)) {\n const targetChild = createNewNode(newChild);\n return rawMethod.call(parent, targetChild, referenceChild);\n }\n\n return rawMethod.call(parent, newChild, referenceChild);\n}\n\n/**\n * 处理 appendChild 操作的基础元素添加\n * @description 拦截并处理 DOM 的 appendChild 操作,对 link 和 script 标签进行特殊处理\n * @param parent - 父节点\n * @param newChild - 要添加的新节点\n * @param rawMethod - 原始的 DOM 操作方法\n * @returns Node - 返回原始方法的执行结果\n */\nexport function baseElementAppendHandle<T extends Node>(parent: T, newChild: T, rawMethod: DOMMethodSignature): T {\n if (isLinkOrScript(newChild)) {\n const targetChild = createNewNode(newChild);\n return rawMethod.call(parent, targetChild);\n }\n\n return rawMethod.call(parent, newChild);\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 主应用资源收集模块\n * @description 收集和管理主应用的样式资源,为微应用提供基础资源共享能力\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { Style } from '../entry/style';\nimport { randomUrl } from '../utils/common';\nimport { baseElementAppendHandle, baseElementInertHandle } from './element';\n\n/**\n * 缓存原始 DOM 操作方法\n * @description 获取并缓存原始的 DOM 操作方法\n * @returns OriginalDOMMethodsCache - 原始方法缓存对象\n */\nfunction cacheOriginalDOMMethods() {\n return {\n rawBodyAppendChild: HTMLBodyElement.prototype.appendChild,\n rawHeadAppendChild: HTMLHeadElement.prototype.appendChild,\n rawHeadInsertBefore: HTMLHeadElement.prototype.insertBefore,\n };\n}\nexport type OriginalDOMMethodsCache = ReturnType<typeof cacheOriginalDOMMethods>;\n/**\n * 重写 DOM 操作方法\n * @description 重写 body 和 head 的 DOM 操作方法\n * @param originalMethods - 原始方法缓存对象\n */\nfunction overrideDOMMethods(originalMethods: OriginalDOMMethodsCache): void {\n const { rawBodyAppendChild, rawHeadAppendChild, rawHeadInsertBefore } = originalMethods;\n\n // 重写 HTMLBodyElement 的 appendChild 方法\n HTMLBodyElement.prototype.appendChild = function <T extends Node>(newChild: T): T {\n return baseElementAppendHandle<Node>(this, newChild, rawBodyAppendChild) as unknown as T;\n };\n\n // 重写 HTMLHeadElement 的 appendChild 方法\n HTMLHeadElement.prototype.appendChild = function <T extends Node>(newChild: T): T {\n return baseElementAppendHandle<Node>(this, newChild, rawHeadAppendChild) as unknown as T;\n };\n\n // 重写 HTMLHeadElement 的 insertBefore 方法\n HTMLHeadElement.prototype.insertBefore = function <T extends Node>(newChild: T, refChild: Node | null): T {\n return baseElementInertHandle<Node>(this, newChild, refChild, rawHeadInsertBefore) as unknown as T;\n };\n}\n\n/**\n * @description 收集主应用的样式资源\n */\nfunction collectExistingStyles(): void {\n const styleNodes = document.head.querySelectorAll('style');\n\n for (const styleNode of Array.from(styleNodes)) {\n const textContent = styleNode.textContent;\n\n if (textContent) {\n try {\n const style = new Style({\n code: textContent,\n fromHtml: false,\n url: '',\n });\n\n appCache.setBaseAppStyle(randomUrl(), style);\n } catch (error) {\n console.warn('Failed to collect style element:', error);\n }\n }\n }\n}\n\n/**\n * @description 在页面加载完成后开始收集主应用的资源\n */\nfunction setupLoadEventListener(): void {\n window.addEventListener('load', collectExistingStyles);\n}\n\n/**\n * 收集主应用的静态资源\n * @description 主要入口函数,用于初始化主应用静态资源收集机制\n *\n * 功能包括:\n * 1. 重写 DOM 操作方法以拦截新增的样式和脚本元素\n * 2. 收集页面加载时已存在的样式元素\n * 3. 将收集到的资源存储到基础应用缓存中\n *\n *\n * @example\n * ```typescript\n * // 在主应用初始化时调用\n * collectBaseSource();\n * ```\n */\nexport function collectBaseSource(): void {\n // 缓存原始 DOM 操作方法\n const originalMethods = cacheOriginalDOMMethods();\n\n // 重写 DOM 操作方法以拦截资源添加\n overrideDOMMethods(originalMethods);\n\n // 设置页面加载完成后的资源收集\n setupLoadEventListener();\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * DOM 元素方法重写模块\n * @description 重写 Body 和 Header 的 DOM 操作方法,实现微前端应用的 DOM 隔离和资源路径处理\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { fillUpPath } from '../utils/common';\nimport { elementInsertHandler, elementAppendHandler, isSpecialElement, type DOMMethod } from '../utils/element';\nimport { getCurrentRunningApp, setCurrentRunningApp } from './cache';\n\n/**\n * 支持的资源属性名称\n * @description 需要进行路径补全处理的属性\n */\nconst RESOURCE_ATTRIBUTES = ['src', 'srcset'];\n\n/**\n * 支持的链接属性名称\n * @description 链接元素需要进行路径补全处理的属性\n */\nconst LINK_ATTRIBUTES = ['href'];\n\n/**\n * 支持资源属性的标签名称\n * @description 这些标签的资源属性需要进行路径补全\n */\nconst RESOURCE_TAG_NAMES = ['IMG', 'SCRIPT'];\n\n/**\n * 支持链接属性的标签名称\n * @description 这些标签的链接属性需要进行路径补全\n */\nconst LINK_TAG_NAMES = ['LINK'];\n\n// 保存原始的 DOM 方法\nconst { setAttribute } = Element.prototype;\n\nconst {\n append,\n appendChild: bodyAppendChild,\n insertBefore: bodyInsertBefore,\n removeChild: bodyRemoveChild,\n} = HTMLBodyElement.prototype;\n\nconst {\n appendChild: headAppendChild,\n insertBefore: headInsertBefore,\n removeChild: headRemoveChild,\n} = HTMLHeadElement.prototype;\n\nconst rawHead = document.head;\nlet hasRewrite = false;\n\n/**\n * 检查是否需要处理资源路径\n * @description 判断元素属性是否需要进行路径补全处理\n * @param key - 属性名称\n * @param tagName - 元素标签名称\n * @returns boolean - 是否需要处理\n */\nfunction shouldProcessResourcePath(key: string, tagName: string): boolean {\n const upperTagName = tagName.toUpperCase();\n\n return (\n (RESOURCE_ATTRIBUTES.includes(key) && RESOURCE_TAG_NAMES.includes(upperTagName)) ||\n (LINK_ATTRIBUTES.includes(key) && LINK_TAG_NAMES.includes(upperTagName))\n );\n}\n\n/**\n * 获取元素的应用信息\n * @description 根据元素的应用标识获取对应的应用实例\n * @param element - 元素对象\n * @returns 应用实例或 null\n */\nfunction getElementApp(element: Element) {\n if (!element.__BK_WEWEB_APP_KEY__) {\n return null;\n }\n\n return appCache.getApp(element.__BK_WEWEB_APP_KEY__) || getCurrentRunningApp();\n}\n\n/**\n * 创建重写的 setAttribute 方法\n * @description 重写 setAttribute 方法,处理资源路径补全\n * @returns 重写后的 setAttribute 方法\n */\nfunction createOverriddenSetAttribute() {\n return function (this: Element, key: string, value: string): void {\n const tagName = this.tagName.toUpperCase();\n\n // 处理需要路径补全的资源属性\n if (shouldProcessResourcePath(key, tagName) && this.__BK_WEWEB_APP_KEY__) {\n const app = getElementApp(this);\n\n if (app) {\n // 补全相对路径\n setAttribute.call(this, key, fillUpPath(value, app.url));\n return;\n }\n }\n\n // 默认调用原始方法\n setAttribute.call(this, key, value);\n };\n}\n\n/**\n * 处理 keepAlive 模式的特殊元素\n * @description 将 keepAlive 模式的特殊元素添加到 head 中\n * @param newChild - 要添加的子元素\n * @returns 添加的元素或 null\n */\nfunction handleKeepAliveElement<T extends Node>(newChild: T): T | null {\n if (newChild.__KEEP_ALIVE__ && isSpecialElement(newChild)) {\n return headAppendChild.call(rawHead, newChild) as T;\n }\n\n return null;\n}\n\n/**\n * 创建重写的 appendChild 方法\n * @description 重写 appendChild 方法,支持 DOM 隔离和 keepAlive 处理\n * @returns 重写后的 appendChild 方法\n */\nfunction createOverriddenAppendChild() {\n return function <T extends Node>(this: HTMLElement, newChild: T): T {\n // keepAlive 模式的特殊元素放到 head 中\n const keepAliveResult = handleKeepAliveElement(newChild);\n if (keepAliveResult) {\n return keepAliveResult;\n }\n\n // 使用元素处理器进行常规处理\n const node = elementAppendHandler(this, newChild, bodyAppendChild as DOMMethod);\n\n if ((node as unknown as HTMLElement)?.tagName === 'STYLE') {\n (node as unknown as HTMLElement).insertAdjacentElement = createOverriddenInsertAdjacentElement();\n }\n return node as T;\n };\n}\n\n/**\n * 创建重写的 append 方法\n * @description 重写 append 方法,支持多节点添加和 keepAlive 处理\n * @returns 重写后的 append 方法\n */\nfunction createOverriddenAppend() {\n return function <T extends Node>(this: HTMLElement, ...nodes: T[]): void {\n // biome-ignore lint/complexity/noForEach: <explanation>\n nodes.forEach(node => {\n // keepAlive 模式的特殊元素放到 head 中\n const keepAliveResult = handleKeepAliveElement(node);\n if (keepAliveResult) {\n return;\n }\n\n // 使用元素处理器进行常规处理\n elementAppendHandler(this, node as Node, bodyAppendChild as DOMMethod);\n });\n };\n}\n\n/**\n * 创建重写的 insertBefore 方法\n * @description 重写 insertBefore 方法,支持 DOM 隔离\n * @returns 重写后的 insertBefore 方法\n */\nfunction createOverriddenInsertBefore() {\n return function <T extends Node>(this: HTMLElement, newChild: T, refChild: Node | null): T {\n return elementInsertHandler(this, newChild, refChild, headInsertBefore as DOMMethod) as T;\n };\n}\n\n/**\n * 创建重写的 removeChild 方法\n * @description 重写 removeChild 方法,支持从应用容器中移除元素\n * @returns 重写后的 removeChild 方法\n */\nfunction createOverriddenRemoveChild() {\n return function <T extends Node>(this: HTMLElement, oldChild: T): T {\n const app = oldChild.__BK_WEWEB_APP_KEY__ ? appCache.getApp(oldChild.__BK_WEWEB_APP_KEY__) : null;\n\n // 从应用容器中移除\n if (app?.container?.contains(oldChild)) {\n return bodyRemoveChild.call(app.container, oldChild) as T;\n }\n\n // 从当前容器中移除\n if (this.contains(oldChild)) {\n return bodyRemoveChild.call(this, oldChild) as T;\n }\n\n return oldChild;\n };\n}\nconst insertAdjacentElement = createOverriddenInsertAdjacentElement();\n\nfunction createOverriddenInsertAdjacentElement() {\n return function (this: HTMLElement, _where: InsertPosition, element: Element): Element | null {\n const node = elementAppendHandler(this, element, headAppendChild as DOMMethod) as Element | null;\n // vite项目使用 如果节点是样式元素,则重写 insertAdjacentElement 方法\n if ((node as unknown as HTMLElement)?.tagName === 'STYLE') {\n (node as unknown as HTMLElement).insertAdjacentElement = insertAdjacentElement;\n }\n return node;\n };\n}\n\n/**\n * 重写 Body 和 Header 的 DOM 操作方法\n * @description 实现微前端应用的 DOM 隔离和资源路径处理\n *\n * 主要功能:\n * 1. 重写 setAttribute 方法,自动补全资源路径\n * 2. 重写 appendChild 和 append 方法,支持 DOM 隔离\n * 3. 重写 insertBefore 方法,支持元素插入隔离\n * 4. 重写 removeChild 方法,支持从应用容器中移除元素\n * 5. 支持 keepAlive 模式的特殊元素处理\n *\n *\n * @example\n * ```typescript\n * // 在微前端应用初始化时调用\n * rewriteBodyAndHeaderMethods();\n * ```\n */\nexport function rewriteBodyAndHeaderMethods(): void {\n if (hasRewrite) {\n return;\n }\n\n hasRewrite = true;\n\n // 重写 Element 的 setAttribute 方法\n Element.prototype.setAttribute = createOverriddenSetAttribute();\n\n // 重写 HTMLBodyElement 的方法\n HTMLBodyElement.prototype.appendChild = createOverriddenAppendChild();\n HTMLBodyElement.prototype.append = createOverriddenAppend();\n HTMLBodyElement.prototype.insertBefore = createOverriddenInsertBefore();\n HTMLBodyElement.prototype.removeChild = createOverriddenRemoveChild();\n\n // 重写 HTMLHeadElement 的方法(复用 Body 的实现)\n HTMLHeadElement.prototype.appendChild = HTMLBodyElement.prototype.appendChild;\n HTMLHeadElement.prototype.insertBefore = createOverriddenInsertBefore();\n HTMLHeadElement.prototype.removeChild = HTMLBodyElement.prototype.removeChild;\n}\n\n/**\n * 重置 Body 和 Header 方法\n * @description 恢复原始 DOM 操作方法,清理微前端相关的修改\n *\n * 主要功能:\n * 1. 恢复所有被重写的 DOM 方法到原始状态\n * 2. 清理当前运行的应用状态\n * 3. 重置重写状态标识\n *\n *\n * @example\n * ```typescript\n * // 在微前端应用卸载时调用\n * resetBodyAndHeaderMethods();\n * ```\n */\nexport function resetBodyAndHeaderMethods(): void {\n setCurrentRunningApp(null);\n\n // 恢复所有原始方法\n Element.prototype.setAttribute = setAttribute;\n HTMLBodyElement.prototype.appendChild = bodyAppendChild;\n HTMLBodyElement.prototype.append = append;\n HTMLBodyElement.prototype.removeChild = bodyRemoveChild;\n HTMLBodyElement.prototype.insertBefore = bodyInsertBefore;\n HTMLHeadElement.prototype.appendChild = headAppendChild;\n HTMLHeadElement.prototype.insertBefore = headInsertBefore;\n HTMLHeadElement.prototype.removeChild = headRemoveChild;\n hasRewrite = false;\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 加载前预处理模块\n * @description 提供应用加载前的初始化和预处理功能\n */\n\nimport { rewriteBodyAndHeaderMethods } from '../context/element';\n\n/**\n * 加载前的预处理操作\n * @description 在应用加载前执行必要的初始化操作,包括重写 DOM 操作方法\n */\nexport function beforeLoad(): void {\n rewriteBodyAndHeaderMethods();\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 激活生命周期模块\n * @description 提供应用激活和重新挂载功能,支持 keep-alive 模式\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { nextTask } from '../utils/common';\nimport { beforeLoad } from './before-load';\n\nimport type { BaseModel } from '../typings';\n\n/**\n * 激活指定应用\n * @description 激活已失活的应用或挂载新应用,支持 keep-alive 模式的应用状态恢复\n * @template T - 导出实例的类型\n * @param appKey - 应用的唯一标识符\n * @param container - 挂载容器,HTMLElement 或 ShadowRoot\n * @param callback - 激活完成后的回调函数(可选)\n */\nexport function activated<T>(\n appKey: string,\n container: HTMLElement | ShadowRoot,\n callback?: <M extends BaseModel>(instance: M, exportInstance?: T) => void,\n): void {\n const app = appCache.getApp(appKey);\n\n if (app?.status === AppState.DEACTIVATED && app.keepAlive) {\n // 如果应用已失活且支持 keep-alive,执行激活操作\n nextTask(() => {\n beforeLoad();\n app.activated(container, callback);\n });\n } else if (app) {\n // 否则执行常规挂载操作\n nextTask(() => {\n beforeLoad();\n app.mount(container, callback);\n });\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 失活生命周期模块\n * @description 提供应用失活和状态保持功能,支持 keep-alive 模式\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { resetBodyAndHeaderMethods } from '../context/element';\n\n/**\n * deactivated 指定应用\n * @description 将指定应用设置为失活状态,根据 keep-alive 配置决定\n */\nexport function deactivated(appKey: string) {\n const app = appCache.getApp(appKey);\n\n if (app && [AppState.ACTIVATED, AppState.MOUNTED].some(status => status === app.status)) {\n app.keepAlive ? app.deactivated() : app.unmount();\n }\n\n if (!appCache.hasActiveApp) {\n resetBodyAndHeaderMethods();\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 加载生命周期模块\n * @description 提供微应用和模块实例的加载功能,支持不同模式的资源加载和状态管理\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { MicroAppModel } from '../mode/app';\nimport { MicroInstanceModel } from '../mode/instance';\nimport { type BaseModel, type IAppModelProps, type IBaseModelProps, type IJsModelProps, WewebMode } from '../typings';\nimport { beforeLoad } from './before-load';\n\n/**\n * 应用状态检查间隔时间(毫秒)\n */\nconst STATUS_CHECK_INTERVAL = 300;\n\n/**\n * 根据配置模式加载相应的应用或模块实例\n * @description 统一的加载入口,根据模式参数决定加载应用还是模块实例\n * @param props - 基础模型配置参数\n * @returns Promise<BaseModel> - 返回加载的模型实例\n */\nexport async function load(props: IBaseModelProps): Promise<BaseModel> {\n beforeLoad();\n\n if (props.mode === WewebMode.INSTANCE) {\n return await loadInstance(props);\n }\n\n return await loadApp(props);\n}\n\n/**\n * 加载微应用\n * @description 加载或获取已存在的微应用实例,并启动应用\n * @param props - 应用模型配置参数\n * @returns Promise<MicroAppModel> - 返回微应用模型实例\n */\nexport async function loadApp(props: IAppModelProps): Promise<MicroAppModel> {\n beforeLoad();\n\n let instance = appCache.getApp(props.id);\n\n if (!instance) {\n instance = new MicroAppModel(props);\n appCache.setApp(instance);\n } else {\n instance.data = props.data || instance.data || {};\n }\n await instance.start();\n return instance as MicroAppModel;\n}\n\n/**\n * 加载模块实例\n * @description 加载或获取已存在的模块实例,支持状态监听和异步等待\n * @param props - 模块实例配置参数\n * @returns Promise<MicroInstanceModel> - 返回模块实例模型\n */\nexport function loadInstance(props: IJsModelProps): Promise<MicroInstanceModel> {\n beforeLoad();\n\n return new Promise(resolve => {\n let instance = appCache.getApp(props.id);\n\n // 如果实例不存在,创建新实例\n if (!instance) {\n instance = new MicroInstanceModel(props);\n appCache.setApp(instance);\n instance.start().then(() => resolve(instance as MicroInstanceModel));\n return;\n }\n // 如果实例正在挂载或未设置状态,等待状态变更\n if (instance.status in [AppState.MOUNTING, AppState.UNSET]) {\n const timer = setInterval(() => {\n if (instance.status in [AppState.ERROR, AppState.MOUNTED]) {\n resolve(instance as MicroInstanceModel);\n clearInterval(timer);\n }\n }, STATUS_CHECK_INTERVAL);\n return;\n }\n instance.data = props.data || instance.data || {};\n // 实例已存在且状态正常,直接返回\n resolve(instance as MicroInstanceModel);\n });\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 卸载生命周期模块\n * @description 提供应用卸载和清理功能\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { resetBodyAndHeaderMethods } from '../context/element';\n\n/**\n * 卸载指定应用\n * @description 卸载指定的应用实例,并在没有活跃应用时重置全局方法\n * @param appKey - 应用的唯一标识符\n */\nexport function unmount(appKey: string): void {\n const app = appCache.getApp(appKey);\n\n if (app && app.status !== AppState.UNMOUNT) {\n app.unmount();\n }\n\n if (!appCache.hasActiveApp) {\n resetBodyAndHeaderMethods();\n }\n}\n","/* eslint-disable @typescript-eslint/member-ordering */\n\n/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * BK WEWEB 自定义 Web Component 模块\n * @description 提供基于 Web Components 标准的微应用容器组件\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { AppState } from '../common';\nimport { activated } from '../lifecycle/activated';\nimport { deactivated } from '../lifecycle/deactivated';\nimport { load } from '../lifecycle/load';\nimport { unmount } from '../lifecycle/unmount';\nimport { type IAppModelProps, type IJsModelProps, WewebMode } from '../typings';\n\n/**\n * BK WEWEB 支持的自定义属性枚举\n * @description 定义了 bk-weweb 自定义元素支持的所有属性配置\n */\nexport enum WewebCustomAttrs {\n /** 传递给子应用的数据 */\n data = 'data',\n /** 应用唯一标识符 */\n id = 'id',\n /** 是否启用缓存模式 */\n keepAlive = 'keepAlive',\n /** 应用运行模式 */\n mode = 'mode',\n /** 是否开启 CSS 样式隔离 */\n scopeCss = 'scopeCss',\n /** 是否开启 JavaScript 隔离 */\n scopeJs = 'scopeJs',\n /** 是否开启 location 路由隔离 */\n scopeLocation = 'scopeLocation',\n /** 是否启用 Shadow DOM */\n setShadowDom = 'setShadowDom',\n /** @deprecated 请使用 setShadowDom 代替 */\n setShodowDom = 'setShodowDom',\n /** 是否显示源码 */\n showSourceCode = 'showSourceCode',\n /** 应用资源 URL */\n url = 'url',\n}\n\n/**\n * BK WEWEB 自定义元素类\n * @description 基于 Web Components 标准实现的微应用容器组件\n */\nexport default class BkWewebElement extends HTMLElement {\n /** 应用 URL 缓存 */\n private appUrl = '';\n\n /** 组件连接状态标识 */\n private connected = false;\n\n /**\n * 观察的属性列表\n * @description 定义需要监听变化的属性名称列表\n * @returns string[] - 属性名称数组\n */\n static get observedAttributes(): string[] {\n return [WewebCustomAttrs.url];\n }\n\n /**\n * 获取布尔类型属性值\n * @description 解析布尔类型的自定义属性,支持驼峰和短横线命名\n * @param name - 属性名称\n * @returns boolean | undefined - 属性值或 undefined\n * @private\n */\n private getBooleanAttr(name: string): boolean | undefined {\n const hasAttr = this.hasAttribute(name) || this.hasAttribute(name.replace(/([A-Z])/g, '-$1').toLocaleLowerCase());\n return hasAttr ? this.getAttribute(name) !== 'false' : undefined;\n }\n\n /**\n * 处理属性变化的内部逻辑\n * @description 当属性发生变化时执行的处理逻辑\n * @returns Promise<void>\n * @private\n */\n private async handleAttributeChanged(): Promise<void> {\n if (!this.appKey) return;\n\n // 如果需要 Shadow DOM,则创建\n if (this.setShadowDomAttr) {\n this.attachShadow({ mode: 'open' });\n }\n\n const app = appCache.getApp(this.appKey);\n\n // 如果应用已存在且 URL 匹配,且是预加载或已卸载状态,则激活\n if (app && app.url === this.appUrl && (app.isPreLoad || app.status === AppState.UNMOUNT)) {\n activated(this.appKey, this.shadowRoot ?? this);\n return;\n }\n\n // 否则重新加载应用\n await load(this.appProps);\n }\n\n /**\n * 属性变化回调\n * @description 当观察的属性发生变化时触发\n * @param attr - 变化的属性名\n * @param _oldVal - 旧值(未使用)\n * @param newVal - 新值\n */\n attributeChangedCallback(attr: WewebCustomAttrs, _oldVal: string, newVal: string): void {\n // 只处理 URL 属性变化,且值确实发生改变,且组件已连接\n if (attr !== WewebCustomAttrs.url || this[attr] === newVal || !this.connected) return;\n\n this.appUrl = newVal;\n const cacheApp = appCache.getApp(this.appKey!);\n\n // 如果组件已连接或存在缓存应用,则处理属性变化\n if (this.connected || cacheApp) {\n this.handleAttributeChanged();\n }\n }\n /**\n * 获取是否启用 Shadow DOM 属性\n * @description 获取是否启用 Shadow DOM 属性 兼容旧版使用\n * @returns boolean | undefined - 是否启用 Shadow DOM 属性\n */\n get setShadowDomAttr(): boolean | undefined {\n return this.getBooleanAttr(WewebCustomAttrs.setShadowDom) ?? this.getBooleanAttr(WewebCustomAttrs.setShodowDom);\n }\n /**\n * 组件连接到 DOM 时的回调\n * @description 当自定义元素被插入到 DOM 时触发\n * @returns Promise<void>\n */\n async connectedCallback(): Promise<void> {\n // 如果需要且尚未创建 Shadow DOM,则创建\n if (this.setShadowDomAttr && !this.shadowRoot) {\n this.attachShadow({ delegatesFocus: false, mode: 'open' });\n }\n\n // 加载应用\n await load(this.appProps);\n\n // 激活应用\n activated(this.appKey!, this.shadowRoot ?? this);\n\n // 标记为已连接\n this.connected = true;\n }\n\n /**\n * 组件从 DOM 断开时的回调\n * @description 当自定义元素从 DOM 中移除时触发\n */\n disconnectedCallback(): void {\n this.connected = false;\n\n // 根据 keepAlive 配置决定失活还是卸载\n if (this.appProps.keepAlive) {\n deactivated(this.appKey!);\n } else {\n unmount(this.appKey!);\n }\n }\n\n /**\n * 获取应用数据\n * @description 解析 data 属性中的 JSON 数据\n * @returns Record<string, unknown> - 应用数据对象\n */\n get appData(): Record<string, unknown> {\n if (this.hasAttribute(WewebCustomAttrs.data)) {\n try {\n return JSON.parse(this.getAttribute(WewebCustomAttrs.data)!);\n } catch {\n // JSON 解析失败时返回空对象\n }\n }\n return {};\n }\n\n /**\n * 获取应用标识符\n * @description 优先使用 id 属性,其次使用 url 属性作为应用标识\n * 考虑到 JS 模式下需要 JS bundle 的复用性,需用户设置 id 属性\n * 如果是单实例应用则可以不用配置 id\n * @returns string | null - 应用标识符或 null\n */\n get appKey(): null | string {\n return this.getAttribute(WewebCustomAttrs.id) || this.getAttribute(WewebCustomAttrs.url);\n }\n\n /**\n * 获取应用配置属性\n * @description 根据模式返回相应的应用配置对象\n * @returns IAppModelProps | IJsModelProps - 应用配置对象\n */\n get appProps(): IAppModelProps | IJsModelProps {\n const commonProps = {\n container: this.shadowRoot ?? this,\n data: this.appData,\n id: this.appKey!,\n keepAlive: this.getBooleanAttr(WewebCustomAttrs.keepAlive),\n showSourceCode: this.getBooleanAttr(WewebCustomAttrs.showSourceCode),\n url: this.getAttribute(WewebCustomAttrs.url)!,\n };\n\n // 根据模式返回不同的配置\n if (this.getAttribute('mode') === WewebMode.INSTANCE) {\n return {\n ...commonProps,\n mode: WewebMode.INSTANCE,\n scopeCss: this.getBooleanAttr(WewebCustomAttrs.scopeCss) && !this.setShadowDomAttr,\n scopeJs: this.getBooleanAttr(WewebCustomAttrs.scopeJs),\n };\n }\n\n return {\n ...commonProps,\n mode: WewebMode.APP,\n scopeCss: !this.setShadowDomAttr,\n scopeJs: !this.getBooleanAttr(WewebCustomAttrs.scopeJs),\n scopeLocation: this.getBooleanAttr(WewebCustomAttrs.scopeLocation),\n };\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 挂载生命周期模块\n * @description 提供应用挂载到指定容器的功能\n */\n\nimport { appCache } from '../cache/app-cache';\nimport { nextTask } from '../utils/common';\nimport { beforeLoad } from './before-load';\n\nimport type { BaseModel } from '../typings';\n\n/**\n * 挂载应用到指定容器\n * @description 将已加载的应用挂载到指定的 DOM 容器或 ShadowRoot 中\n * @template T - 导出实例的类型\n * @param appKey - 应用的唯一标识符\n * @param container - 挂载容器,可以是 HTMLElement 或 ShadowRoot(可选)\n * @param callback - 挂载完成后的回调函数(可选)\n */\nexport function mount<T>(\n appKey: string,\n container?: HTMLElement | ShadowRoot,\n callback?: <M extends BaseModel>(instance: M, exportInstance?: T) => void,\n): void {\n const app = appCache.getApp(appKey);\n\n if (app) {\n nextTask(() => {\n beforeLoad();\n app.mount(container, callback);\n });\n }\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 卸载生命周期模块\n * @description 提供应用完全卸载和清理功能\n */\n\nimport { appCache } from '../cache/app-cache';\n\n/**\n * 卸载并删除指定应用\n * @description 从缓存中完全删除指定的应用实例,释放相关资源\n * @param url - 应用的 URL 标识符,用于定位要删除的应用\n */\nexport function unload(url: string): void {\n appCache.deleteApp(url);\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * 预加载模块\n * @description 提供微应用、模块实例和资源的预加载功能,利用浏览器空闲时间进行资源预加载以提升性能\n */\n\n/* eslint-disable @typescript-eslint/no-misused-promises */\nimport { loadApp, loadInstance } from '../lifecycle/load';\nimport { requestIdleCallback } from '../utils/common';\nimport { type SourceType, loadGlobalSource } from '../utils/load-source';\n\nimport type { IAppModelProps, IJsModelProps } from '../typings';\n\n/**\n * 预加载模块实例\n * @description 在浏览器空闲时预加载指定的模块实例,提前准备资源以提升后续加载性能\n * @param options - 模块加载配置参数\n * @param options.isPreLoad - 将被自动设置为 true,标识这是预加载操作\n * @example\n * ```typescript\n * preLoadInstance({\n * name: 'my-module',\n * url: 'https://example.com/module.js'\n * });\n * ```\n */\nexport function preLoadInstance(options: IJsModelProps): void {\n requestIdleCallback(() =>\n loadInstance({\n ...options,\n isPreLoad: true,\n }),\n );\n}\n\n/**\n * 预加载微应用\n * @description 在浏览器空闲时预加载指定的微应用,提前准备应用资源以提升后续加载性能\n * @param options - 应用加载配置参数\n * @param options.isPreLoad - 将被自动设置为 true,标识这是预加载操作\n * @example\n * ```typescript\n * preLoadApp({\n * name: 'my-app',\n * entry: 'https://example.com/app/'\n * });\n * ```\n */\nexport function preLoadApp(options: IAppModelProps): void {\n requestIdleCallback(() =>\n loadApp({\n ...options,\n isPreLoad: true,\n }),\n );\n}\n\n/**\n * 预加载全局资源\n * @description 在浏览器空闲时预加载指定的全局资源列表,包括样式文件、脚本文件等\n * @param sourceList - 要预加载的资源列表,可以是单个资源或资源数组\n * @example\n * ```typescript\n * // 预加载单个资源\n * preLoadSource('https://example.com/style.css');\n *\n * // 预加载多个资源\n * preLoadSource([\n * 'https://example.com/style.css',\n * 'https://example.com/script.js'\n * ]);\n * ```\n */\nexport function preLoadSource(sourceList: SourceType): void {\n requestIdleCallback(() => {\n loadGlobalSource(sourceList);\n });\n}\n","/*\n * Tencent is pleased to support the open source community by making\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * 蓝鲸智云PaaS平台 (BlueKing PaaS) is licensed under the MIT License.\n *\n * License for 蓝鲸智云PaaS平台 (BlueKing PaaS):\n *\n * ---------------------------------------------------\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\n * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\n * to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n * the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { collectBaseSource } from './base-app/collect-source';\nimport BkWewebElement from './component/web-component';\nimport './context/cache';\n\nimport type { FetchSourceType, IStartOption } from './typings';\nexport * from './lifecycle/activated';\nexport * from './lifecycle/deactivated';\nexport * from './lifecycle/load';\nexport * from './lifecycle/mount';\nexport * from './lifecycle/unload';\nexport * from './lifecycle/unmount';\nexport * from './preload/preload';\nexport { WewebMode } from './typings';\n\nconst CUSTOM_ELEMENT_TAG = 'bk-weweb';\n\nexport class WeWeb {\n fetchSource?: FetchSourceType;\n webComponentTag = CUSTOM_ELEMENT_TAG;\n\n constructor() {\n if (!window.customElements.get(CUSTOM_ELEMENT_TAG)) {\n window.customElements.define(CUSTOM_ELEMENT_TAG, BkWewebElement);\n }\n }\n\n /** 设置自定义DOM标签名 */\n setWebComponentTag() {\n if (!window.customElements.get(this.webComponentTag)) {\n window.customElements.define(this.webComponentTag, BkWewebElement);\n }\n }\n\n /** 启动WeWeb */\n start(option?: IStartOption) {\n if (option?.collectBaseSource) {\n collectBaseSource();\n }\n if (typeof option?.fetchSource === 'function') {\n this.fetchSource = option.fetchSource;\n }\n this.webComponentTag = option?.webComponentTag || CUSTOM_ELEMENT_TAG;\n this.setWebComponentTag();\n }\n}\n\nconst weWeb = new WeWeb();\nexport default weWeb;\n"],"mappings":"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","names":["WewebMode","value","clearInterval","setInterval","DEFAULT_RANDOM_LENGTH","bodyAppendChild"]}