@qxs-bns/utils 0.0.26 → 0.0.28

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 (46) hide show
  1. package/es/index.mjs +1 -1
  2. package/es/src/argo-log.mjs +1 -1
  3. package/es/src/argo-log.mjs.map +1 -1
  4. package/es/src/date-transfer.mjs.map +1 -1
  5. package/es/src/device.mjs.map +1 -1
  6. package/es/src/file-operations.mjs +1 -1
  7. package/es/src/file-operations.mjs.map +1 -1
  8. package/es/src/json.mjs +1 -1
  9. package/es/src/json.mjs.map +1 -1
  10. package/es/src/oss-uploader.mjs.map +1 -1
  11. package/es/src/storage.mjs +1 -1
  12. package/es/src/storage.mjs.map +1 -1
  13. package/es/src/types.mjs.map +1 -1
  14. package/es/src/use-api.mjs +1 -1
  15. package/es/src/use-api.mjs.map +1 -1
  16. package/es/src/watermark.mjs +1 -1
  17. package/es/src/watermark.mjs.map +1 -1
  18. package/lib/index.cjs +1 -1
  19. package/lib/src/argo-log.cjs +1 -1
  20. package/lib/src/argo-log.cjs.map +1 -1
  21. package/lib/src/date-transfer.cjs.map +1 -1
  22. package/lib/src/device.cjs.map +1 -1
  23. package/lib/src/file-operations.cjs +1 -1
  24. package/lib/src/file-operations.cjs.map +1 -1
  25. package/lib/src/json.cjs +1 -1
  26. package/lib/src/json.cjs.map +1 -1
  27. package/lib/src/oss-uploader.cjs.map +1 -1
  28. package/lib/src/storage.cjs +1 -1
  29. package/lib/src/storage.cjs.map +1 -1
  30. package/lib/src/types.cjs.map +1 -1
  31. package/lib/src/use-api.cjs +1 -1
  32. package/lib/src/use-api.cjs.map +1 -1
  33. package/lib/src/watermark.cjs +1 -1
  34. package/lib/src/watermark.cjs.map +1 -1
  35. package/package.json +21 -16
  36. package/types/index.d.ts +0 -1
  37. package/types/index.d.ts.map +1 -1
  38. package/types/src/argo-log.d.ts +27 -2
  39. package/types/src/argo-log.d.ts.map +1 -1
  40. package/types/tsconfig.tsbuildinfo +1 -1
  41. package/es/src/set-guid.mjs +0 -2
  42. package/es/src/set-guid.mjs.map +0 -1
  43. package/lib/src/set-guid.cjs +0 -2
  44. package/lib/src/set-guid.cjs.map +0 -1
  45. package/types/src/set-guid.d.ts +0 -5
  46. package/types/src/set-guid.d.ts.map +0 -1
