quick-platform 1.0.46

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.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +63 -0
  3. package/dist/application/constants.d.ts +4 -0
  4. package/dist/application/index.d.ts +29 -0
  5. package/dist/application/manage.d.ts +31 -0
  6. package/dist/business/index.d.ts +72 -0
  7. package/dist/business/version.d.ts +7 -0
  8. package/dist/components/IconFont.d.ts +4 -0
  9. package/dist/components/LocalDebug.d.ts +6 -0
  10. package/dist/components/MicroApp.d.ts +14 -0
  11. package/dist/components/Permission.d.ts +6 -0
  12. package/dist/components/context.d.ts +3 -0
  13. package/dist/components/i18n.d.ts +2 -0
  14. package/dist/config.d.ts +2 -0
  15. package/dist/config.js +2 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/event.d.ts +13 -0
  18. package/dist/index-543d110b.js +547 -0
  19. package/dist/index-543d110b.js.map +1 -0
  20. package/dist/index-be61d86b.js +2 -0
  21. package/dist/index-be61d86b.js.map +1 -0
  22. package/dist/index.d.ts +12 -0
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/theme/define/color.d.ts +9 -0
  26. package/dist/theme/define/font.d.ts +50 -0
  27. package/dist/theme/define/index.d.ts +5 -0
  28. package/dist/theme/define/size.d.ts +24 -0
  29. package/dist/theme/define/style.d.ts +21 -0
  30. package/dist/theme/doc.d.ts +2 -0
  31. package/dist/theme/index.d.ts +3 -0
  32. package/dist/theme/lib/index.d.ts +1 -0
  33. package/dist/theme/react/hook.d.ts +5 -0
  34. package/dist/theme/react/index.d.ts +3 -0
  35. package/dist/theme/uno.d.ts +19 -0
  36. package/dist/utils/i18n.d.ts +6 -0
  37. package/dist/utils/image.d.ts +2 -0
  38. package/dist/utils/index.d.ts +5 -0
  39. package/dist/utils/localstorage.d.ts +6 -0
  40. package/dist/utils/request.d.ts +37 -0
  41. package/dist/utils/utils.d.ts +3 -0
  42. package/package.json +67 -0
  43. package/src/application/constants.ts +7 -0
  44. package/src/application/index.ts +82 -0
  45. package/src/application/manage.ts +119 -0
  46. package/src/business/declare.d.ts +39 -0
  47. package/src/business/index.ts +130 -0
  48. package/src/business/version.ts +58 -0
  49. package/src/components/IconFont.ts +11 -0
  50. package/src/components/LocalDebug.ts +244 -0
  51. package/src/components/MicroApp.ts +97 -0
  52. package/src/components/Permission.ts +13 -0
  53. package/src/components/context.ts +31 -0
  54. package/src/components/i18n.ts +17 -0
  55. package/src/config.ts +3 -0
  56. package/src/event.ts +24 -0
  57. package/src/index.ts +38 -0
  58. package/src/theme/define/color.ts +53 -0
  59. package/src/theme/define/font.ts +29 -0
  60. package/src/theme/define/index.ts +8 -0
  61. package/src/theme/define/size.ts +31 -0
  62. package/src/theme/define/style.ts +41 -0
  63. package/src/theme/doc.tsx +438 -0
  64. package/src/theme/index.ts +5 -0
  65. package/src/theme/lib/index.ts +15 -0
  66. package/src/theme/react/hook.ts +42 -0
  67. package/src/theme/react/index.ts +14 -0
  68. package/src/theme/uno.ts +218 -0
  69. package/src/utils/i18n.ts +84 -0
  70. package/src/utils/image.ts +52 -0
  71. package/src/utils/index.ts +9 -0
  72. package/src/utils/localstorage.ts +32 -0
  73. package/src/utils/request.ts +173 -0
  74. package/src/utils/utils.ts +15 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/application/manage.ts","../src/business/version.ts","../src/utils/utils.ts","../src/utils/localstorage.ts","../src/business/index.ts","../src/utils/i18n.ts","../src/event.ts","../src/components/LocalDebug.ts","../src/components/IconFont.ts","../src/components/context.ts","../src/utils/image.ts","../src/utils/request.ts","../src/theme/react/hook.ts","../src/index.ts","../src/components/i18n.ts","../src/components/MicroApp.ts","../src/application/index.ts","../src/components/Permission.ts","../src/theme/react/index.ts","../src/theme/lib/index.ts"],"sourcesContent":["import {\n APP_CACHE_PARENT_KEY,\n APP_MANAGE_KEY,\n APP_PARENT_KEY,\n} from './constants';\n\nimport EventEmitter from 'eventemitter3';\n\nconst win = (0, eval)('this');\nconst appMap: Map<string, App> =\n win[APP_MANAGE_KEY] || (win[APP_MANAGE_KEY] = new Map());\n\nclass App {\n name: string;\n parent: App | undefined;\n private children: App[] = [];\n private cacheMap: Map<string, any> = new Map();\n emitter = new EventEmitter();\n constructor(name: string, parent?: string) {\n this.name = name;\n if (parent) {\n this.parent = this.getParent(parent);\n this.parent.addChildren(this);\n }\n appMap.set(name, this);\n }\n private getParent(parent: string): App {\n if (parent === 'root' && !appMap.has(parent)) {\n const root = new App('root', '');\n appMap.set(parent, root);\n return root;\n }\n if (!appMap.has(parent)) {\n throw new Error(`quick micro app manage error:${parent} 应用未加载!`);\n }\n return appMap.get(parent)!;\n }\n get root() {\n let root: App = this;\n while (root?.parent) {\n root = root.parent;\n }\n return root;\n }\n get isRoot() {\n return this.root.name === this.name;\n }\n addChildren(child: App) {\n this.children.push(child);\n }\n removeChildren(name: string) {\n this.children = this.children.filter(app => app.name !== name);\n }\n on = this.emitter.on.bind(this.emitter);\n once = this.emitter.once.bind(this.emitter);\n off = this.emitter.off.bind(this.emitter);\n /***\n * 向父级通信\n */\n trigger(name: string, data: any) {\n if (this.parent) this.parent.emitter.emit(name, data);\n }\n\n /**\n * 向所有子级通信\n */\n broadcast(name: string, data: any) {\n for (let i = 0, len = this.children.length; i < len; i++) {\n this.children[i].emitter.emit(name, data);\n }\n }\n\n cache(key: string, value?: any) {\n if (typeof value !== 'undefined') this.cacheMap.set(key, value);\n return this.cacheMap.get(key);\n }\n\n destroy() {\n this.emitter.removeAllListeners();\n this.cacheMap.clear();\n\n while (this.children.length) {\n this.children.pop()!.destroy();\n }\n if (this.parent) this.parent.removeChildren(this.name);\n }\n}\n\nlet app: App | undefined;\n\nexport const intApp = (name: string) => {\n const win = window as any;\n //@mark 解决proxy缓存问题,如果强行清除proxy上的缓存,可能导致其它问题引入,所以自行缓存父级缓存关系\n let parent = win[APP_CACHE_PARENT_KEY] || win[APP_PARENT_KEY] || 'root';\n if (!app) {\n app = new App(name, parent);\n win[APP_PARENT_KEY] = name;\n win[APP_CACHE_PARENT_KEY] = parent;\n }\n};\n\nexport const getCurrentApp = () => {\n if (app) return app;\n return (\n appMap.get('root') ||\n (() => {\n const app = new App('root');\n appMap.set('root', app);\n return app;\n })()\n );\n};\n\nexport const disposeApp = () => {\n if (app) {\n app.destroy();\n app = undefined;\n }\n};\n","import { UserInfo } from './declare';\n\nenum ReleaseMap {\n 'Trial' = 1,\n 'Free' = 2,\n 'Basic' = 3,\n 'Professional' = 4,\n 'Ultimate' = 5,\n 'FreeCode' = 13,\n 'Starter' = 14,\n 'Growth' = 15,\n 'Enterprise' = 6,\n}\n//@mark LicenseTypeMap对应storeInfo里面的licenceType\n// storeInfo 里的licenceType与licenceId没有对应关系,不能复用上文ReleaseMap的处理\nenum LicenseTypeMap {\n Enterprise = 'ENTERPRISE', //企业版本\n PLG = 'PLG', // (, \"PLG版本\"),\n}\n\nconst PLGList: number[] = [\n ReleaseMap.Free,\n ReleaseMap.FreeCode,\n ReleaseMap.Starter,\n ReleaseMap.Growth,\n];\n\nexport const isPLG = (licence: Partial<UserInfo['storeLicenceInfo']>) => {\n if (typeof licence.licenceId === 'undefined') return false;\n return PLGList.includes(licence.licenceId);\n};\n\nexport const isSLG = (licence: Partial<UserInfo['storeLicenceInfo']>) => {\n return !isPLG(licence);\n};\n\nexport const isEnterprise = (\n licence: Partial<UserInfo['storeLicenceInfo']>\n) => {\n return ReleaseMap.Enterprise === licence.licenceId;\n};\n\nexport const isFree = (licence: Partial<UserInfo['storeLicenceInfo']>) => {\n return ReleaseMap.Free === licence.licenceId;\n};\n\nexport const isProfessional = (\n licence: Partial<UserInfo['storeLicenceInfo']>\n) => {\n return ReleaseMap.Professional === licence.licenceId;\n};\n\nexport const isCredits = (licence: Partial<UserInfo['storeLicenceInfo']>) => {\n return !(\n LicenseTypeMap.Enterprise === licence.licenceType &&\n licence.useBalance === 1\n );\n};\n","export const isMicroApp = !!(window as any).__POWERED_BY_QIANKUN__;\n\nexport const assign = (\n key: string | number,\n value?: any,\n obj?: Record<string, any>\n) => {\n if (!key || !value) return obj || {};\n return Object.assign(obj || {}, { [key]: value });\n};\n\nexport const envValue = (prod: string, dev: string) => {\n if (process.env.NODE_ENV === 'production') return prod;\n return dev;\n};\n","/*\n * @Author: zhaoxuan (zhaoxuan@quickcep.com)\n * @LastEditors: zhaoxuan (zhaoxuan@quickcep.com)\n * @Date: 2023-05-10 13:42:03\n * @Description:\n * @LastEditDescription:\n * @LastEditTime: 2023-05-10 17:36:24\n */\nconst ls = {\n getData(key: string) {\n const data = window.localStorage.getItem(key);\n if (data) {\n try {\n return JSON.parse(data);\n } catch (e) {\n console.error(e);\n }\n }\n return null;\n },\n setData(key: string, value: any) {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (e) {\n console.error(e);\n }\n },\n removeItem(key: string) {\n window.localStorage.removeItem(key);\n },\n};\nexport default ls;\n","import { getCurrentApp } from '../application/manage';\nimport ls from '../utils/localstorage';\nimport { UserInfo } from './declare';\nimport {\n isCredits,\n isEnterprise,\n isFree,\n isPLG,\n isProfessional,\n isSLG,\n} from './version';\n\ninterface Env {\n AIBOT_URL: string;\n APP_URL: string;\n CHAT_URL: string;\n MOPOWER: string;\n MOPOWER_MICRO: string;\n Shoplazza_URL: string;\n Shopify_URL: string;\n Shopline_URL: string;\n Shopyy_URL: string;\n PRODUCT_URL: string;\n PRODUCT_TYPE_URL: string;\n COLLECTION_URL: string;\n appId: number;\n isProd?: boolean;\n isDev?: boolean;\n isTest?: boolean;\n socketUrl: string;\n}\n\nlet GlobalUserInfo: UserInfo = {} as any;\n\nexport const login = (userInfo: UserInfo) => {\n const root = getCurrentApp()?.root;\n if (!getCurrentApp()?.isRoot) {\n console.warn(\n 'quick platform login warn:current App is not Root App. Invalid login!',\n getCurrentApp()\n );\n }\n GlobalUserInfo = userInfo;\n if (root) {\n root?.cache('userinfo', userInfo);\n }\n};\n\nconst buildSystemGetter = <T>(\n fn: (data: UserInfo) => T\n): (() => Partial<T>) => {\n return () => {\n const root = getCurrentApp()?.root;\n if (!root) {\n console.warn('quick platform warn:root App not found!!!');\n }\n const userinfo = root?.cache('userinfo');\n if (!userinfo?.userId) {\n console.error('quick platform warn:root App not logged in yet');\n }\n return fn(userinfo || {});\n };\n};\n\nconst authFunction = buildSystemGetter(userInfo => {\n return userInfo.rightList || [];\n});\n\nexport const getUserInfo = buildSystemGetter(userInfo => {\n return userInfo.statffInfo || {};\n});\n\nexport const getStaffInfo = buildSystemGetter(userInfo => {\n return userInfo.staffInfo || {};\n});\n\nexport const getStoreInfo = buildSystemGetter(userInfo => {\n return userInfo.storeInfo || {};\n});\n\nexport const getStoreLicense = buildSystemGetter(\n userInfo => userInfo.storeLicenceInfo || {}\n);\n\nexport const hasAuth = (code: string) => {\n return authFunction().includes(code);\n};\n\nexport const getSystem = () => {\n const oem = process.env.OEM_NAME;\n const defaultLang = oem ? 'zh-CN' : 'en-US';\n return {\n oem: oem,\n env: process.env.REACT_APP_ENVKEY,\n lang: (ls.getData('qs_lang') || defaultLang) as\n | 'zh-CN'\n | 'en-US'\n | 'ko'\n | 'ja'\n | 'zh-TW',\n token: sessionStorage.getItem('quick-token') || '',\n requestTokenKey: 'quick-token',\n storeId: sessionStorage.getItem('quick-im-storeId') || '',\n };\n};\n\nexport const getOEMName = () => {\n return (window as any).QUICK_CEP?.oem?.name;\n};\n\nconst LicenseCreator = (\n fn: (licence: Partial<UserInfo['storeLicenceInfo']>) => boolean\n) => {\n return () => {\n return fn(getStoreLicense());\n };\n};\n\nexport const License = {\n isPLG: LicenseCreator(isPLG),\n isSLG: LicenseCreator(isSLG),\n isEnterprise: LicenseCreator(isEnterprise),\n isFree: LicenseCreator(isFree),\n isProfessional: LicenseCreator(isProfessional),\n isCredits: LicenseCreator(isCredits),\n getLicense: getStoreLicense,\n isOEM() {\n return !!getOEMName();\n },\n};\n","import { getSystem } from '../business';\nimport { isMicroApp } from './utils';\n\nconst baseUrl =\n 'https://quick-multilingual.obs.ap-southeast-3.myhuaweicloud.com';\n\nconst langMap = {\n 'zh-CN': 'zh',\n 'en-US': 'en',\n ko: 'ko',\n ja: 'ja',\n 'zh-TW': 'zh-tw',\n};\n\nconst getI18nConfigUrl = (\n env: 'test' | 'dev' | 'prod',\n name: string,\n lang: 'zh-CN' | 'en-US' | 'ko' | 'ja' | 'zh-TW'\n) => {\n if (env === 'prod') return `${baseUrl}/${name}/${langMap[lang]}.json`;\n return `${baseUrl}/${name}/${env}/${langMap[lang]}.json`;\n};\n\nconst loadRemoteI18n = (\n env: string,\n name: string,\n lang: 'zh-CN' | 'en-US' | 'ko' | 'ja' | 'zh-TW'\n) => {\n let url = '';\n if (env === 'dev') {\n url = getI18nConfigUrl('dev', name, lang);\n } else {\n url = getI18nConfigUrl(env === 'prod' ? 'prod' : 'test', name, lang);\n }\n return fetch(`${url}?t=${Date.now()}`)\n .then(res => {\n return res.json();\n })\n .catch(() => ({}));\n};\n\nconst $$i18n = (text: string, value: Record<string, any> = {}) => {\n return text.replace(/\\{[a-zA-Z_0-9]*\\}/g, key => {\n return value[key.slice(1, -1)];\n });\n};\n\nconst initI18n = (name: string, env?: string) => {\n const messages: Record<string, string> = {};\n const system = getSystem();\n\n return {\n messages,\n setup() {\n const lang: any = (() => {\n if (isMicroApp) return system.lang;\n return (\n window.localStorage.getItem('quick_local_debug_lang') || system.lang\n );\n })();\n return loadRemoteI18n(env || 'prod', name, lang).then(lang => {\n Object.assign(messages, lang);\n });\n },\n i18n(key: string, value?: Record<string, string>) {\n const content = messages[key];\n if (typeof content === 'undefined') return key;\n if (!value) return content;\n return content.replace(/\\{[a-zA-Z_0-9]*\\}/g, key => {\n return value[key.slice(1, -1)];\n });\n },\n };\n};\n\nexport const installI18n = (name: string, env?: string) => {\n const { i18n, setup, messages } = initI18n(name, env);\n return {\n $i18n: i18n,\n $$i18n,\n messages,\n loadPromise: setup(),\n };\n};\n","import { getCurrentApp } from './application/manage';\n\nconst events = {\n /**\n *向父级发送事件\n */\n trigger(name: string, data: any) {\n getCurrentApp()?.trigger(name, data);\n },\n /**\n *向子级发送事件\n */\n broadcast(name: string, data: any) {\n getCurrentApp()?.broadcast(name, data);\n },\n on(name: string, handler: (...args: any[]) => void) {\n getCurrentApp()?.on(name, handler);\n },\n off(name: string, handler: (...args: any[]) => void) {\n getCurrentApp()?.off(name, handler);\n },\n};\n\nexport default events;\n","import React, { PropsWithChildren, useEffect, useState } from 'react';\nconst URls = {\n UserInfoUrl: '/store/user/getUserInfo',\n Login: '/store/user/login',\n StoreList: '/store/store/list',\n ChangeStore: '/store/store/switch',\n};\nimport * as Authentication from '../business';\n\nconst useRequest = (\n http: (...args: any[]) => Promise<any>,\n url: string,\n ...params: any[]\n) => {\n const [data, setData] = useState<any>();\n const [loading, setLoading] = useState(true);\n const request = () => {\n setLoading(true);\n return http(url, ...params)\n .then(user => {\n setData(user);\n })\n .finally(() => {\n setLoading(false);\n });\n };\n useEffect(() => {\n request();\n }, []);\n\n return {\n data,\n loading,\n request,\n setData,\n };\n};\n\nconst Spining = React.createElement(\n 'div',\n {\n style: {\n width: '100%',\n height: '100&',\n textAlign: 'center',\n fontSize: 40,\n },\n },\n ['微应用本地调试模式初始化中...']\n);\n\nconst valueById = (id: string) => (document.getElementById(id) as any)!.value;\n\nconst Login: React.FC<{ onLogin(data: any): void }> = props => {\n const login = () => {\n props.onLogin({\n email: valueById('local_debug_account'),\n loginStatus: 2,\n password: valueById('local_debug_password'),\n });\n };\n return React.createElement(\n 'div',\n {\n style: {\n fontSize: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexDirection: 'column',\n height: '100%',\n },\n },\n [\n React.createElement('div', {}),\n [\n '请先登录:',\n React.createElement('table', {}, [\n React.createElement('tr', {}, [\n React.createElement('td', {}, [\n '帐号:',\n React.createElement('input', {\n id: 'local_debug_account',\n style: { fontSize: 20, width: 400 },\n }),\n ]),\n ]),\n React.createElement('tr', {}, [\n React.createElement('td', {}, [\n '密码:',\n React.createElement('input', {\n id: 'local_debug_password',\n type: 'password',\n style: { fontSize: 20, width: 400 },\n }),\n ]),\n ]),\n React.createElement('tr', {}, [\n React.createElement(\n 'td',\n {\n colSpan: 2,\n },\n [\n React.createElement(\n 'button',\n {\n style: { fontSize: 20, width: '100%' },\n onClickCapture: login,\n },\n ['登录']\n ),\n ]\n ),\n ]),\n ]),\n ],\n ]\n );\n};\n\nconst Info: React.FC<{\n onLogout(): void;\n post(...args: any[]): Promise<any>;\n}> = ({ post, ...props }) => {\n const store = Authentication.getStoreInfo();\n const staff = Authentication.getStaffInfo();\n const lang = window.localStorage.getItem('quick_local_debug_lang') || 'zh-CN';\n const { data } = useRequest(post, URls.StoreList);\n return React.createElement(\n 'div',\n {\n style: { position: 'fixed', right: 10, bottom: 10, zIndex: 10000 },\n },\n [\n 'quick-platform子应用调试工具:',\n React.createElement('div', { key: 'store' }, [\n React.createElement('span', { style: { float: 'left' } }, [\n `当前店铺:`,\n ]),\n React.createElement(\n 'select',\n {\n style: { fontSize: 16 },\n value: store.id,\n onChange: (e: any) => {\n post(URls.ChangeStore, { storeId: e.target.value })\n .then(data => {\n sessionStorage.setItem('quick-storeId', data.storeId);\n sessionStorage.setItem('quick-token', data.jwt);\n sessionStorage.removeItem('quick-qyWechat');\n console.log(\n '%c [ halvee>]-133',\n 'font-size:13px; background:pink; color:#bf2c9f;',\n data.jwt\n );\n window.location.reload();\n })\n .catch(() => {\n alert('切换店铺失败');\n });\n },\n },\n (data || []).map((item: any) => {\n return React.createElement(\n 'option',\n { value: item.id, key: item.id },\n [item.storeName]\n );\n })\n ),\n ]),\n React.createElement('div', {}, [\n React.createElement('span', { style: { float: 'left' } }, [\n `当前语言:`,\n ]),\n React.createElement(\n 'select',\n {\n style: { fontSize: 16 },\n value: lang,\n onChange(e: any) {\n localStorage.setItem('quick_local_debug_lang', e.target.value);\n window.location.reload();\n },\n },\n ['zh-CN', 'en-US', 'ko', 'ja', 'zh-TW'].map(key => {\n return React.createElement('option', { value: key, key: key }, [\n key,\n ]);\n })\n ),\n ]),\n React.createElement('div', { key: 'user' }, [`当前用户:${staff.email}`]),\n React.createElement(\n 'button',\n {\n onClick() {\n sessionStorage.clear();\n props.onLogout();\n },\n },\n ['退出登录']\n ),\n ]\n );\n};\n\nconst LocalDebug: React.FC<PropsWithChildren<{\n hideInfo: boolean;\n post(...args: any[]): Promise<any>;\n}>> = ({ post, ...props }) => {\n const { loading, data, setData } = useRequest(post, URls.UserInfoUrl);\n if (loading) return Spining;\n if (!data)\n return React.createElement(Login, {\n onLogin: info => {\n post(URls.Login, info)\n .then(data => {\n Authentication.login(data);\n setData(data);\n })\n .catch(e => {\n alert(e.data.message || '登录失败');\n });\n },\n });\n sessionStorage.setItem('quick-token', data.jwt);\n Authentication.login(data);\n if (props.hideInfo)\n return React.createElement(React.Fragment, {}, props.children);\n return React.createElement(React.Fragment, {}, [\n React.createElement(Info, {\n key: 'info-wrapper',\n post,\n onLogout() {\n setData(null);\n },\n }),\n props.children,\n ]);\n};\n\nexport default LocalDebug;\n","import React from 'react';\nimport { createFromIconfontCN } from '@ant-design/icons';\nimport { IconFontProps } from '@ant-design/icons/lib/components/IconFont';\nconst hasInstalled = !!document.getElementById('_CD_ICON_1633');\nconst IconFont: React.FC<IconFontProps> = createFromIconfontCN({\n scriptUrl: hasInstalled\n ? ''\n : 'https://front-assets.obs.ap-southeast-3.myhuaweicloud.com/library/icon/icon.js', //https://front-assets.quickcep.com/library/icon/icon.js\n});\n\nexport default IconFont;\n","import React, { useMemo, useState, useEffect } from 'react';\nimport { getCurrentApp } from '../application';\nimport events from '../event';\n\nconst AppContext = React.createContext({ data: null as any });\n\nexport const useAppData = () => React.useContext(AppContext).data;\n\nexport const App: React.FC<any> = props => {\n const app = getCurrentApp();\n const [data, setData] = useState(app.parent?.cache(`${app.name}-data`));\n useEffect(() => {\n const update = (data: any) => {\n setData(data);\n };\n events.on(`${app.name}-data-change`, update);\n return () => {\n events.off(`${app.name}-data-change`, update);\n };\n }, [app.name]);\n const value = useMemo(() => {\n return { data };\n }, [data]);\n return React.createElement(\n AppContext.Provider,\n {\n value,\n },\n [props.children]\n );\n};\n","import heic2any from 'heic2any';\n\nconst handlerBlob = (url: string, blob: Blob) =>\n new Promise<string>((resolve, reject) => {\n const img = new window.Image();\n img.src = URL.createObjectURL(blob);\n img.onload = resolve.bind(null, img.src);\n img.onerror = reject.bind(null, url);\n });\n\n// eslint-disable-next-line max-len\nconst createFetch = (handler: (url: string) => Promise<Blob>) => (\n url: string\n): Promise<string> =>\n handler(url)\n .then(handlerBlob.bind(null, url))\n .catch(() => Promise.reject(url));\n\n// eslint-disable-next-line max-len\nconst tryHeic = createFetch(url =>\n fetch(url, { headers: {}, mode: 'cors' })\n .then(res => res.blob())\n .then(blob => heic2any({ blob }))\n .then(blob => {\n if (Array.isArray(blob)) return blob[0];\n return blob;\n })\n);\n\n// const tryProxy = createFetch((url) => fetch(`/store/stream/downloadFileStream?fileUrl=${encodeURIComponent(url)}`).then((res) => res.blob()));\n\nconst stack: Map<string, Promise<string>> = new Map();\nconst tryCache = (url: string, fetch: (url: string) => Promise<string>) => {\n if (stack.has(url)) return stack.get(url)!;\n const promise = fetch(url);\n stack.set(url, promise);\n promise.finally(() => {\n stack.delete(url);\n });\n return promise;\n};\n\nconst tryImageTranscode = function(\n url: string,\n customTry?: (url: string) => Promise<Blob>\n) {\n if (!customTry) return tryCache(url, () => tryHeic(url));\n const customTryProxy = createFetch(customTry);\n return tryCache(url, () => tryHeic(url).catch(customTryProxy));\n};\n\nexport { tryImageTranscode };\n","import axios, { AxiosInstance, CancelTokenSource } from 'axios';\nconst CancelToken = axios.CancelToken;\n\nexport interface IResponse<Data> {\n code: number;\n message: string;\n success: boolean;\n data: Data;\n}\nexport interface IResponsePage<Data> {\n pageIndex: number; // 当前分页\n pageSize: number; // 分页条数\n total: number; // 总数\n row: Data[];\n}\nexport type TPageRequest<Params> = {\n pageIndex?: number;\n pageSize?: number;\n} & Params;\n\ninterface IRequestConfig {\n cancelTokenSource?: CancelTokenSource;\n}\ntype TCanceler = (reason?: string) => void;\n\ntype IMethod = <D = any, P extends Record<string, any> = any>(\n url: string,\n params?: P,\n config?: IRequestConfig\n) => Promise<D>;\n\ninterface TCancelCreator {\n <\n T extends (\n url: string,\n params?: any,\n config?: IRequestConfig\n ) => ReturnType<IMethod>\n >(\n request: T\n ): (...args: Parameters<T>) => [ReturnType<T>, TCanceler];\n <T extends (params?: any, config?: IRequestConfig) => ReturnType<IMethod>>(\n request: T\n ): (...args: Parameters<T>) => [ReturnType<T>, TCanceler];\n}\n\nconst createMethods = (\n inst: AxiosInstance,\n requestQueue: CancelTokenSource[]\n) => {\n return ['get', 'post'].map(method => {\n return <D = any, P extends Record<string, any> = any>(\n url: string,\n params?: P,\n config?: IRequestConfig\n ) => {\n const source = config?.cancelTokenSource || CancelToken.source();\n delete config?.cancelTokenSource;\n const requestConfig = {\n [method === 'get' ? 'params' : 'data']: params,\n };\n requestQueue.push(source);\n\n const requestUrl = url.replace(/\\{([a-zA-Z]+)\\}/g, (_match, key) => {\n if (!params) return key;\n const value = params[key] || key;\n /**兼容不删除的场景*/\n if (!params['saveQuery']) {\n delete params[key];\n } else {\n console.log('params', params);\n delete params['saveQuery'];\n }\n return value;\n });\n return inst\n .request<IResponse<D>>({\n url: requestUrl,\n method: method.toUpperCase() as any,\n cancelToken: source.token,\n ...requestConfig,\n ...(config || {}),\n })\n .then(res => res?.data)\n .then(res => {\n if (!(res as any).success) return Promise.reject(res);\n return res.data;\n });\n };\n });\n};\n\nconst createAbort = (queue: CancelTokenSource[]): TCanceler => {\n return (reason?: string) => {\n while (queue.length) {\n queue.shift()!.cancel(reason);\n }\n };\n};\n\nconst creatorFactory = (request: IMethod, config1: IRequestConfig = {}) => <\n D1 = any,\n P1 extends Record<string, any> = any\n>(\n url: string,\n config2: IRequestConfig = {}\n) => (params: P1, config3: IRequestConfig = {}) =>\n request<D1, P1>(\n url,\n params || ({} as any),\n Object.assign({}, config1, config2, config3)\n );\n\nconst createAxios = (baseURL: string) => {\n const inst = axios.create({\n baseURL,\n });\n const useResponseInterCeptor = inst.interceptors.response.use.bind(\n inst.interceptors.response\n );\n const useRequestInterCeptor = inst.interceptors.request.use.bind(\n inst.interceptors.request\n );\n\n return {\n instance: inst,\n useRequestInterCeptor,\n useResponseInterCeptor,\n };\n};\n\nconst cancelCreatorFactory = (): TCancelCreator => (request: any) => {\n return (...args: any[]) => {\n const source = CancelToken.source();\n const configIndex = typeof args[0] === 'string' ? 2 : 1;\n args[configIndex] = Object.assign({}, args[configIndex] || {}, {\n cancelTokenSource: source,\n });\n return [\n request(...args),\n (reason: string) => {\n source.cancel(reason);\n },\n ] as any;\n };\n};\n\nexport const buildHttpCtrl = (server: string) => {\n const requestQueue: CancelTokenSource[] = [];\n const {\n instance: inst,\n useRequestInterCeptor,\n useResponseInterCeptor,\n } = createAxios(server);\n const abort = createAbort(requestQueue);\n const [get, post] = createMethods(inst, requestQueue);\n\n const getCreator = creatorFactory(get);\n const postCreator = creatorFactory(post);\n const cancelCreator = cancelCreatorFactory();\n return {\n abort,\n get,\n post,\n cancelCreator,\n getCreator,\n postCreator,\n useRequestInterCeptor,\n useResponseInterCeptor,\n };\n};\n\nexport default buildHttpCtrl;\n","import React, { useContext, useState } from 'react';\n\nimport { Color } from '../define';\nimport { setPrimaryColor } from '../lib';\n\nconst ThemeContext = React.createContext({\n colorPrimary: Color.PrimaryColor,\n setPrimaryColor(_color: string) {},\n});\n\nexport const ReactThemeHOC = <T extends {}>(\n Component: React.FunctionComponent<T>,\n): React.FC<T> => {\n return (props) => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const [primaryColor, setPrimaryColor] = useState(Color.PrimaryColor);\n return React.createElement(\n ThemeContext.Provider,\n {\n key: 'theme-hoc',\n value: {\n colorPrimary: primaryColor,\n setPrimaryColor(color) {\n setPrimaryColor(color);\n },\n },\n },\n [React.createElement(Component, { ...props, key: 'theme-hoc-component' })],\n );\n };\n};\n\nexport const useThemePrimaryColor = () => {\n const context = useContext(ThemeContext);\n return {\n color: context.colorPrimary,\n set(color: string) {\n context.setPrimaryColor(color);\n setPrimaryColor(color);\n },\n };\n};\n","import { registerApp, getCurrentApp } from './application';\n\nimport MicroApp from './components/MicroApp';\n\nimport Permission from './components/Permission';\nimport LocalDebug from './components/LocalDebug';\n\nimport I18nFC from './components/i18n';\n\nimport IconFont from './components/IconFont';\nimport { App, useAppData } from './components/context';\n\nimport AppEvent from './event';\n\nimport * as Utils from './utils';\n\nimport * as Authentication from './business';\n\nexport * from './theme';\n\nconst win: any = window;\nconst debugKey = '__quick_platform_get_current_app__';\nwin[debugKey] = getCurrentApp;\n\nexport {\n App,\n useAppData,\n getCurrentApp,\n registerApp,\n LocalDebug,\n MicroApp,\n Permission,\n IconFont,\n AppEvent,\n Utils,\n Authentication,\n I18nFC,\n};\n","import React from 'react';\nconst I18nFC = (text: string, data?: Record<string, any>) => {\n if (!data) return text;\n const list: React.ReactNode[] = [];\n let prev = 0;\n text.replace(/\\{[a-zA-Z_0-9]*\\}/g, (match, index) => {\n const prevText = text.slice(prev, index);\n list.push(prevText);\n list.push(data[match.slice(1, -1)]);\n prev = index + match.length;\n return '';\n });\n list.push(text.slice(prev, text.length));\n return React.createElement(React.Fragment, {}, list as any);\n};\n\nexport default I18nFC;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { getCurrentApp, loadApp } from '../application';\nimport { assign } from '../utils/utils';\nimport { getSystem } from '../business';\nimport events from '../event';\n\nconst MicroApp: React.FC<{\n name: string;\n extra?: any;\n base?: string;\n env?: string;\n host?: string;\n data?: any;\n className?: string;\n loading?: React.ReactNode;\n entry?: string;\n onMounted?(): void;\n}> = props => {\n const app = useRef<any>();\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n return () => {\n if (app.current) {\n console.log(props.name, '应用卸载');\n app.current.unmount();\n console.log(props.name, '应用卸载完成');\n }\n };\n }, []);\n useState(() => {\n if (props.data) {\n getCurrentApp().cache(`${props.name}-data`, props.data);\n }\n });\n\n useEffect(() => {\n if (props.data) {\n getCurrentApp().cache(`${props.name}-data`, props.data);\n events.broadcast(`${props.name}-data-change`, props.data);\n }\n }, [props.data, props.name]);\n\n return React.createElement(\n 'div',\n {\n style: {\n width: '100%',\n height: '100%',\n position: 'relative',\n },\n },\n [\n React.createElement('div', {\n style: { width: '100%', height: '100%' },\n className: props.className,\n ref(instance: any) {\n if (!instance || app.current) return;\n const system = getSystem();\n app.current = loadApp(\n props.name,\n instance,\n Object.assign(\n {},\n props.extra,\n assign('base', props.base),\n assign('host', props.host),\n assign('env', props.env || system.env),\n assign('entry', props.entry)\n )\n );\n app.current.mountPromise.then(() => {\n setLoading(false);\n props.onMounted?.();\n });\n },\n }),\n loading\n ? React.createElement(\n 'div',\n {\n style: {\n width: '100%',\n height: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n },\n },\n [props.loading]\n )\n : null,\n ]\n );\n};\n\nexport default MicroApp;\n","import { loadMicroApp } from 'qiankun';\nimport { isMicroApp } from '../utils/utils';\nimport { ROUTER_BASE_KEY } from './constants';\nimport { disposeApp, intApp, getCurrentApp } from './manage';\nimport { installI18n } from '../utils/i18n';\n\nexport const loadApp = (\n name: string,\n container: HTMLElement,\n props?: {\n host?: string;\n base?: string;\n env?: string;\n entry?: string;\n }\n) => {\n const { host = '', base = '' } = props || {};\n const app = loadMicroApp({\n name: name,\n entry:\n host ||\n `${window.location.origin}/micro/${name}/${props?.entry || 'micro'}.html`,\n container: container,\n props: {\n base: base,\n name,\n },\n });\n app.mountPromise.catch(e => {\n console.log('----启动子应用失败', e);\n });\n return app;\n};\n\nexport const registerApp = (options: {\n name: string;\n env?: string;\n i18n?: {\n global?: boolean;\n onReady?(hook: ReturnType<typeof installI18n>): Promise<any>;\n };\n lifecycles: {\n mount?(props: any): Promise<any>;\n unmount?(props: any): Promise<any>;\n bootstrap?(props: any): Promise<any>;\n };\n}) => {\n intApp(options.name);\n const preLoad = options.i18n\n ? () => {\n const i18n = installI18n(options.name, options.env);\n if (options.i18n!.global !== false) {\n (window as any).$$i18n = i18n.$$i18n;\n (window as any).$i18n = i18n.$i18n;\n }\n return Promise.all([i18n.loadPromise, options.i18n!.onReady?.(i18n)]);\n }\n : () => Promise.resolve();\n return {\n async beforeMount() {\n return new Promise(() => {});\n },\n async mount(props: any) {\n intApp(options.name);\n return options.lifecycles.mount?.(props);\n },\n async unmount(props: any) {\n disposeApp(); //todo 可能有点问题\n return options.lifecycles.unmount?.(props);\n },\n async bootstrap(props: any) {\n await preLoad();\n if (isMicroApp && props.base) {\n console.log('来自主应用的路由base控制:', props.base);\n (window as any)[ROUTER_BASE_KEY] = props.base;\n }\n return options.lifecycles.bootstrap?.(props);\n },\n };\n};\n\nexport { intApp, getCurrentApp };\n","import React, { PropsWithChildren } from 'react';\n\nimport { hasAuth } from '../business';\n\nconst Permission: React.FC<PropsWithChildren<{\n code: string; // 权限码\n auth?: () => boolean; // 自定义权限检验\n}>> = ({ auth = () => true, ...props }) => {\n if (hasAuth(props.code) && auth()) return props.children as any;\n return null;\n};\n\nexport default Permission;\n","import { ReactThemeHOC, useThemePrimaryColor } from './hook';\n\nexport const ThemeHOC = <T extends {}>(\n Component: React.FC<T>\n // options: { antd?: boolean; iconPark?: boolean; antdPrefixCls?: string } = {},\n): React.FC<T> => {\n // const { antd = true } = options;\n // if (antd) {\n // Component = AntdHOC(Component, { prefixCls: options.antdPrefixCls });\n // }\n return ReactThemeHOC(Component);\n};\n\nexport { useThemePrimaryColor };\n","import { Color } from '../define';\n\nexport const setPrimaryColor = (color: string) => {\n Color.updateBrandColor(color);\n document.documentElement.style.setProperty(\n Color.generateVar('primary'),\n Color.PrimaryColor\n );\n // Object.keys(Color.BrandColor).forEach(key => {\n // document.documentElement.style.setProperty(\n // Color.generateVar(key),\n // Color.BrandColor[key]\n // );\n // });\n};\n"],"names":["app","ReleaseMap","LicenseTypeMap","isMicroApp","window","__POWERED_BY_QIANKUN__","assign","key","value","obj","Object","_Object$assign","win","eval","appMap","Map","App","name","parent","this","EventEmitter","emitter","on","bind","once","off","getParent","addChildren","set","_proto","prototype","has","root","Error","get","child","children","push","removeChildren","filter","trigger","data","emit","broadcast","i","len","length","cache","cacheMap","destroy","removeAllListeners","clear","pop","_createClass","_root","intApp","getCurrentApp","ls","localStorage","getItem","JSON","parse","e","console","error","PLGList","Free","FreeCode","Starter","Growth","isPLG","licence","licenceId","includes","isSLG","isEnterprise","Enterprise","isFree","isProfessional","Professional","isCredits","licenceType","useBalance","login","userInfo","_getCurrentApp","_getCurrentApp2","isRoot","warn","buildSystemGetter","fn","_getCurrentApp3","userinfo","userId","authFunction","rightList","getUserInfo","statffInfo","getStaffInfo","staffInfo","getStoreInfo","storeInfo","getStoreLicense","storeLicenceInfo","hasAuth","code","getSystem","oem","process","env","OEM_NAME","defaultLang","REACT_APP_ENVKEY","lang","token","sessionStorage","requestTokenKey","storeId","getOEMName","_window$QUICK_CEP","QUICK_CEP","LicenseCreator","License","getLicense","isOEM","baseUrl","langMap","zh-CN","en-US","ko","ja","zh-TW","$$i18n","text","replace","slice","installI18n","_initI18n","messages","system","setup","url","getI18nConfigUrl","fetch","Date","now","then","res","json","loadRemoteI18n","i18n","content","initI18n","$i18n","loadPromise","events","handler","_getCurrentApp4","useRequest","http","params","Array","_len","_key","arguments","_useState","useState","setData","_useState2","loading","setLoading","request","apply","concat","user","useEffect","Spining","React","createElement","style","width","height","textAlign","fontSize","valueById","id","document","getElementById","Login","props","display","alignItems","justifyContent","flexDirection","type","colSpan","onClickCapture","onLogin","email","loginStatus","password","Info","_ref","post","_objectWithoutPropertiesLoose","_excluded","store","Authentication","staff","position","right","bottom","zIndex","float","onChange","target","setItem","jwt","removeItem","log","location","reload","alert","map","item","storeName","onClick","onLogout","IconFont","createFromIconfontCN","scriptUrl","AppContext","createContext","handlerBlob","blob","Promise","resolve","reject","img","Image","src","URL","createObjectURL","onload","onerror","createFetch","tryHeic","headers","mode","heic2any","isArray","stack","tryCache","promise","CancelToken","axios","creatorFactory","config1","config2","config3","customTry","customTryProxy","server","queue","requestQueue","_createAxios","baseURL","inst","create","useResponseInterCeptor","interceptors","response","use","useRequestInterCeptor","instance","createAxios","abort","reason","shift","cancel","_createMethods","method","config","source","cancelTokenSource","requestConfig","_requestConfig","requestUrl","_match","_extends","toUpperCase","cancelToken","success","createMethods","cancelCreator","args","configIndex","getCreator","postCreator","ThemeContext","colorPrimary","Color","setPrimaryColor","_color","_app$parent","update","useMemo","Provider","list","prev","match","index","prevText","Fragment","_ref2","_excluded2","_useRequest2","hideInfo","info","message","useRef","current","unmount","className","ref","container","_ref$host","host","_ref$base","base","loadMicroApp","entry","origin","mountPromise","loadApp","extra","onMounted","top","left","auth","_ref$auth","Component","color","ReactThemeHOC","options","preLoad","global","all","onReady","beforeMount","_context","stop","_callee","mount","_context2","abrupt","lifecycles","_callee2","undefined","_context3","_callee3","bootstrap","_context4","_callee4","useContext","context","documentElement","setProperty"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare let PrimaryColor: string;
2
+ export declare const generateVar: (name: string) => string;
3
+ export declare const BrandColor: {};
4
+ export declare const updateBrandColor: (color: string) => {};
5
+ /**
6
+ * todo预留功能色
7
+ */
8
+ export declare const FunctionalColor: {};
9
+ export declare const FunctionalHelperColor: typeof FunctionalColor;
@@ -0,0 +1,50 @@
1
+ export declare const EnFont = "Inter";
2
+ export declare const NumberFont = "Inter";
3
+ export declare const TextFont: {
4
+ Normal: {
5
+ fontSize: number;
6
+ fontWeight: string;
7
+ };
8
+ NormalBold: {
9
+ fontWeight: string;
10
+ fontSize: number;
11
+ };
12
+ Small: {
13
+ fontSize: number;
14
+ fontWeight: string;
15
+ };
16
+ SmallBold: {
17
+ fontWeight: string;
18
+ fontSize: number;
19
+ };
20
+ Middle: {
21
+ fontSize: number;
22
+ fontWeight: string;
23
+ };
24
+ MiddleBold: {
25
+ fontWeight: string;
26
+ fontSize: number;
27
+ };
28
+ Large: {
29
+ fontSize: number;
30
+ fontWeight: string;
31
+ };
32
+ LargeBold: {
33
+ fontWeight: string;
34
+ fontSize: number;
35
+ };
36
+ Helper: {
37
+ fontSize: number;
38
+ fontWeight: string;
39
+ };
40
+ };
41
+ export declare const TitleFont: {
42
+ Normal: {
43
+ fontSize: number;
44
+ fontWeight: string;
45
+ };
46
+ Middle: {
47
+ fontSize: number;
48
+ fontWeight: string;
49
+ };
50
+ };
@@ -0,0 +1,5 @@
1
+ import * as Color from './color';
2
+ import * as Font from './font';
3
+ import * as Size from './size';
4
+ import * as Style from './style';
5
+ export { Color, Size, Font, Style, };
@@ -0,0 +1,24 @@
1
+ export declare const BaseSize: {
2
+ 'size-1': number;
3
+ 'size-2': number;
4
+ 'size-3': number;
5
+ 'size-4': number;
6
+ 'size-5': number;
7
+ 'size-6': number;
8
+ 'size-7': number;
9
+ 'size-8': number;
10
+ 'size-9': number;
11
+ 'size-10': number;
12
+ };
13
+ export declare const ComponentSize: {};
14
+ export declare const MarginSize: {};
15
+ export declare const IconSize: {
16
+ normal: number;
17
+ };
18
+ export declare const ResponsiveScreenSize: {
19
+ s: number;
20
+ m: number;
21
+ l: number;
22
+ xl: number;
23
+ xxl: number;
24
+ };
@@ -0,0 +1,21 @@
1
+ export declare const BorderRadius: {
2
+ Small: {
3
+ borderRadius: number;
4
+ };
5
+ Normal: {
6
+ borderRadius: number;
7
+ };
8
+ };
9
+ export declare const Border: {
10
+ SolidStroke: {
11
+ borderStyle: "dashed" | "solid";
12
+ borderWidth: number;
13
+ borderColor: string;
14
+ };
15
+ DashedStroke: {
16
+ borderStyle: "dashed" | "solid";
17
+ borderWidth: number;
18
+ borderColor: string;
19
+ };
20
+ };
21
+ export declare const Shadow: {};
@@ -0,0 +1,2 @@
1
+ declare const ThemeDoc: any;
2
+ export default ThemeDoc;
@@ -0,0 +1,3 @@
1
+ import * as Theme from './define';
2
+ import { useThemePrimaryColor, ThemeHOC } from './react';
3
+ export { useThemePrimaryColor, ThemeHOC, Theme };
@@ -0,0 +1 @@
1
+ export declare const setPrimaryColor: (color: string) => void;
@@ -0,0 +1,5 @@
1
+ export declare const ReactThemeHOC: <T extends {}>(Component: any) => any;
2
+ export declare const useThemePrimaryColor: () => {
3
+ color: any;
4
+ set(color: string): void;
5
+ };
@@ -0,0 +1,3 @@
1
+ import { useThemePrimaryColor } from './hook';
2
+ export declare const ThemeHOC: <T extends {}>(Component: any) => any;
3
+ export { useThemePrimaryColor };
@@ -0,0 +1,19 @@
1
+ export declare const UnoConfig: () => {
2
+ content: {
3
+ pipeline: {
4
+ include: string[];
5
+ };
6
+ };
7
+ rules: ([RegExp, Function] | [RegExp, Function, any])[];
8
+ theme: {
9
+ colors: any;
10
+ };
11
+ shortcuts: [RegExp, Function][];
12
+ layers: {
13
+ default: number;
14
+ 'weight-lower': number;
15
+ };
16
+ preflights: {
17
+ getCSS(): any;
18
+ }[];
19
+ };
@@ -0,0 +1,6 @@
1
+ export declare const installI18n: (name: string, env?: string | undefined) => {
2
+ $i18n: (key: string, value?: Record<string, string> | undefined) => string;
3
+ $$i18n: (text: string, value?: Record<string, any>) => string;
4
+ messages: Record<string, string>;
5
+ loadPromise: Promise<void>;
6
+ };
@@ -0,0 +1,2 @@
1
+ declare const tryImageTranscode: (url: string, customTry?: ((url: string) => Promise<Blob>) | undefined) => Promise<string>;
2
+ export { tryImageTranscode };
@@ -0,0 +1,5 @@
1
+ import { isMicroApp } from './utils';
2
+ export * from './image';
3
+ export * from './request';
4
+ export * from './i18n';
5
+ export { isMicroApp };
@@ -0,0 +1,6 @@
1
+ declare const ls: {
2
+ getData(key: string): any;
3
+ setData(key: string, value: any): void;
4
+ removeItem(key: string): void;
5
+ };
6
+ export default ls;
@@ -0,0 +1,37 @@
1
+ import { CancelTokenSource } from 'axios';
2
+ export interface IResponse<Data> {
3
+ code: number;
4
+ message: string;
5
+ success: boolean;
6
+ data: Data;
7
+ }
8
+ export interface IResponsePage<Data> {
9
+ pageIndex: number;
10
+ pageSize: number;
11
+ total: number;
12
+ row: Data[];
13
+ }
14
+ export declare type TPageRequest<Params> = {
15
+ pageIndex?: number;
16
+ pageSize?: number;
17
+ } & Params;
18
+ interface IRequestConfig {
19
+ cancelTokenSource?: CancelTokenSource;
20
+ }
21
+ declare type TCanceler = (reason?: string) => void;
22
+ declare type IMethod = <D = any, P extends Record<string, any> = any>(url: string, params?: P, config?: IRequestConfig) => Promise<D>;
23
+ interface TCancelCreator {
24
+ <T extends (url: string, params?: any, config?: IRequestConfig) => ReturnType<IMethod>>(request: T): (...args: Parameters<T>) => [ReturnType<T>, TCanceler];
25
+ <T extends (params?: any, config?: IRequestConfig) => ReturnType<IMethod>>(request: T): (...args: Parameters<T>) => [ReturnType<T>, TCanceler];
26
+ }
27
+ export declare const buildHttpCtrl: (server: string) => {
28
+ abort: TCanceler;
29
+ get: <D = any, P extends Record<string, any> = any>(url: string, params?: P | undefined, config?: IRequestConfig | undefined) => Promise<D>;
30
+ post: <D = any, P extends Record<string, any> = any>(url: string, params?: P | undefined, config?: IRequestConfig | undefined) => Promise<D>;
31
+ cancelCreator: TCancelCreator;
32
+ getCreator: <D1 = any, P1 extends Record<string, any> = any>(url: string, config2?: IRequestConfig) => (params: P1, config3?: IRequestConfig) => Promise<D1>;
33
+ postCreator: <D1 = any, P1 extends Record<string, any> = any>(url: string, config2?: IRequestConfig) => (params: P1, config3?: IRequestConfig) => Promise<D1>;
34
+ useRequestInterCeptor: (onFulfilled?: ((value: import("axios").InternalAxiosRequestConfig<any>) => import("axios").InternalAxiosRequestConfig<any> | Promise<import("axios").InternalAxiosRequestConfig<any>>) | null | undefined, onRejected?: ((error: any) => any) | null | undefined, options?: import("axios").AxiosInterceptorOptions | undefined) => number;
35
+ useResponseInterCeptor: (onFulfilled?: ((value: import("axios").AxiosResponse<any, any>) => import("axios").AxiosResponse<any, any> | Promise<import("axios").AxiosResponse<any, any>>) | null | undefined, onRejected?: ((error: any) => any) | null | undefined, options?: import("axios").AxiosInterceptorOptions | undefined) => number;
36
+ };
37
+ export default buildHttpCtrl;
@@ -0,0 +1,3 @@
1
+ export declare const isMicroApp: boolean;
2
+ export declare const assign: (key: string | number, value?: any, obj?: Record<string, any> | undefined) => Record<string, any>;
3
+ export declare const envValue: (prod: string, dev: string) => string;
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "version": "1.0.46",
3
+ "name": "quick-platform",
4
+ "license": "MIT",
5
+ "main": "dist/index.js",
6
+ "typings": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "src"
10
+ ],
11
+ "engines": {
12
+ "node": ">=10"
13
+ },
14
+ "exports": {
15
+ ".": "./dist/index.js",
16
+ "./config": "./dist/config.js"
17
+ },
18
+ "scripts": {
19
+ "start": "tsdx watch",
20
+ "build": "tsdx build --transpileOnly",
21
+ "test": "tsdx test --passWithNoTests",
22
+ "lint": "tsdx lint",
23
+ "size": "size-limit",
24
+ "analyze": "size-limit --why"
25
+ },
26
+ "peerDependencies": {
27
+ "@ant-design/icons": ">=5.0.1",
28
+ "axios": "^1.7.7",
29
+ "classnames": ">=2.3.1",
30
+ "react": ">=16"
31
+ },
32
+ "husky": {
33
+ "hooks": {
34
+ "pre-commit": "tsdx lint"
35
+ }
36
+ },
37
+ "prettier": {
38
+ "printWidth": 80,
39
+ "semi": true,
40
+ "singleQuote": true,
41
+ "trailingComma": "es5"
42
+ },
43
+ "author": "halvee",
44
+ "module": "dist/platform.esm.js",
45
+ "size-limit": [
46
+ {
47
+ "path": "dist/platform.cjs.production.min.js",
48
+ "limit": "10 KB"
49
+ },
50
+ {
51
+ "path": "dist/platform.esm.js",
52
+ "limit": "10 KB"
53
+ }
54
+ ],
55
+ "devDependencies": {
56
+ "@size-limit/preset-small-lib": "^11.1.4",
57
+ "tsdx": "^0.14.1",
58
+ "tslib": "^2.6.3",
59
+ "typescript": "^5.5.4"
60
+ },
61
+ "dependencies": {
62
+ "@ant-design/icons": "^5.4.0",
63
+ "eventemitter3": "^5.0.1",
64
+ "heic2any": "^0.0.4",
65
+ "qiankun": "^2.10.16"
66
+ }
67
+ }
@@ -0,0 +1,7 @@
1
+ export const ROUTER_BASE_KEY = 'quick_qiankun_router_base';
2
+
3
+ export const APP_PARENT_KEY = 'quick_qiankun_parent_app';
4
+
5
+ export const APP_CACHE_PARENT_KEY = 'quick_qiankun_parent_cache';
6
+
7
+ export const APP_MANAGE_KEY = 'quick_qiankun_manage';
@@ -0,0 +1,82 @@
1
+ import { loadMicroApp } from 'qiankun';
2
+ import { isMicroApp } from '../utils/utils';
3
+ import { ROUTER_BASE_KEY } from './constants';
4
+ import { disposeApp, intApp, getCurrentApp } from './manage';
5
+ import { installI18n } from '../utils/i18n';
6
+
7
+ export const loadApp = (
8
+ name: string,
9
+ container: HTMLElement,
10
+ props?: {
11
+ host?: string;
12
+ base?: string;
13
+ env?: string;
14
+ entry?: string;
15
+ }
16
+ ) => {
17
+ const { host = '', base = '' } = props || {};
18
+ const app = loadMicroApp({
19
+ name: name,
20
+ entry:
21
+ host ||
22
+ `${window.location.origin}/micro/${name}/${props?.entry || 'micro'}.html`,
23
+ container: container,
24
+ props: {
25
+ base: base,
26
+ name,
27
+ },
28
+ });
29
+ app.mountPromise.catch(e => {
30
+ console.log('----启动子应用失败', e);
31
+ });
32
+ return app;
33
+ };
34
+
35
+ export const registerApp = (options: {
36
+ name: string;
37
+ env?: string;
38
+ i18n?: {
39
+ global?: boolean;
40
+ onReady?(hook: ReturnType<typeof installI18n>): Promise<any>;
41
+ };
42
+ lifecycles: {
43
+ mount?(props: any): Promise<any>;
44
+ unmount?(props: any): Promise<any>;
45
+ bootstrap?(props: any): Promise<any>;
46
+ };
47
+ }) => {
48
+ intApp(options.name);
49
+ const preLoad = options.i18n
50
+ ? () => {
51
+ const i18n = installI18n(options.name, options.env);
52
+ if (options.i18n!.global !== false) {
53
+ (window as any).$$i18n = i18n.$$i18n;
54
+ (window as any).$i18n = i18n.$i18n;
55
+ }
56
+ return Promise.all([i18n.loadPromise, options.i18n!.onReady?.(i18n)]);
57
+ }
58
+ : () => Promise.resolve();
59
+ return {
60
+ async beforeMount() {
61
+ return new Promise(() => {});
62
+ },
63
+ async mount(props: any) {
64
+ intApp(options.name);
65
+ return options.lifecycles.mount?.(props);
66
+ },
67
+ async unmount(props: any) {
68
+ disposeApp(); //todo 可能有点问题
69
+ return options.lifecycles.unmount?.(props);
70
+ },
71
+ async bootstrap(props: any) {
72
+ await preLoad();
73
+ if (isMicroApp && props.base) {
74
+ console.log('来自主应用的路由base控制:', props.base);
75
+ (window as any)[ROUTER_BASE_KEY] = props.base;
76
+ }
77
+ return options.lifecycles.bootstrap?.(props);
78
+ },
79
+ };
80
+ };
81
+
82
+ export { intApp, getCurrentApp };
@@ -0,0 +1,119 @@
1
+ import {
2
+ APP_CACHE_PARENT_KEY,
3
+ APP_MANAGE_KEY,
4
+ APP_PARENT_KEY,
5
+ } from './constants';
6
+
7
+ import EventEmitter from 'eventemitter3';
8
+
9
+ const win = (0, eval)('this');
10
+ const appMap: Map<string, App> =
11
+ win[APP_MANAGE_KEY] || (win[APP_MANAGE_KEY] = new Map());
12
+
13
+ class App {
14
+ name: string;
15
+ parent: App | undefined;
16
+ private children: App[] = [];
17
+ private cacheMap: Map<string, any> = new Map();
18
+ emitter = new EventEmitter();
19
+ constructor(name: string, parent?: string) {
20
+ this.name = name;
21
+ if (parent) {
22
+ this.parent = this.getParent(parent);
23
+ this.parent.addChildren(this);
24
+ }
25
+ appMap.set(name, this);
26
+ }
27
+ private getParent(parent: string): App {
28
+ if (parent === 'root' && !appMap.has(parent)) {
29
+ const root = new App('root', '');
30
+ appMap.set(parent, root);
31
+ return root;
32
+ }
33
+ if (!appMap.has(parent)) {
34
+ throw new Error(`quick micro app manage error:${parent} 应用未加载!`);
35
+ }
36
+ return appMap.get(parent)!;
37
+ }
38
+ get root() {
39
+ let root: App = this;
40
+ while (root?.parent) {
41
+ root = root.parent;
42
+ }
43
+ return root;
44
+ }
45
+ get isRoot() {
46
+ return this.root.name === this.name;
47
+ }
48
+ addChildren(child: App) {
49
+ this.children.push(child);
50
+ }
51
+ removeChildren(name: string) {
52
+ this.children = this.children.filter(app => app.name !== name);
53
+ }
54
+ on = this.emitter.on.bind(this.emitter);
55
+ once = this.emitter.once.bind(this.emitter);
56
+ off = this.emitter.off.bind(this.emitter);
57
+ /***
58
+ * 向父级通信
59
+ */
60
+ trigger(name: string, data: any) {
61
+ if (this.parent) this.parent.emitter.emit(name, data);
62
+ }
63
+
64
+ /**
65
+ * 向所有子级通信
66
+ */
67
+ broadcast(name: string, data: any) {
68
+ for (let i = 0, len = this.children.length; i < len; i++) {
69
+ this.children[i].emitter.emit(name, data);
70
+ }
71
+ }
72
+
73
+ cache(key: string, value?: any) {
74
+ if (typeof value !== 'undefined') this.cacheMap.set(key, value);
75
+ return this.cacheMap.get(key);
76
+ }
77
+
78
+ destroy() {
79
+ this.emitter.removeAllListeners();
80
+ this.cacheMap.clear();
81
+
82
+ while (this.children.length) {
83
+ this.children.pop()!.destroy();
84
+ }
85
+ if (this.parent) this.parent.removeChildren(this.name);
86
+ }
87
+ }
88
+
89
+ let app: App | undefined;
90
+
91
+ export const intApp = (name: string) => {
92
+ const win = window as any;
93
+ //@mark 解决proxy缓存问题,如果强行清除proxy上的缓存,可能导致其它问题引入,所以自行缓存父级缓存关系
94
+ let parent = win[APP_CACHE_PARENT_KEY] || win[APP_PARENT_KEY] || 'root';
95
+ if (!app) {
96
+ app = new App(name, parent);
97
+ win[APP_PARENT_KEY] = name;
98
+ win[APP_CACHE_PARENT_KEY] = parent;
99
+ }
100
+ };
101
+
102
+ export const getCurrentApp = () => {
103
+ if (app) return app;
104
+ return (
105
+ appMap.get('root') ||
106
+ (() => {
107
+ const app = new App('root');
108
+ appMap.set('root', app);
109
+ return app;
110
+ })()
111
+ );
112
+ };
113
+
114
+ export const disposeApp = () => {
115
+ if (app) {
116
+ app.destroy();
117
+ app = undefined;
118
+ }
119
+ };