@djvlc/runtime-host-vue 1.0.9 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=require("vue"),t=require("@djvlc/runtime-core");function r(r){const n=e.shallowRef(null),a=e.ref(!0),o=e.ref("idle"),i=e.shallowRef(null),s=e.shallowRef(null),l=e.shallowRef(null),c=e.computed(()=>"ready"===o.value),u=e.computed(()=>"error"===o.value||null!==s.value),d=e.shallowRef({initTime:0,loadTime:0,renderTime:0,totalTime:0,initTimestamp:null,readyTimestamp:null});let p=0,m=0,f=0,y=0;const h=async()=>{if(!n.value)throw new Error("Runtime not initialized");f=performance.now();const e=await n.value.load();return i.value=e,l.value=n.value.getHostApi(),r.enableMetrics&&(d.value={...d.value,loadTime:performance.now()-f}),e},v=async()=>{if(!n.value)throw new Error("Runtime not initialized");if(y=performance.now(),await n.value.render(),a.value=!1,r.enableMetrics){const e=performance.now();d.value={...d.value,renderTime:e-y,totalTime:e-p,readyTimestamp:Date.now()}}};return{runtime:n,loading:e.readonly(a),phase:e.readonly(o),page:i,error:s,hostApi:l,isReady:c,hasError:u,metrics:d,init:async()=>{const e=r.containerRef?.value;if(!e)throw new Error("Container element not found");p=performance.now(),m=p,r.enableMetrics&&(d.value={...d.value,initTimestamp:Date.now()});const c=t.createRuntime({...r,container:e,onError:e=>{s.value=e,r.onError?.(e)},onEvent:e=>{r.onEvent?.(e)}});n.value=c,c.onStateChange(e=>{o.value=e.phase,a.value="ready"!==e.phase&&"error"!==e.phase,e.page&&(i.value=e.page),e.error&&(s.value=e.error)}),await c.init(),l.value=c.getHostApi(),r.enableMetrics&&(d.value={...d.value,initTime:performance.now()-m})},load:h,render:v,destroy:()=>{n.value?.destroy(),n.value=null,l.value=null,i.value=null,s.value=null,o.value="idle",a.value=!0},reload:async()=>{if(!n.value)throw new Error("Runtime not initialized");s.value=null,a.value=!0,await h(),await v()},setVariable:(e,t)=>{n.value?.setVariable(e,t)},setVariables:e=>{n.value&&Object.entries(e).forEach(([e,t])=>{n.value?.setVariable(e,t)})},getVariable:e=>n.value?.getState().variables[e],refreshData:async e=>{await(n.value?.refreshData(e))},executeAction:async(e,t)=>{const r=l.value;if(!r)throw new Error("HostAPI not available");const n=await r.executeAction(e,t||{});if(n.success)return n.data;throw new Error(n.errorMessage||"Action failed")}}}var n=Symbol("DJVRuntime");function a(t){e.provide(n,t)}function o(){const t=e.inject(n);if(!t)throw new Error("useDJVRuntime must be used within a DJVProvider");return t}function i(t,r){const n=o(),a=e.ref(!1),i=e.shallowRef(),s=e.ref(null),l=e.ref(0),c=async(e,a)=>{const o=n.value.hostApi;if(!o)throw new Error("HostAPI not available");try{const r=await o.executeAction(t,e);if(r.success)return r.data;throw new Error(r.errorMessage||"Action failed")}catch(t){if(a>0)return await new Promise(e=>setTimeout(e,r?.retryDelay||1e3)),c(e,a-1);throw t}};return{execute:async e=>{a.value=!0,s.value=null,l.value++;try{const t=await c(e,r?.retryCount||0);return i.value=t,r?.onSuccess?.(t),t}catch(e){const t=e;throw s.value=t,r?.onError?.(t),e}finally{a.value=!1}},loading:a,result:i,error:s,reset:()=>{i.value=void 0,s.value=null,l.value=0},executionCount:l}}var s=e.defineComponent({name:"DJVRenderer",props:{pageId:{type:String,required:!0},apiBaseUrl:{type:String,required:!0},cdnBaseUrl:{type:String,required:!0},userApiAdapter:{type:Object,required:!0},channel:{type:String,default:"prod"},userId:String,deviceId:String,authToken:String,previewToken:String,debug:{type:Boolean,default:!1},enableSRI:{type:Boolean,default:!0},retryCount:{type:Number,default:3},retryDelay:{type:Number,default:1e3},timeout:{type:Number,default:3e4}},emits:["load","error","ready","phase-change"],setup(t,{emit:n,slots:o}){const i=e.ref(null),s=e.ref(!0),l=e.ref(0),c=e.ref("idle"),u=e.shallowRef({runtime:null,state:{phase:"idle",page:null,variables:{},queries:{},components:new Map,error:null,destroyed:!1},hostApi:null});a(u);let d=null;const p=async()=>{if(!i.value||!s.value)return;const e={pageId:t.pageId,apiBaseUrl:t.apiBaseUrl,cdnBaseUrl:t.cdnBaseUrl,userApiAdapter:t.userApiAdapter,channel:t.channel,userId:t.userId,deviceId:t.deviceId,authToken:t.authToken,previewToken:t.previewToken,debug:t.debug,enableSRI:t.enableSRI,containerRef:i,onError:e=>{n("error",e)}};d=r(e);try{await(a=(async()=>{if(await d.init(),!s.value)return;c.value="loading",n("phase-change","loading"),u.value={runtime:d.runtime.value,state:d.runtime.value?.getState()||u.value.state,hostApi:d.hostApi.value};const e=await d.load();s.value&&(n("load",e),u.value={...u.value,state:d.runtime.value?.getState()||u.value.state,hostApi:d.hostApi.value},await d.render(),s.value&&(c.value="ready",n("phase-change","ready"),n("ready"),l.value=0,d.runtime.value?.onStateChange(e=>{s.value&&(u.value={...u.value,state:e},c.value=e.phase,n("phase-change",e.phase))})))})(),o=t.timeout,Promise.race([a,new Promise((e,t)=>setTimeout(()=>t(new Error("加载超时")),o))]))}catch(e){if(!s.value)return;l.value<t.retryCount?(l.value++,t.debug,setTimeout(()=>{s.value&&p()},t.retryDelay)):(c.value="error",n("phase-change","error"),n("error",e))}var a,o},m=()=>{l.value=0,p()};return e.onMounted(()=>{s.value=!0,p()}),e.onUnmounted(()=>{s.value=!1,d?.destroy()}),e.watch(()=>t.pageId,()=>{d?.destroy(),l.value=0,p()}),()=>{const r=d?.loading.value??!1,n=d?.error.value,a=d?.page.value;return e.h("div",{ref:i,class:"djvlc-renderer","data-phase":c.value,"data-page-id":t.pageId},[r&&(o.loading?.()||e.h("div",{class:"djvlc-loading"},[e.h("div",{class:"djvlc-loading-spinner"}),e.h("span",{},"加载中..."),l.value>0&&e.h("span",{class:"djvlc-loading-retry"},`重试 ${l.value}/${t.retryCount}`)])),n&&(o.error?.({error:n,retry:m})||(s=n,e.h("div",{class:"djvlc-error"},[e.h("div",{class:"djvlc-error-icon"},"⚠️"),e.h("span",{class:"djvlc-error-message"},`加载失败:${s.message}`),e.h("button",{class:"djvlc-error-retry-btn",onClick:m,type:"button"},"重试")]))),!r&&!n&&!a&&"ready"===c.value&&(o.empty?.()||e.h("div",{class:"djvlc-empty"},[e.h("span",{},"暂无内容")])),o.default?.()]);var s}}}),l={phase:"idle",page:null,variables:{},queries:{},components:new Map,error:null,destroyed:!1},c=e.defineComponent({name:"DJVProvider",props:{runtime:{type:Object,default:null},hostApi:{type:Object,default:null},class:{type:String,default:""},debug:{type:Boolean,default:!1}},emits:["state-change","phase-change","error"],setup(t,{slots:r,emit:n}){let o=null;const i=e.shallowRef({runtime:t.runtime,state:t.runtime?.getState()||l,hostApi:t.hostApi});a(i);const s=e=>{o&&(o(),o=null),e&&(o=e.onStateChange(e=>{const r=i.value.state.phase;i.value={...i.value,state:e},n("state-change",e),e.phase!==r&&(n("phase-change",e.phase),t.debug),e.error&&n("error",e.error)}))};return s(t.runtime),e.watch(()=>t.runtime,(e,r)=>{e!==r&&(i.value={runtime:e,state:e?.getState()||l,hostApi:t.hostApi},s(e))}),e.watch(()=>t.hostApi,e=>{i.value={...i.value,hostApi:e}}),e.onUnmounted(()=>{o&&(o(),o=null)}),()=>e.h("div",{class:["djvlc-provider",t.class].filter(Boolean).join(" "),"data-phase":i.value.state.phase},r.default?.())}}),u="djvlc-config";function d(e,t){window.dispatchEvent(new CustomEvent("djvlc:track",{detail:{event:e,data:t,timestamp:Date.now()}}))}function p(e,t){e.style.display=t?"":"none"}function m(e,t,r){let n=r.get(e);t?(n||(n=document.createElement("div"),n.className="djvlc-loading-overlay",n.innerHTML='\n <div class="djvlc-loading-spinner"></div>\n ',n.style.cssText="\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.8);\n z-index: 100;\n ",e.appendChild(n),r.set(e,n)),n.style.display="flex"):n&&(n.style.display="none")}var f={install(e,t={}){const r=t.componentPrefix||"";!1!==t.registerComponents&&(e.component(`${r}DJVRenderer`,s),e.component(`${r}DJVProvider`,c)),!1!==t.registerDirectives&&(e.directive("djv-track",function(){const e=new WeakSet;return{mounted(t,r){const{event:n,data:a={},trigger:o="click"}=r.value;if("click"===o)t.addEventListener("click",()=>{d(n,{...a,element:t.tagName})});else if("view"===o){if(!e.has(t)){e.add(t);const r=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&(d(n,{...a,element:t.tagName}),r.unobserve(t))})},{threshold:.5});r.observe(t)}}else"mounted"===o&&d(n,{...a,element:t.tagName})}}}()),e.directive("djv-visible",{mounted(e,t){p(e,t.value)},updated(e,t){p(e,t.value)}}),e.directive("djv-loading",function(){const e=new WeakMap;return{mounted(t,r){t.style.position="relative",m(t,r.value,e)},updated(t,r){m(t,r.value,e)},unmounted(t){const r=e.get(t);r&&(r.remove(),e.delete(t))}}}()));const n={apiBaseUrl:t.apiBaseUrl,cdnBaseUrl:t.cdnBaseUrl,channel:t.channel,debug:t.debug,enableSRI:t.enableSRI,enableMetrics:t.enableMetrics,retryCount:t.retryCount,retryDelay:t.retryDelay,timeout:t.timeout};e.provide(u,n),e.config.globalProperties.$djvlc={config:n,track:d}}};exports.DJVLC_CONFIG_KEY=u,exports.DJVPlugin=f,exports.DJVProvider=c,exports.DJVRenderer=s,exports.RuntimeContextKey=n,exports.createVueRuntime=r,exports.injectRuntime=o,exports.provideRuntime=a,exports.useAction=i,exports.useComponentState=function(t){const r=o(),n=e.computed(()=>r.value.state.components.get(t));return{isLoaded:e.computed(()=>"loaded"===n.value?.status),isLoading:e.computed(()=>"loading"===n.value?.status),hasError:e.computed(()=>"failed"===n.value?.status),loadTime:e.computed(()=>n.value?.loadTime),info:n}},exports.useDJVRuntime=function(){const t=o(),r=e.computed(()=>{const e=t.value.state.phase;return"ready"!==e&&"error"!==e}),n=e.computed(()=>"ready"===t.value.state.phase),a=e.computed(()=>"error"===t.value.state.phase||null!==t.value.state.error);return{runtime:e.computed(()=>t.value.runtime),state:e.computed(()=>t.value.state),loading:r,phase:e.computed(()=>t.value.state.phase),error:e.computed(()=>t.value.state.error),page:e.computed(()=>t.value.state.page),isReady:n,hasError:a,reload:async()=>{const e=t.value.runtime;if(!e)throw new Error("Runtime not available");await e.load(),await e.render()}}},exports.useData=function(t,r,n){const a=o(),i=e.shallowRef(),s=e.ref(!1),l=e.ref(null),c=e.ref(!1);let u=null;const d=async e=>{const o=a.value.hostApi;if(!o)throw new Error("HostAPI not available");s.value=!0,l.value=null;try{const a=await o.requestData(t,e||(()=>{if(r)return"object"==typeof r&&"value"in r?r.value:r})());i.value=a,c.value=!0,n?.onSuccess?.(a)}catch(e){const t=e;l.value=t,n?.onError?.(t)}finally{s.value=!1}};return r&&"object"==typeof r&&"value"in r&&!1!==n?.refreshOnParamsChange&&e.watch(r,()=>{c.value&&d()},{deep:!0}),e.onMounted(()=>{!1!==n?.immediate&&a.value.hostApi&&d(),n?.refreshInterval&&n.refreshInterval>0&&(u=setInterval(d,n.refreshInterval))}),e.onUnmounted(()=>{u&&clearInterval(u)}),{data:i,loading:s,error:l,refetch:d,isFetched:c}},exports.useDebouncedAction=function(t,r=300){const{execute:n,loading:a,result:o,error:s}=i(t);let l=null;const c=()=>{l&&(clearTimeout(l),l=null)};return e.onUnmounted(()=>{c()}),{execute:e=>{l&&clearTimeout(l),l=setTimeout(()=>{n(e).catch(()=>{})},r)},loading:a,result:o,error:s,cancel:c}},exports.useGlobalConfig=function(){return e.inject("djvlc-config",{})},exports.useHostApi=function(){const e=o().value.hostApi;if(!e)throw new Error("HostAPI not available. Make sure runtime is initialized.");return e},exports.useLifecycle=function(t){const r=o(),n=e.ref(!1),a=e.ref(!1);return e.watch(()=>r.value.state.phase,async(e,o)=>{if(t?.onPhaseChange?.(e),!n.value&&"idle"!==e){n.value=!0;try{await(t?.onMounted?.())}catch(e){t?.onError?.(e)}}if(!a.value&&"ready"===e){a.value=!0;try{await(t?.onReady?.())}catch(e){t?.onError?.(e)}}"error"===e&&"error"!==o&&t?.onError?.(r.value.state.error)},{immediate:!0}),{phase:e.computed(()=>r.value.state.phase),hasMounted:e.readonly(n),hasReady:e.readonly(a)}},exports.usePageInfo=function(){const t=o();return{pageId:e.computed(()=>t.value.state.page?.pageId),pageVersionId:e.computed(()=>t.value.state.page?.pageVersionId),schemaVersion:e.computed(()=>t.value.state.page?.pageJson?.schemaVersion),title:e.computed(()=>{const e=t.value.state.page;return e?.title}),config:e.computed(()=>{const e=t.value.state.page;return e?.config}),isLoaded:e.computed(()=>null!==t.value.state.page)}},exports.useQuery=function(t,r){const n=o(),a=e.ref(!1),i=e.ref(null),s=e.ref(null);let l=null;const c=e.computed(()=>n.value.state.queries[t]),u=async()=>{a.value=!0,i.value=null;try{await(n.value.runtime?.refreshData(t)),s.value=Date.now()}catch(e){i.value=e}finally{a.value=!1}};return e.onMounted(()=>{r?.refreshOnMount&&n.value.runtime&&u(),r?.refreshInterval&&r.refreshInterval>0&&(l=setInterval(u,r.refreshInterval)),r?.refreshOnFocus&&window.addEventListener("focus",u)}),e.onUnmounted(()=>{l&&clearInterval(l),r?.refreshOnFocus&&window.removeEventListener("focus",u)}),{data:c,loading:a,error:i,refetch:u,lastUpdated:s}},exports.useRuntimeEvent=function(t,r){const n=o(),a=n.value.runtime?.on(t,e=>{r(e.data)});e.onUnmounted(()=>{a?.()})},exports.useRuntimeState=function(t){const r=o();return e.computed(()=>r.value.state.variables[t])},exports.useRuntimeStateWritable=function(t,r){const n=o();return[e.computed(()=>n.value.state.variables[t]??r),e=>{n.value.runtime?.setVariable(t,e)}]},exports.useWhen=function(t,r,n){const a=e.ref(!1),{once:o=!0,immediate:i=!0}=n||{},s=e.watch(t,async e=>{!e||o&&a.value||(a.value=!0,await r(),o&&s())},{immediate:i});return e.onUnmounted(()=>{s()}),{executed:e.readonly(a),stop:s}};
|
|
1
|
+
"use strict";var e=require("vue"),t=require("@djvlc/runtime-core");function r(r){const n=e.shallowRef(null),a=e.ref(!0),o=e.ref("idle"),i=e.shallowRef(null),s=e.shallowRef(null),l=e.shallowRef(null),c=e.computed(()=>"ready"===o.value),u=e.computed(()=>"error"===o.value||null!==s.value),d=e.shallowRef({initTime:0,loadTime:0,renderTime:0,totalTime:0,initTimestamp:null,readyTimestamp:null});let p=0,m=0,f=0,y=0;const h=async()=>{if(!n.value)throw new Error("Runtime not initialized");f=performance.now();const e=await n.value.load();return i.value=e,l.value=n.value.getHostApi(),r.enableMetrics&&(d.value={...d.value,loadTime:performance.now()-f}),e},v=async()=>{if(!n.value)throw new Error("Runtime not initialized");if(y=performance.now(),await n.value.render(),a.value=!1,r.enableMetrics){const e=performance.now();d.value={...d.value,renderTime:e-y,totalTime:e-p,readyTimestamp:Date.now()}}};return{runtime:n,loading:e.readonly(a),phase:e.readonly(o),page:i,error:s,hostApi:l,isReady:c,hasError:u,metrics:d,init:async()=>{const e=r.containerRef?.value;if(!e)throw new Error("Container element not found");p=performance.now(),m=p,r.enableMetrics&&(d.value={...d.value,initTimestamp:Date.now()});const c=t.createRuntime({...r,container:e,onError:e=>{s.value=e,r.onError?.(e)},onEvent:e=>{r.onEvent?.(e)}});n.value=c,c.onStateChange(e=>{o.value=e.phase,a.value="ready"!==e.phase&&"error"!==e.phase,e.page&&(i.value=e.page),e.error&&(s.value=e.error)}),await c.init(),l.value=c.getHostApi(),r.enableMetrics&&(d.value={...d.value,initTime:performance.now()-m})},load:h,render:v,destroy:()=>{n.value?.destroy(),n.value=null,l.value=null,i.value=null,s.value=null,o.value="idle",a.value=!0},reload:async()=>{if(!n.value)throw new Error("Runtime not initialized");s.value=null,a.value=!0,await h(),await v()},setVariable:(e,t)=>{n.value?.setVariable(e,t)},setVariables:e=>{n.value&&Object.entries(e).forEach(([e,t])=>{n.value?.setVariable(e,t)})},getVariable:e=>n.value?.getState().variables[e],refreshData:async e=>{await(n.value?.refreshData(e))},executeAction:async(e,t)=>{const r=l.value;if(!r)throw new Error("HostAPI not available");const n=await r.executeAction(e,t||{});if(n.success)return n.data;throw new Error(n.errorMessage||"Action failed")}}}var n=Symbol("DJVRuntime");function a(t){e.provide(n,t)}function o(){const t=e.inject(n);if(!t)throw new Error("useDJVRuntime must be used within a DJVProvider");return t}function i(t,r){const n=o(),a=e.ref(!1),i=e.shallowRef(),s=e.ref(null),l=e.ref(0),c=async(e,a)=>{const o=n.value.hostApi;if(!o)throw new Error("HostAPI not available");try{const r=await o.executeAction(t,e);if(r.success)return r.data;throw new Error(r.errorMessage||"Action failed")}catch(t){if(a>0)return await new Promise(e=>setTimeout(e,r?.retryDelay||1e3)),c(e,a-1);throw t}};return{execute:async e=>{a.value=!0,s.value=null,l.value++;try{const t=await c(e,r?.retryCount||0);return i.value=t,r?.onSuccess?.(t),t}catch(e){const t=e;throw s.value=t,r?.onError?.(t),e}finally{a.value=!1}},loading:a,result:i,error:s,reset:()=>{i.value=void 0,s.value=null,l.value=0},executionCount:l}}var s=e.defineComponent({name:"DJVRenderer",props:{pageId:{type:String,required:!0},apiBaseUrl:{type:String,required:!0},cdnBaseUrl:{type:String,required:!0},userApiAdapter:{type:Object,required:!0},channel:{type:String,default:"prod"},userId:String,deviceId:String,authToken:String,previewToken:String,debug:{type:Boolean,default:!1},enableSRI:{type:Boolean,default:!0},retryCount:{type:Number,default:3},retryDelay:{type:Number,default:1e3},timeout:{type:Number,default:3e4}},emits:["load","error","ready","phase-change"],setup(t,{emit:n,slots:o}){const i=e.ref(null),s=e.ref(!0),l=e.ref(0),c=e.ref("idle"),u=e.shallowRef({runtime:null,state:{phase:"idle",page:null,variables:{},queries:{},components:new Map,error:null,destroyed:!1},hostApi:null});a(u);let d=null;const p=async()=>{if(!i.value||!s.value)return;const e={pageId:t.pageId,apiBaseUrl:t.apiBaseUrl,cdnBaseUrl:t.cdnBaseUrl,userApiAdapter:t.userApiAdapter,channel:t.channel,userId:t.userId,deviceId:t.deviceId,authToken:t.authToken,previewToken:t.previewToken,debug:t.debug,enableSRI:t.enableSRI,containerRef:i,onError:e=>{n("error",e)}};d=r(e);try{await(a=(async()=>{if(await d.init(),!s.value)return;c.value="loading",n("phase-change","loading"),u.value={runtime:d.runtime.value,state:d.runtime.value?.getState()||u.value.state,hostApi:d.hostApi.value};const e=await d.load();s.value&&(n("load",e),u.value={...u.value,state:d.runtime.value?.getState()||u.value.state,hostApi:d.hostApi.value},await d.render(),s.value&&(c.value="ready",n("phase-change","ready"),n("ready"),l.value=0,d.runtime.value?.onStateChange(e=>{s.value&&(u.value={...u.value,state:e},c.value=e.phase,n("phase-change",e.phase))})))})(),o=t.timeout,Promise.race([a,new Promise((e,t)=>setTimeout(()=>t(new Error("加载超时")),o))]))}catch(e){if(!s.value)return;l.value<t.retryCount?(l.value++,t.debug,setTimeout(()=>{s.value&&p()},t.retryDelay)):(c.value="error",n("phase-change","error"),n("error",e))}var a,o},m=()=>{l.value=0,p()};return e.onMounted(()=>{s.value=!0,p()}),e.onUnmounted(()=>{s.value=!1,d?.destroy()}),e.watch(()=>t.pageId,()=>{d?.destroy(),l.value=0,p()}),()=>{const r=d?.loading.value??!1,n=d?.error.value,a=d?.page.value;return e.h("div",{ref:i,class:"djvlc-renderer","data-phase":c.value,"data-page-id":t.pageId},[r&&(o.loading?.()||e.h("div",{class:"djvlc-loading"},[e.h("div",{class:"djvlc-loading-spinner"}),e.h("span",{},"加载中..."),l.value>0&&e.h("span",{class:"djvlc-loading-retry"},`重试 ${l.value}/${t.retryCount}`)])),n&&(o.error?.({error:n,retry:m})||(s=n,e.h("div",{class:"djvlc-error"},[e.h("div",{class:"djvlc-error-icon"},"⚠️"),e.h("span",{class:"djvlc-error-message"},`加载失败:${s.message}`),e.h("button",{class:"djvlc-error-retry-btn",onClick:m,type:"button"},"重试")]))),!r&&!n&&!a&&"ready"===c.value&&(o.empty?.()||e.h("div",{class:"djvlc-empty"},[e.h("span",{},"暂无内容")])),o.default?.()]);var s}}}),l={phase:"idle",page:null,variables:{},queries:{},components:new Map,error:null,destroyed:!1},c=e.defineComponent({name:"DJVProvider",props:{runtime:{type:Object,default:null},hostApi:{type:Object,default:null},class:{type:String,default:""},debug:{type:Boolean,default:!1}},emits:["state-change","phase-change","error"],setup(t,{slots:r,emit:n}){let o=null;const i=e.shallowRef({runtime:t.runtime,state:t.runtime?.getState()||l,hostApi:t.hostApi});a(i);const s=e=>{o&&(o(),o=null),e&&(o=e.onStateChange(e=>{const r=i.value.state.phase;i.value={...i.value,state:e},n("state-change",e),e.phase!==r&&(n("phase-change",e.phase),t.debug),e.error&&n("error",e.error)}))};return s(t.runtime),e.watch(()=>t.runtime,(e,r)=>{e!==r&&(i.value={runtime:e,state:e?.getState()||l,hostApi:t.hostApi},s(e))}),e.watch(()=>t.hostApi,e=>{i.value={...i.value,hostApi:e}}),e.onUnmounted(()=>{o&&(o(),o=null)}),()=>e.h("div",{class:["djvlc-provider",t.class].filter(Boolean).join(" "),"data-phase":i.value.state.phase},r.default?.())}}),u="djvlc-config";function d(e,t){window.dispatchEvent(new CustomEvent("djvlc:track",{detail:{event:e,data:t,timestamp:Date.now()}}))}function p(e,t){e.style.display=t?"":"none"}function m(e,t,r){let n=r.get(e);t?(n||(n=document.createElement("div"),n.className="djvlc-loading-overlay",n.innerHTML='\n <div class="djvlc-loading-spinner"></div>\n ',n.style.cssText="\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.8);\n z-index: 100;\n ",e.appendChild(n),r.set(e,n)),n.style.display="flex"):n&&(n.style.display="none")}var f={install(e,t={}){const r=t.componentPrefix||"";!1!==t.registerComponents&&(e.component(`${r}DJVRenderer`,s),e.component(`${r}DJVProvider`,c)),!1!==t.registerDirectives&&(e.directive("djv-track",function(){const e=new WeakSet;return{mounted(t,r){const{event:n,data:a={},trigger:o="click"}=r.value;if("click"===o)t.addEventListener("click",()=>{d(n,{...a,element:t.tagName})});else if("view"===o){if(!e.has(t)){e.add(t);const r=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&(d(n,{...a,element:t.tagName}),r.unobserve(t))})},{threshold:.5});r.observe(t)}}else"mounted"===o&&d(n,{...a,element:t.tagName})}}}()),e.directive("djv-visible",{mounted(e,t){p(e,t.value)},updated(e,t){p(e,t.value)}}),e.directive("djv-loading",function(){const e=new WeakMap;return{mounted(t,r){t.style.position="relative",m(t,r.value,e)},updated(t,r){m(t,r.value,e)},unmounted(t){const r=e.get(t);r&&(r.remove(),e.delete(t))}}}()));const n={apiBaseUrl:t.apiBaseUrl,cdnBaseUrl:t.cdnBaseUrl,channel:t.channel,debug:t.debug,enableSRI:t.enableSRI,enableMetrics:t.enableMetrics,retryCount:t.retryCount,retryDelay:t.retryDelay,timeout:t.timeout};e.provide(u,n),e.config.globalProperties.$djvlc={config:n,track:d}}};exports.DJVLC_CONFIG_KEY=u,exports.DJVPlugin=f,exports.DJVProvider=c,exports.DJVRenderer=s,exports.RuntimeContextKey=n,exports.createVueRuntime=r,exports.injectRuntime=o,exports.provideRuntime=a,exports.useAction=i,exports.useComponentState=function(t){const r=o(),n=e.computed(()=>r.value.state.components.get(t));return{isLoaded:e.computed(()=>"loaded"===n.value?.status),isLoading:e.computed(()=>"loading"===n.value?.status),hasError:e.computed(()=>"failed"===n.value?.status),loadTime:e.computed(()=>n.value?.loadTime),info:n}},exports.useDJVRuntime=function(){const t=o(),r=e.computed(()=>{const e=t.value.state.phase;return"ready"!==e&&"error"!==e}),n=e.computed(()=>"ready"===t.value.state.phase),a=e.computed(()=>"error"===t.value.state.phase||null!==t.value.state.error);return{runtime:e.computed(()=>t.value.runtime),state:e.computed(()=>t.value.state),loading:r,phase:e.computed(()=>t.value.state.phase),error:e.computed(()=>t.value.state.error),page:e.computed(()=>t.value.state.page),isReady:n,hasError:a,reload:async()=>{const e=t.value.runtime;if(!e)throw new Error("Runtime not available");await e.load(),await e.render()}}},exports.useData=function(t,r,n){const a=o(),i=e.shallowRef(),s=e.ref(!1),l=e.ref(null),c=e.ref(!1);let u=null;const d=async e=>{const o=a.value.hostApi;if(!o)throw new Error("HostAPI not available");s.value=!0,l.value=null;try{const a=await o.requestData(t,e||(()=>{if(r)return"object"==typeof r&&"value"in r?r.value:r})());i.value=a,c.value=!0,n?.onSuccess?.(a)}catch(e){const t=e;l.value=t,n?.onError?.(t)}finally{s.value=!1}};return r&&"object"==typeof r&&"value"in r&&!1!==n?.refreshOnParamsChange&&e.watch(r,()=>{c.value&&d()},{deep:!0}),e.onMounted(()=>{!1!==n?.immediate&&a.value.hostApi&&d(),n?.refreshInterval&&n.refreshInterval>0&&(u=setInterval(d,n.refreshInterval))}),e.onUnmounted(()=>{u&&clearInterval(u)}),{data:i,loading:s,error:l,refetch:d,isFetched:c}},exports.useDebouncedAction=function(t,r=300){const{execute:n,loading:a,result:o,error:s}=i(t);let l=null;const c=()=>{l&&(clearTimeout(l),l=null)};return e.onUnmounted(()=>{c()}),{execute:e=>{l&&clearTimeout(l),l=setTimeout(()=>{n(e).catch(()=>{})},r)},loading:a,result:o,error:s,cancel:c}},exports.useGlobalConfig=function(){return e.inject("djvlc-config",{})},exports.useHostApi=function(){const e=o().value.hostApi;if(!e)throw new Error("HostAPI not available. Make sure runtime is initialized.");return e},exports.useLifecycle=function(t){const r=o(),n=e.ref(!1),a=e.ref(!1);return e.watch(()=>r.value.state.phase,async(e,o)=>{if(t?.onPhaseChange?.(e),!n.value&&"idle"!==e){n.value=!0;try{await(t?.onMounted?.())}catch(e){t?.onError?.(e)}}if(!a.value&&"ready"===e){a.value=!0;try{await(t?.onReady?.())}catch(e){t?.onError?.(e)}}"error"===e&&"error"!==o&&t?.onError?.(r.value.state.error)},{immediate:!0}),{phase:e.computed(()=>r.value.state.phase),hasMounted:e.readonly(n),hasReady:e.readonly(a)}},exports.usePageInfo=function(){const t=o();return{pageId:e.computed(()=>t.value.state.page?.pageId),pageVersionId:e.computed(()=>t.value.state.page?.pageVersionId),schemaVersion:e.computed(()=>t.value.state.page?.pageJson?.schemaVersion),title:e.computed(()=>{const e=t.value.state.page;return e?.title}),config:e.computed(()=>{const e=t.value.state.page;return e?.config}),isLoaded:e.computed(()=>null!==t.value.state.page)}},exports.useQuery=function(t,r){const n=o(),a=e.ref(!1),i=e.ref(null),s=e.ref(null);let l=null;const c=e.computed(()=>n.value.state.queries[t]),u=async()=>{a.value=!0,i.value=null;try{await(n.value.runtime?.refreshData(t)),s.value=Date.now()}catch(e){i.value=e}finally{a.value=!1}};return e.onMounted(()=>{r?.refreshOnMount&&n.value.runtime&&u(),r?.refreshInterval&&r.refreshInterval>0&&(l=setInterval(u,r.refreshInterval)),r?.refreshOnFocus&&window.addEventListener("focus",u)}),e.onUnmounted(()=>{l&&clearInterval(l),r?.refreshOnFocus&&window.removeEventListener("focus",u)}),{data:c,loading:a,error:i,refetch:u,lastUpdated:s}},exports.useRuntimeEvent=function(t,r){const n=o(),a=n.value.runtime?.on(t,e=>{r(e.data)});e.onUnmounted(()=>{a?.()})},exports.useRuntimeState=function(t){const r=o();return e.computed(()=>r.value.state.variables[t])},exports.useRuntimeStateWritable=function(t,r){const n=o();return[e.computed(()=>n.value.state.variables[t]??r),e=>{n.value.runtime?.setVariable(t,e)}]},exports.useWhen=function(t,r,n){const a=e.ref(!1),{once:o=!0,immediate:i=!0}=n||{},s=e.watch(t,async e=>{!e||o&&a.value||(a.value=!0,await r(),o&&s())},{immediate:i});return e.onUnmounted(()=>{s()}),{executed:e.readonly(a),stop:s}};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@djvlc/runtime-host-vue",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.11",
|
|
4
4
|
"description": "DJV 低代码平台 Vue3 宿主适配器",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"clean": "rimraf dist"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@djvlc/runtime-core": "1.2.
|
|
29
|
+
"@djvlc/runtime-core": "1.2.2"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^20.10.0",
|