package/es/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export{ArgoLog}from"./src/argo-log.mjs";export{formatDuration}from"./src/date-transfer.mjs";export{getDeviceType,isAndroid,isIOS,isMobile}from"./src/device.mjs";export{createVideoUploader,downloadFile}from"./src/file-operations.mjs";export{JsonToExcel,excelToJson}from"./src/json.mjs";export{OssError,OssUploader,generateSignedUrl,uploadFile}from"./src/oss-uploader.mjs";export{setGuid}from"./src/set-guid.mjs";export{Storage}from"./src/storage.mjs";export{isBoolean,isElement,isImageByMimeType,isJSONString,isNumber,isPlainObject,isUndefined,isWindow}from"./src/types.mjs";export{ApiService}from"./src/use-api.mjs";export{watermark}from"./src/watermark.mjs";
1
+ export{ArgoLog}from"./src/argo-log.mjs";export{formatDuration}from"./src/date-transfer.mjs";export{getDeviceType,isAndroid,isIOS,isMobile}from"./src/device.mjs";export{createVideoUploader,downloadFile}from"./src/file-operations.mjs";export{JsonToExcel,excelToJson}from"./src/json.mjs";export{OssError,OssUploader,generateSignedUrl,uploadFile}from"./src/oss-uploader.mjs";export{Storage}from"./src/storage.mjs";export{isBoolean,isElement,isImageByMimeType,isJSONString,isNumber,isPlainObject,isUndefined,isWindow}from"./src/types.mjs";export{ApiService}from"./src/use-api.mjs";export{watermark}from"./src/watermark.mjs";
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1,2 +1,2 @@
1
- var e=Object.defineProperty,s=(s,n,t)=>((s,n,t)=>n in s?e(s,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[n]=t)(s,"symbol"!=typeof n?n+"":n,t);const n=class e{constructor(n){s(this,"AnalysysAgent",null),s(this,"pendingQueue",[]),s(this,"track",((e,s)=>{const n=()=>{e?this.AnalysysAgent.track(e,s):console.warn("[ArgoLog] track: name is required")};if(!this.AnalysysAgent)return this.pendingQueue.push(n),void console.info("[ArgoLog] track: SDK 未初始化,调用已暂存");try{n()}catch(e){console.warn("[ArgoLog] track failed:",e)}})),s(this,"setProfile",(e=>{const s=()=>{e?this.AnalysysAgent.profileSet(e):console.warn("[ArgoLog] setProfile: info is required")};if(!this.AnalysysAgent)return this.pendingQueue.push(s),void console.info("[ArgoLog] setProfile: SDK 未初始化,调用已暂存");try{s()}catch(e){console.warn("[ArgoLog] setProfile failed:",e)}})),s(this,"setAlias",(e=>{const s=()=>{e?this.AnalysysAgent.alias(e):console.warn("[ArgoLog] setAlias: code is required")};if(!this.AnalysysAgent)return this.pendingQueue.push(s),void console.info("[ArgoLog] setAlias: SDK 未初始化,调用已暂存");try{s()}catch(e){console.warn("[ArgoLog] setAlias failed:",e)}}));try{if("undefined"==typeof window)return console.warn("[ArgoLog] 仅支持浏览器环境"),this;const s=JSON.stringify(n),t=e.instances.get(s);if(t)return t;if(!n)return console.error("envConfig is required"),this;import("ans-javascript-sdk").then((t=>{this.AnalysysAgent=t.default,this.AnalysysAgent.init(n),e.instances.set(s,this),this.pendingQueue.forEach((e=>e())),this.pendingQueue=[]})).catch((e=>{console.warn("[ArgoLog] SDK 加载失败:",e)}))}catch(e){console.warn("[ArgoLog] Init failed:",e)}return this}};s(n,"instances",new Map);let t=n;export{t as ArgoLog};
1
+ var i=Object.defineProperty,s=(s,t,e)=>((s,t,e)=>t in s?i(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e)(s,"symbol"!=typeof t?t+"":t,e);const t=class i{constructor(){s(this,"sdkPromise",null),s(this,"sdk",null)}static getInstance(){return i.instance||(i.instance=new i),i.instance}async loadSDK(){if(this.sdk)return this.sdk;if(this.sdkPromise)return this.sdkPromise;if("undefined"==typeof window)return console.warn("[ArgoLog] 仅支持浏览器环境"),null;const i=window;return i.__argoLogSDKPromise?(this.sdkPromise=i.__argoLogSDKPromise,this.sdk=await this.sdkPromise,this.sdk):(this.sdkPromise=this.createSDKPromise(),i.__argoLogSDKPromise=this.sdkPromise,this.sdk=await this.sdkPromise,this.sdk)}async createSDKPromise(){try{return(await import("ans-javascript-sdk")).default}catch(i){return console.warn("[ArgoLog] SDK 加载失败,使用 mock 实现:",i),this.createMockSDK()}}createMockSDK(){return{init:i=>{console.log("[ArgoLog Mock] SDK 初始化:",i)},track:(i,s)=>{console.log("[ArgoLog Mock] 追踪事件:",i,s)},profileSet:i=>{console.log("[ArgoLog Mock] 设置用户画像:",i)},alias:i=>{console.log("[ArgoLog Mock] 设置用户别名:",i)}}}getSDK(){return this.sdk}isLoaded(){return null!==this.sdk}};s(t,"instance");const e=t.getInstance(),n=class i{constructor(t){s(this,"AnalysysAgent",null),s(this,"pendingQueue",[]),s(this,"isInitialized",!1),s(this,"isInitializing",!1),s(this,"track",(i,s)=>{const t=()=>{i?this.AnalysysAgent&&this.AnalysysAgent.track(i,s):console.warn("[ArgoLog] track: name is required")};if(this.isInitialized)try{t()}catch(i){console.warn("[ArgoLog] track failed:",i)}else this.pendingQueue.push(t)}),s(this,"setProfile",i=>{const s=()=>{i?this.AnalysysAgent&&this.AnalysysAgent.profileSet(i):console.warn("[ArgoLog] setProfile: info is required")};if(this.isInitialized)try{s()}catch(i){console.warn("[ArgoLog] setProfile failed:",i)}else this.pendingQueue.push(s)}),s(this,"setAlias",i=>{const s=()=>{i?this.AnalysysAgent&&this.AnalysysAgent.alias(i):console.warn("[ArgoLog] setAlias: code is required")};if(this.isInitialized)try{s()}catch(i){console.warn("[ArgoLog] setAlias failed:",i)}else this.pendingQueue.push(s)});try{if("undefined"==typeof window)return console.warn("[ArgoLog] 仅支持浏览器环境"),this;const s=JSON.stringify(t),e=i.instances.get(s);if(e)return e;if(!t)return console.error("[ArgoLog] envConfig is required"),this;this.initializeSDK(t,s)}catch(i){console.warn("[ArgoLog] Init failed:",i)}return this}async initializeSDK(s,t){if(!this.isInitializing&&!this.isInitialized){this.isInitializing=!0;try{const n=await e.loadSDK();n?(this.AnalysysAgent=n,n.init(s),this.isInitialized=!0,i.instances.set(t,this),this.processPendingQueue()):console.warn("[ArgoLog] SDK 加载失败")}catch(i){console.warn("[ArgoLog] SDK 初始化失败:",i)}finally{this.isInitializing=!1}}}processPendingQueue(){this.pendingQueue.forEach(i=>i()),this.pendingQueue=[]}get initialized(){return this.isInitialized}async waitForInitialization(){if(this.isInitialized)return!0;const i=Date.now();for(;!this.isInitialized&&Date.now()-i<5e3;)await new Promise(i=>setTimeout(i,100));return this.isInitialized}};s(n,"instances",new Map);let o=n;export{o as ArgoLog};
2
2
  //# sourceMappingURL=argo-log.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"argo-log.mjs","sources":["../../../../packages/utils/src/argo-log.ts"],"sourcesContent":["// 定义配置项的类型别名\nexport interface EnvironmentConfig {\n encryptType?: number\n debugMode?: number\n appkey: string\n uploadURL: string\n autoProfile?: boolean\n autoTrack?: boolean\n}\n\n/**\n * ArgoLog 类 - 用于处理埋点统计的工具类\n *\n * @class ArgoLog\n * @description 基于 AnalysysAgent SDK 封装的埋点工具类,提供了埋点追踪、用户画像设置和用户别名设置等功能\n * @example\n * ```typescript\n * const argoLog = new ArgoLog({\n * appkey: 'your-app-key',\n * uploadURL: 'your-upload-url'\n * });\n *\n * // 追踪事件\n * argoLog.track('event_name', { key: 'value' });\n * ```\n */\nexport class ArgoLog<T = EnvironmentConfig> {\n private static instances = new Map<string, ArgoLog<any>>()\n private AnalysysAgent: any | null = null\n private pendingQueue: Array<() => void> = []\n\n constructor(envConfig: T) {\n try {\n if (typeof window === 'undefined') {\n console.warn('[ArgoLog] 仅支持浏览器环境')\n return this\n }\n\n const configKey = JSON.stringify(envConfig)\n const existingInstance = ArgoLog.instances.get(configKey)\n if (existingInstance) {\n return existingInstance\n }\n\n if (!envConfig) {\n console.error('envConfig is required')\n return this\n }\n\n import('ans-javascript-sdk').then((module) => {\n this.AnalysysAgent = module.default\n this.AnalysysAgent.init(envConfig)\n ArgoLog.instances.set(configKey, this)\n // SDK 初始化完成后,重放所有暂存的调用\n this.pendingQueue.forEach(fn => fn())\n this.pendingQueue = []\n }).catch((error) => {\n console.warn('[ArgoLog] SDK 加载失败:', error)\n })\n }\n catch (error) {\n console.warn('[ArgoLog] Init failed:', error)\n }\n return this\n }\n\n track = (name: string, opt?: Record<string, any>): void => {\n const exec = () => {\n if (!name) {\n console.warn('[ArgoLog] track: name is required')\n return\n }\n this.AnalysysAgent.track(name, opt)\n }\n if (!this.AnalysysAgent) {\n // SDK 未初始化,暂存调用\n this.pendingQueue.push(exec)\n console.info('[ArgoLog] track: SDK 未初始化,调用已暂存')\n return\n }\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] track failed:', error)\n }\n }\n\n setProfile = (info: Record<string, any>): void => {\n const exec = () => {\n if (!info) {\n console.warn('[ArgoLog] setProfile: info is required')\n return\n }\n this.AnalysysAgent.profileSet(info)\n }\n if (!this.AnalysysAgent) {\n this.pendingQueue.push(exec)\n console.info('[ArgoLog] setProfile: SDK 未初始化,调用已暂存')\n return\n }\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] setProfile failed:', error)\n }\n }\n\n setAlias = (code: string): void => {\n const exec = () => {\n if (!code) {\n console.warn('[ArgoLog] setAlias: code is required')\n return\n }\n this.AnalysysAgent.alias(code)\n }\n if (!this.AnalysysAgent) {\n this.pendingQueue.push(exec)\n console.info('[ArgoLog] setAlias: SDK 未初始化,调用已暂存')\n return\n }\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] setAlias failed:', error)\n }\n }\n}\n"],"names":["_ArgoLog","constructor","envConfig","__publicField","this","name","opt","exec","AnalysysAgent","track","console","warn","pendingQueue","push","info","error","profileSet","code","alias","window","configKey","JSON","stringify","existingInstance","instances","get","import","then","module","default","init","set","forEach","fn","catch","Map","ArgoLog"],"mappings":"0JA0BO,MAAMA,EAAN,MAAMA,EAKXC,WAAAA,CAAYC,GAHZC,EAAAC,KAAQ,gBAA4B,MACpCD,EAAAC,KAAQ,eAAkC,IAqClCD,EAAAC,KAAA,SAAA,CAACC,EAAcC,KACrB,MAAMC,EAAOA,KACNF,EAIAD,KAAAI,cAAcC,MAAMJ,EAAMC,GAH7BI,QAAQC,KAAK,oCAGmB,EAEhC,IAACP,KAAKI,cAIR,OAFKJ,KAAAQ,aAAaC,KAAKN,QACvBG,QAAQI,KAAK,mCAGX,IACGP,UAEAQ,GACGL,QAAAC,KAAK,0BAA2BI,EAC1C,KAGFZ,EAAAC,KAAA,cAAcU,IACZ,MAAMP,EAAOA,KACNO,EAIAV,KAAAI,cAAcQ,WAAWF,GAH5BJ,QAAQC,KAAK,yCAGmB,EAEhC,IAACP,KAAKI,cAGR,OAFKJ,KAAAQ,aAAaC,KAAKN,QACvBG,QAAQI,KAAK,wCAGX,IACGP,UAEAQ,GACGL,QAAAC,KAAK,+BAAgCI,EAC/C,KAGFZ,EAAAC,KAAA,YAAYa,IACV,MAAMV,EAAOA,KACNU,EAIAb,KAAAI,cAAcU,MAAMD,GAHvBP,QAAQC,KAAK,uCAGc,EAE3B,IAACP,KAAKI,cAGR,OAFKJ,KAAAQ,aAAaC,KAAKN,QACvBG,QAAQI,KAAK,sCAGX,IACGP,UAEAQ,GACGL,QAAAC,KAAK,6BAA8BI,EAC7C,KA/FI,IACE,GAAkB,oBAAXI,OAEF,OADPT,QAAQC,KAAK,sBACNP,KAGH,MAAAgB,EAAYC,KAAKC,UAAUpB,GAC3BqB,EAAmBvB,EAAQwB,UAAUC,IAAIL,GAC/C,GAAIG,EACK,OAAAA,EAGT,IAAKrB,EAEI,OADPQ,QAAQK,MAAM,yBACPX,KAGTsB,OAAO,sBAAsBC,MAAMC,IACjCxB,KAAKI,cAAgBoB,EAAOC,QACvBzB,KAAAI,cAAcsB,KAAK5B,GAChBF,EAAAwB,UAAUO,IAAIX,EAAWhB,MAEjCA,KAAKQ,aAAaoB,SAAcC,GAAAA,MAChC7B,KAAKQ,aAAe,EAAC,IACpBsB,OAAOnB,IACAL,QAAAC,KAAK,sBAAuBI,EAAK,UAGtCA,GACGL,QAAAC,KAAK,yBAA0BI,EACzC,CACO,OAAAX,IACT,GArCAD,EADWH,EACI,YAAY,IAAImC,KAD1B,IAAMC,EAANpC"}
1
+ {"version":3,"file":"argo-log.mjs","sources":["../../../../packages/utils/src/argo-log.ts"],"sourcesContent":["// SDK 配置接口\nexport interface AnalysysConfig {\n encryptType?: number\n debugMode?: number\n appkey: string\n uploadURL: string\n autoProfile?: boolean\n autoTrack?: boolean\n}\n\n// SDK 实例接口\nexport interface AnalysysAgentInterface {\n init: (config: AnalysysConfig) => void\n track: (eventName: string, properties?: Record<string, any>) => void\n profileSet: (properties: Record<string, any>) => void\n alias: (aliasId: string) => void\n}\n\n// 全局窗口类型扩展\ndeclare global {\n interface Window {\n __argoLogSDKPromise?: Promise<AnalysysAgentInterface | null>\n }\n}\n\n// 定义配置项的类型别名,保持向后兼容\nexport interface EnvironmentConfig extends AnalysysConfig {}\n\n/**\n * SDK 加载器 - 统一管理 SDK 的加载和初始化\n */\nclass SDKLoader {\n private static instance: SDKLoader\n private sdkPromise: Promise<AnalysysAgentInterface | null> | null = null\n private sdk: AnalysysAgentInterface | null = null\n\n private constructor() {}\n\n static getInstance(): SDKLoader {\n if (!SDKLoader.instance) {\n SDKLoader.instance = new SDKLoader()\n }\n return SDKLoader.instance\n }\n\n /**\n * 加载 SDK\n */\n async loadSDK(): Promise<AnalysysAgentInterface | null> {\n // 如果已经加载过,直接返回\n if (this.sdk) {\n return this.sdk\n }\n\n // 如果正在加载,等待加载完成\n if (this.sdkPromise) {\n return this.sdkPromise\n }\n\n // 检查浏览器环境\n if (typeof window === 'undefined') {\n console.warn('[ArgoLog] 仅支持浏览器环境')\n return null\n }\n\n // 检查是否已有全局 Promise\n const windowAny = window as any\n if (windowAny.__argoLogSDKPromise) {\n this.sdkPromise = windowAny.__argoLogSDKPromise\n this.sdk = await this.sdkPromise\n return this.sdk\n }\n\n // 创建新的加载 Promise\n this.sdkPromise = this.createSDKPromise()\n windowAny.__argoLogSDKPromise = this.sdkPromise\n\n this.sdk = await this.sdkPromise\n return this.sdk\n }\n\n /**\n * 创建 SDK 加载 Promise\n */\n private async createSDKPromise(): Promise<AnalysysAgentInterface | null> {\n try {\n // 尝试动态导入\n const module = await import('ans-javascript-sdk')\n return module.default as AnalysysAgentInterface\n }\n catch (error) {\n // 在 docs 环境中,可能无法加载 SDK,提供一个 mock 实现\n console.warn('[ArgoLog] SDK 加载失败,使用 mock 实现:', error)\n return this.createMockSDK()\n }\n }\n\n /**\n * 创建 Mock SDK - 用于开发和文档环境\n */\n private createMockSDK(): AnalysysAgentInterface {\n return {\n init: (config) => {\n console.log('[ArgoLog Mock] SDK 初始化:', config)\n },\n track: (eventName, properties) => {\n console.log('[ArgoLog Mock] 追踪事件:', eventName, properties)\n },\n profileSet: (properties) => {\n console.log('[ArgoLog Mock] 设置用户画像:', properties)\n },\n alias: (aliasId) => {\n console.log('[ArgoLog Mock] 设置用户别名:', aliasId)\n },\n }\n }\n\n /**\n * 获取已加载的 SDK\n */\n getSDK(): AnalysysAgentInterface | null {\n return this.sdk\n }\n\n /**\n * 检查 SDK 是否已加载\n */\n isLoaded(): boolean {\n return this.sdk !== null\n }\n}\n\n// SDK 加载器单例\nconst sdkLoader = SDKLoader.getInstance()\n\n/**\n * ArgoLog 类 - 用于处理埋点统计的工具类\n *\n * @class ArgoLog\n * @description 基于 AnalysysAgent SDK 封装的埋点工具类,提供了埋点追踪、用户画像设置和用户别名设置等功能\n * @example\n * ```typescript\n * const argoLog = new ArgoLog({\n * appkey: 'your-app-key',\n * uploadURL: 'your-upload-url'\n * });\n *\n * // 追踪事件\n * argoLog.track('event_name', { key: 'value' });\n * ```\n */\nexport class ArgoLog<T extends EnvironmentConfig = EnvironmentConfig> {\n private static instances = new Map<string, ArgoLog<any>>()\n private AnalysysAgent: AnalysysAgentInterface | null = null\n private pendingQueue: Array<() => void> = []\n private isInitialized = false\n private isInitializing = false\n\n constructor(envConfig: T) {\n try {\n if (typeof window === 'undefined') {\n console.warn('[ArgoLog] 仅支持浏览器环境')\n return this\n }\n\n const configKey = JSON.stringify(envConfig)\n const existingInstance = ArgoLog.instances.get(configKey)\n if (existingInstance) {\n return existingInstance\n }\n\n if (!envConfig) {\n console.error('[ArgoLog] envConfig is required')\n return this\n }\n\n this.initializeSDK(envConfig, configKey)\n }\n catch (error) {\n console.warn('[ArgoLog] Init failed:', error)\n }\n return this\n }\n\n private async initializeSDK(envConfig: T, configKey: string) {\n if (this.isInitializing || this.isInitialized) {\n return\n }\n\n this.isInitializing = true\n\n try {\n // 使用 SDK 加载器加载 SDK\n const sdk = await sdkLoader.loadSDK()\n\n if (sdk) {\n this.AnalysysAgent = sdk\n sdk.init(envConfig)\n this.isInitialized = true\n ArgoLog.instances.set(configKey, this)\n this.processPendingQueue()\n }\n else {\n console.warn('[ArgoLog] SDK 加载失败')\n }\n }\n catch (error) {\n console.warn('[ArgoLog] SDK 初始化失败:', error)\n }\n finally {\n this.isInitializing = false\n }\n }\n\n private processPendingQueue() {\n // SDK 初始化完成后,重放所有暂存的调用\n this.pendingQueue.forEach(fn => fn())\n this.pendingQueue = []\n }\n\n track = (name: string, opt?: Record<string, any>): void => {\n const exec = () => {\n if (!name) {\n console.warn('[ArgoLog] track: name is required')\n return\n }\n if (this.AnalysysAgent) {\n this.AnalysysAgent.track(name, opt)\n }\n }\n\n if (!this.isInitialized) {\n // SDK 未初始化,暂存调用\n this.pendingQueue.push(exec)\n // 静默处理,不显示暂存信息,避免用户困惑\n return\n }\n\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] track failed:', error)\n }\n }\n\n setProfile = (info: Record<string, any>): void => {\n const exec = () => {\n if (!info) {\n console.warn('[ArgoLog] setProfile: info is required')\n return\n }\n if (this.AnalysysAgent) {\n this.AnalysysAgent.profileSet(info)\n }\n }\n\n if (!this.isInitialized) {\n this.pendingQueue.push(exec)\n // 静默处理,不显示暂存信息\n return\n }\n\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] setProfile failed:', error)\n }\n }\n\n setAlias = (code: string): void => {\n const exec = () => {\n if (!code) {\n console.warn('[ArgoLog] setAlias: code is required')\n return\n }\n if (this.AnalysysAgent) {\n this.AnalysysAgent.alias(code)\n }\n }\n\n if (!this.isInitialized) {\n this.pendingQueue.push(exec)\n // 静默处理,不显示暂存信息\n return\n }\n\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] setAlias failed:', error)\n }\n }\n\n /**\n * 获取 SDK 初始化状态\n */\n get initialized(): boolean {\n return this.isInitialized\n }\n\n /**\n * 等待 SDK 初始化完成\n */\n async waitForInitialization(): Promise<boolean> {\n if (this.isInitialized) {\n return true\n }\n\n // 等待最多 5 秒\n const timeout = 5000\n const startTime = Date.now()\n\n while (!this.isInitialized && (Date.now() - startTime) < timeout) {\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n return this.isInitialized\n }\n}\n"],"names":["_SDKLoader","constructor","__publicField","this","getInstance","instance","loadSDK","sdk","sdkPromise","window","console","warn","windowAny","__argoLogSDKPromise","createSDKPromise","import","default","error","createMockSDK","init","config","log","track","eventName","properties","profileSet","alias","aliasId","getSDK","isLoaded","sdkLoader","_ArgoLog","envConfig","name","opt","exec","AnalysysAgent","isInitialized","pendingQueue","push","info","code","configKey","JSON","stringify","existingInstance","instances","get","initializeSDK","isInitializing","set","processPendingQueue","forEach","fn","initialized","waitForInitialization","startTime","Date","now","Promise","resolve","setTimeout","Map","ArgoLog"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"date-transfer.mjs","sources":["../../../../packages/utils/src/date-transfer.ts"],"sourcesContent":["/**\n * 智能格式化毫秒时间\n * @param ms 毫秒数\n * @returns 格式化后的时间字符串\n *\n * 规则:\n * 1. 小于1小时:显示 MM:SS\n * 2. 小于24小时:显示 HH:MM:SS\n * 3. 大于等于24小时:显示 x天x小时x分钟\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000)\n const minutes = Math.floor(seconds / 60)\n const hours = Math.floor(minutes / 60)\n const days = Math.floor(hours / 24)\n\n const pad = (num: number) => num.toString().padStart(2, '0')\n\n // 如果时间小于1小时,返回 MM:SS\n if (hours < 1) {\n const mm = pad(minutes % 60)\n const ss = pad(seconds % 60)\n return `${mm}:${ss}`\n }\n\n // 如果时间小于24小时,返回 HH:MM:SS\n if (days < 1) {\n const hh = pad(hours)\n const mm = pad(minutes % 60)\n const ss = pad(seconds % 60)\n return `${hh}:${mm}:${ss}`\n }\n\n // 如果时间大于等于24小时,返回 x天x小时x分钟\n const remainingHours = hours % 24\n const remainingMinutes = minutes % 60\n\n const parts: string[] = []\n if (days > 0) {\n parts.push(`${days}天`)\n }\n if (remainingHours > 0) {\n parts.push(`${remainingHours}小时`)\n }\n if (remainingMinutes > 0) {\n parts.push(`${remainingMinutes}分钟`)\n }\n\n return parts.join('')\n}\n"],"names":["formatDuration","ms","seconds","Math","floor","minutes","hours","days","pad","num","toString","padStart","remainingHours","remainingMinutes","parts","push","join"],"mappings":"AAUO,SAASA,EAAeC,GAC7B,MAAMC,EAAUC,KAAKC,MAAMH,EAAK,KAC1BI,EAAUF,KAAKC,MAAMF,EAAU,IAC/BI,EAAQH,KAAKC,MAAMC,EAAU,IAC7BE,EAAOJ,KAAKC,MAAME,EAAQ,IAE1BE,EAAOC,GAAgBA,EAAIC,WAAWC,SAAS,EAAG,KAGxD,GAAIL,EAAQ,EAAG,CAGN,MAAA,GAFIE,EAAIH,EAAU,OACdG,EAAIN,EAAU,KAE3B,CAGA,GAAIK,EAAO,EAAG,CAIZ,MAAO,GAHIC,EAAIF,MACJE,EAAIH,EAAU,OACdG,EAAIN,EAAU,KAE3B,CAGA,MAAMU,EAAiBN,EAAQ,GACzBO,EAAmBR,EAAU,GAE7BS,EAAkB,GAWjB,OAVHP,EAAO,GACHO,EAAAC,KAAK,GAAGR,MAEZK,EAAiB,GACbE,EAAAC,KAAK,GAAGH,OAEZC,EAAmB,GACfC,EAAAC,KAAK,GAAGF,OAGTC,EAAME,KAAK,GACpB"}
1
+ {"version":3,"file":"date-transfer.mjs","sources":["../../../../packages/utils/src/date-transfer.ts"],"sourcesContent":["/**\n * 智能格式化毫秒时间\n * @param ms 毫秒数\n * @returns 格式化后的时间字符串\n *\n * 规则:\n * 1. 小于1小时:显示 MM:SS\n * 2. 小于24小时:显示 HH:MM:SS\n * 3. 大于等于24小时:显示 x天x小时x分钟\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000)\n const minutes = Math.floor(seconds / 60)\n const hours = Math.floor(minutes / 60)\n const days = Math.floor(hours / 24)\n\n const pad = (num: number) => num.toString().padStart(2, '0')\n\n // 如果时间小于1小时,返回 MM:SS\n if (hours < 1) {\n const mm = pad(minutes % 60)\n const ss = pad(seconds % 60)\n return `${mm}:${ss}`\n }\n\n // 如果时间小于24小时,返回 HH:MM:SS\n if (days < 1) {\n const hh = pad(hours)\n const mm = pad(minutes % 60)\n const ss = pad(seconds % 60)\n return `${hh}:${mm}:${ss}`\n }\n\n // 如果时间大于等于24小时,返回 x天x小时x分钟\n const remainingHours = hours % 24\n const remainingMinutes = minutes % 60\n\n const parts: string[] = []\n if (days > 0) {\n parts.push(`${days}天`)\n }\n if (remainingHours > 0) {\n parts.push(`${remainingHours}小时`)\n }\n if (remainingMinutes > 0) {\n parts.push(`${remainingMinutes}分钟`)\n }\n\n return parts.join('')\n}\n"],"names":["formatDuration","ms","seconds","Math","floor","minutes","hours","days","pad","num","toString","padStart","remainingHours","remainingMinutes","parts","push","join"],"mappings":"AAUO,SAASA,EAAeC,GAC7B,MAAMC,EAAUC,KAAKC,MAAMH,EAAK,KAC1BI,EAAUF,KAAKC,MAAMF,EAAU,IAC/BI,EAAQH,KAAKC,MAAMC,EAAU,IAC7BE,EAAOJ,KAAKC,MAAME,EAAQ,IAE1BE,EAAOC,GAAgBA,EAAIC,WAAWC,SAAS,EAAG,KAGxD,GAAIL,EAAQ,EAAG,CAGb,MAAO,GAFIE,EAAIH,EAAU,OACdG,EAAIN,EAAU,KAE3B,CAGA,GAAIK,EAAO,EAAG,CAIZ,MAAO,GAHIC,EAAIF,MACJE,EAAIH,EAAU,OACdG,EAAIN,EAAU,KAE3B,CAGA,MAAMU,EAAiBN,EAAQ,GACzBO,EAAmBR,EAAU,GAE7BS,EAAkB,GAWxB,OAVIP,EAAO,GACTO,EAAMC,KAAK,GAAGR,MAEZK,EAAiB,GACnBE,EAAMC,KAAK,GAAGH,OAEZC,EAAmB,GACrBC,EAAMC,KAAK,GAAGF,OAGTC,EAAME,KAAK,GACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"device.mjs","sources":["../../../../packages/utils/src/device.ts"],"sourcesContent":["/**\n * 获取设备类型\n * @returns {string} 设备类型: \"iOS\", \"Android\" 或 \"desktop\"\n */\nexport function getDeviceType() {\n const userAgent = navigator.userAgent\n\n if (/iPhone|iPad|iPod|iOS/i.test(userAgent)) {\n return 'iOS'\n }\n else if (/Android/i.test(userAgent)) {\n return 'Android'\n }\n else {\n return 'desktop'\n }\n}\n\n/**\n * 判断是否是移动端\n */\nexport function isMobile() {\n const deviceType = getDeviceType()\n return deviceType === 'iOS' || deviceType === 'Android'\n}\n\n/**\n * 判断是否是ios\n */\nexport function isIOS() {\n return /iPhone|iPad|iPod|iOS/i.test(navigator.userAgent)\n}\n\n/**\n * 判断是否是安卓\n */\nexport function isAndroid() {\n return /Android/i.test(navigator.userAgent)\n}\n"],"names":["getDeviceType","userAgent","navigator","test","isMobile","deviceType","isIOS","isAndroid"],"mappings":"AAIO,SAASA,IACd,MAAMC,EAAYC,UAAUD,UAExB,MAAA,wBAAwBE,KAAKF,GACxB,MAEA,WAAWE,KAAKF,GAChB,UAGA,SAEX,CAKO,SAASG,IACd,MAAMC,EAAaL,IACZ,MAAe,QAAfK,GAAuC,YAAfA,CACjC,CAKO,SAASC,IACP,MAAA,wBAAwBH,KAAKD,UAAUD,UAChD,CAKO,SAASM,IACP,MAAA,WAAWJ,KAAKD,UAAUD,UACnC"}
1
+ {"version":3,"file":"device.mjs","sources":["../../../../packages/utils/src/device.ts"],"sourcesContent":["/**\n * 获取设备类型\n * @returns {string} 设备类型: \"iOS\", \"Android\" 或 \"desktop\"\n */\nexport function getDeviceType() {\n const userAgent = navigator.userAgent\n\n if (/iPhone|iPad|iPod|iOS/i.test(userAgent)) {\n return 'iOS'\n }\n else if (/Android/i.test(userAgent)) {\n return 'Android'\n }\n else {\n return 'desktop'\n }\n}\n\n/**\n * 判断是否是移动端\n */\nexport function isMobile() {\n const deviceType = getDeviceType()\n return deviceType === 'iOS' || deviceType === 'Android'\n}\n\n/**\n * 判断是否是ios\n */\nexport function isIOS() {\n return /iPhone|iPad|iPod|iOS/i.test(navigator.userAgent)\n}\n\n/**\n * 判断是否是安卓\n */\nexport function isAndroid() {\n return /Android/i.test(navigator.userAgent)\n}\n"],"names":["getDeviceType","userAgent","navigator","test","isMobile","deviceType","isIOS","isAndroid"],"mappings":"AAIO,SAASA,IACd,MAAMC,EAAYC,UAAUD,UAE5B,MAAI,wBAAwBE,KAAKF,GACxB,MAEA,WAAWE,KAAKF,GAChB,UAGA,SAEX,CAKO,SAASG,IACd,MAAMC,EAAaL,IACnB,MAAsB,QAAfK,GAAuC,YAAfA,CACjC,CAKO,SAASC,IACd,MAAO,wBAAwBH,KAAKD,UAAUD,UAChD,CAKO,SAASM,IACd,MAAO,WAAWJ,KAAKD,UAAUD,UACnC"}
@@ -1,2 +1,2 @@
1
- async function o(o){return new Promise(((n,e)=>{try{const r=document.createElement("script");r.src=o,r.onload=()=>{n()},r.onerror=()=>{e(new Error(`Failed to load script from ${o}`))},document.head.appendChild(r)}catch(o){console.error("loadScript error:",o),e(o)}}))}async function n(n){if("undefined"==typeof window)throw new TypeError("VideoUploader 只能在浏览器环境中使用");window.AliyunUpload||await async function(){try{if(await o("https://gosspublic.alicdn.com/aliyun-oss-sdk.min.js"),await o("https://cdnfile.yaomaitong.cn/cdn/js/aliyun-upload-sdk1.3.1.min.js"),!window.AliyunUpload)throw new Error("SDK 加载成功但未找到 AliyunUpload 对象")}catch(o){throw console.error("无法加载阿里云上传SDK:",o),o}}();let e=null,r=null;const d=new window.AliyunUpload.Vod({onUploadProgress:n.onUploadProgress,onUploadTokenExpired:n.onUploadTokenExpired||(()=>{}),onUploadstarted:async o=>{try{const{uploadAuth:e,uploadAddress:r,videoId:a}=await(n.onUploadstarted?.(o))||{};e&&r&&a&&d.setUploadAuthAndAddress(o,e,r,a)}catch(o){throw console.error("onUploadstarted error: ",o),o}},onUploadSucceed:o=>{e?.(o)},onUploadFailed:(o,n,e)=>{console.log("info: ",o),r?.(new Error(`${e} ${n}`))}});return{uploader:d,upload:async o=>new Promise(((n,a)=>{e=n,r=a;const l=JSON.stringify({Vod:{UserData:{IsShowWaterMark:"false",Priority:"7"}}});d.addFile(o,null,null,null,l),d.startUpload()}))}}function e(o,n){const e=document.createElement("a");e.download=n,e.style.display="none",e.href=o,document.body.appendChild(e),e.click(),document.body.removeChild(e)}export{n as createVideoUploader,e as downloadFile};
1
+ async function o(o){return new Promise((n,e)=>{try{const r=document.createElement("script");r.src=o,r.onload=()=>{n()},r.onerror=()=>{e(new Error(`Failed to load script from ${o}`))},document.head.appendChild(r)}catch(o){console.error("loadScript error:",o),e(o)}})}async function n(n){if("undefined"==typeof window)throw new TypeError("VideoUploader 只能在浏览器环境中使用");window.AliyunUpload||await async function(){try{if(await o("https://gosspublic.alicdn.com/aliyun-oss-sdk.min.js"),await o("https://cdnfile.yaomaitong.cn/cdn/js/aliyun-upload-sdk1.3.1.min.js"),!window.AliyunUpload)throw new Error("SDK 加载成功但未找到 AliyunUpload 对象")}catch(o){throw console.error("无法加载阿里云上传SDK:",o),o}}();let e=null,r=null;const d=new window.AliyunUpload.Vod({onUploadProgress:n.onUploadProgress,onUploadTokenExpired:n.onUploadTokenExpired||(()=>{}),onUploadstarted:async o=>{try{const{uploadAuth:e,uploadAddress:r,videoId:a}=await(n.onUploadstarted?.(o))||{};e&&r&&a&&d.setUploadAuthAndAddress(o,e,r,a)}catch(o){throw console.error("onUploadstarted error: ",o),o}},onUploadSucceed:o=>{e?.(o)},onUploadFailed:(o,n,e)=>{console.log("info: ",o),r?.(new Error(`${e} ${n}`))}});return{uploader:d,upload:async o=>new Promise((n,a)=>{e=n,r=a;const l=JSON.stringify({Vod:{UserData:{IsShowWaterMark:"false",Priority:"7"}}});d.addFile(o,null,null,null,l),d.startUpload()})}}function e(o,n){const e=document.createElement("a");e.download=n,e.style.display="none",e.href=o,document.body.appendChild(e),e.click(),document.body.removeChild(e)}export{n as createVideoUploader,e as downloadFile};
2
2
  //# sourceMappingURL=file-operations.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-operations.mjs","sources":["../../../../packages/utils/src/file-operations.ts"],"sourcesContent":["declare global {\n interface Window {\n AliyunUpload: any\n OSS: any\n }\n}\n\nasync function loadScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n const script = document.createElement('script')\n script.src = src\n script.onload = () => {\n resolve()\n }\n script.onerror = () => {\n reject(new Error(`Failed to load script from ${src}`))\n }\n document.head.appendChild(script)\n }\n catch (error) {\n console.error('loadScript error:', error)\n reject(error)\n }\n })\n}\nasync function initAliyunSDK() {\n try {\n await loadScript('https://gosspublic.alicdn.com/aliyun-oss-sdk.min.js')\n await loadScript('https://cdnfile.yaomaitong.cn/cdn/js/aliyun-upload-sdk1.3.1.min.js')\n\n if (!window.AliyunUpload) {\n throw new Error('SDK 加载成功但未找到 AliyunUpload 对象')\n }\n }\n catch (error) {\n console.error('无法加载阿里云上传SDK:', error)\n throw error\n }\n}\n\nexport interface UploadInfo {\n file: File\n videoId?: string\n}\n\ninterface VideoUploadOptions {\n onUploadFailed?: (uploadInfo: any, code: string, message: string) => void\n onUploadSucceed?: (uploadInfo: any) => void\n onUploadProgress?: (uploadInfo: UploadInfo, totalSize: number, percent: number) => void\n onUploadTokenExpired?: (response: any) => void\n onUploadstarted?: (uploadInfo: UploadInfo) => Promise<{ uploadAuth: string, uploadAddress: string, videoId: string }>\n}\n\ninterface VideoUploadResult {\n videoId: string\n uploadInfo: any\n}\nexport interface IVideoUploader {\n uploader: any\n upload: (file: File) => Promise<VideoUploadResult>\n}\n\n/**\n * 创建阿里云视频上传器实例\n * @param options - 上传配置选项,包含各种回调函数\n * @returns 返回一个包含上传器实例和上传方法的对象\n */\nexport async function createVideoUploader(options: VideoUploadOptions): Promise<IVideoUploader> {\n // 检查是否在浏览器环境中运行\n if (typeof window === 'undefined') {\n throw new TypeError('VideoUploader 只能在浏览器环境中使用')\n }\n\n // 如果阿里云SDK未加载,则初始化SDK\n if (!window.AliyunUpload) {\n await initAliyunSDK()\n }\n\n // 声明Promise的resolve和reject函数,用于控制上传过程\n let currentResolve: ((value: VideoUploadResult) => void) | null = null\n let currentReject: ((reason: any) => void) | null = null\n\n // 创建阿里云上传实例\n const uploader = new window.AliyunUpload.Vod({\n // 上传进度回调\n onUploadProgress: options.onUploadProgress,\n // 上传凭证过期回调\n onUploadTokenExpired: options.onUploadTokenExpired || (() => {}),\n // 开始上传回调,用于设置上传凭证和地址\n onUploadstarted: async (uploadInfo: UploadInfo) => {\n try {\n const { uploadAuth, uploadAddress, videoId } = await options.onUploadstarted?.(uploadInfo) || {}\n if (uploadAuth && uploadAddress && videoId) {\n uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress, videoId)\n }\n }\n catch (error) {\n console.error('onUploadstarted error: ', error)\n throw error\n }\n },\n // 上传成功回调\n onUploadSucceed: (uploadInfo: any) => {\n currentResolve?.(uploadInfo)\n },\n // 上传失败回调\n onUploadFailed: (info: any, code: string, message: string) => {\n console.log('info: ', info)\n currentReject?.(new Error(`${message} ${code}`))\n },\n })\n\n /**\n * 上传文件方法\n * @param file - 要上传的文件对象\n * @returns Promise,解析为上传结果\n */\n const upload = async (file: File): Promise<VideoUploadResult> => {\n return new Promise((resolve, reject) => {\n currentResolve = resolve\n currentReject = reject\n\n // 设置上传的用户自定义数据\n const userData = JSON.stringify({\n Vod: {\n UserData: {\n IsShowWaterMark: 'false', // 不显示水印\n Priority: '7', // 上传优先级\n },\n },\n })\n\n // 添加文件到上传队列并开始上传\n uploader.addFile(file, null, null, null, userData)\n uploader.startUpload()\n })\n }\n\n // 返回上传器实例和上传方法\n return {\n uploader,\n upload,\n }\n}\n\n/**\n * 下载文件,创建一个隐藏的链接元素,设置下载属性并触发点击事件,然后移除该链接元素\n * @param url - 文件的URL\n * @param fileName - 文件的名称\n */\nexport function downloadFile(url: string, fileName: string) {\n const link = document.createElement('a')\n link.download = fileName\n link.style.display = 'none'\n link.href = url\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n}\n"],"names":["async","loadScript","src","Promise","resolve","reject","script","document","createElement","onload","onerror","Error","head","appendChild","error","console","createVideoUploader","options","window","TypeError","AliyunUpload","initAliyunSDK","currentResolve","currentReject","uploader","Vod","onUploadProgress","onUploadTokenExpired","onUploadstarted","uploadAuth","uploadAddress","videoId","uploadInfo","setUploadAuthAndAddress","onUploadSucceed","onUploadFailed","info","code","message","log","upload","userData","JSON","stringify","UserData","IsShowWaterMark","Priority","addFile","file","startUpload","downloadFile","url","fileName","link","download","style","display","href","body","click","removeChild"],"mappings":"AAOAA,eAAeC,EAAWC,GACxB,OAAO,IAAIC,SAAQ,CAACC,EAASC,KACvB,IACI,MAAAC,EAASC,SAASC,cAAc,UACtCF,EAAOJ,IAAMA,EACbI,EAAOG,OAAS,KACNL,GAAA,EAEVE,EAAOI,QAAU,KACfL,EAAO,IAAIM,MAAM,8BAA8BT,KAAM,EAE9CK,SAAAK,KAAKC,YAAYP,SAErBQ,GACGC,QAAAD,MAAM,oBAAqBA,GACnCT,EAAOS,EACT,IAEJ,CA2CAd,eAAsBgB,EAAoBC,GAEpC,GAAkB,oBAAXC,OACH,MAAA,IAAIC,UAAU,6BAIjBD,OAAOE,oBAjDdpB,iBACM,IAIE,SAHEC,EAAW,6DACXA,EAAW,uEAEZiB,OAAOE,aACJ,MAAA,IAAIT,MAAM,sCAGbG,GAEC,MADEC,QAAAD,MAAM,gBAAiBA,GACzBA,CACR,CACF,CAqCUO,GAIR,IAAIC,EAA8D,KAC9DC,EAAgD,KAGpD,MAAMC,EAAW,IAAIN,OAAOE,aAAaK,IAAI,CAE3CC,iBAAkBT,EAAQS,iBAE1BC,qBAAsBV,EAAQU,sBAAyB,MAAO,GAE9DC,gBAAiB5B,UACX,IACI,MAAA6B,WAAEA,EAAYC,cAAAA,EAAAC,QAAeA,SAAkBd,EAAQW,kBAAkBI,KAAe,CAAC,EAC3FH,GAAcC,GAAiBC,GACjCP,EAASS,wBAAwBD,EAAYH,EAAYC,EAAeC,SAGrEjB,GAEC,MADEC,QAAAD,MAAM,0BAA2BA,GACnCA,CACR,GAGFoB,gBAAkBF,IAChBV,IAAiBU,EAAU,EAG7BG,eAAgBA,CAACC,EAAWC,EAAcC,KAChCvB,QAAAwB,IAAI,SAAUH,GACtBb,IAAgB,IAAIZ,MAAM,GAAG2B,KAAWD,KAAO,IA+B5C,MAAA,CACLb,WACAgB,OAxBaxC,SACN,IAAIG,SAAQ,CAACC,EAASC,KACViB,EAAAlB,EACDmB,EAAAlB,EAGV,MAAAoC,EAAWC,KAAKC,UAAU,CAC9BlB,IAAK,CACHmB,SAAU,CACRC,gBAAiB,QACjBC,SAAU,QAMhBtB,EAASuB,QAAQC,EAAM,KAAM,KAAM,KAAMP,GACzCjB,EAASyB,aAAY,IAS3B,CAOgB,SAAAC,EAAaC,EAAaC,GAClC,MAAAC,EAAO9C,SAASC,cAAc,KACpC6C,EAAKC,SAAWF,EAChBC,EAAKE,MAAMC,QAAU,OACrBH,EAAKI,KAAON,EACH5C,SAAAmD,KAAK7C,YAAYwC,GAC1BA,EAAKM,QACIpD,SAAAmD,KAAKE,YAAYP,EAC5B"}
1
+ {"version":3,"file":"file-operations.mjs","sources":["../../../../packages/utils/src/file-operations.ts"],"sourcesContent":["declare global {\n interface Window {\n AliyunUpload: any\n OSS: any\n }\n}\n\nasync function loadScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n const script = document.createElement('script')\n script.src = src\n script.onload = () => {\n resolve()\n }\n script.onerror = () => {\n reject(new Error(`Failed to load script from ${src}`))\n }\n document.head.appendChild(script)\n }\n catch (error) {\n console.error('loadScript error:', error)\n reject(error)\n }\n })\n}\nasync function initAliyunSDK() {\n try {\n await loadScript('https://gosspublic.alicdn.com/aliyun-oss-sdk.min.js')\n await loadScript('https://cdnfile.yaomaitong.cn/cdn/js/aliyun-upload-sdk1.3.1.min.js')\n\n if (!window.AliyunUpload) {\n throw new Error('SDK 加载成功但未找到 AliyunUpload 对象')\n }\n }\n catch (error) {\n console.error('无法加载阿里云上传SDK:', error)\n throw error\n }\n}\n\nexport interface UploadInfo {\n file: File\n videoId?: string\n}\n\ninterface VideoUploadOptions {\n onUploadFailed?: (uploadInfo: any, code: string, message: string) => void\n onUploadSucceed?: (uploadInfo: any) => void\n onUploadProgress?: (uploadInfo: UploadInfo, totalSize: number, percent: number) => void\n onUploadTokenExpired?: (response: any) => void\n onUploadstarted?: (uploadInfo: UploadInfo) => Promise<{ uploadAuth: string, uploadAddress: string, videoId: string }>\n}\n\ninterface VideoUploadResult {\n videoId: string\n uploadInfo: any\n}\nexport interface IVideoUploader {\n uploader: any\n upload: (file: File) => Promise<VideoUploadResult>\n}\n\n/**\n * 创建阿里云视频上传器实例\n * @param options - 上传配置选项,包含各种回调函数\n * @returns 返回一个包含上传器实例和上传方法的对象\n */\nexport async function createVideoUploader(options: VideoUploadOptions): Promise<IVideoUploader> {\n // 检查是否在浏览器环境中运行\n if (typeof window === 'undefined') {\n throw new TypeError('VideoUploader 只能在浏览器环境中使用')\n }\n\n // 如果阿里云SDK未加载,则初始化SDK\n if (!window.AliyunUpload) {\n await initAliyunSDK()\n }\n\n // 声明Promise的resolve和reject函数,用于控制上传过程\n let currentResolve: ((value: VideoUploadResult) => void) | null = null\n let currentReject: ((reason: any) => void) | null = null\n\n // 创建阿里云上传实例\n const uploader = new window.AliyunUpload.Vod({\n // 上传进度回调\n onUploadProgress: options.onUploadProgress,\n // 上传凭证过期回调\n onUploadTokenExpired: options.onUploadTokenExpired || (() => {}),\n // 开始上传回调,用于设置上传凭证和地址\n onUploadstarted: async (uploadInfo: UploadInfo) => {\n try {\n const { uploadAuth, uploadAddress, videoId } = await options.onUploadstarted?.(uploadInfo) || {}\n if (uploadAuth && uploadAddress && videoId) {\n uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress, videoId)\n }\n }\n catch (error) {\n console.error('onUploadstarted error: ', error)\n throw error\n }\n },\n // 上传成功回调\n onUploadSucceed: (uploadInfo: any) => {\n currentResolve?.(uploadInfo)\n },\n // 上传失败回调\n onUploadFailed: (info: any, code: string, message: string) => {\n console.log('info: ', info)\n currentReject?.(new Error(`${message} ${code}`))\n },\n })\n\n /**\n * 上传文件方法\n * @param file - 要上传的文件对象\n * @returns Promise,解析为上传结果\n */\n const upload = async (file: File): Promise<VideoUploadResult> => {\n return new Promise((resolve, reject) => {\n currentResolve = resolve\n currentReject = reject\n\n // 设置上传的用户自定义数据\n const userData = JSON.stringify({\n Vod: {\n UserData: {\n IsShowWaterMark: 'false', // 不显示水印\n Priority: '7', // 上传优先级\n },\n },\n })\n\n // 添加文件到上传队列并开始上传\n uploader.addFile(file, null, null, null, userData)\n uploader.startUpload()\n })\n }\n\n // 返回上传器实例和上传方法\n return {\n uploader,\n upload,\n }\n}\n\n/**\n * 下载文件,创建一个隐藏的链接元素,设置下载属性并触发点击事件,然后移除该链接元素\n * @param url - 文件的URL\n * @param fileName - 文件的名称\n */\nexport function downloadFile(url: string, fileName: string) {\n const link = document.createElement('a')\n link.download = fileName\n link.style.display = 'none'\n link.href = url\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n}\n"],"names":["async","loadScript","src","Promise","resolve","reject","script","document","createElement","onload","onerror","Error","head","appendChild","error","console","createVideoUploader","options","window","TypeError","AliyunUpload","initAliyunSDK","currentResolve","currentReject","uploader","Vod","onUploadProgress","onUploadTokenExpired","onUploadstarted","uploadAuth","uploadAddress","videoId","uploadInfo","setUploadAuthAndAddress","onUploadSucceed","onUploadFailed","info","code","message","log","upload","userData","JSON","stringify","UserData","IsShowWaterMark","Priority","addFile","file","startUpload","downloadFile","url","fileName","link","download","style","display","href","body","click","removeChild"],"mappings":"AAOAA,eAAeC,EAAWC,GACxB,OAAO,IAAIC,QAAQ,CAACC,EAASC,KAC3B,IACE,MAAMC,EAASC,SAASC,cAAc,UACtCF,EAAOJ,IAAMA,EACbI,EAAOG,OAAS,KACdL,KAEFE,EAAOI,QAAU,KACfL,EAAO,IAAIM,MAAM,8BAA8BT,OAEjDK,SAASK,KAAKC,YAAYP,EAC5B,OACOQ,GACLC,QAAQD,MAAM,oBAAqBA,GACnCT,EAAOS,EACT,GAEJ,CA2CAd,eAAsBgB,EAAoBC,GAExC,GAAsB,oBAAXC,OACT,MAAM,IAAIC,UAAU,6BAIjBD,OAAOE,oBAjDdpB,iBACE,IAIE,SAHMC,EAAW,6DACXA,EAAW,uEAEZiB,OAAOE,aACV,MAAM,IAAIT,MAAM,+BAEpB,OACOG,GAEL,MADAC,QAAQD,MAAM,gBAAiBA,GACzBA,CACR,CACF,CAqCUO,GAIR,IAAIC,EAA8D,KAC9DC,EAAgD,KAGpD,MAAMC,EAAW,IAAIN,OAAOE,aAAaK,IAAI,CAE3CC,iBAAkBT,EAAQS,iBAE1BC,qBAAsBV,EAAQU,sBAAA,MAAgC,GAE9DC,gBAAiB5B,UACf,IACE,MAAM6B,WAAEA,EAAAC,cAAYA,EAAAC,QAAeA,SAAkBd,EAAQW,kBAAkBI,KAAe,CAAA,EAC1FH,GAAcC,GAAiBC,GACjCP,EAASS,wBAAwBD,EAAYH,EAAYC,EAAeC,EAE5E,OACOjB,GAEL,MADAC,QAAQD,MAAM,0BAA2BA,GACnCA,CACR,GAGFoB,gBAAkBF,IAChBV,IAAiBU,IAGnBG,eAAgBA,CAACC,EAAWC,EAAcC,KACxCvB,QAAQwB,IAAI,SAAUH,GACtBb,IAAgB,IAAIZ,MAAM,GAAG2B,KAAWD,SA+B5C,MAAO,CACLb,WACAgB,OAxBaxC,SACN,IAAIG,QAAQ,CAACC,EAASC,KAC3BiB,EAAiBlB,EACjBmB,EAAgBlB,EAGhB,MAAMoC,EAAWC,KAAKC,UAAU,CAC9BlB,IAAK,CACHmB,SAAU,CACRC,gBAAiB,QACjBC,SAAU,QAMhBtB,EAASuB,QAAQC,EAAM,KAAM,KAAM,KAAMP,GACzCjB,EAASyB,gBASf,CAOO,SAASC,EAAaC,EAAaC,GACxC,MAAMC,EAAO9C,SAASC,cAAc,KACpC6C,EAAKC,SAAWF,EAChBC,EAAKE,MAAMC,QAAU,OACrBH,EAAKI,KAAON,EACZ5C,SAASmD,KAAK7C,YAAYwC,GAC1BA,EAAKM,QACLpD,SAASmD,KAAKE,YAAYP,EAC5B"}
package/es/src/json.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{utils as e,writeFile as t,read as o}from"xlsx";function r(){let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0;try{if(!r.length)return;const s=e.aoa_to_sheet(r);n&&(s["!merges"]=n);const c=e.book_new();e.book_append_sheet(c,s,""),t(c,`${o}.xlsx`)}catch(e){return console.log("e: ",e),new Error("数据导出失败")}}function n(t,r,n){return new Promise(((s,c)=>{const a=new FileReader;a.readAsArrayBuffer(t),a.onload=t=>{const c=t.target?.result,a=o(c,{type:"binary"}),h=[];for(const t in a.Sheets)if(Object.prototype.hasOwnProperty.call(a.Sheets,t)){let o=[];const r=a.Sheets[t]["!ref"]||"",s=r.split(":"),c=n+s[1].toString();o=o.concat(e.sheet_to_json(a.Sheets[t],{header:1,range:n?c:r}));const l=o[0];o.shift();const i=o.map((e=>{const t={};return l.forEach(((o,r)=>{t[o]=e[r]})),t}));h.push(...i)}r&&r(h),s(h)},a.onerror=e=>{c(e)}}))}export{r as JsonToExcel,n as excelToJson};
1
+ import{utils as e,writeFile as t,read as o}from"xlsx";function r(){let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0;try{if(!r.length)return;const s=e.aoa_to_sheet(r);n&&(s["!merges"]=n);const c=e.book_new();e.book_append_sheet(c,s,""),t(c,`${o}.xlsx`)}catch(e){return console.log("e: ",e),new Error("数据导出失败")}}function n(t,r,n){return new Promise((s,c)=>{const a=new FileReader;a.readAsArrayBuffer(t),a.onload=t=>{const c=t.target?.result,a=o(c,{type:"binary"}),h=[];for(const t in a.Sheets)if(Object.prototype.hasOwnProperty.call(a.Sheets,t)){let o=[];const r=a.Sheets[t]["!ref"]||"",s=r.split(":"),c=n+s[1].toString();o=o.concat(e.sheet_to_json(a.Sheets[t],{header:1,range:n?c:r}));const l=o[0];o.shift();const i=o.map(e=>{const t={};return l.forEach((o,r)=>{t[o]=e[r]}),t});h.push(...i)}r&&r(h),s(h)},a.onerror=e=>{c(e)}})}export{r as JsonToExcel,n as excelToJson};
2
2
  //# sourceMappingURL=json.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"json.mjs","sources":["../../../../packages/utils/src/json.ts"],"sourcesContent":["import { read, utils, writeFile } from 'xlsx'\n\n/**\n * 将JSON数据导出为Excel文件\n * @param title - Excel文件的标题\n * @param json - JSON数据\n * @param merge - 合并单元格的配置\n * @returns 如果JSON数据为空,则返回undefined,否则返回Excel文件的名称\n */\nexport function JsonToExcel(title = '', json: (string | number)[][] = [], merge?: any) {\n try {\n if (!json.length) {\n return\n }\n // 创建worksheet\n const worksheet = utils.aoa_to_sheet(json)\n if (merge) {\n worksheet['!merges'] = merge\n }\n // 新建空workbook,加入worksheet\n const workbook = utils.book_new()\n utils.book_append_sheet(workbook, worksheet, '')\n writeFile(workbook, `${title}.xlsx`)\n }\n catch (e) {\n console.log('e: ', e)\n return new Error('数据导出失败')\n }\n}\n\n/**\n * 将Excel数据转换为JSON\n * @param file - Excel文件\n * @param cb - 转换完成后的回调函数\n * @param start - 开始行号\n */\nexport function excelToJson(file: File, cb: (json: any[]) => void, start: number): Promise<any[]> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.readAsArrayBuffer(file)\n reader.onload = (e) => {\n const data = e.target?.result\n const workbook = read(data, { type: 'binary' })\n // 遍历每张表读取\n const json: any[] = []\n for (const sheet in workbook.Sheets) {\n if (Object.prototype.hasOwnProperty.call(workbook.Sheets, sheet)) {\n let arr: string[][] = []\n const fromTo = workbook.Sheets[sheet]['!ref'] || ''\n const end = fromTo.split(':')\n const space = start + end[1].toString()\n arr = arr.concat(utils.sheet_to_json(workbook.Sheets[sheet], { header: 1, range: start ? space : fromTo }))\n const titleArr = arr[0]\n arr.shift()\n const excelJsonArr = arr.map((item) => {\n const obj: {\n [key: string]: any\n } = {}\n titleArr.forEach((titleItem: string, index: number) => {\n obj[titleItem] = item[index]\n })\n return obj\n })\n json.push(...excelJsonArr)\n }\n }\n if (cb) {\n cb(json)\n }\n resolve(json)\n }\n reader.onerror = (e) => {\n reject(e)\n }\n })\n}\n"],"names":["JsonToExcel","title","arguments","length","undefined","json","merge","worksheet","utils","aoa_to_sheet","workbook","book_new","book_append_sheet","writeFile","e","console","log","Error","excelToJson","file","cb","start","Promise","resolve","reject","reader","FileReader","readAsArrayBuffer","onload","data","target","result","read","type","sheet","Sheets","Object","prototype","hasOwnProperty","call","arr","fromTo","end","split","space","toString","concat","sheet_to_json","header","range","titleArr","shift","excelJsonArr","map","item","obj","forEach","titleItem","index","push","onerror"],"mappings":"sDASO,SAASA,IAAuE,IAA3DC,EAAQC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAA,GAAIG,EAA8BH,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAA,GAAII,EAAaJ,UAAAC,OAAAD,EAAAA,kBAAAE,EACjF,IACE,IAACC,EAAKF,OACR,OAGI,MAAAI,EAAYC,EAAMC,aAAaJ,GACjCC,IACFC,EAAU,WAAaD,GAGnB,MAAAI,EAAWF,EAAMG,WACjBH,EAAAI,kBAAkBF,EAAUH,EAAW,IACnCM,EAAAH,EAAU,GAAGT,gBAElBa,GAEE,OADCC,QAAAC,IAAI,MAAOF,GACZ,IAAIG,MAAM,SACnB,CACF,CAQgB,SAAAC,EAAYC,EAAYC,EAA2BC,GACjE,OAAO,IAAIC,SAAQ,CAACC,EAASC,KACrB,MAAAC,EAAS,IAAIC,WACnBD,EAAOE,kBAAkBR,GAClBM,EAAAG,OAAUd,IACT,MAAAe,EAAOf,EAAEgB,QAAQC,OACjBrB,EAAWsB,EAAKH,EAAM,CAAEI,KAAM,WAE9B5B,EAAc,GACT,IAAA,MAAA6B,KAASxB,EAASyB,OAC3B,GAAIC,OAAOC,UAAUC,eAAeC,KAAK7B,EAASyB,OAAQD,GAAQ,CAChE,IAAIM,EAAkB,GACtB,MAAMC,EAAS/B,EAASyB,OAAOD,GAAO,SAAW,GAC3CQ,EAAMD,EAAOE,MAAM,KACnBC,EAAQvB,EAAQqB,EAAI,GAAGG,WAC7BL,EAAMA,EAAIM,OAAOtC,EAAMuC,cAAcrC,EAASyB,OAAOD,GAAQ,CAAEc,OAAQ,EAAGC,MAAO5B,EAAQuB,EAAQH,KAC3F,MAAAS,EAAWV,EAAI,GACrBA,EAAIW,QACJ,MAAMC,EAAeZ,EAAIa,KAAKC,IAC5B,MAAMC,EAEF,CAAC,EAIE,OAHEL,EAAAM,SAAQ,CAACC,EAAmBC,KAC/BH,EAAAE,GAAaH,EAAKI,EAAK,IAEtBH,CAAA,IAEJlD,EAAAsD,QAAQP,EACf,CAEEhC,GACFA,EAAGf,GAELkB,EAAQlB,EAAI,EAEPoB,EAAAmC,QAAW9C,IAChBU,EAAOV,EAAC,CACV,GAEJ"}
1
+ {"version":3,"file":"json.mjs","sources":["../../../../packages/utils/src/json.ts"],"sourcesContent":["import { read, utils, writeFile } from 'xlsx'\n\n/**\n * 将JSON数据导出为Excel文件\n * @param title - Excel文件的标题\n * @param json - JSON数据\n * @param merge - 合并单元格的配置\n * @returns 如果JSON数据为空,则返回undefined,否则返回Excel文件的名称\n */\nexport function JsonToExcel(title = '', json: (string | number)[][] = [], merge?: any) {\n try {\n if (!json.length) {\n return\n }\n // 创建worksheet\n const worksheet = utils.aoa_to_sheet(json)\n if (merge) {\n worksheet['!merges'] = merge\n }\n // 新建空workbook,加入worksheet\n const workbook = utils.book_new()\n utils.book_append_sheet(workbook, worksheet, '')\n writeFile(workbook, `${title}.xlsx`)\n }\n catch (e) {\n console.log('e: ', e)\n return new Error('数据导出失败')\n }\n}\n\n/**\n * 将Excel数据转换为JSON\n * @param file - Excel文件\n * @param cb - 转换完成后的回调函数\n * @param start - 开始行号\n */\nexport function excelToJson(file: File, cb: (json: any[]) => void, start: number): Promise<any[]> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.readAsArrayBuffer(file)\n reader.onload = (e) => {\n const data = e.target?.result\n const workbook = read(data, { type: 'binary' })\n // 遍历每张表读取\n const json: any[] = []\n for (const sheet in workbook.Sheets) {\n if (Object.prototype.hasOwnProperty.call(workbook.Sheets, sheet)) {\n let arr: string[][] = []\n const fromTo = workbook.Sheets[sheet]['!ref'] || ''\n const end = fromTo.split(':')\n const space = start + end[1].toString()\n arr = arr.concat(utils.sheet_to_json(workbook.Sheets[sheet], { header: 1, range: start ? space : fromTo }))\n const titleArr = arr[0]\n arr.shift()\n const excelJsonArr = arr.map((item) => {\n const obj: {\n [key: string]: any\n } = {}\n titleArr.forEach((titleItem: string, index: number) => {\n obj[titleItem] = item[index]\n })\n return obj\n })\n json.push(...excelJsonArr)\n }\n }\n if (cb) {\n cb(json)\n }\n resolve(json)\n }\n reader.onerror = (e) => {\n reject(e)\n }\n })\n}\n"],"names":["JsonToExcel","title","arguments","length","undefined","json","merge","worksheet","utils","aoa_to_sheet","workbook","book_new","book_append_sheet","writeFile","e","console","log","Error","excelToJson","file","cb","start","Promise","resolve","reject","reader","FileReader","readAsArrayBuffer","onload","data","target","result","read","type","sheet","Sheets","Object","prototype","hasOwnProperty","call","arr","fromTo","end","split","space","toString","concat","sheet_to_json","header","range","titleArr","shift","excelJsonArr","map","item","obj","forEach","titleItem","index","push","onerror"],"mappings":"sDASO,SAASA,IAAuE,IAA3DC,EAAAC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAQ,GAAIG,EAAAH,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAA8B,GAAII,EAAAJ,UAAAC,OAAA,EAAAD,kBAAAE,EACxE,IACE,IAAKC,EAAKF,OACR,OAGF,MAAMI,EAAYC,EAAMC,aAAaJ,GACjCC,IACFC,EAAU,WAAaD,GAGzB,MAAMI,EAAWF,EAAMG,WACvBH,EAAMI,kBAAkBF,EAAUH,EAAW,IAC7CM,EAAUH,EAAU,GAAGT,SACzB,OACOa,GAEL,OADAC,QAAQC,IAAI,MAAOF,GACZ,IAAIG,MAAM,SACnB,CACF,CAQO,SAASC,EAAYC,EAAYC,EAA2BC,GACjE,OAAO,IAAIC,QAAQ,CAACC,EAASC,KAC3B,MAAMC,EAAS,IAAIC,WACnBD,EAAOE,kBAAkBR,GACzBM,EAAOG,OAAUd,IACf,MAAMe,EAAOf,EAAEgB,QAAQC,OACjBrB,EAAWsB,EAAKH,EAAM,CAAEI,KAAM,WAE9B5B,EAAc,GACpB,IAAA,MAAW6B,KAASxB,EAASyB,OAC3B,GAAIC,OAAOC,UAAUC,eAAeC,KAAK7B,EAASyB,OAAQD,GAAQ,CAChE,IAAIM,EAAkB,GACtB,MAAMC,EAAS/B,EAASyB,OAAOD,GAAO,SAAW,GAC3CQ,EAAMD,EAAOE,MAAM,KACnBC,EAAQvB,EAAQqB,EAAI,GAAGG,WAC7BL,EAAMA,EAAIM,OAAOtC,EAAMuC,cAAcrC,EAASyB,OAAOD,GAAQ,CAAEc,OAAQ,EAAGC,MAAO5B,EAAQuB,EAAQH,KACjG,MAAMS,EAAWV,EAAI,GACrBA,EAAIW,QACJ,MAAMC,EAAeZ,EAAIa,IAAKC,IAC5B,MAAMC,EAEF,CAAA,EAIJ,OAHAL,EAASM,QAAQ,CAACC,EAAmBC,KACnCH,EAAIE,GAAaH,EAAKI,KAEjBH,IAETlD,EAAKsD,QAAQP,EACf,CAEEhC,GACFA,EAAGf,GAELkB,EAAQlB,IAEVoB,EAAOmC,QAAW9C,IAChBU,EAAOV,KAGb"}
@@ -1 +1 @@
1
- {"version":3,"file":"oss-uploader.mjs","sources":["../../../../packages/utils/src/oss-uploader.ts"],"sourcesContent":["import OSS from 'ali-oss'\n\nexport interface OssCredentials {\n accessKeyId: string\n accessKeySecret: string\n securityToken: string\n}\n\nexport interface OssConfig extends Partial<Omit<OssClientConfig, 'accessKeyId' | 'accessKeySecret' | 'stsToken'>> {\n file: File\n onProgress?: (p: { percent: number }) => void\n path?: string\n getCredentials: () => Promise<OssCredentials | null>\n}\n\nexport interface OssClientConfig {\n accessKeyId: string\n accessKeySecret: string\n stsToken: string\n secure: boolean\n bucket: string\n region: string\n cors: boolean\n useFetch: boolean\n timeout: number\n headers: Record<string, string>\n}\n\n// 定义错误类型\nexport class OssError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'OssError'\n }\n}\n\nconst ossConfig: OssClientConfig = {\n accessKeyId: '',\n accessKeySecret: '',\n stsToken: '',\n secure: true,\n bucket: 'yao-file-daily',\n region: 'oss-cn-hangzhou',\n cors: true,\n useFetch: false,\n timeout: 60000,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE',\n 'Access-Control-Allow-Headers': '*',\n },\n}\n\nexport class OssUploader {\n private static client: OSS\n private static createTokenTime: number = 0\n private static readonly expireTime = 15 * 60 * 1000\n\n // 获取凭证\n private static async getOssCredentials(getCredentials: OssConfig['getCredentials']): Promise<Required<OssCredentials>> {\n const credentials = await getCredentials()\n if (!credentials) {\n throw new OssError('获取凭证失败')\n }\n return {\n accessKeyId: credentials.accessKeyId,\n accessKeySecret: credentials.accessKeySecret,\n securityToken: credentials.securityToken,\n }\n }\n\n // 修改初始化方法\n public static async initOssClient(getCredentials: OssConfig['getCredentials'], args?: Partial<OssConfig>): Promise<void> {\n const diff = Date.now() - this.createTokenTime\n if (!ossConfig.accessKeyId || diff > this.expireTime) {\n try {\n const { accessKeyId, accessKeySecret, securityToken: stsToken } = await this.getOssCredentials(getCredentials)\n Object.assign(ossConfig, {\n accessKeyId,\n accessKeySecret,\n stsToken,\n ...args,\n refreshSTSToken: async () => {\n return await this.getOssCredentials(getCredentials)\n },\n refreshSTSTokenInterval: 300000,\n })\n this.createTokenTime = Date.now()\n this.client = new OSS(ossConfig)\n }\n catch (error) {\n throw new OssError(error instanceof Error ? error.message : String(error))\n }\n }\n }\n\n // 修改上传方法\n public static async uploadFile(opts: OssConfig & { getCredentials: OssConfig['getCredentials'] }): Promise<OSS.MultipartUploadResult> {\n const { file, onProgress = () => {}, path = 'ksh/pdf', getCredentials, ...rest } = opts\n\n await this.initOssClient(getCredentials, rest)\n\n try {\n const result = await this.client.multipartUpload(`${path}/${file.name}`, file, {\n progress(p: number) {\n onProgress({ percent: Math.round(p * 100) })\n },\n })\n return result\n }\n catch (error) {\n throw new OssError(error instanceof Error ? error.message : String(error))\n }\n }\n\n // 修改生成签名URL方法\n public static async generateSignedUrl(\n objectKey: string,\n getCredentials: OssConfig['getCredentials'],\n args?: Partial<OssConfig>,\n ): Promise<string> {\n await this.initOssClient(getCredentials, args)\n try {\n return await this.client.signatureUrl(objectKey, { expires: 60 * 60 })\n }\n catch (error) {\n throw new OssError(error instanceof Error ? error.message : String(error))\n }\n }\n}\n\n// 导出便捷方法\nexport const uploadFile = OssUploader.uploadFile.bind(OssUploader)\nexport const generateSignedUrl = OssUploader.generateSignedUrl.bind(OssUploader)\n"],"names":["OssError","Error","constructor","message","super","this","name","ossConfig","accessKeyId","accessKeySecret","stsToken","secure","bucket","region","cors","useFetch","timeout","headers","OssUploader","getOssCredentials","getCredentials","credentials","securityToken","initOssClient","args","diff","Date","now","createTokenTime","expireTime","Object","assign","refreshSTSToken","async","refreshSTSTokenInterval","client","OSS","error","String","uploadFile","opts","file","onProgress","path","rest","multipartUpload","progress","p","percent","Math","round","generateSignedUrl","objectKey","signatureUrl","expires","__publicField","bind"],"mappings":"iLA6BO,MAAMA,UAAiBC,MAC5BC,WAAAA,CAAYC,GACVC,MAAMD,GACNE,KAAKC,KAAO,UACd,EAGF,MAAMC,EAA6B,CACjCC,YAAa,GACbC,gBAAiB,GACjBC,SAAU,GACVC,QAAQ,EACRC,OAAQ,iBACRC,OAAQ,kBACRC,MAAM,EACNC,UAAU,EACVC,QAAS,IACTC,QAAS,CACP,8BAA+B,IAC/B,+BAAgC,yBAChC,+BAAgC,MAI7B,MAAMC,EAMX,8BAAqBC,CAAkBC,GAC/B,MAAAC,QAAoBD,IAC1B,IAAKC,EACG,MAAA,IAAIrB,EAAS,UAEd,MAAA,CACLQ,YAAaa,EAAYb,YACzBC,gBAAiBY,EAAYZ,gBAC7Ba,cAAeD,EAAYC,cAE/B,CAGA,0BAAoBC,CAAcH,EAA6CI,GAC7E,MAAMC,EAAOC,KAAKC,MAAQtB,KAAKuB,gBAC/B,IAAKrB,EAAUC,aAAeiB,EAAOpB,KAAKwB,WACpC,IACI,MAAArB,YAAEA,kBAAaC,EAAiBa,cAAeZ,SAAmBL,KAAKc,kBAAkBC,GAC/FU,OAAOC,OAAOxB,EAAW,CACvBC,cACAC,kBACAC,cACGc,EACHQ,gBAAiBC,eACF5B,KAAKc,kBAAkBC,GAEtCc,wBAAyB,MAEtB7B,KAAAuB,gBAAkBF,KAAKC,MACvBtB,KAAA8B,OAAS,IAAIC,EAAI7B,SAEjB8B,GACC,MAAA,IAAIrC,EAASqC,aAAiBpC,MAAQoC,EAAMlC,QAAUmC,OAAOD,GACrE,CAEJ,CAGA,uBAAoBE,CAAWC,GACvB,MAAAC,KAAEA,EAAMC,WAAAA,EAAaA,YAAUC,EAAO,UAAAvB,eAAWA,KAAmBwB,GAASJ,QAE7EnC,KAAKkB,cAAcH,EAAgBwB,GAErC,IAMK,aALcvC,KAAK8B,OAAOU,gBAAgB,GAAGF,KAAQF,EAAKnC,OAAQmC,EAAM,CAC7EK,QAAAA,CAASC,GACPL,EAAW,CAAEM,QAASC,KAAKC,MAAU,IAAJH,IACnC,UAIGV,GACC,MAAA,IAAIrC,EAASqC,aAAiBpC,MAAQoC,EAAMlC,QAAUmC,OAAOD,GACrE,CACF,CAGA,8BAAoBc,CAClBC,EACAhC,EACAI,SAEMnB,KAAKkB,cAAcH,EAAgBI,GACrC,IACK,aAAMnB,KAAK8B,OAAOkB,aAAaD,EAAW,CAAEE,QAAS,aAEvDjB,GACC,MAAA,IAAIrC,EAASqC,aAAiBpC,MAAQoC,EAAMlC,QAAUmC,OAAOD,GACrE,CACF,EA1EAkB,EADWrC,EACI,UACfqC,EAFWrC,EAEI,kBAA0B,GACzCqC,EAHWrC,EAGa,aAAa,KA4EhC,MAAMqB,EAAarB,EAAYqB,WAAWiB,KAAKtC,GACzCiC,EAAoBjC,EAAYiC,kBAAkBK,KAAKtC"}
1
+ {"version":3,"file":"oss-uploader.mjs","sources":["../../../../packages/utils/src/oss-uploader.ts"],"sourcesContent":["import OSS from 'ali-oss'\n\nexport interface OssCredentials {\n accessKeyId: string\n accessKeySecret: string\n securityToken: string\n}\n\nexport interface OssConfig extends Partial<Omit<OssClientConfig, 'accessKeyId' | 'accessKeySecret' | 'stsToken'>> {\n file: File\n onProgress?: (p: { percent: number }) => void\n path?: string\n getCredentials: () => Promise<OssCredentials | null>\n}\n\nexport interface OssClientConfig {\n accessKeyId: string\n accessKeySecret: string\n stsToken: string\n secure: boolean\n bucket: string\n region: string\n cors: boolean\n useFetch: boolean\n timeout: number\n headers: Record<string, string>\n}\n\n// 定义错误类型\nexport class OssError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'OssError'\n }\n}\n\nconst ossConfig: OssClientConfig = {\n accessKeyId: '',\n accessKeySecret: '',\n stsToken: '',\n secure: true,\n bucket: 'yao-file-daily',\n region: 'oss-cn-hangzhou',\n cors: true,\n useFetch: false,\n timeout: 60000,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE',\n 'Access-Control-Allow-Headers': '*',\n },\n}\n\nexport class OssUploader {\n private static client: OSS\n private static createTokenTime: number = 0\n private static readonly expireTime = 15 * 60 * 1000\n\n // 获取凭证\n private static async getOssCredentials(getCredentials: OssConfig['getCredentials']): Promise<Required<OssCredentials>> {\n const credentials = await getCredentials()\n if (!credentials) {\n throw new OssError('获取凭证失败')\n }\n return {\n accessKeyId: credentials.accessKeyId,\n accessKeySecret: credentials.accessKeySecret,\n securityToken: credentials.securityToken,\n }\n }\n\n // 修改初始化方法\n public static async initOssClient(getCredentials: OssConfig['getCredentials'], args?: Partial<OssConfig>): Promise<void> {\n const diff = Date.now() - this.createTokenTime\n if (!ossConfig.accessKeyId || diff > this.expireTime) {\n try {\n const { accessKeyId, accessKeySecret, securityToken: stsToken } = await this.getOssCredentials(getCredentials)\n Object.assign(ossConfig, {\n accessKeyId,\n accessKeySecret,\n stsToken,\n ...args,\n refreshSTSToken: async () => {\n return await this.getOssCredentials(getCredentials)\n },\n refreshSTSTokenInterval: 300000,\n })\n this.createTokenTime = Date.now()\n this.client = new OSS(ossConfig)\n }\n catch (error) {\n throw new OssError(error instanceof Error ? error.message : String(error))\n }\n }\n }\n\n // 修改上传方法\n public static async uploadFile(opts: OssConfig & { getCredentials: OssConfig['getCredentials'] }): Promise<OSS.MultipartUploadResult> {\n const { file, onProgress = () => {}, path = 'ksh/pdf', getCredentials, ...rest } = opts\n\n await this.initOssClient(getCredentials, rest)\n\n try {\n const result = await this.client.multipartUpload(`${path}/${file.name}`, file, {\n progress(p: number) {\n onProgress({ percent: Math.round(p * 100) })\n },\n })\n return result\n }\n catch (error) {\n throw new OssError(error instanceof Error ? error.message : String(error))\n }\n }\n\n // 修改生成签名URL方法\n public static async generateSignedUrl(\n objectKey: string,\n getCredentials: OssConfig['getCredentials'],\n args?: Partial<OssConfig>,\n ): Promise<string> {\n await this.initOssClient(getCredentials, args)\n try {\n return await this.client.signatureUrl(objectKey, { expires: 60 * 60 })\n }\n catch (error) {\n throw new OssError(error instanceof Error ? error.message : String(error))\n }\n }\n}\n\n// 导出便捷方法\nexport const uploadFile = OssUploader.uploadFile.bind(OssUploader)\nexport const generateSignedUrl = OssUploader.generateSignedUrl.bind(OssUploader)\n"],"names":["OssError","Error","constructor","message","super","this","name","ossConfig","accessKeyId","accessKeySecret","stsToken","secure","bucket","region","cors","useFetch","timeout","headers","OssUploader","getOssCredentials","getCredentials","credentials","securityToken","initOssClient","args","diff","Date","now","createTokenTime","expireTime","Object","assign","refreshSTSToken","async","refreshSTSTokenInterval","client","OSS","error","String","uploadFile","opts","file","onProgress","path","rest","multipartUpload","progress","p","percent","Math","round","generateSignedUrl","objectKey","signatureUrl","expires","__publicField","bind"],"mappings":"iLA6BO,MAAMA,UAAiBC,MAC5BC,WAAAA,CAAYC,GACVC,MAAMD,GACNE,KAAKC,KAAO,UACd,EAGF,MAAMC,EAA6B,CACjCC,YAAa,GACbC,gBAAiB,GACjBC,SAAU,GACVC,QAAQ,EACRC,OAAQ,iBACRC,OAAQ,kBACRC,MAAM,EACNC,UAAU,EACVC,QAAS,IACTC,QAAS,CACP,8BAA+B,IAC/B,+BAAgC,yBAChC,+BAAgC,MAI7B,MAAMC,EAMX,8BAAqBC,CAAkBC,GACrC,MAAMC,QAAoBD,IAC1B,IAAKC,EACH,MAAM,IAAIrB,EAAS,UAErB,MAAO,CACLQ,YAAaa,EAAYb,YACzBC,gBAAiBY,EAAYZ,gBAC7Ba,cAAeD,EAAYC,cAE/B,CAGA,0BAAoBC,CAAcH,EAA6CI,GAC7E,MAAMC,EAAOC,KAAKC,MAAQtB,KAAKuB,gBAC/B,IAAKrB,EAAUC,aAAeiB,EAAOpB,KAAKwB,WACxC,IACE,MAAMrB,YAAEA,kBAAaC,EAAiBa,cAAeZ,SAAmBL,KAAKc,kBAAkBC,GAC/FU,OAAOC,OAAOxB,EAAW,CACvBC,cACAC,kBACAC,cACGc,EACHQ,gBAAiBC,eACF5B,KAAKc,kBAAkBC,GAEtCc,wBAAyB,MAE3B7B,KAAKuB,gBAAkBF,KAAKC,MAC5BtB,KAAK8B,OAAS,IAAIC,EAAI7B,EACxB,OACO8B,GACL,MAAM,IAAIrC,EAASqC,aAAiBpC,MAAQoC,EAAMlC,QAAUmC,OAAOD,GACrE,CAEJ,CAGA,uBAAoBE,CAAWC,GAC7B,MAAMC,KAAEA,EAAAC,WAAMA,EAAaA,YAAUC,EAAO,UAAAvB,eAAWA,KAAmBwB,GAASJ,QAE7EnC,KAAKkB,cAAcH,EAAgBwB,GAEzC,IAME,aALqBvC,KAAK8B,OAAOU,gBAAgB,GAAGF,KAAQF,EAAKnC,OAAQmC,EAAM,CAC7EK,QAAAA,CAASC,GACPL,EAAW,CAAEM,QAASC,KAAKC,MAAU,IAAJH,IACnC,GAGJ,OACOV,GACL,MAAM,IAAIrC,EAASqC,aAAiBpC,MAAQoC,EAAMlC,QAAUmC,OAAOD,GACrE,CACF,CAGA,8BAAoBc,CAClBC,EACAhC,EACAI,SAEMnB,KAAKkB,cAAcH,EAAgBI,GACzC,IACE,aAAanB,KAAK8B,OAAOkB,aAAaD,EAAW,CAAEE,QAAS,MAC9D,OACOjB,GACL,MAAM,IAAIrC,EAASqC,aAAiBpC,MAAQoC,EAAMlC,QAAUmC,OAAOD,GACrE,CACF,EA1EAkB,EADWrC,EACI,UACfqC,EAFWrC,EAEI,kBAA0B,GACzCqC,EAHWrC,EAGa,aAAa,KA4EhC,MAAMqB,EAAarB,EAAYqB,WAAWiB,KAAKtC,GACzCiC,EAAoBjC,EAAYiC,kBAAkBK,KAAKtC"}
@@ -1,2 +1,2 @@
1
- var e=Object.defineProperty,t=(t,o,n)=>((t,o,n)=>o in t?e(t,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[o]=n)(t,"symbol"!=typeof o?o+"":o,n);class o{constructor(){var e=this;let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"qxs_";t(this,"prefix"),t(this,"local",{has:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return Object.prototype.hasOwnProperty.call(localStorage,o)},get:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return localStorage.getItem(o)},set:function(t,o){const n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2]?`${e.prefix}${t}`:t;localStorage.setItem(n,o)},remove:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;localStorage.removeItem(o)},clear:()=>{localStorage.clear()}}),t(this,"session",{has:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return Object.prototype.hasOwnProperty.call(sessionStorage,o)},get:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return sessionStorage.getItem(o)},set:function(t,o){const n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2]?`${e.prefix}${t}`:t;sessionStorage.setItem(n,o)},remove:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;sessionStorage.removeItem(o)},clear:()=>{sessionStorage.clear()}}),t(this,"cookie",{has:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return new RegExp(`(^|;)\\s*${o}=`).test(document.cookie)},get:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t,n=document.cookie.match(new RegExp(`(^|;)\\s*${o}=([^;]*)`));return n?decodeURIComponent(n[2]):null},set:function(t,o){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"/",r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:window.location.hostname;const c=!(arguments.length>5&&void 0!==arguments[5])||arguments[5]?`${e.prefix}${t}`:t,s=new Date;s.setTime(s.getTime()+24*n*60*60*1e3);const l=`;expires=${s.toUTCString()}`,a=`;path=${i}`,$=r?`;domain=${r}`:"";document.cookie=`${c}=${encodeURIComponent(o)}${l}${a}${$}`},remove:function(t){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:window.location.hostname;const i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3]?`${e.prefix}${t}`:t,r=`;expires=${new Date(0).toUTCString()}`,c=`;path=${o}`,s=n?`;domain=${n}`:"";document.cookie=`${i}=;${r}${c}${s}`},clear:()=>{const e=document.cookie.match(/[^ =;]+(?==)/g);e&&e.forEach((e=>{document.cookie=`${e}=;expires=${new Date(0).toUTCString()};path=/`}))}}),this.prefix=o}}export{o as Storage};
1
+ var e=Object.defineProperty,t=(t,o,n)=>((t,o,n)=>o in t?e(t,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[o]=n)(t,"symbol"!=typeof o?o+"":o,n);class o{constructor(){var e=this;let o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"qxs_";t(this,"prefix"),t(this,"local",{has:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return Object.prototype.hasOwnProperty.call(localStorage,o)},get:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return localStorage.getItem(o)},set:function(t,o){const n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2]?`${e.prefix}${t}`:t;localStorage.setItem(n,o)},remove:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;localStorage.removeItem(o)},clear:()=>{localStorage.clear()}}),t(this,"session",{has:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return Object.prototype.hasOwnProperty.call(sessionStorage,o)},get:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return sessionStorage.getItem(o)},set:function(t,o){const n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2]?`${e.prefix}${t}`:t;sessionStorage.setItem(n,o)},remove:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;sessionStorage.removeItem(o)},clear:()=>{sessionStorage.clear()}}),t(this,"cookie",{has:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t;return new RegExp(`(^|;)\\s*${o}=`).test(document.cookie)},get:function(t){const o=!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`${e.prefix}${t}`:t,n=document.cookie.match(new RegExp(`(^|;)\\s*${o}=([^;]*)`));return n?decodeURIComponent(n[2]):null},set:function(t,o){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"/",r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:window.location.hostname;const c=!(arguments.length>5&&void 0!==arguments[5])||arguments[5]?`${e.prefix}${t}`:t,s=new Date;s.setTime(s.getTime()+24*n*60*60*1e3);const l=`;expires=${s.toUTCString()}`,a=`;path=${i}`,$=r?`;domain=${r}`:"";document.cookie=`${c}=${encodeURIComponent(o)}${l}${a}${$}`},remove:function(t){let o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:window.location.hostname;const i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3]?`${e.prefix}${t}`:t,r=`;expires=${new Date(0).toUTCString()}`,c=`;path=${o}`,s=n?`;domain=${n}`:"";document.cookie=`${i}=;${r}${c}${s}`},clear:()=>{const e=document.cookie.match(/[^ =;]+(?==)/g);e&&e.forEach(e=>{document.cookie=`${e}=;expires=${new Date(0).toUTCString()};path=/`})}}),this.prefix=o}}export{o as Storage};
2
2
  //# sourceMappingURL=storage.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.mjs","sources":["../../../../packages/utils/src/storage.ts"],"sourcesContent":["// 使用单例模式\nclass Storage {\n private readonly prefix: string\n\n constructor(prefix = 'qxs_') {\n this.prefix = prefix\n }\n\n local = {\n has: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return Object.prototype.hasOwnProperty.call(localStorage, prefixedKey)\n },\n get: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return localStorage.getItem(prefixedKey)\n },\n set: (key: string, value: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n localStorage.setItem(prefixedKey, value)\n },\n remove: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n localStorage.removeItem(prefixedKey)\n },\n clear: () => {\n localStorage.clear()\n },\n }\n\n session = {\n has: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return Object.prototype.hasOwnProperty.call(sessionStorage, prefixedKey)\n },\n get: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return sessionStorage.getItem(prefixedKey)\n },\n set: (key: string, value: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n sessionStorage.setItem(prefixedKey, value)\n },\n remove: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n sessionStorage.removeItem(prefixedKey)\n },\n clear: () => {\n sessionStorage.clear()\n },\n }\n\n cookie = {\n has: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return new RegExp(`(^|;)\\\\s*${prefixedKey}=`).test(document.cookie)\n },\n get: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n const match = document.cookie.match(new RegExp(`(^|;)\\\\s*${prefixedKey}=([^;]*)`))\n return match ? decodeURIComponent(match[2]) : null\n },\n set: (key: string, value: string, expires = 1, path = '/', domain = window.location.hostname, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n const expiresDate = new Date()\n expiresDate.setTime(expiresDate.getTime() + expires * 24 * 60 * 60 * 1000)\n const expiresStr = `;expires=${expiresDate.toUTCString()}`\n const pathStr = `;path=${path}`\n const domainStr = domain ? `;domain=${domain}` : ''\n\n document.cookie = `${prefixedKey}=${encodeURIComponent(value)}${expiresStr}${pathStr}${domainStr}`\n },\n remove: (key: string, path = '/', domain = window.location.hostname, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n const expiresStr = `;expires=${new Date(0).toUTCString()}`\n const pathStr = `;path=${path}`\n const domainStr = domain ? `;domain=${domain}` : ''\n\n document.cookie = `${prefixedKey}=;${expiresStr}${pathStr}${domainStr}`\n },\n clear: () => {\n const keys = document.cookie.match(/[^ =;]+(?==)/g)\n if (keys) {\n keys.forEach((key) => {\n document.cookie = `${key}=;expires=${new Date(0).toUTCString()};path=/`\n })\n }\n },\n }\n}\n\n// 直接导出 Storage 类\nexport { Storage }\n"],"names":["Storage","constructor","_this","this","prefix","__publicField","has","key","prefixedKey","arguments","length","undefined","Object","prototype","hasOwnProperty","call","localStorage","get","getItem","set","value","setItem","remove","removeItem","clear","sessionStorage","RegExp","test","document","cookie","match","decodeURIComponent","expires","path","domain","window","location","hostname","expiresDate","Date","setTime","getTime","expiresStr","toUTCString","pathStr","domainStr","encodeURIComponent","keys","forEach"],"mappings":"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"}
