@cdfrd/publish-notification-plugin 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -0
- package/dist/index.cjs +1148 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +61 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.js +1114 -0
- package/dist/index.js.map +1 -0
- package/dist/types-DaCJHaWX.d.cts +132 -0
- package/dist/types-DaCJHaWX.d.ts +132 -0
- package/dist/version.cjs +102 -0
- package/dist/version.cjs.map +1 -0
- package/dist/version.d.cts +13 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.js +75 -0
- package/dist/version.js.map +1 -0
- package/dist/vite.cjs +111 -0
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.cts +10 -0
- package/dist/vite.d.ts +10 -0
- package/dist/vite.js +84 -0
- package/dist/vite.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.26_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","../src/constants.ts","../src/build/validate-options.ts","../src/core/check-gate.ts","../src/core/dismiss-storage.ts","../src/core/version-compare.ts","../src/core/version-url.ts","../src/core/UpdateNoticeRuntime.ts","../src/core/locale.ts","../src/notification/default-styles.ts","../src/notification/inject-styles.ts","../src/theme/resolve-primary.ts","../src/notification/NotificationManager.ts","../src/manager/UpdateNoticeManager.ts"],"sourcesContent":["export { createUpdateNotice, getUpdateNotice, UpdateNoticeManager } from './manager/UpdateNoticeManager'\n\nexport type {\n CheckConfig,\n Locale,\n LocaleConfig,\n LocaleCopy,\n MicroAppConfig,\n Placement,\n SetActiveAppOptions,\n Theme,\n ThemeAdapterConfig,\n ThemeAdapterType,\n UpdateNoticeManagerApi,\n UpdateNoticeOptions,\n VersionJson,\n VersionPluginOptions,\n VersionType,\n WebUpdateNoticeEventDetail,\n} from './types'\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","export const DIRECTORY_NAME = 'update-notice'\nexport const JSON_FILE_NAME = 'version'\nexport const INJECT_STYLE_TAG_ID = '_cdfrd_un_styles_'\nexport const CUSTOM_UPDATE_EVENT_NAME = 'web_update_notice'\nexport const NOTIFICATION_ANCHOR_CLASS_NAME = 'cdfrd-update-notice-anchor'\nexport const NOTIFICATION_REFRESH_BTN_CLASS = 'cdfrd-update-notice-refresh-btn'\nexport const NOTIFICATION_DISMISS_BTN_CLASS = 'cdfrd-update-notice-dismiss-btn'\nexport const NOTIFICATION_CLOSE_BTN_CLASS = 'cdfrd-update-notice-close-btn'\nexport const DISMISS_STORAGE_PREFIX = 'cdfrd_update_notice_dismiss_'\nexport const MAX_DISMISSED_VERSIONS = 3\nexport const STANDALONE_APP_ID = '__standalone__'\nexport const DEFAULT_PRIMARY_COLOR = '#1677ff'\nexport const THEME_RETRY_MAX = 3\n/** Wait for Antd button CSS transitions to settle before applying watched primary. */\nexport const THEME_WATCH_DEBOUNCE_MS = 150\n\nexport const PLACEMENT_STYLES: Record<string, string> = {\n topLeft: 'top:16px;left:24px',\n topRight: 'top:16px;right:24px',\n bottomLeft: 'bottom:16px;left:24px',\n bottomRight: 'bottom:16px;right:24px',\n}\n\nexport const DEFAULT_CHECK_INTERVAL = 10 * 60 * 1000\n","import type { UpdateNoticeOptions, UpdateNoticeOptionsInput } from '../types'\n\nconst MUTUAL_EXCLUSIVE_MSG =\n '[publish-notification] disableNotification 与 hiddenDefaultNotice 不得同时为 true,请二选一。'\n\nexport function validateOptions(options: UpdateNoticeOptionsInput = {}): UpdateNoticeOptions {\n if (options.disableNotification && options.hiddenDefaultNotice) {\n throw new Error(MUTUAL_EXCLUSIVE_MSG)\n }\n if (options.microApp?.enabled && !options.microApp.appId) {\n throw new Error('[publish-notification] microApp.enabled 为 true 时必须提供 microApp.appId')\n }\n return options as UpdateNoticeOptions\n}\n\nexport function resolveAppId(options: UpdateNoticeOptions): string | undefined {\n if (options.microApp?.enabled) return options.microApp.appId\n return undefined\n}\n\nexport function isNotificationFullyDisabled(options: UpdateNoticeOptions): boolean {\n return options.disableNotification === true\n}\n\nexport function shouldUseCustomEvent(options: UpdateNoticeOptions): boolean {\n return options.hiddenDefaultNotice === true && !isNotificationFullyDisabled(options)\n}\n\nexport function shouldShowDefaultUi(options: UpdateNoticeOptions): boolean {\n return !options.disableNotification && !options.hiddenDefaultNotice\n}\n","import type { UpdateNoticeOptions } from '../types'\nimport { isNotificationFullyDisabled, resolveAppId } from '../build/validate-options'\nimport { STANDALONE_APP_ID } from '../constants'\n\nexport interface CheckGateContext {\n activeApp: string | null\n}\n\nexport function isTabVisible(): boolean {\n return typeof document !== 'undefined' && document.visibilityState === 'visible' && !document.hidden\n}\n\nexport function isAppActive(options: UpdateNoticeOptions, context: CheckGateContext): boolean {\n if (!options.microApp?.enabled) return true\n return context.activeApp === options.microApp.appId\n}\n\nexport function canCheckUpdate(\n options: UpdateNoticeOptions,\n context: CheckGateContext,\n): boolean {\n if (isNotificationFullyDisabled(options)) return false\n // Default on: require visible tab. Explicit false skips this gate.\n if (options.check?.onTabVisible !== false && !isTabVisible()) return false\n if (!isAppActive(options, context)) return false\n return true\n}\n\nexport function getRuntimeKey(options: UpdateNoticeOptions): string {\n return resolveAppId(options) ?? STANDALONE_APP_ID\n}\n\nexport function getDismissAppId(options: UpdateNoticeOptions): string {\n return resolveAppId(options) ?? STANDALONE_APP_ID\n}\n","import { DISMISS_STORAGE_PREFIX, MAX_DISMISSED_VERSIONS } from '../constants'\n\nconst DISMISS_STORAGE_KEY = `${DISMISS_STORAGE_PREFIX}entries`\n\nexport function toDismissEntry(appId: string, version: string): string {\n return `${appId}+${version}`\n}\n\nfunction parseDismissEntry(entry: string): { appId: string; version: string } | null {\n const idx = entry.indexOf('+')\n if (idx <= 0) return null\n return { appId: entry.slice(0, idx), version: entry.slice(idx + 1) }\n}\n\nfunction readDismissEntries(): string[] {\n try {\n const raw = localStorage.getItem(DISMISS_STORAGE_KEY)\n if (!raw) return []\n const parsed = JSON.parse(raw) as unknown\n return Array.isArray(parsed) ? parsed.filter((v) => typeof v === 'string') : []\n } catch {\n return []\n }\n}\n\nfunction writeDismissEntries(entries: string[]): void {\n try {\n localStorage.setItem(DISMISS_STORAGE_KEY, JSON.stringify(entries))\n } catch {\n // ignore quota errors\n }\n}\n\nexport function readDismissedVersions(appId: string): string[] {\n return readDismissEntries()\n .map(parseDismissEntry)\n .filter((item): item is { appId: string; version: string } => item?.appId === appId)\n .map((item) => item.version)\n}\n\nexport function isVersionDismissed(appId: string, version: string): boolean {\n return readDismissEntries().includes(toDismissEntry(appId, version))\n}\n\nexport function rememberDismissedVersion(appId: string, version: string): void {\n const entry = toDismissEntry(appId, version)\n const entries = readDismissEntries().filter((item) => item !== entry)\n const sameAppEntries = entries.filter((item) => item.startsWith(`${appId}+`))\n const otherAppEntries = entries.filter((item) => !item.startsWith(`${appId}+`))\n const nextSameAppEntries = [entry, ...sameAppEntries].slice(0, MAX_DISMISSED_VERSIONS)\n writeDismissEntries([...otherAppEntries, ...nextSameAppEntries])\n}\n","export function hasNewVersion(localVersion: string, remoteVersion: string): boolean {\n return localVersion !== remoteVersion\n}\n","import { DIRECTORY_NAME, JSON_FILE_NAME } from '../constants'\n\nfunction normalizeBase(base: string): string {\n if (!base) return ''\n return base.endsWith('/') ? base : `${base}/`\n}\n\nfunction isAbsoluteHttpBase(base: string): boolean {\n return /^https?:\\/\\//i.test(base)\n}\n\n/**\n * Read Vite base. Must use static `import.meta.env.BASE_URL` so Vite replaces\n * it when bundling consumer apps (optional chaining / indirection breaks that).\n */\nfunction readViteBaseUrl(): string | undefined {\n try {\n const base = import.meta.env.BASE_URL\n if (typeof base === 'string') return base\n } catch {\n // ignore\n }\n return undefined\n}\n\n/**\n * Runtime public path injected by the micro-frontend loader (dynamic domain).\n * Prefer this over build-time vite `base` for qiankun / webpack apps.\n */\nexport function readRuntimePublicPath(): string | undefined {\n if (typeof window === 'undefined') return undefined\n const w = window as Window & {\n __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string\n __webpack_public_path__?: string\n proxy?: {\n __INJECTED_PUBLIC_PATH_BY_QIANKUN__?: string\n __webpack_public_path__?: string\n }\n }\n const raw =\n w.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ ||\n w.proxy?.__INJECTED_PUBLIC_PATH_BY_QIANKUN__ ||\n w.__webpack_public_path__ ||\n w.proxy?.__webpack_public_path__\n if (typeof raw !== 'string' || !raw.trim()) return undefined\n try {\n const href = new URL(\n raw,\n typeof location !== 'undefined' ? location.href : 'http://localhost/',\n ).href\n return normalizeBase(href)\n } catch {\n return normalizeBase(raw)\n }\n}\n\n/**\n * Normalize Vite BASE_URL pathname for joining with a module origin.\n * `./` and `/` both mean \"app root on that origin\".\n */\nfunction vitePathPrefix(viteBase: string): string {\n if (!viteBase || viteBase === '/' || viteBase === './') return '/'\n if (isAbsoluteHttpBase(viteBase)) {\n try {\n const path = new URL(viteBase).pathname\n return normalizeBase(path || '/')\n } catch {\n return '/'\n }\n }\n return normalizeBase(viteBase)\n}\n\n/**\n * Origin of THIS module's chunk. For micro-apps this is the deployed asset\n * origin (dynamic at runtime) — no build-time absolute vite `base` required.\n * Must be called from the micro-app's own bundle (createUpdateNotice stamp),\n * not from a shared Host copy of the module graph.\n */\nfunction readModuleOriginBase(pathBase: string): string | undefined {\n try {\n const moduleUrl = new URL(import.meta.url)\n if (moduleUrl.protocol !== 'http:' && moduleUrl.protocol !== 'https:') return undefined\n if (!moduleUrl.origin) return undefined\n const prefix = pathBase === '/' ? '/' : pathBase\n return normalizeBase(`${moduleUrl.origin}${prefix === '/' ? '/' : prefix}`)\n } catch {\n return undefined\n }\n}\n\n/**\n * Micro-app base (call from micro bundle):\n * 1) runtime publicPath / webpack publicPath (loader-injected dynamic domain)\n * 2) absolute Vite BASE_URL if present\n * 3) this chunk's origin + relative BASE_URL path\n *\n * Never falls back to page-relative `/` (would hit Host when embedded).\n */\nexport function resolveMicroVersionBase(explicit?: string): string | undefined {\n if (explicit !== undefined && explicit !== null) {\n return normalizeBase(explicit)\n }\n\n const runtime = readRuntimePublicPath()\n if (runtime && isAbsoluteHttpBase(runtime)) return runtime\n\n const viteBase = readViteBaseUrl() ?? ''\n if (isAbsoluteHttpBase(viteBase)) return normalizeBase(viteBase)\n\n return readModuleOriginBase(vitePathPrefix(viteBase))\n}\n\n/**\n * Host / standalone: explicit → absolute Vite base → relative Vite path → ''.\n * Skips qiankun publicPath so a leftover micro publicPath cannot hijack Host checks.\n */\nexport function resolveVersionBase(explicit?: string): string {\n if (explicit !== undefined && explicit !== null) {\n return normalizeBase(explicit)\n }\n\n const viteBase = readViteBaseUrl() ?? ''\n if (isAbsoluteHttpBase(viteBase)) {\n return normalizeBase(viteBase)\n }\n\n const pathBase = vitePathPrefix(viteBase)\n // Host/standalone: keep path-only (`/` → '') so fetch stays same-origin relative\n return pathBase === '/' ? '' : pathBase\n}\n\nexport function buildVersionJsonUrl(versionBase?: string): string {\n const base = resolveVersionBase(versionBase)\n return `${base}${DIRECTORY_NAME}/${JSON_FILE_NAME}.json`\n}\n","import { CUSTOM_UPDATE_EVENT_NAME, DEFAULT_CHECK_INTERVAL, NOTIFICATION_ANCHOR_CLASS_NAME } from '../constants'\nimport { canCheckUpdate, getDismissAppId, getRuntimeKey } from './check-gate'\nimport { isVersionDismissed, rememberDismissedVersion } from './dismiss-storage'\nimport { hasNewVersion } from './version-compare'\nimport { buildVersionJsonUrl, resolveMicroVersionBase, resolveVersionBase } from './version-url'\nimport {\n isNotificationFullyDisabled,\n resolveAppId,\n shouldShowDefaultUi,\n shouldUseCustomEvent,\n} from '../build/validate-options'\nimport type { UpdateNoticeManager } from '../manager/UpdateNoticeManager'\nimport type { UpdateNoticeOptions, VersionJson } from '../types'\n\nexport class UpdateNoticeRuntime {\n readonly appKey: string\n readonly appId?: string\n readonly options: UpdateNoticeOptions\n /** Baseline version for this page session; set on first successful fetch */\n localVersion: string | null = null\n private intervalId: ReturnType<typeof setInterval> | undefined\n private manager: UpdateNoticeManager\n private pendingUpdate: string | null = null\n private onVisibilityChange?: () => void\n private onWindowFocus?: () => void\n private onResourceError?: (event: Event) => void\n\n constructor(manager: UpdateNoticeManager, options: UpdateNoticeOptions) {\n this.manager = manager\n this.options = options\n this.appId = resolveAppId(options)\n this.appKey = getRuntimeKey(options)\n }\n\n bootstrap(): void {\n if (isNotificationFullyDisabled(this.options)) return\n this.setupScheduler()\n }\n\n destroy(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = undefined\n }\n if (this.onVisibilityChange) {\n document.removeEventListener('visibilitychange', this.onVisibilityChange)\n this.onVisibilityChange = undefined\n }\n if (this.onWindowFocus) {\n window.removeEventListener('focus', this.onWindowFocus)\n this.onWindowFocus = undefined\n }\n if (this.onResourceError) {\n window.removeEventListener('error', this.onResourceError, true)\n this.onResourceError = undefined\n }\n }\n\n checkUpdate(): void {\n if (isNotificationFullyDisabled(this.options)) return\n\n if (!canCheckUpdate(this.options, { activeApp: this.manager.activeApp })) {\n if (this.pendingUpdate) this.tryNotify(this.pendingUpdate)\n return\n }\n\n // Prefer stamped versionBase from createUpdateNotice (micro bundle context).\n // If unset (rare), re-read runtime publicPath only when powered by qiankun.\n const poweredByQiankun = Boolean(\n (window as Window & { __POWERED_BY_QIANKUN__?: boolean }).__POWERED_BY_QIANKUN__,\n )\n const versionBase =\n this.options.versionBase !== undefined && this.options.versionBase !== null\n ? this.options.versionBase\n : this.options.microApp?.enabled && poweredByQiankun\n ? (resolveMicroVersionBase() ?? resolveVersionBase())\n : resolveVersionBase()\n const url = `${buildVersionJsonUrl(versionBase)}?t=${Date.now()}`\n\n fetch(url)\n .then((res) => {\n if (!res.ok) throw new Error('version fetch failed')\n return res.json() as Promise<VersionJson>\n })\n .then((remote) => {\n if (!remote?.version) return\n\n // First successful fetch establishes session baseline — no notify\n if (this.localVersion == null) {\n this.localVersion = remote.version\n return\n }\n\n if (!hasNewVersion(this.localVersion, remote.version)) {\n this.pendingUpdate = null\n return\n }\n if (!canCheckUpdate(this.options, { activeApp: this.manager.activeApp })) {\n this.pendingUpdate = remote.version\n return\n }\n this.handleUpdateDetected(remote.version)\n })\n .catch(() => {\n // silent\n })\n }\n\n flushPendingUpdate(): void {\n if (this.pendingUpdate) this.tryNotify(this.pendingUpdate)\n }\n\n private handleUpdateDetected(version: string): void {\n const dismissKey = getDismissAppId(this.options)\n if (isVersionDismissed(dismissKey, version)) return\n\n this.pendingUpdate = null\n this.manager.notifyUpdate(this, version)\n\n if (shouldUseCustomEvent(this.options)) {\n window.dispatchEvent(\n new CustomEvent(CUSTOM_UPDATE_EVENT_NAME, {\n detail: { appId: this.appId, version, options: this.options },\n }),\n )\n return\n }\n\n if (shouldShowDefaultUi(this.options)) {\n const shown = this.manager.showDefaultNotice(this, version)\n if (!shown) this.pendingUpdate = version\n }\n }\n\n private tryNotify(version: string): void {\n if (canCheckUpdate(this.options, { activeApp: this.manager.activeApp })) {\n this.handleUpdateDetected(version)\n }\n }\n\n dismissVersion(version: string): void {\n rememberDismissedVersion(getDismissAppId(this.options), version)\n }\n\n private setupScheduler(): void {\n const check = this.options.check ?? {}\n const checkInterval = check.interval ?? DEFAULT_CHECK_INTERVAL\n const onWindowActive = check.onWindowActive !== false\n const onResourceError = check.onResourceError !== false\n const checkImmediately = !this.options.microApp?.enabled\n\n const run = () => this.checkUpdate()\n const flushPending = () => this.flushPendingUpdate()\n\n if (checkImmediately) {\n setTimeout(run, 0)\n }\n\n const startPolling = () => {\n if (this.intervalId) clearInterval(this.intervalId)\n if (checkInterval > 0) {\n this.intervalId = setInterval(run, checkInterval)\n }\n }\n\n startPolling()\n\n this.onVisibilityChange = () => {\n if (document.visibilityState === 'visible') {\n startPolling()\n flushPending()\n if (onWindowActive) run()\n } else if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = undefined\n }\n }\n document.addEventListener('visibilitychange', this.onVisibilityChange)\n\n if (onWindowActive) {\n this.onWindowFocus = () => {\n flushPending()\n run()\n }\n window.addEventListener('focus', this.onWindowFocus)\n }\n\n if (onResourceError) {\n this.onResourceError = (event) => {\n const tag = (event.target as HTMLElement | null)?.tagName\n if (tag === 'SCRIPT' || tag === 'LINK') run()\n }\n window.addEventListener('error', this.onResourceError, true)\n }\n }\n}\n\nexport function ensureNotificationAnchor(): void {\n if (typeof document === 'undefined') return\n const existing = document.body?.querySelector(`:scope > .${NOTIFICATION_ANCHOR_CLASS_NAME}`)\n if (existing) return\n\n const mount = () => {\n if (document.body?.querySelector(`:scope > .${NOTIFICATION_ANCHOR_CLASS_NAME}`)) return\n if (!document.body) return\n const anchor = document.createElement('div')\n anchor.className = NOTIFICATION_ANCHOR_CLASS_NAME\n document.body.appendChild(anchor)\n }\n\n if (!document.body) {\n document.addEventListener('DOMContentLoaded', mount, { once: true })\n return\n }\n mount()\n}\n","import type { Locale, LocaleCopy, UpdateNoticeOptions } from '../types'\n\nexport const PRESET_LOCALE: Record<Locale, LocaleCopy> = {\n zh_CN: {\n title: '发现新版本',\n description: '请刷新后继续。',\n forcedTitle: '发现新版本',\n forcedDescription: '请刷新后继续。',\n buttonText: '刷新',\n dismissButtonText: '稍后',\n },\n en_US: {\n title: 'Update available',\n description: 'Please refresh to continue.',\n forcedTitle: 'Update required',\n forcedDescription: 'Please refresh to continue.',\n buttonText: 'Refresh',\n dismissButtonText: 'Later',\n },\n}\n\nexport function resolveNotificationCopy(\n options: UpdateNoticeOptions,\n locale: Locale,\n): LocaleCopy {\n const builtin = PRESET_LOCALE[locale] ?? PRESET_LOCALE.zh_CN\n const fromData = options.locale?.data?.[locale] ?? {}\n return {\n title: fromData.title ?? builtin.title,\n description: fromData.description ?? builtin.description,\n forcedTitle: fromData.title ?? builtin.forcedTitle,\n forcedDescription: fromData.forcedDescription ?? builtin.forcedDescription,\n buttonText: fromData.buttonText ?? builtin.buttonText,\n dismissButtonText: fromData.dismissButtonText ?? builtin.dismissButtonText,\n }\n}\n","export const DEFAULT_NOTICE_CSS = `\n.cdfrd-update-notice[data-update-notice-theme='light'] {\n --update-bg: #ffffff;\n --update-text: rgba(0, 0, 0, 0.88);\n --update-text-secondary: rgba(0, 0, 0, 0.65);\n --update-border: #f0f0f0;\n --update-btn-border: #d9d9d9;\n --update-btn-hover-bg: rgba(0, 0, 0, 0.04);\n --update-primary: #1677ff;\n --update-primary-hover: #4096ff;\n --update-mask: rgba(0, 0, 0, 0.45);\n --update-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n}\n\n.cdfrd-update-notice[data-update-notice-theme='dark'] {\n --update-bg: #1f1f1f;\n --update-text: rgba(255, 255, 255, 0.85);\n --update-text-secondary: rgba(255, 255, 255, 0.65);\n --update-border: #303030;\n --update-btn-border: #424242;\n --update-btn-hover-bg: rgba(255, 255, 255, 0.08);\n --update-primary: #1668dc;\n --update-primary-hover: #3c89e8;\n --update-mask: rgba(0, 0, 0, 0.65);\n --update-shadow: 0 6px 16px 0 rgba(0, 0, 0, 0.32), 0 3px 6px -4px rgba(0, 0, 0, 0.48),\n 0 9px 28px 8px rgba(0, 0, 0, 0.2);\n}\n\n.cdfrd-update-notice {\n position: fixed;\n z-index: 99999;\n box-sizing: border-box;\n max-width: calc(100vw - 48px);\n user-select: none;\n pointer-events: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n 'Noto Sans', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;\n}\n\n.cdfrd-update-notice:not(.cdfrd-update-notice--forced) {\n width: 384px;\n}\n\n.cdfrd-update-notice-panel {\n pointer-events: auto;\n position: relative;\n box-sizing: border-box;\n width: 100%;\n padding: 16px 24px;\n border-radius: 8px;\n background: var(--update-bg);\n color: var(--update-text);\n border: 1px solid var(--update-border);\n box-shadow: var(--update-shadow);\n}\n\n.cdfrd-update-notice-header {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-bottom: 4px;\n}\n\n.cdfrd-update-notice-title {\n flex: 1;\n min-width: 0;\n font-size: 16px;\n font-weight: 600;\n line-height: 1.5;\n color: var(--update-text);\n}\n\n.cdfrd-update-notice-close {\n flex-shrink: 0;\n cursor: pointer;\n width: 22px;\n height: 22px;\n padding: 0;\n border: none;\n border-radius: 4px;\n background: transparent;\n color: var(--update-text-secondary);\n font-size: 16px;\n line-height: 22px;\n}\n\n.cdfrd-update-notice-close:hover {\n color: var(--update-text);\n background: var(--update-btn-hover-bg);\n}\n\n.cdfrd-update-notice-desc {\n font-size: 14px;\n line-height: 1.5714;\n color: var(--update-text-secondary);\n margin: 0 0 12px;\n}\n\n.cdfrd-update-notice-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n}\n\n.cdfrd-update-notice-btn {\n cursor: pointer;\n font-size: 14px;\n line-height: 1.5714;\n height: 32px;\n padding: 4px 15px;\n border: 1px solid var(--update-btn-border);\n border-radius: 6px;\n background: var(--update-bg);\n color: var(--update-text);\n box-sizing: border-box;\n transition: all 0.2s;\n}\n\n.cdfrd-update-notice-btn:hover {\n color: var(--update-primary);\n border-color: var(--update-primary);\n}\n\n.cdfrd-update-notice-btn-primary {\n background: var(--update-primary);\n border-color: var(--update-primary);\n color: #fff;\n}\n\n.cdfrd-update-notice-btn-primary:hover {\n background: var(--update-primary-hover);\n border-color: var(--update-primary-hover);\n color: #fff;\n}\n\n/* Forced centered modal — Ant Design Modal */\n.cdfrd-update-notice--forced {\n inset: 0;\n max-width: none;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: auto;\n background: var(--update-mask);\n padding: 24px;\n}\n\n.cdfrd-update-notice--forced .cdfrd-update-notice-panel {\n width: min(416px, 100%);\n padding: 20px 24px;\n border: none;\n text-align: left;\n}\n\n.cdfrd-update-notice--forced .cdfrd-update-notice-title {\n margin-bottom: 8px;\n}\n\n.cdfrd-update-notice--forced .cdfrd-update-notice-desc {\n margin-bottom: 0;\n}\n\n.cdfrd-update-notice--forced .cdfrd-update-notice-actions {\n margin-top: 12px;\n justify-content: flex-end;\n}\n`.trim()\n","import { INJECT_STYLE_TAG_ID } from '../constants'\nimport { DEFAULT_NOTICE_CSS } from './default-styles'\n\nexport function ensureDefaultStyles(): void {\n if (typeof document === 'undefined') return\n if (document.getElementById(INJECT_STYLE_TAG_ID)) return\n if (!document.head) return\n const style = document.createElement('style')\n style.id = INJECT_STYLE_TAG_ID\n style.textContent = DEFAULT_NOTICE_CSS\n document.head.appendChild(style)\n}\n","import {\n DEFAULT_PRIMARY_COLOR,\n INJECT_STYLE_TAG_ID,\n NOTIFICATION_ANCHOR_CLASS_NAME,\n THEME_RETRY_MAX,\n THEME_WATCH_DEBOUNCE_MS,\n} from '../constants'\nimport type { Theme, ThemeAdapterConfig } from '../types'\n\nconst ANT_PRIMARY_VARS = [\n '--ant-color-primary',\n '--ant-primary-color',\n '--colorPrimary',\n]\n\nexport function isInvalidColor(color: string | null | undefined): boolean {\n if (!color) return true\n const c = color.trim().toLowerCase()\n if (!c || c === 'transparent' || c === 'rgba(0, 0, 0, 0)' || c === 'rgba(0,0,0,0)') return true\n // Browser default button face when Antd styles are not loaded\n if (c === 'buttonface' || c === 'canvas' || c === 'rgba(239, 239, 239, 1)' || c === 'rgb(239, 239, 239)') {\n return true\n }\n return false\n}\n\nfunction readCssVarFromElement(el: Element): string | null {\n try {\n const style = getComputedStyle(el)\n for (const name of ANT_PRIMARY_VARS) {\n const value = style.getPropertyValue(name)?.trim()\n if (!isInvalidColor(value)) return value\n }\n } catch {\n return null\n }\n return null\n}\n\n/**\n * Prefer CSS tokens over painted background. Tokens jump when ConfigProvider commits;\n * `.ant-btn-primary` background often CSS-transitions for ~1s and yields intermediate rgb().\n */\nfunction readCssVariablePrimary(): string | null {\n if (typeof document === 'undefined') return null\n const btn = document.querySelector('.ant-btn-primary')\n if (btn) {\n let el: HTMLElement | null = btn as HTMLElement\n while (el) {\n const value = readCssVarFromElement(el)\n if (value) return value\n el = el.parentElement\n }\n }\n for (const root of [document.documentElement, document.body]) {\n if (!root) continue\n const value = readCssVarFromElement(root)\n if (value) return value\n }\n return null\n}\n\nfunction readExistingPrimaryButtonBg(): string | null {\n if (typeof document === 'undefined') return null\n const btn = document.querySelector('.ant-btn-primary') as HTMLElement | null\n if (!btn) return null\n try {\n const color = getComputedStyle(btn).backgroundColor\n return isInvalidColor(color) ? null : color\n } catch {\n return null\n }\n}\n\nexport type AntdPrimarySource = 'cssVar' | 'btnBg' | 'probe'\n\nexport type AntdPrimaryResolve = {\n color: string\n source: AntdPrimarySource\n}\n\n/** Suppress theme MutationObserver while probe mutates body (avoids feedback loop). */\nlet suppressThemeWatch = 0\n\nexport function beginSuppressThemeWatch(): void {\n suppressThemeWatch += 1\n}\n\nexport function endSuppressThemeWatch(): void {\n // MutationObserver delivers records as a microtask after DOM writes.\n void Promise.resolve().then(() => {\n suppressThemeWatch = Math.max(0, suppressThemeWatch - 1)\n })\n}\n\nfunction probePrimaryButton(): string | null {\n if (typeof document === 'undefined' || !document.body) return null\n beginSuppressThemeWatch()\n try {\n const probe = document.createElement('button')\n probe.className = 'ant-btn ant-btn-primary'\n probe.setAttribute('aria-hidden', 'true')\n probe.tabIndex = -1\n probe.style.cssText =\n 'position:absolute;left:0;top:0;opacity:0;pointer-events:none;width:0;height:0;overflow:hidden;'\n document.body.appendChild(probe)\n const color = getComputedStyle(probe).backgroundColor\n probe.remove()\n return isInvalidColor(color) ? null : color\n } catch {\n return null\n } finally {\n endSuppressThemeWatch()\n }\n}\n\nexport type ResolveAntdOptions = {\n /** Temporary body probe. Watch callbacks MUST pass false to avoid MutationObserver loops. */\n allowProbe?: boolean\n}\n\n/** Sync resolve with source (cssVar avoids transition intermediates). */\nexport function tryResolveAntdPrimaryDetailed(\n options?: ResolveAntdOptions,\n): AntdPrimaryResolve | null {\n try {\n const allowProbe = options?.allowProbe !== false\n const cssVar = readCssVariablePrimary()\n if (cssVar) return { color: cssVar, source: 'cssVar' }\n const btnBg = readExistingPrimaryButtonBg()\n if (btnBg) return { color: btnBg, source: 'btnBg' }\n if (allowProbe) {\n const probed = probePrimaryButton()\n if (probed) return { color: probed, source: 'probe' }\n }\n return null\n } catch {\n return null\n }\n}\n\n/** Sync resolve: CSS var → existing btn bg → optional probe → null if all fail */\nexport function tryResolveAntdPrimaryColor(options?: ResolveAntdOptions): string | null {\n return tryResolveAntdPrimaryDetailed(options)?.color ?? null\n}\n\nexport function resolveAntdPrimaryColorOnce(): string {\n return tryResolveAntdPrimaryColor() || DEFAULT_PRIMARY_COLOR\n}\n\nexport function resolveCssVariablePrimary(\n config: ThemeAdapterConfig | undefined,\n theme: Theme,\n): string {\n const primary = config?.primaryColor\n if (!primary) return DEFAULT_PRIMARY_COLOR\n if (typeof primary === 'string') return primary\n return primary[theme] || primary.light || DEFAULT_PRIMARY_COLOR\n}\n\nexport function resolvePrimaryColorOnce(\n config: ThemeAdapterConfig | undefined,\n theme: Theme,\n): string {\n const type = config?.type ?? 'antd'\n if (type === 'cssVariable') return resolveCssVariablePrimary(config, theme)\n return resolveAntdPrimaryColorOnce()\n}\n\nexport function scheduleFrame(cb: () => void): void {\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(() => cb())\n } else {\n setTimeout(cb, 0)\n }\n}\n\n/**\n * Lazy resolve with limited rAF retries when antd color is not yet available.\n * @param allowProbe - false for MutationObserver callbacks (probe would re-enter the observer).\n */\nexport function resolvePrimaryColorLazy(\n config: ThemeAdapterConfig | undefined,\n theme: Theme,\n onDone: (color: string) => void,\n maxAttempts = THEME_RETRY_MAX,\n allowProbe = true,\n): void {\n const type = config?.type ?? 'antd'\n if (type === 'cssVariable') {\n onDone(resolveCssVariablePrimary(config, theme))\n return\n }\n\n let attempts = 0\n const run = () => {\n attempts += 1\n const found = tryResolveAntdPrimaryColor({ allowProbe })\n if (found) {\n onDone(found)\n return\n }\n if (attempts < maxAttempts) {\n scheduleFrame(run)\n return\n }\n onDone(DEFAULT_PRIMARY_COLOR)\n }\n run()\n}\n\nexport type ThemeChangeListener = (color: string) => void\n\nfunction isUpdateNoticeMutationTarget(node: Node | null): boolean {\n if (!node || node.nodeType !== Node.ELEMENT_NODE) return false\n const el = node as Element\n if (el.id === INJECT_STYLE_TAG_ID) return true\n return Boolean(\n el.closest?.('.cdfrd-update-notice') || el.closest?.(`.${NOTIFICATION_ANCHOR_CLASS_NAME}`),\n )\n}\n\nfunction mutationsOnlyAffectNotice(mutations: MutationRecord[]): boolean {\n if (!mutations.length) return false\n return mutations.every((m) => {\n if (isUpdateNoticeMutationTarget(m.target)) return true\n if (m.type === 'childList') {\n const nodes = [...Array.from(m.addedNodes), ...Array.from(m.removedNodes)]\n return nodes.length > 0 && nodes.every((n) => isUpdateNoticeMutationTarget(n))\n }\n return false\n })\n}\n\nexport function watchThemeChanges(\n config: ThemeAdapterConfig | undefined,\n getTheme: () => Theme,\n onChange: ThemeChangeListener,\n): () => void {\n if (typeof document === 'undefined') {\n return () => undefined\n }\n\n const adapterType = config?.type ?? 'antd'\n // cssVariable colors only change via setTheme → refreshPrimaryColor; DOM watch not needed.\n if (adapterType === 'cssVariable') {\n return () => undefined\n }\n\n if (typeof MutationObserver === 'undefined') {\n return () => undefined\n }\n\n let last = ''\n /** Prior btnBg sample while waiting for CSS transition to settle. */\n let btnBgCandidate = ''\n let debounceTimer: ReturnType<typeof setTimeout> | undefined\n let settleTimer: ReturnType<typeof setTimeout> | undefined\n\n const clearTimers = () => {\n if (debounceTimer !== undefined) clearTimeout(debounceTimer)\n if (settleTimer !== undefined) clearTimeout(settleTimer)\n debounceTimer = undefined\n settleTimer = undefined\n }\n\n const evaluate = () => {\n // Never probe inside the observer: append/remove on body re-triggers childList/subtree.\n const found = tryResolveAntdPrimaryDetailed({ allowProbe: false })\n if (!found) return\n const { color, source } = found\n if (color === last) {\n btnBgCandidate = ''\n return\n }\n // cssVar/probe tokens jump to the final value; btnBg can be mid-transition rgb().\n if (source === 'btnBg' && color !== btnBgCandidate) {\n btnBgCandidate = color\n if (settleTimer !== undefined) clearTimeout(settleTimer)\n settleTimer = setTimeout(() => {\n settleTimer = undefined\n evaluate()\n }, THEME_WATCH_DEBOUNCE_MS)\n return\n }\n last = color\n btnBgCandidate = ''\n onChange(color)\n }\n\n const schedule = (mutations?: MutationRecord[]) => {\n if (suppressThemeWatch > 0) return\n if (mutations && mutationsOnlyAffectNotice(mutations)) return\n // Trailing debounce: collapse mutation bursts, then evaluate (cssVar or settled btnBg).\n if (debounceTimer !== undefined) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => {\n debounceTimer = undefined\n btnBgCandidate = ''\n evaluate()\n }, THEME_WATCH_DEBOUNCE_MS)\n }\n\n const observer = new MutationObserver((mutations) => schedule(mutations))\n const attrFilter = ['class', 'style', 'data-theme', 'data-update-notice-theme']\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: attrFilter,\n })\n if (document.body) {\n // childList: catch late .ant-btn-primary; safe because evaluate never probes.\n observer.observe(document.body, {\n attributes: true,\n attributeFilter: attrFilter,\n childList: true,\n subtree: true,\n })\n }\n // Antd 5/6 css-in-js often injects / updates <style> in head.\n if (document.head) {\n observer.observe(document.head, { childList: true, subtree: true })\n }\n\n // Initial resolve (applyTheme may have run before the observer was attached).\n schedule()\n\n return () => {\n clearTimers()\n observer.disconnect()\n }\n}\n","import {\n NOTIFICATION_CLOSE_BTN_CLASS,\n NOTIFICATION_DISMISS_BTN_CLASS,\n NOTIFICATION_REFRESH_BTN_CLASS,\n PLACEMENT_STYLES,\n} from '../constants'\nimport { resolveNotificationCopy } from '../core/locale'\nimport type { Locale, Theme, UpdateNoticeOptions } from '../types'\nimport { ensureDefaultStyles } from './inject-styles'\nimport { beginSuppressThemeWatch, endSuppressThemeWatch } from '../theme/resolve-primary'\n\nlet visible = false\nlet lastShowOptions: UpdateNoticeOptions | null = null\nlet lastLocale: Locale = 'zh_CN'\nlet currentPrimary = ''\n\nfunction el(tag: string, className: string, text?: string): HTMLElement {\n const node = document.createElement(tag)\n node.className = className\n if (text !== undefined) node.textContent = text\n return node\n}\n\nfunction applyPrimaryToNode(node: Element, primary: string): void {\n if (!primary) return\n ;(node as HTMLElement).style.setProperty('--update-primary', primary)\n ;(node as HTMLElement).style.setProperty('--update-primary-hover', primary)\n}\n\nexport function applyTheme(theme: Theme): void {\n ensureDefaultStyles()\n document.documentElement.setAttribute('data-update-notice-theme', theme)\n document.querySelectorAll('.cdfrd-update-notice').forEach((node) => {\n node.setAttribute('data-update-notice-theme', theme)\n })\n}\n\nexport function applyPrimaryColor(primary: string): void {\n beginSuppressThemeWatch()\n try {\n currentPrimary = primary\n document.querySelectorAll('.cdfrd-update-notice').forEach((node) => {\n applyPrimaryToNode(node, primary)\n })\n } finally {\n endSuppressThemeWatch()\n }\n}\n\nexport function closeDefaultNotice(): void {\n document.querySelector('.cdfrd-update-notice')?.remove()\n visible = false\n lastShowOptions = null\n}\n\nexport function applyLocale(locale: Locale): void {\n const wrap = document.querySelector('.cdfrd-update-notice')\n if (!wrap || !lastShowOptions) return\n lastLocale = locale\n const copy = resolveNotificationCopy(lastShowOptions, locale)\n const forced = lastShowOptions.forcedUpdate === true\n const titleEl = wrap.querySelector('.cdfrd-update-notice-title')\n const descEl = wrap.querySelector('.cdfrd-update-notice-desc')\n const refreshEl = wrap.querySelector(`.${NOTIFICATION_REFRESH_BTN_CLASS}`)\n const dismissEl = wrap.querySelector(`.${NOTIFICATION_DISMISS_BTN_CLASS}`)\n if (titleEl) titleEl.textContent = forced ? copy.forcedTitle : copy.title\n if (descEl) descEl.textContent = forced ? copy.forcedDescription : copy.description\n if (refreshEl) refreshEl.textContent = copy.buttonText\n if (dismissEl) dismissEl.textContent = copy.dismissButtonText\n}\n\nexport function showDefaultNotice(options: {\n options: UpdateNoticeOptions\n version: string\n locale: Locale\n theme?: Theme\n primaryColor?: string\n onRefresh: () => void\n onDismiss: () => void\n /** Close × only hides UI — does not write dismiss storage */\n onClose?: () => void\n}): boolean {\n ensureDefaultStyles()\n const existing = document.querySelector('.cdfrd-update-notice')\n if (visible && existing) return false\n if (visible && !existing) visible = false\n\n const copy = resolveNotificationCopy(options.options, options.locale)\n const placement = options.options.placement ?? 'topRight'\n const forced = options.options.forcedUpdate === true\n const theme = options.theme ?? 'light'\n const primary = options.primaryColor || currentPrimary\n\n const wrap = document.createElement('div')\n wrap.className = forced ? 'cdfrd-update-notice cdfrd-update-notice--forced' : 'cdfrd-update-notice'\n wrap.setAttribute('data-update-notice-theme', theme)\n if (!forced) {\n wrap.style.cssText = PLACEMENT_STYLES[placement] ?? PLACEMENT_STYLES.topRight\n }\n if (primary) applyPrimaryToNode(wrap, primary)\n\n const panel = el('div', 'cdfrd-update-notice-panel')\n\n if (forced) {\n panel.appendChild(el('div', 'cdfrd-update-notice-title', copy.forcedTitle))\n panel.appendChild(el('div', 'cdfrd-update-notice-desc', copy.forcedDescription))\n const actions = el('div', 'cdfrd-update-notice-actions')\n const refreshBtn = el(\n 'button',\n `cdfrd-update-notice-btn cdfrd-update-notice-btn-primary ${NOTIFICATION_REFRESH_BTN_CLASS}`,\n copy.buttonText,\n )\n refreshBtn.setAttribute('type', 'button')\n actions.appendChild(refreshBtn)\n panel.appendChild(actions)\n } else {\n const header = el('div', 'cdfrd-update-notice-header')\n header.appendChild(el('div', 'cdfrd-update-notice-title', copy.title))\n const closeBtn = el('button', `cdfrd-update-notice-close ${NOTIFICATION_CLOSE_BTN_CLASS}`, '×')\n closeBtn.setAttribute('type', 'button')\n closeBtn.setAttribute('aria-label', 'close')\n header.appendChild(closeBtn)\n panel.appendChild(header)\n panel.appendChild(el('div', 'cdfrd-update-notice-desc', copy.description))\n\n const actions = el('div', 'cdfrd-update-notice-actions')\n const dismissBtn = el(\n 'button',\n `cdfrd-update-notice-btn ${NOTIFICATION_DISMISS_BTN_CLASS}`,\n copy.dismissButtonText,\n )\n dismissBtn.setAttribute('type', 'button')\n actions.appendChild(dismissBtn)\n const refreshBtn = el(\n 'button',\n `cdfrd-update-notice-btn cdfrd-update-notice-btn-primary ${NOTIFICATION_REFRESH_BTN_CLASS}`,\n copy.buttonText,\n )\n refreshBtn.setAttribute('type', 'button')\n actions.appendChild(refreshBtn)\n panel.appendChild(actions)\n }\n\n wrap.appendChild(panel)\n\n let anchor = document.body.querySelector(`:scope > .cdfrd-update-notice-anchor`)\n if (!anchor) {\n anchor = document.createElement('div')\n anchor.className = 'cdfrd-update-notice-anchor'\n document.body.appendChild(anchor)\n }\n anchor.appendChild(wrap)\n visible = true\n lastShowOptions = options.options\n lastLocale = options.locale\n\n wrap.querySelector(`.${NOTIFICATION_REFRESH_BTN_CLASS}`)?.addEventListener('click', () => {\n options.onRefresh()\n })\n\n wrap.querySelector(`.${NOTIFICATION_DISMISS_BTN_CLASS}`)?.addEventListener('click', () => {\n options.onDismiss()\n closeDefaultNotice()\n })\n\n // × closes without dismiss storage (per V2 doc)\n wrap.querySelector(`.${NOTIFICATION_CLOSE_BTN_CLASS}`)?.addEventListener('click', () => {\n options.onClose?.()\n closeDefaultNotice()\n })\n\n return true\n}\n","import { ensureNotificationAnchor, UpdateNoticeRuntime } from '../core/UpdateNoticeRuntime'\nimport {\n applyLocale,\n applyPrimaryColor,\n applyTheme,\n closeDefaultNotice,\n showDefaultNotice,\n} from '../notification/NotificationManager'\nimport {\n resolvePrimaryColorLazy,\n tryResolveAntdPrimaryDetailed,\n watchThemeChanges,\n} from '../theme/resolve-primary'\nimport { resolveMicroVersionBase, resolveVersionBase } from '../core/version-url'\nimport type { Locale, Theme, ThemeAdapterConfig, UpdateNoticeOptions } from '../types'\nimport { shouldShowDefaultUi, validateOptions } from '../build/validate-options'\n\nexport class UpdateNoticeManager {\n activeApp: string | null = null\n locale: Locale = 'zh_CN'\n theme: Theme = 'light'\n primaryColor = ''\n private themeAdapter: ThemeAdapterConfig | undefined\n private stopWatchTheme?: () => void\n /** Bumped on each setTheme so late antd resolve callbacks cannot overwrite newer results. */\n private primaryResolveGen = 0\n\n onClickRefresh?: (version: string, appId?: string) => void\n onClickDismiss?: (version: string, appId?: string) => void\n\n private runtimes = new Map<string, UpdateNoticeRuntime>()\n\n static getOrCreate(): UpdateNoticeManager {\n if (!window.updateNoticeManager) {\n window.updateNoticeManager = new UpdateNoticeManager()\n }\n return window.updateNoticeManager as UpdateNoticeManager\n }\n\n /** First create applies Manager-level defaults; later creates only register runtimes */\n register(options: UpdateNoticeOptions, isFirstCreate: boolean): UpdateNoticeRuntime {\n validateOptions(options)\n\n if (isFirstCreate) {\n this.themeAdapter = options.themeAdapter\n if (options.locale?.default) this.locale = options.locale.default\n applyTheme(this.theme)\n this.startThemeWatch()\n }\n\n const runtime = new UpdateNoticeRuntime(this, options)\n const previous = this.runtimes.get(runtime.appKey)\n if (previous && previous !== runtime) previous.destroy()\n this.runtimes.set(runtime.appKey, runtime)\n\n runtime.bootstrap()\n\n if (shouldShowDefaultUi(options)) {\n ensureNotificationAnchor()\n }\n\n if (this.isRuntimeActive(runtime)) {\n runtime.checkUpdate()\n }\n return runtime\n }\n\n setActiveApp(\n appId: string | null,\n options: { immediateCheck?: boolean } = { immediateCheck: true },\n ): void {\n const changed = this.activeApp !== appId\n this.activeApp = appId\n if (changed) {\n closeDefaultNotice()\n // Active app may carry a different themeAdapter (e.g. cssVariable vs antd).\n this.startThemeWatch()\n this.refreshPrimaryColor()\n }\n this.flushPendingForActiveApp()\n const immediateCheck = options.immediateCheck ?? true\n if (immediateCheck && changed) {\n for (const runtime of this.runtimes.values()) {\n if (this.isRuntimeActive(runtime)) runtime.checkUpdate()\n }\n }\n }\n\n checkUpdate(): void {\n for (const runtime of this.runtimes.values()) runtime.checkUpdate()\n }\n\n private isRuntimeActive(runtime: UpdateNoticeRuntime): boolean {\n if (!runtime.appId) return true\n return runtime.appId === this.activeApp\n }\n\n /** Prefer the active runtime's adapter; fall back to Manager default (first create). */\n private getActiveThemeAdapter(): ThemeAdapterConfig | undefined {\n for (const runtime of this.runtimes.values()) {\n if (this.isRuntimeActive(runtime)) {\n return runtime.options.themeAdapter ?? this.themeAdapter\n }\n }\n return this.themeAdapter\n }\n\n setLocale(locale: Locale): void {\n this.locale = locale\n applyLocale(locale)\n }\n\n setTheme(theme: Theme): void {\n this.theme = theme\n applyTheme(theme)\n const gen = ++this.primaryResolveGen\n const adapter = this.getActiveThemeAdapter()\n const detailed =\n (adapter?.type ?? 'antd') === 'antd' ? tryResolveAntdPrimaryDetailed() : null\n // Prefer cssVar (instant token). Avoid applying transitioning btnBg here — watch settles that.\n if (detailed?.source === 'btnBg') {\n return\n }\n this.refreshPrimaryColor(gen)\n }\n\n notifyUpdate(_runtime: UpdateNoticeRuntime, _version: string): void {\n void _runtime\n void _version\n }\n\n showDefaultNotice(runtime: UpdateNoticeRuntime, version: string): boolean {\n ensureNotificationAnchor()\n const adapter = runtime.options.themeAdapter ?? this.themeAdapter\n const gen = this.primaryResolveGen\n\n resolvePrimaryColorLazy(adapter, this.theme, (color) => {\n if (gen !== this.primaryResolveGen) return\n this.primaryColor = color\n applyPrimaryColor(color)\n showDefaultNotice({\n options: runtime.options,\n version,\n locale: this.locale,\n theme: this.theme,\n primaryColor: color,\n onRefresh: () => {\n if (this.onClickRefresh) {\n this.onClickRefresh(version, runtime.appId)\n return\n }\n window.location.reload()\n },\n onDismiss: () => {\n if (this.onClickDismiss) {\n this.onClickDismiss(version, runtime.appId)\n return\n }\n runtime.dismissVersion(version)\n },\n })\n })\n return true\n }\n\n private refreshPrimaryColor(gen = this.primaryResolveGen): void {\n const adapter = this.getActiveThemeAdapter()\n resolvePrimaryColorLazy(adapter, this.theme, (color) => {\n if (gen !== this.primaryResolveGen) return\n this.primaryColor = color\n applyPrimaryColor(color)\n })\n }\n\n private startThemeWatch(): void {\n this.stopWatchTheme?.()\n const adapter = this.getActiveThemeAdapter()\n this.stopWatchTheme = watchThemeChanges(adapter, () => this.theme, (color) => {\n // DOM-driven update claims a new generation so in-flight setTheme resolves stay stale.\n this.primaryResolveGen += 1\n this.primaryColor = color\n applyPrimaryColor(color)\n })\n }\n\n destroy(): void {\n this.stopWatchTheme?.()\n this.stopWatchTheme = undefined\n for (const runtime of this.runtimes.values()) runtime.destroy()\n this.runtimes.clear()\n closeDefaultNotice()\n delete window.updateNoticeManager\n }\n\n private flushPendingForActiveApp(): void {\n for (const runtime of this.runtimes.values()) runtime.flushPendingUpdate()\n }\n}\n\nexport function createUpdateNotice(options: UpdateNoticeOptions = {}): UpdateNoticeManager {\n validateOptions(options)\n // Stamp absolute base in THIS bundle when available. Do not freeze '' / relative `/`\n // for micro-apps — checkUpdate re-reads runtime publicPath (dynamic domain).\n const stamped: UpdateNoticeOptions = { ...options }\n if (options.versionBase === undefined || options.versionBase === null) {\n const poweredByQiankun = Boolean(\n (window as Window & { __POWERED_BY_QIANKUN__?: boolean }).__POWERED_BY_QIANKUN__ ||\n (window as Window & { proxy?: { __POWERED_BY_QIANKUN__?: boolean } }).proxy\n ?.__POWERED_BY_QIANKUN__,\n )\n if (options.microApp?.enabled && poweredByQiankun) {\n const microBase = resolveMicroVersionBase()\n if (microBase) stamped.versionBase = microBase\n } else if (options.microApp?.enabled) {\n // Standalone open of a micro entry, or Host shell: prefer cross-origin module\n // origin when chunk is not on the page origin; otherwise page-relative.\n const microBase = resolveMicroVersionBase()\n if (\n microBase &&\n /^https?:\\/\\//i.test(microBase) &&\n typeof location !== 'undefined' &&\n new URL(microBase).origin !== location.origin\n ) {\n stamped.versionBase = microBase\n } else {\n stamped.versionBase = resolveVersionBase()\n }\n } else {\n stamped.versionBase = resolveVersionBase()\n }\n }\n const existed = Boolean(window.updateNoticeManager)\n const manager = UpdateNoticeManager.getOrCreate()\n manager.register(stamped, !existed)\n return manager\n}\n\nexport function getUpdateNotice(): UpdateNoticeManager | undefined {\n return window.updateNoticeManager as UpdateNoticeManager | undefined\n}\n"],"mappings":"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","names":["el","el"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { U as UpdateNoticeOptions, L as Locale, T as Theme } from './types-DaCJHaWX.cjs';
|
|
2
|
+
export { C as CheckConfig, a as LocaleConfig, b as LocaleCopy, M as MicroAppConfig, P as Placement, S as SetActiveAppOptions, c as ThemeAdapterConfig, d as ThemeAdapterType, e as UpdateNoticeManagerApi, V as VersionJson, f as VersionPluginOptions, g as VersionType, W as WebUpdateNoticeEventDetail } from './types-DaCJHaWX.cjs';
|
|
3
|
+
|
|
4
|
+
declare class UpdateNoticeRuntime {
|
|
5
|
+
readonly appKey: string;
|
|
6
|
+
readonly appId?: string;
|
|
7
|
+
readonly options: UpdateNoticeOptions;
|
|
8
|
+
/** Baseline version for this page session; set on first successful fetch */
|
|
9
|
+
localVersion: string | null;
|
|
10
|
+
private intervalId;
|
|
11
|
+
private manager;
|
|
12
|
+
private pendingUpdate;
|
|
13
|
+
private onVisibilityChange?;
|
|
14
|
+
private onWindowFocus?;
|
|
15
|
+
private onResourceError?;
|
|
16
|
+
constructor(manager: UpdateNoticeManager, options: UpdateNoticeOptions);
|
|
17
|
+
bootstrap(): void;
|
|
18
|
+
destroy(): void;
|
|
19
|
+
checkUpdate(): void;
|
|
20
|
+
flushPendingUpdate(): void;
|
|
21
|
+
private handleUpdateDetected;
|
|
22
|
+
private tryNotify;
|
|
23
|
+
dismissVersion(version: string): void;
|
|
24
|
+
private setupScheduler;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare class UpdateNoticeManager {
|
|
28
|
+
activeApp: string | null;
|
|
29
|
+
locale: Locale;
|
|
30
|
+
theme: Theme;
|
|
31
|
+
primaryColor: string;
|
|
32
|
+
private themeAdapter;
|
|
33
|
+
private stopWatchTheme?;
|
|
34
|
+
/** Bumped on each setTheme so late antd resolve callbacks cannot overwrite newer results. */
|
|
35
|
+
private primaryResolveGen;
|
|
36
|
+
onClickRefresh?: (version: string, appId?: string) => void;
|
|
37
|
+
onClickDismiss?: (version: string, appId?: string) => void;
|
|
38
|
+
private runtimes;
|
|
39
|
+
static getOrCreate(): UpdateNoticeManager;
|
|
40
|
+
/** First create applies Manager-level defaults; later creates only register runtimes */
|
|
41
|
+
register(options: UpdateNoticeOptions, isFirstCreate: boolean): UpdateNoticeRuntime;
|
|
42
|
+
setActiveApp(appId: string | null, options?: {
|
|
43
|
+
immediateCheck?: boolean;
|
|
44
|
+
}): void;
|
|
45
|
+
checkUpdate(): void;
|
|
46
|
+
private isRuntimeActive;
|
|
47
|
+
/** Prefer the active runtime's adapter; fall back to Manager default (first create). */
|
|
48
|
+
private getActiveThemeAdapter;
|
|
49
|
+
setLocale(locale: Locale): void;
|
|
50
|
+
setTheme(theme: Theme): void;
|
|
51
|
+
notifyUpdate(_runtime: UpdateNoticeRuntime, _version: string): void;
|
|
52
|
+
showDefaultNotice(runtime: UpdateNoticeRuntime, version: string): boolean;
|
|
53
|
+
private refreshPrimaryColor;
|
|
54
|
+
private startThemeWatch;
|
|
55
|
+
destroy(): void;
|
|
56
|
+
private flushPendingForActiveApp;
|
|
57
|
+
}
|
|
58
|
+
declare function createUpdateNotice(options?: UpdateNoticeOptions): UpdateNoticeManager;
|
|
59
|
+
declare function getUpdateNotice(): UpdateNoticeManager | undefined;
|
|
60
|
+
|
|
61
|
+
export { Locale, Theme, UpdateNoticeManager, UpdateNoticeOptions, createUpdateNotice, getUpdateNotice };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { U as UpdateNoticeOptions, L as Locale, T as Theme } from './types-DaCJHaWX.js';
|
|
2
|
+
export { C as CheckConfig, a as LocaleConfig, b as LocaleCopy, M as MicroAppConfig, P as Placement, S as SetActiveAppOptions, c as ThemeAdapterConfig, d as ThemeAdapterType, e as UpdateNoticeManagerApi, V as VersionJson, f as VersionPluginOptions, g as VersionType, W as WebUpdateNoticeEventDetail } from './types-DaCJHaWX.js';
|
|
3
|
+
|
|
4
|
+
declare class UpdateNoticeRuntime {
|
|
5
|
+
readonly appKey: string;
|
|
6
|
+
readonly appId?: string;
|
|
7
|
+
readonly options: UpdateNoticeOptions;
|
|
8
|
+
/** Baseline version for this page session; set on first successful fetch */
|
|
9
|
+
localVersion: string | null;
|
|
10
|
+
private intervalId;
|
|
11
|
+
private manager;
|
|
12
|
+
private pendingUpdate;
|
|
13
|
+
private onVisibilityChange?;
|
|
14
|
+
private onWindowFocus?;
|
|
15
|
+
private onResourceError?;
|
|
16
|
+
constructor(manager: UpdateNoticeManager, options: UpdateNoticeOptions);
|
|
17
|
+
bootstrap(): void;
|
|
18
|
+
destroy(): void;
|
|
19
|
+
checkUpdate(): void;
|
|
20
|
+
flushPendingUpdate(): void;
|
|
21
|
+
private handleUpdateDetected;
|
|
22
|
+
private tryNotify;
|
|
23
|
+
dismissVersion(version: string): void;
|
|
24
|
+
private setupScheduler;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare class UpdateNoticeManager {
|
|
28
|
+
activeApp: string | null;
|
|
29
|
+
locale: Locale;
|
|
30
|
+
theme: Theme;
|
|
31
|
+
primaryColor: string;
|
|
32
|
+
private themeAdapter;
|
|
33
|
+
private stopWatchTheme?;
|
|
34
|
+
/** Bumped on each setTheme so late antd resolve callbacks cannot overwrite newer results. */
|
|
35
|
+
private primaryResolveGen;
|
|
36
|
+
onClickRefresh?: (version: string, appId?: string) => void;
|
|
37
|
+
onClickDismiss?: (version: string, appId?: string) => void;
|
|
38
|
+
private runtimes;
|
|
39
|
+
static getOrCreate(): UpdateNoticeManager;
|
|
40
|
+
/** First create applies Manager-level defaults; later creates only register runtimes */
|
|
41
|
+
register(options: UpdateNoticeOptions, isFirstCreate: boolean): UpdateNoticeRuntime;
|
|
42
|
+
setActiveApp(appId: string | null, options?: {
|
|
43
|
+
immediateCheck?: boolean;
|
|
44
|
+
}): void;
|
|
45
|
+
checkUpdate(): void;
|
|
46
|
+
private isRuntimeActive;
|
|
47
|
+
/** Prefer the active runtime's adapter; fall back to Manager default (first create). */
|
|
48
|
+
private getActiveThemeAdapter;
|
|
49
|
+
setLocale(locale: Locale): void;
|
|
50
|
+
setTheme(theme: Theme): void;
|
|
51
|
+
notifyUpdate(_runtime: UpdateNoticeRuntime, _version: string): void;
|
|
52
|
+
showDefaultNotice(runtime: UpdateNoticeRuntime, version: string): boolean;
|
|
53
|
+
private refreshPrimaryColor;
|
|
54
|
+
private startThemeWatch;
|
|
55
|
+
destroy(): void;
|
|
56
|
+
private flushPendingForActiveApp;
|
|
57
|
+
}
|
|
58
|
+
declare function createUpdateNotice(options?: UpdateNoticeOptions): UpdateNoticeManager;
|
|
59
|
+
declare function getUpdateNotice(): UpdateNoticeManager | undefined;
|
|
60
|
+
|
|
61
|
+
export { Locale, Theme, UpdateNoticeManager, UpdateNoticeOptions, createUpdateNotice, getUpdateNotice };
|