1
+ {"version":3,"file":"storage.mjs","sources":["../../../../packages/utils/src/storage.ts"],"sourcesContent":["// 使用单例模式\nclass Storage {\n private readonly prefix: string\n\n constructor(prefix = 'qxs_') {\n this.prefix = prefix\n }\n\n local = {\n has: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return Object.prototype.hasOwnProperty.call(localStorage, prefixedKey)\n },\n get: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return localStorage.getItem(prefixedKey)\n },\n set: (key: string, value: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n localStorage.setItem(prefixedKey, value)\n },\n remove: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n localStorage.removeItem(prefixedKey)\n },\n clear: () => {\n localStorage.clear()\n },\n }\n\n session = {\n has: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return Object.prototype.hasOwnProperty.call(sessionStorage, prefixedKey)\n },\n get: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return sessionStorage.getItem(prefixedKey)\n },\n set: (key: string, value: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n sessionStorage.setItem(prefixedKey, value)\n },\n remove: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n sessionStorage.removeItem(prefixedKey)\n },\n clear: () => {\n sessionStorage.clear()\n },\n }\n\n cookie = {\n has: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n return new RegExp(`(^|;)\\\\s*${prefixedKey}=`).test(document.cookie)\n },\n get: (key: string, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n const match = document.cookie.match(new RegExp(`(^|;)\\\\s*${prefixedKey}=([^;]*)`))\n return match ? decodeURIComponent(match[2]) : null\n },\n set: (key: string, value: string, expires = 1, path = '/', domain = window.location.hostname, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n const expiresDate = new Date()\n expiresDate.setTime(expiresDate.getTime() + expires * 24 * 60 * 60 * 1000)\n const expiresStr = `;expires=${expiresDate.toUTCString()}`\n const pathStr = `;path=${path}`\n const domainStr = domain ? `;domain=${domain}` : ''\n\n document.cookie = `${prefixedKey}=${encodeURIComponent(value)}${expiresStr}${pathStr}${domainStr}`\n },\n remove: (key: string, path = '/', domain = window.location.hostname, usePrefix: boolean = true) => {\n const prefixedKey = usePrefix ? `${this.prefix}${key}` : key\n const expiresStr = `;expires=${new Date(0).toUTCString()}`\n const pathStr = `;path=${path}`\n const domainStr = domain ? `;domain=${domain}` : ''\n\n document.cookie = `${prefixedKey}=;${expiresStr}${pathStr}${domainStr}`\n },\n clear: () => {\n const keys = document.cookie.match(/[^ =;]+(?==)/g)\n if (keys) {\n keys.forEach((key) => {\n document.cookie = `${key}=;expires=${new Date(0).toUTCString()};path=/`\n })\n }\n },\n }\n}\n\n// 直接导出 Storage 类\nexport { Storage }\n"],"names":["Storage","constructor","_this","this","prefix","__publicField","has","key","prefixedKey","arguments","length","undefined","Object","prototype","hasOwnProperty","call","localStorage","get","getItem","set","value","setItem","remove","removeItem","clear","sessionStorage","RegExp","test","document","cookie","match","decodeURIComponent","expires","path","domain","window","location","hostname","expiresDate","Date","setTime","getTime","expiresStr","toUTCString","pathStr","domainStr","encodeURIComponent","keys","forEach"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","sources":["../../../../packages/utils/src/types.ts"],"sourcesContent":["export const isUndefined = (val: any): val is undefined => val === undefined\nexport const isBoolean = (val: any): val is boolean => typeof val === 'boolean'\nexport const isNumber = (val: any): val is number => typeof val === 'number'\n\nexport function isElement(e: unknown): e is Element {\n if (typeof Element === 'undefined') {\n return false\n }\n return e instanceof Element\n}\n\nexport function isWindow(val: unknown): val is Window {\n return val === window\n}\n\n/**\n * 判断字符串是否为JSON字符串\n * @param str - 要判断的字符串\n * @returns 如果字符串是JSON字符串,则返回true,否则返回false\n */\nexport function isJSONString(str: string) {\n const jsonStringRegex = /^[\\],:{}\\s]*$/\n .test(str.replace(/\\\\[\"\\\\/bfnrtu]/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))\n\n return jsonStringRegex && isValidJSON(str)\n}\n\n/**\n * 判断字符串是否为有效的JSON字符串\n * @param str - 要判断的字符串\n * @returns 如果字符串是有效的JSON字符串,则返回true,否则返回false\n */\nfunction isValidJSON(str: string) {\n try {\n JSON.parse(str)\n return true\n }\n catch (e) {\n console.log('e: ', e)\n return false\n }\n}\n\n/**\n * 通过 MIME 类型判断文件是否为图片\n * @param file - 要检查的文件对象\n * @returns {boolean} 如果文件是图片类型返回 true,否则返回 false\n * @example\n * const file = new File([''], 'test.png', { type: 'image/png' });\n * isImageByMimeType(file); // true\n */\nexport function isImageByMimeType(file: File) {\n return file.type.startsWith('image/')\n}\n\n/**\n * 判断一个值是否为普通对象\n * @param value - 要判断的值\n * @returns 如果值是普通对象,则返回 true,否则返回 false\n */\nexport function isPlainObject(value: unknown): value is Record<string, any> {\n if (value === null || typeof value !== 'object') {\n return false\n }\n\n // 获取原型\n const proto = Object.getPrototypeOf(value)\n\n // 如果没有原型(proto === null),说明是通过 Object.create(null) 创建的\n // 或者原型就是 Object.prototype,说明是普通对象\n return proto === null || proto === Object.prototype\n}\n"],"names":["isUndefined","val","isBoolean","isNumber","isElement","e","Element","isWindow","window","isJSONString","str","test","replace","JSON","parse","console","log","isValidJSON","isImageByMimeType","file","type","startsWith","isPlainObject","value","proto","Object","getPrototypeOf","prototype"],"mappings":"AAAa,MAAAA,EAAeC,QAAuC,IAARA,EAC9CC,EAAaD,GAA4C,kBAARA,EACjDE,EAAYF,GAA2C,iBAARA,EAErD,SAASG,EAAUC,GACpB,MAAmB,oBAAZC,SAGJD,aAAaC,OACtB,CAEO,SAASC,EAASN,GACvB,OAAOA,IAAQO,MACjB,CAOO,SAASC,EAAaC,GAMpB,MALiB,gBACrBC,KAAKD,EAAIE,QAAQ,kBAAmB,KAClCA,QAAQ,mEAAoE,KAC5EA,QAAQ,uBAAwB,MAUvC,SAAqBF,GACf,IAEK,OADPG,KAAKC,MAAMJ,IACJ,QAEFL,GAEE,OADCU,QAAAC,IAAI,MAAOX,IACZ,CACT,CACF,CAjB4BY,CAAYP,EACxC,CA0BO,SAASQ,EAAkBC,GACzB,OAAAA,EAAKC,KAAKC,WAAW,SAC9B,CAOO,SAASC,EAAcC,GAC5B,GAAc,OAAVA,GAAmC,iBAAVA,EACpB,OAAA,EAIH,MAAAC,EAAQC,OAAOC,eAAeH,GAI7B,OAAU,OAAVC,GAAkBA,IAAUC,OAAOE,SAC5C"}
1
+ {"version":3,"file":"types.mjs","sources":["../../../../packages/utils/src/types.ts"],"sourcesContent":["export const isUndefined = (val: any): val is undefined => val === undefined\nexport const isBoolean = (val: any): val is boolean => typeof val === 'boolean'\nexport const isNumber = (val: any): val is number => typeof val === 'number'\n\nexport function isElement(e: unknown): e is Element {\n if (typeof Element === 'undefined') {\n return false\n }\n return e instanceof Element\n}\n\nexport function isWindow(val: unknown): val is Window {\n return val === window\n}\n\n/**\n * 判断字符串是否为JSON字符串\n * @param str - 要判断的字符串\n * @returns 如果字符串是JSON字符串,则返回true,否则返回false\n */\nexport function isJSONString(str: string) {\n const jsonStringRegex = /^[\\],:{}\\s]*$/\n .test(str.replace(/\\\\[\"\\\\/bfnrtu]/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))\n\n return jsonStringRegex && isValidJSON(str)\n}\n\n/**\n * 判断字符串是否为有效的JSON字符串\n * @param str - 要判断的字符串\n * @returns 如果字符串是有效的JSON字符串,则返回true,否则返回false\n */\nfunction isValidJSON(str: string) {\n try {\n JSON.parse(str)\n return true\n }\n catch (e) {\n console.log('e: ', e)\n return false\n }\n}\n\n/**\n * 通过 MIME 类型判断文件是否为图片\n * @param file - 要检查的文件对象\n * @returns {boolean} 如果文件是图片类型返回 true,否则返回 false\n * @example\n * const file = new File([''], 'test.png', { type: 'image/png' });\n * isImageByMimeType(file); // true\n */\nexport function isImageByMimeType(file: File) {\n return file.type.startsWith('image/')\n}\n\n/**\n * 判断一个值是否为普通对象\n * @param value - 要判断的值\n * @returns 如果值是普通对象,则返回 true,否则返回 false\n */\nexport function isPlainObject(value: unknown): value is Record<string, any> {\n if (value === null || typeof value !== 'object') {\n return false\n }\n\n // 获取原型\n const proto = Object.getPrototypeOf(value)\n\n // 如果没有原型(proto === null),说明是通过 Object.create(null) 创建的\n // 或者原型就是 Object.prototype,说明是普通对象\n return proto === null || proto === Object.prototype\n}\n"],"names":["isUndefined","val","isBoolean","isNumber","isElement","e","Element","isWindow","window","isJSONString","str","test","replace","JSON","parse","console","log","isValidJSON","isImageByMimeType","file","type","startsWith","isPlainObject","value","proto","Object","getPrototypeOf","prototype"],"mappings":"AAAO,MAAMA,EAAeC,QAAuC,IAARA,EAC9CC,EAAaD,GAA4C,kBAARA,EACjDE,EAAYF,GAA2C,iBAARA,EAErD,SAASG,EAAUC,GACxB,MAAuB,oBAAZC,SAGJD,aAAaC,OACtB,CAEO,SAASC,EAASN,GACvB,OAAOA,IAAQO,MACjB,CAOO,SAASC,EAAaC,GAM3B,MALwB,gBACrBC,KAAKD,EAAIE,QAAQ,kBAAmB,KAClCA,QAAQ,mEAAoE,KAC5EA,QAAQ,uBAAwB,MAUvC,SAAqBF,GACnB,IAEE,OADAG,KAAKC,MAAMJ,IACJ,CACT,OACOL,GAEL,OADAU,QAAQC,IAAI,MAAOX,IACZ,CACT,CACF,CAjB4BY,CAAYP,EACxC,CA0BO,SAASQ,EAAkBC,GAChC,OAAOA,EAAKC,KAAKC,WAAW,SAC9B,CAOO,SAASC,EAAcC,GAC5B,GAAc,OAAVA,GAAmC,iBAAVA,EAC3B,OAAO,EAIT,MAAMC,EAAQC,OAAOC,eAAeH,GAIpC,OAAiB,OAAVC,GAAkBA,IAAUC,OAAOE,SAC5C"}
@@ -1,2 +1,2 @@
1
- import{isPlainObject as e}from"./types.mjs";var s=Object.defineProperty,t=(e,t,r)=>((e,t,r)=>t in e?s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,"symbol"!=typeof t?t+"":t,r);const r=class s{constructor(e,r){var o=this;if(this.apiInstance=e,this.isWholeResponse=r,t(this,"useApi",(async function(e,s){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o.isWholeResponse,r=null,i=null;try{const i={...e,...s?e.method&&["GET"].includes(e.method.toUpperCase())?{params:s}:{data:s}:{}};i.url=(i.proxyPrefix||"")+e.url,delete i.proxyPrefix;const n=await o.apiInstance(i);r=t?n.data:n.data.data}catch(e){"AxiosError"!==e.name?o.isAxiosResponse(e)?i=e.data:o.isErrorResponse(e)&&(i=e):console.error(e)}return{res:r,error:i}})),s.instance)return s.instance;s.instance=this,this.isWholeResponse=r}isBusinessError(s){return e(s)&&"string"==typeof s.message&&"number"==typeof s.code&&0!==s.code}isAxiosResponse(s){return e(s)&&void 0!==s.data&&this.isBusinessError(s.data)&&void 0!==s.status&&void 0!==s.statusText&&void 0!==s.headers&&void 0!==s.config&&void 0!==s.request}isErrorResponse(e){return"code"in e&&"data"in e&&"message"in e&&0!==e.code}};t(r,"instance");let o=r;export{o as ApiService};
1
+ import{isPlainObject as e}from"./types.mjs";var s=Object.defineProperty,t=(e,t,r)=>((e,t,r)=>t in e?s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,"symbol"!=typeof t?t+"":t,r);const r=class s{constructor(e,r){var o=this;if(this.apiInstance=e,this.isWholeResponse=r,t(this,"useApi",async function(e,s){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o.isWholeResponse,r=null,i=null;try{const i={...e,...s?e.method&&["GET"].includes(e.method.toUpperCase())?{params:s}:{data:s}:{}};i.url=(i.proxyPrefix||"")+e.url,delete i.proxyPrefix;const n=await o.apiInstance(i);r=t?n.data:n.data.data}catch(e){"AxiosError"!==e.name?o.isAxiosResponse(e)?i=e.data:o.isErrorResponse(e)&&(i=e):console.error(e)}return{res:r,error:i}}),s.instance)return s.instance;s.instance=this,this.isWholeResponse=r}isBusinessError(s){return e(s)&&"string"==typeof s.message&&"number"==typeof s.code&&0!==s.code}isAxiosResponse(s){return e(s)&&void 0!==s.data&&this.isBusinessError(s.data)&&void 0!==s.status&&void 0!==s.statusText&&void 0!==s.headers&&void 0!==s.config&&void 0!==s.request}isErrorResponse(e){return"code"in e&&"data"in e&&"message"in e&&0!==e.code}};t(r,"instance");let o=r;export{o as ApiService};
2
2
  //# sourceMappingURL=use-api.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-api.mjs","sources":["../../../../packages/utils/src/use-api.ts"],"sourcesContent":["import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, Method } from 'axios'\nimport { isPlainObject } from './types'\n\n/**\n * 成功响应的数据结构\n * @template T - 响应数据的类型\n */\nexport interface SuccessResponse<T> {\n code: number\n count: number\n data: T\n message: string\n}\n\n/**\n * 错误响应的数据结构\n */\nexport interface ErrorResponse {\n code: number\n data: null\n message: string\n}\n\n/**\n * API 响应的统一封装\n * @template W - 是否返回完整响应,true 返回完整响应,false 只返回 data\n * @template T - 响应数据的类型\n */\nexport interface UseApiResponse<W extends boolean = false, T = unknown> {\n res: W extends true ? SuccessResponse<T> : T\n error: ErrorResponse | null\n}\n\n/**\n * API URL 配置对象类型\n */\nexport interface UrlObjectType {\n url: string\n method: Method\n proxyPrefix?: string\n}\n\n/**\n * API 类型映射,用于定义每个接口的请求和响应类型\n * @template U - URL 配置对象类型\n */\nexport type ApiTypeMap<U extends UrlObjectType> = {\n [K in U['url']]: {\n request: any\n response: any\n }\n}\n\n// 辅助类型,用于提取请求数据类型\ntype RequestPayload<T> = T extends { data: any } ? T['data'] : T\ntype RequestParams<T> = T extends { params: any } ? T['params'] : T\n\n/**\n * API 服务类,提供统一的请求处理和错误处理\n * @template T - API 类型映射\n * @template U - URL 配置对象类型\n *\n * @example\n * ```typescript\n * // 定义 API 类型映射\n * interface UserApi extends ApiTypeMap<UserUrlObject> {\n * '/user/list': {\n * request: { page: number; size: number }\n * response: User[]\n * }\n * }\n *\n * // 创建 API 服务实例\n * const api = new ApiService<UserApi, UserUrlObject>(axios.create(), false)\n *\n * // 发起请求\n * const { res, error } = await api.useApi({\n * url: '/user/list',\n * method: 'GET',\n * params: { page: 1, size: 10 }\n * })\n * ```\n */\nexport class ApiService<\n T extends ApiTypeMap<U>,\n U extends UrlObjectType,\n> {\n private static instance: ApiService<any, any>\n\n /**\n * 构造函数,实现单例模式\n * @param apiInstance - Axios 实例\n * @param isWholeResponse - 是否返回完整响应\n */\n constructor(\n private apiInstance: AxiosInstance,\n private isWholeResponse: boolean,\n ) {\n if (ApiService.instance) {\n return ApiService.instance as ApiService<T, U>\n }\n ApiService.instance = this\n this.isWholeResponse = isWholeResponse\n }\n\n /**\n * 判断是否为业务错误\n * @param obj - 待判断的对象\n */\n private isBusinessError(obj: ErrorResponse): boolean {\n return isPlainObject(obj)\n && typeof obj.message === 'string'\n && typeof obj.code === 'number'\n && obj.code !== 0\n }\n\n /**\n * 判断是否为 Axios 响应对象\n * @param value - 待判断的值\n */\n private isAxiosResponse(value: any): value is AxiosResponse {\n return isPlainObject(value)\n && value.data !== undefined\n && this.isBusinessError(value.data)\n && value.status !== undefined\n && value.statusText !== undefined\n && value.headers !== undefined\n && value.config !== undefined\n && value.request !== undefined\n }\n\n /**\n * 判断是否为错误响应\n * @param value - 待判断的值\n */\n private isErrorResponse(value: any): value is ErrorResponse {\n return 'code' in value && 'data' in value && 'message' in value && value.code !== 0\n }\n\n /**\n * 发起 API 请求\n * @template K - URL 配置对象类型\n * @template W - 是否返回完整响应\n * @param axiosConfig - Axios 请求配置\n * @param params - 请求参数\n * @param isWholeResponse - 是否返回完整响应,默认使用实例配置\n * @returns Promise<UseApiResponse> - 统一的响应格式\n */\n public useApi = async <\n K extends U,\n W extends boolean = false,\n >(\n axiosConfig: Omit<AxiosRequestConfig<RequestPayload<T[K['url']]['request']>>, 'params'> & K & {\n params?: RequestParams<T[K['url']]['request']>\n },\n params?: RequestParams<T[K['url']]['request']>,\n isWholeResponse: W = this.isWholeResponse as W,\n ): Promise<UseApiResponse<W, T[K['url']]['response']>> => {\n let res: UseApiResponse<W, T[K['url']]['response']>['res'] | null = null\n let error: UseApiResponse['error'] = null\n\n try {\n // 处理请求配置\n const config = {\n ...axiosConfig,\n ...(params ? (axiosConfig.method && ['GET'].includes(axiosConfig.method.toUpperCase()) ? { params } : { data: params }) : {}),\n }\n\n // 处理代理前缀\n config.url = (config.proxyPrefix || '') + axiosConfig.url\n delete config.proxyPrefix\n\n // 发起请求\n const response = await this.apiInstance<SuccessResponse<T[K['url']]['response']>>(config)\n res = isWholeResponse\n ? response.data\n : response.data.data\n }\n catch (err: any) {\n // 错误处理\n if (err.name !== 'AxiosError') {\n if (this.isAxiosResponse(err)) {\n error = err.data\n }\n else if (this.isErrorResponse(err)) {\n error = err\n }\n }\n else {\n console.error(err)\n }\n }\n\n return { res: res!, error }\n }\n}\n"],"names":["_ApiService","constructor","apiInstance","isWholeResponse","_this","this","__publicField","async","axiosConfig","params","arguments","length","undefined","res","error","config","method","includes","toUpperCase","data","url","proxyPrefix","response","err","name","isAxiosResponse","isErrorResponse","console","instance","isBusinessError","obj","isPlainObject","message","code","value","status","statusText","headers","request","ApiService"],"mappings":"sMAmFO,MAAMA,EAAN,MAAMA,EAWXC,WAAAA,CACUC,EACAC,GACR,IAAAC,EAAAC,KACA,GAHQA,KAAAH,YAAAA,EACAG,KAAAF,gBAAAA,EAoDVG,EAAAD,KAAO,UAASE,eAIdC,EAGAC,GAEwD,IADxDN,EAAAO,UAAAC,OAAAD,QAAAE,IAAAF,UAAAE,GAAAF,UAAqBN,GAAAA,EAAKD,gBAEtBU,EAAgE,KAChEC,EAAiC,KAEjC,IAEF,MAAMC,EAAS,IACVP,KACCC,EAAUD,EAAYQ,QAAU,CAAC,OAAOC,SAAST,EAAYQ,OAAOE,eAAiB,CAAET,UAAW,CAAEU,KAAMV,GAAY,CAAC,GAI7HM,EAAOK,KAAOL,EAAOM,aAAe,IAAMb,EAAYY,WAC/CL,EAAOM,YAGd,MAAMC,QAAiBlB,EAAKF,YAAsDa,GAClFF,EAAMV,EACFmB,EAASH,KACTG,EAASH,KAAKA,WAEbI,GAEY,eAAbA,EAAIC,KACFpB,EAAKqB,gBAAgBF,GACvBT,EAAQS,EAAIJ,KAELf,EAAKsB,gBAAgBH,KACpBT,EAAAS,GAIVI,QAAQb,MAAMS,EAElB,CAEO,MAAA,CAAEV,MAAWC,QACtB,IAhGMd,EAAW4B,SACb,OAAO5B,EAAW4B,SAEpB5B,EAAW4B,SAAWvB,KACtBA,KAAKF,gBAAkBA,CACzB,CAMQ0B,eAAAA,CAAgBC,GACtB,OAAOC,EAAcD,IACO,iBAAhBA,EAAIE,SACS,iBAAbF,EAAIG,MACE,IAAbH,EAAIG,IACX,CAMQR,eAAAA,CAAgBS,GACf,OAAAH,EAAcG,SACD,IAAfA,EAAMf,MACNd,KAAKwB,gBAAgBK,EAAMf,YACV,IAAjBe,EAAMC,aACe,IAArBD,EAAME,iBACY,IAAlBF,EAAMG,cACW,IAAjBH,EAAMnB,aACY,IAAlBmB,EAAMI,OACb,CAMQZ,eAAAA,CAAgBQ,GACtB,MAAO,SAAUA,GAAS,SAAUA,GAAS,YAAaA,GAAwB,IAAfA,EAAMD,IAC3E,GAlDA3B,EAJWN,EAII,YAJV,IAAMuC,EAANvC"}
1
+ {"version":3,"file":"use-api.mjs","sources":["../../../../packages/utils/src/use-api.ts"],"sourcesContent":["import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, Method } from 'axios'\nimport { isPlainObject } from './types'\n\n/**\n * 成功响应的数据结构\n * @template T - 响应数据的类型\n */\nexport interface SuccessResponse<T> {\n code: number\n count: number\n data: T\n message: string\n}\n\n/**\n * 错误响应的数据结构\n */\nexport interface ErrorResponse {\n code: number\n data: null\n message: string\n}\n\n/**\n * API 响应的统一封装\n * @template W - 是否返回完整响应,true 返回完整响应,false 只返回 data\n * @template T - 响应数据的类型\n */\nexport interface UseApiResponse<W extends boolean = false, T = unknown> {\n res: W extends true ? SuccessResponse<T> : T\n error: ErrorResponse | null\n}\n\n/**\n * API URL 配置对象类型\n */\nexport interface UrlObjectType {\n url: string\n method: Method\n proxyPrefix?: string\n}\n\n/**\n * API 类型映射,用于定义每个接口的请求和响应类型\n * @template U - URL 配置对象类型\n */\nexport type ApiTypeMap<U extends UrlObjectType> = {\n [K in U['url']]: {\n request: any\n response: any\n }\n}\n\n// 辅助类型,用于提取请求数据类型\ntype RequestPayload<T> = T extends { data: any } ? T['data'] : T\ntype RequestParams<T> = T extends { params: any } ? T['params'] : T\n\n/**\n * API 服务类,提供统一的请求处理和错误处理\n * @template T - API 类型映射\n * @template U - URL 配置对象类型\n *\n * @example\n * ```typescript\n * // 定义 API 类型映射\n * interface UserApi extends ApiTypeMap<UserUrlObject> {\n * '/user/list': {\n * request: { page: number; size: number }\n * response: User[]\n * }\n * }\n *\n * // 创建 API 服务实例\n * const api = new ApiService<UserApi, UserUrlObject>(axios.create(), false)\n *\n * // 发起请求\n * const { res, error } = await api.useApi({\n * url: '/user/list',\n * method: 'GET',\n * params: { page: 1, size: 10 }\n * })\n * ```\n */\nexport class ApiService<\n T extends ApiTypeMap<U>,\n U extends UrlObjectType,\n> {\n private static instance: ApiService<any, any>\n\n /**\n * 构造函数,实现单例模式\n * @param apiInstance - Axios 实例\n * @param isWholeResponse - 是否返回完整响应\n */\n constructor(\n private apiInstance: AxiosInstance,\n private isWholeResponse: boolean,\n ) {\n if (ApiService.instance) {\n return ApiService.instance as ApiService<T, U>\n }\n ApiService.instance = this\n this.isWholeResponse = isWholeResponse\n }\n\n /**\n * 判断是否为业务错误\n * @param obj - 待判断的对象\n */\n private isBusinessError(obj: ErrorResponse): boolean {\n return isPlainObject(obj)\n && typeof obj.message === 'string'\n && typeof obj.code === 'number'\n && obj.code !== 0\n }\n\n /**\n * 判断是否为 Axios 响应对象\n * @param value - 待判断的值\n */\n private isAxiosResponse(value: any): value is AxiosResponse {\n return isPlainObject(value)\n && value.data !== undefined\n && this.isBusinessError(value.data)\n && value.status !== undefined\n && value.statusText !== undefined\n && value.headers !== undefined\n && value.config !== undefined\n && value.request !== undefined\n }\n\n /**\n * 判断是否为错误响应\n * @param value - 待判断的值\n */\n private isErrorResponse(value: any): value is ErrorResponse {\n return 'code' in value && 'data' in value && 'message' in value && value.code !== 0\n }\n\n /**\n * 发起 API 请求\n * @template K - URL 配置对象类型\n * @template W - 是否返回完整响应\n * @param axiosConfig - Axios 请求配置\n * @param params - 请求参数\n * @param isWholeResponse - 是否返回完整响应,默认使用实例配置\n * @returns Promise<UseApiResponse> - 统一的响应格式\n */\n public useApi = async <\n K extends U,\n W extends boolean = false,\n >(\n axiosConfig: Omit<AxiosRequestConfig<RequestPayload<T[K['url']]['request']>>, 'params'> & K & {\n params?: RequestParams<T[K['url']]['request']>\n },\n params?: RequestParams<T[K['url']]['request']>,\n isWholeResponse: W = this.isWholeResponse as W,\n ): Promise<UseApiResponse<W, T[K['url']]['response']>> => {\n let res: UseApiResponse<W, T[K['url']]['response']>['res'] | null = null\n let error: UseApiResponse['error'] = null\n\n try {\n // 处理请求配置\n const config = {\n ...axiosConfig,\n ...(params ? (axiosConfig.method && ['GET'].includes(axiosConfig.method.toUpperCase()) ? { params } : { data: params }) : {}),\n }\n\n // 处理代理前缀\n config.url = (config.proxyPrefix || '') + axiosConfig.url\n delete config.proxyPrefix\n\n // 发起请求\n const response = await this.apiInstance<SuccessResponse<T[K['url']]['response']>>(config)\n res = isWholeResponse\n ? response.data\n : response.data.data\n }\n catch (err: any) {\n // 错误处理\n if (err.name !== 'AxiosError') {\n if (this.isAxiosResponse(err)) {\n error = err.data\n }\n else if (this.isErrorResponse(err)) {\n error = err\n }\n }\n else {\n console.error(err)\n }\n }\n\n return { res: res!, error }\n }\n}\n"],"names":["_ApiService","constructor","apiInstance","isWholeResponse","_this","this","__publicField","async","axiosConfig","params","arguments","length","undefined","res","error","config","method","includes","toUpperCase","data","url","proxyPrefix","response","err","name","isAxiosResponse","isErrorResponse","console","instance","isBusinessError","obj","isPlainObject","message","code","value","status","statusText","headers","request","ApiService"],"mappings":"sMAmFO,MAAMA,EAAN,MAAMA,EAWXC,WAAAA,CACUC,EACAC,GACR,IAAAC,EAAAC,KACA,GAHQA,KAAAH,YAAAA,EACAG,KAAAF,gBAAAA,EAoDVG,EAAAD,KAAO,SAASE,eAIdC,EAGAC,GAEwD,IADxDN,EAAAO,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAqBN,EAAKD,gBAEtBU,EAAgE,KAChEC,EAAiC,KAErC,IAEE,MAAMC,EAAS,IACVP,KACCC,EAAUD,EAAYQ,QAAU,CAAC,OAAOC,SAAST,EAAYQ,OAAOE,eAAiB,CAAET,UAAW,CAAEU,KAAMV,GAAY,CAAA,GAI5HM,EAAOK,KAAOL,EAAOM,aAAe,IAAMb,EAAYY,WAC/CL,EAAOM,YAGd,MAAMC,QAAiBlB,EAAKF,YAAsDa,GAClFF,EAAMV,EACFmB,EAASH,KACTG,EAASH,KAAKA,IACpB,OACOI,GAEY,eAAbA,EAAIC,KACFpB,EAAKqB,gBAAgBF,GACvBT,EAAQS,EAAIJ,KAELf,EAAKsB,gBAAgBH,KAC5BT,EAAQS,GAIVI,QAAQb,MAAMS,EAElB,CAEA,MAAO,CAAEV,MAAWC,QACtB,GAhGMd,EAAW4B,SACb,OAAO5B,EAAW4B,SAEpB5B,EAAW4B,SAAWvB,KACtBA,KAAKF,gBAAkBA,CACzB,CAMQ0B,eAAAA,CAAgBC,GACtB,OAAOC,EAAcD,IACO,iBAAhBA,EAAIE,SACS,iBAAbF,EAAIG,MACE,IAAbH,EAAIG,IACX,CAMQR,eAAAA,CAAgBS,GACtB,OAAOH,EAAcG,SACD,IAAfA,EAAMf,MACNd,KAAKwB,gBAAgBK,EAAMf,YACV,IAAjBe,EAAMC,aACe,IAArBD,EAAME,iBACY,IAAlBF,EAAMG,cACW,IAAjBH,EAAMnB,aACY,IAAlBmB,EAAMI,OACb,CAMQZ,eAAAA,CAAgBQ,GACtB,MAAO,SAAUA,GAAS,SAAUA,GAAS,YAAaA,GAAwB,IAAfA,EAAMD,IAC3E,GAlDA3B,EAJWN,EAII,YAJV,IAAMuC,EAANvC"}
@@ -1,2 +1,2 @@
1
- const t={id:"wm_div_id",prefix:"mask_div_id",text:"测试水印",x:0,y:0,rows:0,cols:0,width:0,height:0,x_space:100,y_space:40,font:"微软雅黑",color:"black",fontsize:"18px",alpha:.15,zIndex:9999999,angle:15,parent_width:0,parent_height:0,parent_node:null,monitor:!0};function e(){const e={...t};let n=!1;const i=new MutationObserver((function(t){if(n)return void(n=!1);if(!document.getElementById(e.id))return void s(e);t.some((t=>"childList"===t.type||("attributes"===t.type||"characterData"===t.type)))&&s(e)})),o=new ResizeObserver((()=>{n||s(e)}));function c(t,n,i){const o=document.createElement("div");return o.textContent=e.text,o.id=`${e.prefix}${i}`,o.style.cssText=`\n transform: rotate(-${e.angle}deg);\n position: absolute;\n left: ${t}px;\n top: ${n}px;\n overflow: hidden;\n z-index: 999999;\n opacity: ${e.alpha};\n font-size: ${e.fontsize};\n font-family: ${e.font};\n color: ${e.color};\n text-align: center;\n width: ${e.width}px;\n height: ${e.height}px;\n line-height: ${e.height}px;\n display: flex;\n align-items: center;\n justify-content: center;\n user-select: none;\n visibility: visible;\n `.replace(/\s+/g," ").trim(),o}function s(t){if(document.querySelectorAll(`#${e.id}`).forEach((t=>{t.parentNode?.removeChild(t)})),Object.assign(e,t),0===e.width&&0===e.height||0===e.width||0===e.height){const t=function(t,e,n){const i=document.createElement("canvas").getContext("2d");if(!i)return{width:100,height:100};i.font=`${n} ${e}`;const o=i.measureText(t.trim()),c=Number.parseFloat(n),s=void 0!==o.actualBoundingBoxAscent&&void 0!==o.actualBoundingBoxDescent?o.actualBoundingBoxAscent+o.actualBoundingBoxDescent:c;return{width:Math.ceil(o.width),height:Math.ceil(s)}}(e.text,e.font,e.fontsize),n=10;0===e.width&&(e.width=t.width+n),0===e.height&&(e.height=t.height+n)}const n=e.parent_node||document.body,s=Math.max(n.scrollWidth,n.clientWidth),a=Math.max(n.scrollHeight,n.clientHeight),d=document.createElement("div");d.id=e.id,n.closest("body")&&"static"===getComputedStyle(n).position&&(n.style.position="relative"),d.style.cssText=`\n pointer-events: none;\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: ${e.zIndex};\n overflow: hidden;\n `.replace(/\s+/g," ").trim();const r=d.attachShadow?d.attachShadow({mode:"open"}):d;n.appendChild(d);const{cols:h,rows:l,x_space:p,y_space:u}=function(t,n){const i=t-e.x,o=n-e.y,c=e.x_space||20,s=e.y_space||20;return{cols:Math.ceil(i/(e.width+c)),rows:Math.ceil(o/(e.height+s)),x_space:c,y_space:s}}(s,a);e.cols=h,e.rows=l,e.x_space=p,e.y_space=u;const x=document.createDocumentFragment();for(let t=0;t<l;t++){const n=e.y+(e.height+u)*t;for(let i=0;i<h;i++){const o=e.x+(e.width+p)*i;x.appendChild(c(o,n,t*h+i))}}if(r.appendChild(x),e.monitor){o.observe(n);const t={attributes:!0,childList:!0,subtree:!0,characterData:!0};i.observe(d,t),r!==d&&i.observe(r,t)}}return{addMark:s,removeMark:()=>{n=!0,function(){const t=document.getElementById(e.id);i.disconnect(),t&&t.parentNode?.removeChild(t)}()}}}export{e as watermark};
1
+ const t={id:"wm_div_id",prefix:"mask_div_id",text:"测试水印",x:0,y:0,rows:0,cols:0,width:0,height:0,x_space:100,y_space:40,font:"微软雅黑",color:"black",fontsize:"18px",alpha:.15,zIndex:9999999,angle:15,parent_width:0,parent_height:0,parent_node:null,monitor:!0};function e(){const e={...t};let n=!1;const i=new MutationObserver(function(t){if(n)return void(n=!1);if(!document.getElementById(e.id))return void s(e);t.some(t=>"childList"===t.type||("attributes"===t.type||"characterData"===t.type))&&s(e)}),o=new ResizeObserver(()=>{n||s(e)});function c(t,n,i){const o=document.createElement("div");return o.textContent=e.text,o.id=`${e.prefix}${i}`,o.style.cssText=`\n transform: rotate(-${e.angle}deg);\n position: absolute;\n left: ${t}px;\n top: ${n}px;\n overflow: hidden;\n z-index: 999999;\n opacity: ${e.alpha};\n font-size: ${e.fontsize};\n font-family: ${e.font};\n color: ${e.color};\n text-align: center;\n width: ${e.width}px;\n height: ${e.height}px;\n line-height: ${e.height}px;\n display: flex;\n align-items: center;\n justify-content: center;\n user-select: none;\n visibility: visible;\n `.replace(/\s+/g," ").trim(),o}function s(t){if(document.querySelectorAll(`#${e.id}`).forEach(t=>{t.parentNode?.removeChild(t)}),Object.assign(e,t),0===e.width&&0===e.height||0===e.width||0===e.height){const t=function(t,e,n){const i=document.createElement("canvas").getContext("2d");if(!i)return{width:100,height:100};i.font=`${n} ${e}`;const o=i.measureText(t.trim()),c=Number.parseFloat(n),s=void 0!==o.actualBoundingBoxAscent&&void 0!==o.actualBoundingBoxDescent?o.actualBoundingBoxAscent+o.actualBoundingBoxDescent:c;return{width:Math.ceil(o.width),height:Math.ceil(s)}}(e.text,e.font,e.fontsize),n=10;0===e.width&&(e.width=t.width+n),0===e.height&&(e.height=t.height+n)}const n=e.parent_node||document.body,s=Math.max(n.scrollWidth,n.clientWidth),a=Math.max(n.scrollHeight,n.clientHeight),d=document.createElement("div");d.id=e.id,n.closest("body")&&"static"===getComputedStyle(n).position&&(n.style.position="relative"),d.style.cssText=`\n pointer-events: none;\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: ${e.zIndex};\n overflow: hidden;\n `.replace(/\s+/g," ").trim();const r=d.attachShadow?d.attachShadow({mode:"open"}):d;n.appendChild(d);const{cols:h,rows:l,x_space:p,y_space:u}=function(t,n){const i=t-e.x,o=n-e.y,c=e.x_space||20,s=e.y_space||20;return{cols:Math.ceil(i/(e.width+c)),rows:Math.ceil(o/(e.height+s)),x_space:c,y_space:s}}(s,a);e.cols=h,e.rows=l,e.x_space=p,e.y_space=u;const x=document.createDocumentFragment();for(let t=0;t<l;t++){const n=e.y+(e.height+u)*t;for(let i=0;i<h;i++){const o=e.x+(e.width+p)*i;x.appendChild(c(o,n,t*h+i))}}if(r.appendChild(x),e.monitor){o.observe(n);const t={attributes:!0,childList:!0,subtree:!0,characterData:!0};i.observe(d,t),r!==d&&i.observe(r,t)}}return{addMark:s,removeMark:()=>{n=!0,function(){const t=document.getElementById(e.id);i.disconnect(),t&&t.parentNode?.removeChild(t)}()}}}export{e as watermark};
2
2
  //# sourceMappingURL=watermark.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"watermark.mjs","sources":["../../../../packages/utils/src/watermark.ts"],"sourcesContent":["interface SettingsType {\n /** 水印总体的id */\n id?: string\n /** 小水印的id前缀 */\n prefix?: string\n /** 水印文案 */\n text?: string\n /** 水印起始位置x轴坐标 */\n x?: number\n /** 水印起始位置Y轴坐标 */\n y?: number\n /** 水印行数 */\n rows?: number\n /** 水印层级 */\n zIndex?: number\n /** 水印列数 */\n cols?: number\n /** 水印x轴间隔 */\n x_space?: number\n /** 水印y轴间隔 */\n y_space?: number\n /** 水印字体 */\n font?: string\n /** 水印字体颜色 */\n color?: string\n /** 水印字体大小 */\n fontsize?: string\n /** 水印透明度,要求设置在大于等于0.005 */\n alpha?: number\n /** 水印宽度 */\n width?: number\n /** 水印长度 */\n height?: number\n /** 水印倾斜度数 */\n angle?: number\n /** 水印的总体宽度(默认值:body的scrollWidth和clientWidth的较大值) */\n parent_width?: number\n /** 水印的总体高度(默认值:body的scrollHeight和clientHeight的较大值) */\n parent_height?: number\n /** 水印插件挂载的父元素element,不输入则默认挂在body */\n parent_node?: HTMLElement | null\n /** 是否监控,true: 不可删除水印; false: 可删水印 */\n monitor?: boolean\n}\n\n// 默认配置\nconst initialSettings: Required<SettingsType> = {\n id: 'wm_div_id',\n prefix: 'mask_div_id',\n text: '测试水印',\n x: 0,\n y: 0,\n rows: 0,\n cols: 0,\n width: 0,\n height: 0,\n x_space: 100,\n y_space: 40,\n font: '微软雅黑',\n color: 'black',\n fontsize: '18px',\n alpha: 0.15,\n zIndex: 9999999,\n angle: 15,\n parent_width: 0,\n parent_height: 0,\n parent_node: null,\n monitor: true,\n}\n\nfunction calculateTextDimensions(text: string, font: string, fontSize: string): { width: number, height: number } {\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')\n if (!context) {\n return { width: 100, height: 100 }\n }\n\n context.font = `${fontSize} ${font}`\n const metrics = context.measureText(text.trim())\n const fontSizeNum = Number.parseFloat(fontSize)\n\n // 移除 DPI 缩放,直接使用原始值\n const height = (metrics.actualBoundingBoxAscent !== undefined && metrics.actualBoundingBoxDescent !== undefined)\n ? (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent)\n : fontSizeNum\n\n return {\n width: Math.ceil(metrics.width),\n height: Math.ceil(height),\n }\n}\n\nexport function watermark() {\n const globalSetting: Required<SettingsType> = { ...initialSettings }\n let forceRemove = false\n const watermarkDom = new MutationObserver(domChangeCallback)\n const resizeObserver = new ResizeObserver(() => {\n if (!forceRemove) {\n loadMark(globalSetting)\n }\n })\n\n // 计算水印布局\n function calculateWatermarkLayout(pageWidth: number, pageHeight: number) {\n const availableWidth = pageWidth - globalSetting.x\n const availableHeight = pageHeight - globalSetting.y\n\n // 使用固定间距\n const x_space = globalSetting.x_space || 20 // 如果未设置则使用默认值\n const y_space = globalSetting.y_space || 20 // 如果未设置则使用默认值\n\n // 计算能容纳的行数和列数\n const cols = Math.ceil(availableWidth / (globalSetting.width + x_space))\n const rows = Math.ceil(availableHeight / (globalSetting.height + y_space))\n\n return {\n cols,\n rows,\n x_space,\n y_space,\n }\n }\n\n // 创建水印元素\n function createWatermarkElement(x: number, y: number, index: number): HTMLElement {\n const maskDiv = document.createElement('div')\n maskDiv.textContent = globalSetting.text\n maskDiv.id = `${globalSetting.prefix}${index}`\n\n maskDiv.style.cssText = `\n transform: rotate(-${globalSetting.angle}deg);\n position: absolute;\n left: ${x}px;\n top: ${y}px;\n overflow: hidden;\n z-index: 999999;\n opacity: ${globalSetting.alpha};\n font-size: ${globalSetting.fontsize};\n font-family: ${globalSetting.font};\n color: ${globalSetting.color};\n text-align: center;\n width: ${globalSetting.width}px;\n height: ${globalSetting.height}px;\n line-height: ${globalSetting.height}px;\n display: flex;\n align-items: center;\n justify-content: center;\n user-select: none;\n visibility: visible;\n `.replace(/\\s+/g, ' ').trim()\n\n return maskDiv\n }\n\n // 加载水印\n function loadMark(settings: Partial<SettingsType>) {\n // 先移除所有已存在的水印\n const existingWatermarks = document.querySelectorAll(`#${globalSetting.id}`)\n existingWatermarks.forEach((watermark) => {\n watermark.parentNode?.removeChild(watermark)\n })\n\n Object.assign(globalSetting, settings)\n\n if ((globalSetting.width === 0 && globalSetting.height === 0) || globalSetting.width === 0 || globalSetting.height === 0) {\n // 计算文本尺寸\n const textDimensions = calculateTextDimensions(\n globalSetting.text,\n globalSetting.font,\n globalSetting.fontsize,\n )\n const padding = 10\n if (globalSetting.width === 0) {\n globalSetting.width = textDimensions.width + padding\n }\n if (globalSetting.height === 0) {\n globalSetting.height = textDimensions.height + padding\n }\n }\n\n const parentElement = globalSetting.parent_node || document.body\n const pageWidth = Math.max(parentElement.scrollWidth, parentElement.clientWidth)\n const pageHeight = Math.max(parentElement.scrollHeight, parentElement.clientHeight)\n\n const watermarkContainer = document.createElement('div')\n watermarkContainer.id = globalSetting.id\n\n // 处理父元素定位\n if (parentElement.closest('body') && getComputedStyle(parentElement).position === 'static') {\n parentElement.style.position = 'relative'\n }\n\n watermarkContainer.style.cssText = `\n pointer-events: none;\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: ${globalSetting.zIndex};\n overflow: hidden;\n `.replace(/\\s+/g, ' ').trim()\n\n const shadowRoot = watermarkContainer.attachShadow ? watermarkContainer.attachShadow({ mode: 'open' }) : watermarkContainer\n\n parentElement.appendChild(watermarkContainer)\n\n const { cols, rows, x_space, y_space } = calculateWatermarkLayout(pageWidth, pageHeight)\n globalSetting.cols = cols\n globalSetting.rows = rows\n globalSetting.x_space = x_space\n globalSetting.y_space = y_space\n\n const fragment = document.createDocumentFragment()\n for (let i = 0; i < rows; i++) {\n const y = globalSetting.y + (globalSetting.height + y_space) * i\n for (let j = 0; j < cols; j++) {\n const x = globalSetting.x + (globalSetting.width + x_space) * j\n fragment.appendChild(createWatermarkElement(x, y, i * cols + j))\n }\n }\n shadowRoot.appendChild(fragment)\n\n if (globalSetting.monitor) {\n // 监听父元素大小变化\n resizeObserver.observe(parentElement)\n\n // 监听水印容器及其子元素\n const config: MutationObserverInit = {\n attributes: true, // 监听属性变化\n childList: true, // 监听子元素变化\n subtree: true, // 监听子树变化\n characterData: true, // 监听文本内容变化\n }\n\n // 监听水印容器\n watermarkDom.observe(watermarkContainer, config)\n\n // 如果使用了 Shadow DOM,还需要监听 shadowRoot 内的元素\n if (shadowRoot !== watermarkContainer) {\n watermarkDom.observe(shadowRoot, config)\n }\n }\n }\n\n // 移除水印\n function removeMark() {\n const watermarkElement = document.getElementById(globalSetting.id)\n watermarkDom.disconnect()\n if (watermarkElement) {\n watermarkElement.parentNode?.removeChild(watermarkElement)\n }\n }\n\n // 监听DOM变化\n function domChangeCallback(records: MutationRecord[]) {\n if (forceRemove) {\n forceRemove = false\n return\n }\n\n const watermarkElement = document.getElementById(globalSetting.id)\n if (!watermarkElement) {\n // 如果水印容器被删除,重新创建\n loadMark(globalSetting)\n return\n }\n\n // 检查是否有任何修改\n const hasChanges = records.some((record) => {\n // 检查元素是否被删除或添加\n if (record.type === 'childList') {\n return true\n }\n\n // 检查属性是否被修改\n if (record.type === 'attributes') {\n return true\n }\n\n // 检查文本内容是否被修改\n if (record.type === 'characterData') {\n return true\n }\n\n return false\n })\n\n if (hasChanges) {\n loadMark(globalSetting)\n }\n }\n\n return {\n addMark: loadMark,\n removeMark: () => {\n forceRemove = true\n // 删除这行,不重置全局配置\n // Object.assign(globalSetting, initialSettings)\n removeMark()\n },\n }\n}\n"],"names":["initialSettings","id","prefix","text","x","y","rows","cols","width","height","x_space","y_space","font","color","fontsize","alpha","zIndex","angle","parent_width","parent_height","parent_node","monitor","watermark","globalSetting","forceRemove","watermarkDom","MutationObserver","records","document","getElementById","loadMark","some","record","type","resizeObserver","ResizeObserver","createWatermarkElement","index","maskDiv","createElement","textContent","style","cssText","replace","trim","settings","querySelectorAll","forEach","parentNode","removeChild","Object","assign","textDimensions","fontSize","context","getContext","metrics","measureText","fontSizeNum","Number","parseFloat","actualBoundingBoxAscent","actualBoundingBoxDescent","Math","ceil","calculateTextDimensions","padding","parentElement","body","pageWidth","max","scrollWidth","clientWidth","pageHeight","scrollHeight","clientHeight","watermarkContainer","closest","getComputedStyle","position","shadowRoot","attachShadow","mode","appendChild","availableWidth","availableHeight","calculateWatermarkLayout","fragment","createDocumentFragment","i","j","observe","config","attributes","childList","subtree","characterData","addMark","removeMark","watermarkElement","disconnect"],"mappings":"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"}
1
+ {"version":3,"file":"watermark.mjs","sources":["../../../../packages/utils/src/watermark.ts"],"sourcesContent":["interface SettingsType {\n /** 水印总体的id */\n id?: string\n /** 小水印的id前缀 */\n prefix?: string\n /** 水印文案 */\n text?: string\n /** 水印起始位置x轴坐标 */\n x?: number\n /** 水印起始位置Y轴坐标 */\n y?: number\n /** 水印行数 */\n rows?: number\n /** 水印层级 */\n zIndex?: number\n /** 水印列数 */\n cols?: number\n /** 水印x轴间隔 */\n x_space?: number\n /** 水印y轴间隔 */\n y_space?: number\n /** 水印字体 */\n font?: string\n /** 水印字体颜色 */\n color?: string\n /** 水印字体大小 */\n fontsize?: string\n /** 水印透明度,要求设置在大于等于0.005 */\n alpha?: number\n /** 水印宽度 */\n width?: number\n /** 水印长度 */\n height?: number\n /** 水印倾斜度数 */\n angle?: number\n /** 水印的总体宽度(默认值:body的scrollWidth和clientWidth的较大值) */\n parent_width?: number\n /** 水印的总体高度(默认值:body的scrollHeight和clientHeight的较大值) */\n parent_height?: number\n /** 水印插件挂载的父元素element,不输入则默认挂在body */\n parent_node?: HTMLElement | null\n /** 是否监控,true: 不可删除水印; false: 可删水印 */\n monitor?: boolean\n}\n\n// 默认配置\nconst initialSettings: Required<SettingsType> = {\n id: 'wm_div_id',\n prefix: 'mask_div_id',\n text: '测试水印',\n x: 0,\n y: 0,\n rows: 0,\n cols: 0,\n width: 0,\n height: 0,\n x_space: 100,\n y_space: 40,\n font: '微软雅黑',\n color: 'black',\n fontsize: '18px',\n alpha: 0.15,\n zIndex: 9999999,\n angle: 15,\n parent_width: 0,\n parent_height: 0,\n parent_node: null,\n monitor: true,\n}\n\nfunction calculateTextDimensions(text: string, font: string, fontSize: string): { width: number, height: number } {\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')\n if (!context) {\n return { width: 100, height: 100 }\n }\n\n context.font = `${fontSize} ${font}`\n const metrics = context.measureText(text.trim())\n const fontSizeNum = Number.parseFloat(fontSize)\n\n // 移除 DPI 缩放,直接使用原始值\n const height = (metrics.actualBoundingBoxAscent !== undefined && metrics.actualBoundingBoxDescent !== undefined)\n ? (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent)\n : fontSizeNum\n\n return {\n width: Math.ceil(metrics.width),\n height: Math.ceil(height),\n }\n}\n\nexport function watermark() {\n const globalSetting: Required<SettingsType> = { ...initialSettings }\n let forceRemove = false\n const watermarkDom = new MutationObserver(domChangeCallback)\n const resizeObserver = new ResizeObserver(() => {\n if (!forceRemove) {\n loadMark(globalSetting)\n }\n })\n\n // 计算水印布局\n function calculateWatermarkLayout(pageWidth: number, pageHeight: number) {\n const availableWidth = pageWidth - globalSetting.x\n const availableHeight = pageHeight - globalSetting.y\n\n // 使用固定间距\n const x_space = globalSetting.x_space || 20 // 如果未设置则使用默认值\n const y_space = globalSetting.y_space || 20 // 如果未设置则使用默认值\n\n // 计算能容纳的行数和列数\n const cols = Math.ceil(availableWidth / (globalSetting.width + x_space))\n const rows = Math.ceil(availableHeight / (globalSetting.height + y_space))\n\n return {\n cols,\n rows,\n x_space,\n y_space,\n }\n }\n\n // 创建水印元素\n function createWatermarkElement(x: number, y: number, index: number): HTMLElement {\n const maskDiv = document.createElement('div')\n maskDiv.textContent = globalSetting.text\n maskDiv.id = `${globalSetting.prefix}${index}`\n\n maskDiv.style.cssText = `\n transform: rotate(-${globalSetting.angle}deg);\n position: absolute;\n left: ${x}px;\n top: ${y}px;\n overflow: hidden;\n z-index: 999999;\n opacity: ${globalSetting.alpha};\n font-size: ${globalSetting.fontsize};\n font-family: ${globalSetting.font};\n color: ${globalSetting.color};\n text-align: center;\n width: ${globalSetting.width}px;\n height: ${globalSetting.height}px;\n line-height: ${globalSetting.height}px;\n display: flex;\n align-items: center;\n justify-content: center;\n user-select: none;\n visibility: visible;\n `.replace(/\\s+/g, ' ').trim()\n\n return maskDiv\n }\n\n // 加载水印\n function loadMark(settings: Partial<SettingsType>) {\n // 先移除所有已存在的水印\n const existingWatermarks = document.querySelectorAll(`#${globalSetting.id}`)\n existingWatermarks.forEach((watermark) => {\n watermark.parentNode?.removeChild(watermark)\n })\n\n Object.assign(globalSetting, settings)\n\n if ((globalSetting.width === 0 && globalSetting.height === 0) || globalSetting.width === 0 || globalSetting.height === 0) {\n // 计算文本尺寸\n const textDimensions = calculateTextDimensions(\n globalSetting.text,\n globalSetting.font,\n globalSetting.fontsize,\n )\n const padding = 10\n if (globalSetting.width === 0) {\n globalSetting.width = textDimensions.width + padding\n }\n if (globalSetting.height === 0) {\n globalSetting.height = textDimensions.height + padding\n }\n }\n\n const parentElement = globalSetting.parent_node || document.body\n const pageWidth = Math.max(parentElement.scrollWidth, parentElement.clientWidth)\n const pageHeight = Math.max(parentElement.scrollHeight, parentElement.clientHeight)\n\n const watermarkContainer = document.createElement('div')\n watermarkContainer.id = globalSetting.id\n\n // 处理父元素定位\n if (parentElement.closest('body') && getComputedStyle(parentElement).position === 'static') {\n parentElement.style.position = 'relative'\n }\n\n watermarkContainer.style.cssText = `\n pointer-events: none;\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: ${globalSetting.zIndex};\n overflow: hidden;\n `.replace(/\\s+/g, ' ').trim()\n\n const shadowRoot = watermarkContainer.attachShadow ? watermarkContainer.attachShadow({ mode: 'open' }) : watermarkContainer\n\n parentElement.appendChild(watermarkContainer)\n\n const { cols, rows, x_space, y_space } = calculateWatermarkLayout(pageWidth, pageHeight)\n globalSetting.cols = cols\n globalSetting.rows = rows\n globalSetting.x_space = x_space\n globalSetting.y_space = y_space\n\n const fragment = document.createDocumentFragment()\n for (let i = 0; i < rows; i++) {\n const y = globalSetting.y + (globalSetting.height + y_space) * i\n for (let j = 0; j < cols; j++) {\n const x = globalSetting.x + (globalSetting.width + x_space) * j\n fragment.appendChild(createWatermarkElement(x, y, i * cols + j))\n }\n }\n shadowRoot.appendChild(fragment)\n\n if (globalSetting.monitor) {\n // 监听父元素大小变化\n resizeObserver.observe(parentElement)\n\n // 监听水印容器及其子元素\n const config: MutationObserverInit = {\n attributes: true, // 监听属性变化\n childList: true, // 监听子元素变化\n subtree: true, // 监听子树变化\n characterData: true, // 监听文本内容变化\n }\n\n // 监听水印容器\n watermarkDom.observe(watermarkContainer, config)\n\n // 如果使用了 Shadow DOM,还需要监听 shadowRoot 内的元素\n if (shadowRoot !== watermarkContainer) {\n watermarkDom.observe(shadowRoot, config)\n }\n }\n }\n\n // 移除水印\n function removeMark() {\n const watermarkElement = document.getElementById(globalSetting.id)\n watermarkDom.disconnect()\n if (watermarkElement) {\n watermarkElement.parentNode?.removeChild(watermarkElement)\n }\n }\n\n // 监听DOM变化\n function domChangeCallback(records: MutationRecord[]) {\n if (forceRemove) {\n forceRemove = false\n return\n }\n\n const watermarkElement = document.getElementById(globalSetting.id)\n if (!watermarkElement) {\n // 如果水印容器被删除,重新创建\n loadMark(globalSetting)\n return\n }\n\n // 检查是否有任何修改\n const hasChanges = records.some((record) => {\n // 检查元素是否被删除或添加\n if (record.type === 'childList') {\n return true\n }\n\n // 检查属性是否被修改\n if (record.type === 'attributes') {\n return true\n }\n\n // 检查文本内容是否被修改\n if (record.type === 'characterData') {\n return true\n }\n\n return false\n })\n\n if (hasChanges) {\n loadMark(globalSetting)\n }\n }\n\n return {\n addMark: loadMark,\n removeMark: () => {\n forceRemove = true\n // 删除这行,不重置全局配置\n // Object.assign(globalSetting, initialSettings)\n removeMark()\n },\n }\n}\n"],"names":["initialSettings","id","prefix","text","x","y","rows","cols","width","height","x_space","y_space","font","color","fontsize","alpha","zIndex","angle","parent_width","parent_height","parent_node","monitor","watermark","globalSetting","forceRemove","watermarkDom","MutationObserver","records","document","getElementById","loadMark","some","record","type","resizeObserver","ResizeObserver","createWatermarkElement","index","maskDiv","createElement","textContent","style","cssText","replace","trim","settings","querySelectorAll","forEach","parentNode","removeChild","Object","assign","textDimensions","fontSize","context","getContext","metrics","measureText","fontSizeNum","Number","parseFloat","actualBoundingBoxAscent","actualBoundingBoxDescent","Math","ceil","calculateTextDimensions","padding","parentElement","body","pageWidth","max","scrollWidth","clientWidth","pageHeight","scrollHeight","clientHeight","watermarkContainer","closest","getComputedStyle","position","shadowRoot","attachShadow","mode","appendChild","availableWidth","availableHeight","calculateWatermarkLayout","fragment","createDocumentFragment","i","j","observe","config","attributes","childList","subtree","characterData","addMark","removeMark","watermarkElement","disconnect"],"mappings":"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"}
package/lib/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("./src/argo-log.cjs"),r=require("./src/date-transfer.cjs"),s=require("./src/device.cjs"),o=require("./src/file-operations.cjs"),i=require("./src/json.cjs"),t=require("./src/oss-uploader.cjs"),p=require("./src/set-guid.cjs"),a=require("./src/storage.cjs"),c=require("./src/types.cjs"),n=require("./src/use-api.cjs"),d=require("./src/watermark.cjs");exports.ArgoLog=e.ArgoLog,exports.formatDuration=r.formatDuration,exports.getDeviceType=s.getDeviceType,exports.isAndroid=s.isAndroid,exports.isIOS=s.isIOS,exports.isMobile=s.isMobile,exports.createVideoUploader=o.createVideoUploader,exports.downloadFile=o.downloadFile,exports.JsonToExcel=i.JsonToExcel,exports.excelToJson=i.excelToJson,exports.OssError=t.OssError,exports.OssUploader=t.OssUploader,exports.generateSignedUrl=t.generateSignedUrl,exports.uploadFile=t.uploadFile,exports.setGuid=p.setGuid,exports.Storage=a.Storage,exports.isBoolean=c.isBoolean,exports.isElement=c.isElement,exports.isImageByMimeType=c.isImageByMimeType,exports.isJSONString=c.isJSONString,exports.isNumber=c.isNumber,exports.isPlainObject=c.isPlainObject,exports.isUndefined=c.isUndefined,exports.isWindow=c.isWindow,exports.ApiService=n.ApiService,exports.watermark=d.watermark;
1
+ "use strict";var e=require("./src/argo-log.cjs"),r=require("./src/date-transfer.cjs"),s=require("./src/device.cjs"),o=require("./src/file-operations.cjs"),i=require("./src/json.cjs"),t=require("./src/oss-uploader.cjs"),p=require("./src/storage.cjs"),a=require("./src/types.cjs"),c=require("./src/use-api.cjs"),n=require("./src/watermark.cjs");exports.ArgoLog=e.ArgoLog,exports.formatDuration=r.formatDuration,exports.getDeviceType=s.getDeviceType,exports.isAndroid=s.isAndroid,exports.isIOS=s.isIOS,exports.isMobile=s.isMobile,exports.createVideoUploader=o.createVideoUploader,exports.downloadFile=o.downloadFile,exports.JsonToExcel=i.JsonToExcel,exports.excelToJson=i.excelToJson,exports.OssError=t.OssError,exports.OssUploader=t.OssUploader,exports.generateSignedUrl=t.generateSignedUrl,exports.uploadFile=t.uploadFile,exports.Storage=p.Storage,exports.isBoolean=a.isBoolean,exports.isElement=a.isElement,exports.isImageByMimeType=a.isImageByMimeType,exports.isJSONString=a.isJSONString,exports.isNumber=a.isNumber,exports.isPlainObject=a.isPlainObject,exports.isUndefined=a.isUndefined,exports.isWindow=a.isWindow,exports.ApiService=c.ApiService,exports.watermark=n.watermark;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,2 +1,2 @@
1
- "use strict";var e=Object.defineProperty,s=(s,n,t)=>((s,n,t)=>n in s?e(s,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[n]=t)(s,"symbol"!=typeof n?n+"":n,t);const n=class e{constructor(n){s(this,"AnalysysAgent",null),s(this,"pendingQueue",[]),s(this,"track",((e,s)=>{const n=()=>{e?this.AnalysysAgent.track(e,s):console.warn("[ArgoLog] track: name is required")};if(!this.AnalysysAgent)return this.pendingQueue.push(n),void console.info("[ArgoLog] track: SDK 未初始化,调用已暂存");try{n()}catch(e){console.warn("[ArgoLog] track failed:",e)}})),s(this,"setProfile",(e=>{const s=()=>{e?this.AnalysysAgent.profileSet(e):console.warn("[ArgoLog] setProfile: info is required")};if(!this.AnalysysAgent)return this.pendingQueue.push(s),void console.info("[ArgoLog] setProfile: SDK 未初始化,调用已暂存");try{s()}catch(e){console.warn("[ArgoLog] setProfile failed:",e)}})),s(this,"setAlias",(e=>{const s=()=>{e?this.AnalysysAgent.alias(e):console.warn("[ArgoLog] setAlias: code is required")};if(!this.AnalysysAgent)return this.pendingQueue.push(s),void console.info("[ArgoLog] setAlias: SDK 未初始化,调用已暂存");try{s()}catch(e){console.warn("[ArgoLog] setAlias failed:",e)}}));try{if("undefined"==typeof window)return console.warn("[ArgoLog] 仅支持浏览器环境"),this;const s=JSON.stringify(n),t=e.instances.get(s);if(t)return t;if(!n)return console.error("envConfig is required"),this;import("ans-javascript-sdk").then((t=>{this.AnalysysAgent=t.default,this.AnalysysAgent.init(n),e.instances.set(s,this),this.pendingQueue.forEach((e=>e())),this.pendingQueue=[]})).catch((e=>{console.warn("[ArgoLog] SDK 加载失败:",e)}))}catch(e){console.warn("[ArgoLog] Init failed:",e)}return this}};s(n,"instances",new Map);let t=n;exports.ArgoLog=t;
1
+ "use strict";var i=Object.defineProperty,s=(s,t,e)=>((s,t,e)=>t in s?i(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e)(s,"symbol"!=typeof t?t+"":t,e);const t=class i{constructor(){s(this,"sdkPromise",null),s(this,"sdk",null)}static getInstance(){return i.instance||(i.instance=new i),i.instance}async loadSDK(){if(this.sdk)return this.sdk;if(this.sdkPromise)return this.sdkPromise;if("undefined"==typeof window)return console.warn("[ArgoLog] 仅支持浏览器环境"),null;const i=window;return i.__argoLogSDKPromise?(this.sdkPromise=i.__argoLogSDKPromise,this.sdk=await this.sdkPromise,this.sdk):(this.sdkPromise=this.createSDKPromise(),i.__argoLogSDKPromise=this.sdkPromise,this.sdk=await this.sdkPromise,this.sdk)}async createSDKPromise(){try{return(await import("ans-javascript-sdk")).default}catch(i){return console.warn("[ArgoLog] SDK 加载失败,使用 mock 实现:",i),this.createMockSDK()}}createMockSDK(){return{init:i=>{console.log("[ArgoLog Mock] SDK 初始化:",i)},track:(i,s)=>{console.log("[ArgoLog Mock] 追踪事件:",i,s)},profileSet:i=>{console.log("[ArgoLog Mock] 设置用户画像:",i)},alias:i=>{console.log("[ArgoLog Mock] 设置用户别名:",i)}}}getSDK(){return this.sdk}isLoaded(){return null!==this.sdk}};s(t,"instance");const e=t.getInstance(),n=class i{constructor(t){s(this,"AnalysysAgent",null),s(this,"pendingQueue",[]),s(this,"isInitialized",!1),s(this,"isInitializing",!1),s(this,"track",(i,s)=>{const t=()=>{i?this.AnalysysAgent&&this.AnalysysAgent.track(i,s):console.warn("[ArgoLog] track: name is required")};if(this.isInitialized)try{t()}catch(i){console.warn("[ArgoLog] track failed:",i)}else this.pendingQueue.push(t)}),s(this,"setProfile",i=>{const s=()=>{i?this.AnalysysAgent&&this.AnalysysAgent.profileSet(i):console.warn("[ArgoLog] setProfile: info is required")};if(this.isInitialized)try{s()}catch(i){console.warn("[ArgoLog] setProfile failed:",i)}else this.pendingQueue.push(s)}),s(this,"setAlias",i=>{const s=()=>{i?this.AnalysysAgent&&this.AnalysysAgent.alias(i):console.warn("[ArgoLog] setAlias: code is required")};if(this.isInitialized)try{s()}catch(i){console.warn("[ArgoLog] setAlias failed:",i)}else this.pendingQueue.push(s)});try{if("undefined"==typeof window)return console.warn("[ArgoLog] 仅支持浏览器环境"),this;const s=JSON.stringify(t),e=i.instances.get(s);if(e)return e;if(!t)return console.error("[ArgoLog] envConfig is required"),this;this.initializeSDK(t,s)}catch(i){console.warn("[ArgoLog] Init failed:",i)}return this}async initializeSDK(s,t){if(!this.isInitializing&&!this.isInitialized){this.isInitializing=!0;try{const n=await e.loadSDK();n?(this.AnalysysAgent=n,n.init(s),this.isInitialized=!0,i.instances.set(t,this),this.processPendingQueue()):console.warn("[ArgoLog] SDK 加载失败")}catch(i){console.warn("[ArgoLog] SDK 初始化失败:",i)}finally{this.isInitializing=!1}}}processPendingQueue(){this.pendingQueue.forEach(i=>i()),this.pendingQueue=[]}get initialized(){return this.isInitialized}async waitForInitialization(){if(this.isInitialized)return!0;const i=Date.now();for(;!this.isInitialized&&Date.now()-i<5e3;)await new Promise(i=>setTimeout(i,100));return this.isInitialized}};s(n,"instances",new Map);let o=n;exports.ArgoLog=o;
2
2
  //# sourceMappingURL=argo-log.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"argo-log.cjs","sources":["../../../../packages/utils/src/argo-log.ts"],"sourcesContent":["// 定义配置项的类型别名\nexport interface EnvironmentConfig {\n encryptType?: number\n debugMode?: number\n appkey: string\n uploadURL: string\n autoProfile?: boolean\n autoTrack?: boolean\n}\n\n/**\n * ArgoLog 类 - 用于处理埋点统计的工具类\n *\n * @class ArgoLog\n * @description 基于 AnalysysAgent SDK 封装的埋点工具类,提供了埋点追踪、用户画像设置和用户别名设置等功能\n * @example\n * ```typescript\n * const argoLog = new ArgoLog({\n * appkey: 'your-app-key',\n * uploadURL: 'your-upload-url'\n * });\n *\n * // 追踪事件\n * argoLog.track('event_name', { key: 'value' });\n * ```\n */\nexport class ArgoLog<T = EnvironmentConfig> {\n private static instances = new Map<string, ArgoLog<any>>()\n private AnalysysAgent: any | null = null\n private pendingQueue: Array<() => void> = []\n\n constructor(envConfig: T) {\n try {\n if (typeof window === 'undefined') {\n console.warn('[ArgoLog] 仅支持浏览器环境')\n return this\n }\n\n const configKey = JSON.stringify(envConfig)\n const existingInstance = ArgoLog.instances.get(configKey)\n if (existingInstance) {\n return existingInstance\n }\n\n if (!envConfig) {\n console.error('envConfig is required')\n return this\n }\n\n import('ans-javascript-sdk').then((module) => {\n this.AnalysysAgent = module.default\n this.AnalysysAgent.init(envConfig)\n ArgoLog.instances.set(configKey, this)\n // SDK 初始化完成后,重放所有暂存的调用\n this.pendingQueue.forEach(fn => fn())\n this.pendingQueue = []\n }).catch((error) => {\n console.warn('[ArgoLog] SDK 加载失败:', error)\n })\n }\n catch (error) {\n console.warn('[ArgoLog] Init failed:', error)\n }\n return this\n }\n\n track = (name: string, opt?: Record<string, any>): void => {\n const exec = () => {\n if (!name) {\n console.warn('[ArgoLog] track: name is required')\n return\n }\n this.AnalysysAgent.track(name, opt)\n }\n if (!this.AnalysysAgent) {\n // SDK 未初始化,暂存调用\n this.pendingQueue.push(exec)\n console.info('[ArgoLog] track: SDK 未初始化,调用已暂存')\n return\n }\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] track failed:', error)\n }\n }\n\n setProfile = (info: Record<string, any>): void => {\n const exec = () => {\n if (!info) {\n console.warn('[ArgoLog] setProfile: info is required')\n return\n }\n this.AnalysysAgent.profileSet(info)\n }\n if (!this.AnalysysAgent) {\n this.pendingQueue.push(exec)\n console.info('[ArgoLog] setProfile: SDK 未初始化,调用已暂存')\n return\n }\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] setProfile failed:', error)\n }\n }\n\n setAlias = (code: string): void => {\n const exec = () => {\n if (!code) {\n console.warn('[ArgoLog] setAlias: code is required')\n return\n }\n this.AnalysysAgent.alias(code)\n }\n if (!this.AnalysysAgent) {\n this.pendingQueue.push(exec)\n console.info('[ArgoLog] setAlias: SDK 未初始化,调用已暂存')\n return\n }\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] setAlias failed:', error)\n }\n }\n}\n"],"names":["_ArgoLog","constructor","envConfig","__publicField","this","name","opt","exec","AnalysysAgent","track","console","warn","pendingQueue","push","info","error","profileSet","code","alias","window","configKey","JSON","stringify","existingInstance","instances","get","import","then","module","default","init","set","forEach","fn","catch","Map","ArgoLog"],"mappings":"uKA0BO,MAAMA,EAAN,MAAMA,EAKXC,WAAAA,CAAYC,GAHZC,EAAAC,KAAQ,gBAA4B,MACpCD,EAAAC,KAAQ,eAAkC,IAqClCD,EAAAC,KAAA,SAAA,CAACC,EAAcC,KACrB,MAAMC,EAAOA,KACNF,EAIAD,KAAAI,cAAcC,MAAMJ,EAAMC,GAH7BI,QAAQC,KAAK,oCAGmB,EAEhC,IAACP,KAAKI,cAIR,OAFKJ,KAAAQ,aAAaC,KAAKN,QACvBG,QAAQI,KAAK,mCAGX,IACGP,UAEAQ,GACGL,QAAAC,KAAK,0BAA2BI,EAC1C,KAGFZ,EAAAC,KAAA,cAAcU,IACZ,MAAMP,EAAOA,KACNO,EAIAV,KAAAI,cAAcQ,WAAWF,GAH5BJ,QAAQC,KAAK,yCAGmB,EAEhC,IAACP,KAAKI,cAGR,OAFKJ,KAAAQ,aAAaC,KAAKN,QACvBG,QAAQI,KAAK,wCAGX,IACGP,UAEAQ,GACGL,QAAAC,KAAK,+BAAgCI,EAC/C,KAGFZ,EAAAC,KAAA,YAAYa,IACV,MAAMV,EAAOA,KACNU,EAIAb,KAAAI,cAAcU,MAAMD,GAHvBP,QAAQC,KAAK,uCAGc,EAE3B,IAACP,KAAKI,cAGR,OAFKJ,KAAAQ,aAAaC,KAAKN,QACvBG,QAAQI,KAAK,sCAGX,IACGP,UAEAQ,GACGL,QAAAC,KAAK,6BAA8BI,EAC7C,KA/FI,IACE,GAAkB,oBAAXI,OAEF,OADPT,QAAQC,KAAK,sBACNP,KAGH,MAAAgB,EAAYC,KAAKC,UAAUpB,GAC3BqB,EAAmBvB,EAAQwB,UAAUC,IAAIL,GAC/C,GAAIG,EACK,OAAAA,EAGT,IAAKrB,EAEI,OADPQ,QAAQK,MAAM,yBACPX,KAGTsB,OAAO,sBAAsBC,MAAMC,IACjCxB,KAAKI,cAAgBoB,EAAOC,QACvBzB,KAAAI,cAAcsB,KAAK5B,GAChBF,EAAAwB,UAAUO,IAAIX,EAAWhB,MAEjCA,KAAKQ,aAAaoB,SAAcC,GAAAA,MAChC7B,KAAKQ,aAAe,EAAC,IACpBsB,OAAOnB,IACAL,QAAAC,KAAK,sBAAuBI,EAAK,UAGtCA,GACGL,QAAAC,KAAK,yBAA0BI,EACzC,CACO,OAAAX,IACT,GArCAD,EADWH,EACI,YAAY,IAAImC,KAD1B,IAAMC,EAANpC"}
1
+ {"version":3,"file":"argo-log.cjs","sources":["../../../../packages/utils/src/argo-log.ts"],"sourcesContent":["// SDK 配置接口\nexport interface AnalysysConfig {\n encryptType?: number\n debugMode?: number\n appkey: string\n uploadURL: string\n autoProfile?: boolean\n autoTrack?: boolean\n}\n\n// SDK 实例接口\nexport interface AnalysysAgentInterface {\n init: (config: AnalysysConfig) => void\n track: (eventName: string, properties?: Record<string, any>) => void\n profileSet: (properties: Record<string, any>) => void\n alias: (aliasId: string) => void\n}\n\n// 全局窗口类型扩展\ndeclare global {\n interface Window {\n __argoLogSDKPromise?: Promise<AnalysysAgentInterface | null>\n }\n}\n\n// 定义配置项的类型别名,保持向后兼容\nexport interface EnvironmentConfig extends AnalysysConfig {}\n\n/**\n * SDK 加载器 - 统一管理 SDK 的加载和初始化\n */\nclass SDKLoader {\n private static instance: SDKLoader\n private sdkPromise: Promise<AnalysysAgentInterface | null> | null = null\n private sdk: AnalysysAgentInterface | null = null\n\n private constructor() {}\n\n static getInstance(): SDKLoader {\n if (!SDKLoader.instance) {\n SDKLoader.instance = new SDKLoader()\n }\n return SDKLoader.instance\n }\n\n /**\n * 加载 SDK\n */\n async loadSDK(): Promise<AnalysysAgentInterface | null> {\n // 如果已经加载过,直接返回\n if (this.sdk) {\n return this.sdk\n }\n\n // 如果正在加载,等待加载完成\n if (this.sdkPromise) {\n return this.sdkPromise\n }\n\n // 检查浏览器环境\n if (typeof window === 'undefined') {\n console.warn('[ArgoLog] 仅支持浏览器环境')\n return null\n }\n\n // 检查是否已有全局 Promise\n const windowAny = window as any\n if (windowAny.__argoLogSDKPromise) {\n this.sdkPromise = windowAny.__argoLogSDKPromise\n this.sdk = await this.sdkPromise\n return this.sdk\n }\n\n // 创建新的加载 Promise\n this.sdkPromise = this.createSDKPromise()\n windowAny.__argoLogSDKPromise = this.sdkPromise\n\n this.sdk = await this.sdkPromise\n return this.sdk\n }\n\n /**\n * 创建 SDK 加载 Promise\n */\n private async createSDKPromise(): Promise<AnalysysAgentInterface | null> {\n try {\n // 尝试动态导入\n const module = await import('ans-javascript-sdk')\n return module.default as AnalysysAgentInterface\n }\n catch (error) {\n // 在 docs 环境中,可能无法加载 SDK,提供一个 mock 实现\n console.warn('[ArgoLog] SDK 加载失败,使用 mock 实现:', error)\n return this.createMockSDK()\n }\n }\n\n /**\n * 创建 Mock SDK - 用于开发和文档环境\n */\n private createMockSDK(): AnalysysAgentInterface {\n return {\n init: (config) => {\n console.log('[ArgoLog Mock] SDK 初始化:', config)\n },\n track: (eventName, properties) => {\n console.log('[ArgoLog Mock] 追踪事件:', eventName, properties)\n },\n profileSet: (properties) => {\n console.log('[ArgoLog Mock] 设置用户画像:', properties)\n },\n alias: (aliasId) => {\n console.log('[ArgoLog Mock] 设置用户别名:', aliasId)\n },\n }\n }\n\n /**\n * 获取已加载的 SDK\n */\n getSDK(): AnalysysAgentInterface | null {\n return this.sdk\n }\n\n /**\n * 检查 SDK 是否已加载\n */\n isLoaded(): boolean {\n return this.sdk !== null\n }\n}\n\n// SDK 加载器单例\nconst sdkLoader = SDKLoader.getInstance()\n\n/**\n * ArgoLog 类 - 用于处理埋点统计的工具类\n *\n * @class ArgoLog\n * @description 基于 AnalysysAgent SDK 封装的埋点工具类,提供了埋点追踪、用户画像设置和用户别名设置等功能\n * @example\n * ```typescript\n * const argoLog = new ArgoLog({\n * appkey: 'your-app-key',\n * uploadURL: 'your-upload-url'\n * });\n *\n * // 追踪事件\n * argoLog.track('event_name', { key: 'value' });\n * ```\n */\nexport class ArgoLog<T extends EnvironmentConfig = EnvironmentConfig> {\n private static instances = new Map<string, ArgoLog<any>>()\n private AnalysysAgent: AnalysysAgentInterface | null = null\n private pendingQueue: Array<() => void> = []\n private isInitialized = false\n private isInitializing = false\n\n constructor(envConfig: T) {\n try {\n if (typeof window === 'undefined') {\n console.warn('[ArgoLog] 仅支持浏览器环境')\n return this\n }\n\n const configKey = JSON.stringify(envConfig)\n const existingInstance = ArgoLog.instances.get(configKey)\n if (existingInstance) {\n return existingInstance\n }\n\n if (!envConfig) {\n console.error('[ArgoLog] envConfig is required')\n return this\n }\n\n this.initializeSDK(envConfig, configKey)\n }\n catch (error) {\n console.warn('[ArgoLog] Init failed:', error)\n }\n return this\n }\n\n private async initializeSDK(envConfig: T, configKey: string) {\n if (this.isInitializing || this.isInitialized) {\n return\n }\n\n this.isInitializing = true\n\n try {\n // 使用 SDK 加载器加载 SDK\n const sdk = await sdkLoader.loadSDK()\n\n if (sdk) {\n this.AnalysysAgent = sdk\n sdk.init(envConfig)\n this.isInitialized = true\n ArgoLog.instances.set(configKey, this)\n this.processPendingQueue()\n }\n else {\n console.warn('[ArgoLog] SDK 加载失败')\n }\n }\n catch (error) {\n console.warn('[ArgoLog] SDK 初始化失败:', error)\n }\n finally {\n this.isInitializing = false\n }\n }\n\n private processPendingQueue() {\n // SDK 初始化完成后,重放所有暂存的调用\n this.pendingQueue.forEach(fn => fn())\n this.pendingQueue = []\n }\n\n track = (name: string, opt?: Record<string, any>): void => {\n const exec = () => {\n if (!name) {\n console.warn('[ArgoLog] track: name is required')\n return\n }\n if (this.AnalysysAgent) {\n this.AnalysysAgent.track(name, opt)\n }\n }\n\n if (!this.isInitialized) {\n // SDK 未初始化,暂存调用\n this.pendingQueue.push(exec)\n // 静默处理,不显示暂存信息,避免用户困惑\n return\n }\n\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] track failed:', error)\n }\n }\n\n setProfile = (info: Record<string, any>): void => {\n const exec = () => {\n if (!info) {\n console.warn('[ArgoLog] setProfile: info is required')\n return\n }\n if (this.AnalysysAgent) {\n this.AnalysysAgent.profileSet(info)\n }\n }\n\n if (!this.isInitialized) {\n this.pendingQueue.push(exec)\n // 静默处理,不显示暂存信息\n return\n }\n\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] setProfile failed:', error)\n }\n }\n\n setAlias = (code: string): void => {\n const exec = () => {\n if (!code) {\n console.warn('[ArgoLog] setAlias: code is required')\n return\n }\n if (this.AnalysysAgent) {\n this.AnalysysAgent.alias(code)\n }\n }\n\n if (!this.isInitialized) {\n this.pendingQueue.push(exec)\n // 静默处理,不显示暂存信息\n return\n }\n\n try {\n exec()\n }\n catch (error) {\n console.warn('[ArgoLog] setAlias failed:', error)\n }\n }\n\n /**\n * 获取 SDK 初始化状态\n */\n get initialized(): boolean {\n return this.isInitialized\n }\n\n /**\n * 等待 SDK 初始化完成\n */\n async waitForInitialization(): Promise<boolean> {\n if (this.isInitialized) {\n return true\n }\n\n // 等待最多 5 秒\n const timeout = 5000\n const startTime = Date.now()\n\n while (!this.isInitialized && (Date.now() - startTime) < timeout) {\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n return this.isInitialized\n }\n}\n"],"names":["_SDKLoader","constructor","__publicField","this","getInstance","instance","loadSDK","sdk","sdkPromise","window","console","warn","windowAny","__argoLogSDKPromise","createSDKPromise","import","default","error","createMockSDK","init","config","log","track","eventName","properties","profileSet","alias","aliasId","getSDK","isLoaded","sdkLoader","_ArgoLog","envConfig","name","opt","exec","AnalysysAgent","isInitialized","pendingQueue","push","info","code","configKey","JSON","stringify","existingInstance","instances","get","initializeSDK","isInitializing","set","processPendingQueue","forEach","fn","initialized","waitForInitialization","startTime","Date","now","Promise","resolve","setTimeout","Map","ArgoLog"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"date-transfer.cjs","sources":["../../../../packages/utils/src/date-transfer.ts"],"sourcesContent":["/**\n * 智能格式化毫秒时间\n * @param ms 毫秒数\n * @returns 格式化后的时间字符串\n *\n * 规则:\n * 1. 小于1小时:显示 MM:SS\n * 2. 小于24小时:显示 HH:MM:SS\n * 3. 大于等于24小时:显示 x天x小时x分钟\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000)\n const minutes = Math.floor(seconds / 60)\n const hours = Math.floor(minutes / 60)\n const days = Math.floor(hours / 24)\n\n const pad = (num: number) => num.toString().padStart(2, '0')\n\n // 如果时间小于1小时,返回 MM:SS\n if (hours < 1) {\n const mm = pad(minutes % 60)\n const ss = pad(seconds % 60)\n return `${mm}:${ss}`\n }\n\n // 如果时间小于24小时,返回 HH:MM:SS\n if (days < 1) {\n const hh = pad(hours)\n const mm = pad(minutes % 60)\n const ss = pad(seconds % 60)\n return `${hh}:${mm}:${ss}`\n }\n\n // 如果时间大于等于24小时,返回 x天x小时x分钟\n const remainingHours = hours % 24\n const remainingMinutes = minutes % 60\n\n const parts: string[] = []\n if (days > 0) {\n parts.push(`${days}天`)\n }\n if (remainingHours > 0) {\n parts.push(`${remainingHours}小时`)\n }\n if (remainingMinutes > 0) {\n parts.push(`${remainingMinutes}分钟`)\n }\n\n return parts.join('')\n}\n"],"names":["ms","seconds","Math","floor","minutes","hours","days","pad","num","toString","padStart","remainingHours","remainingMinutes","parts","push","join"],"mappings":"oCAUO,SAAwBA,GAC7B,MAAMC,EAAUC,KAAKC,MAAMH,EAAK,KAC1BI,EAAUF,KAAKC,MAAMF,EAAU,IAC/BI,EAAQH,KAAKC,MAAMC,EAAU,IAC7BE,EAAOJ,KAAKC,MAAME,EAAQ,IAE1BE,EAAOC,GAAgBA,EAAIC,WAAWC,SAAS,EAAG,KAGxD,GAAIL,EAAQ,EAAG,CAGN,MAAA,GAFIE,EAAIH,EAAU,OACdG,EAAIN,EAAU,KAE3B,CAGA,GAAIK,EAAO,EAAG,CAIZ,MAAO,GAHIC,EAAIF,MACJE,EAAIH,EAAU,OACdG,EAAIN,EAAU,KAE3B,CAGA,MAAMU,EAAiBN,EAAQ,GACzBO,EAAmBR,EAAU,GAE7BS,EAAkB,GAWjB,OAVHP,EAAO,GACHO,EAAAC,KAAK,GAAGR,MAEZK,EAAiB,GACbE,EAAAC,KAAK,GAAGH,OAEZC,EAAmB,GACfC,EAAAC,KAAK,GAAGF,OAGTC,EAAME,KAAK,GACpB"}
1
+ {"version":3,"file":"date-transfer.cjs","sources":["../../../../packages/utils/src/date-transfer.ts"],"sourcesContent":["/**\n * 智能格式化毫秒时间\n * @param ms 毫秒数\n * @returns 格式化后的时间字符串\n *\n * 规则:\n * 1. 小于1小时:显示 MM:SS\n * 2. 小于24小时:显示 HH:MM:SS\n * 3. 大于等于24小时:显示 x天x小时x分钟\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000)\n const minutes = Math.floor(seconds / 60)\n const hours = Math.floor(minutes / 60)\n const days = Math.floor(hours / 24)\n\n const pad = (num: number) => num.toString().padStart(2, '0')\n\n // 如果时间小于1小时,返回 MM:SS\n if (hours < 1) {\n const mm = pad(minutes % 60)\n const ss = pad(seconds % 60)\n return `${mm}:${ss}`\n }\n\n // 如果时间小于24小时,返回 HH:MM:SS\n if (days < 1) {\n const hh = pad(hours)\n const mm = pad(minutes % 60)\n const ss = pad(seconds % 60)\n return `${hh}:${mm}:${ss}`\n }\n\n // 如果时间大于等于24小时,返回 x天x小时x分钟\n const remainingHours = hours % 24\n const remainingMinutes = minutes % 60\n\n const parts: string[] = []\n if (days > 0) {\n parts.push(`${days}天`)\n }\n if (remainingHours > 0) {\n parts.push(`${remainingHours}小时`)\n }\n if (remainingMinutes > 0) {\n parts.push(`${remainingMinutes}分钟`)\n }\n\n return parts.join('')\n}\n"],"names":["ms","seconds","Math","floor","minutes","hours","days","pad","num","toString","padStart","remainingHours","remainingMinutes","parts","push","join"],"mappings":"oCAUO,SAAwBA,GAC7B,MAAMC,EAAUC,KAAKC,MAAMH,EAAK,KAC1BI,EAAUF,KAAKC,MAAMF,EAAU,IAC/BI,EAAQH,KAAKC,MAAMC,EAAU,IAC7BE,EAAOJ,KAAKC,MAAME,EAAQ,IAE1BE,EAAOC,GAAgBA,EAAIC,WAAWC,SAAS,EAAG,KAGxD,GAAIL,EAAQ,EAAG,CAGb,MAAO,GAFIE,EAAIH,EAAU,OACdG,EAAIN,EAAU,KAE3B,CAGA,GAAIK,EAAO,EAAG,CAIZ,MAAO,GAHIC,EAAIF,MACJE,EAAIH,EAAU,OACdG,EAAIN,EAAU,KAE3B,CAGA,MAAMU,EAAiBN,EAAQ,GACzBO,EAAmBR,EAAU,GAE7BS,EAAkB,GAWxB,OAVIP,EAAO,GACTO,EAAMC,KAAK,GAAGR,MAEZK,EAAiB,GACnBE,EAAMC,KAAK,GAAGH,OAEZC,EAAmB,GACrBC,EAAMC,KAAK,GAAGF,OAGTC,EAAME,KAAK,GACpB"}