@shwfed/config 2.7.6 → 2.7.8

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 (111) hide show
  1. package/dist/mcp.mjs +165 -52
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/badge-KAEXz3VO.js +1 -0
  4. package/dist/preview/assets/{config-C947O8za.js → config-BXx5syNf.js} +1 -1
  5. package/dist/preview/assets/{config-DhAntnE5.js → config-Bb9Yeh33.js} +1 -1
  6. package/dist/preview/assets/config-C-QRPeN1.js +1 -0
  7. package/dist/preview/assets/config-CkKx7sVR.js +1 -0
  8. package/dist/preview/assets/config-CtbYlZCL.js +1 -0
  9. package/dist/preview/assets/{config-Bl8L6943.js → config-DPlbFBRi.js} +1 -1
  10. package/dist/preview/assets/config-DbfJWa8K.js +1 -0
  11. package/dist/preview/assets/{config-DppExb4h.js → config-DbirfZyy.js} +1 -1
  12. package/dist/preview/assets/{config-B7hXY5FF.js → config-ZczGik30.js} +1 -1
  13. package/dist/preview/assets/definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js +1 -0
  14. package/dist/preview/assets/{index-DiC1rvCq.js → index-Bv_aA34a.js} +1 -1
  15. package/dist/preview/assets/{index-B0PL01fm.css → index-C9P-6gZd.css} +1 -1
  16. package/dist/preview/assets/index-CJFU9znN.js +1 -0
  17. package/dist/preview/assets/index-DUOkekYu.js +680 -0
  18. package/dist/preview/assets/item-SC0WQMVu.js +1 -0
  19. package/dist/preview/assets/{runtime-DmV_M4B_.js → runtime-BPOf7Yqz.js} +1 -1
  20. package/dist/preview/assets/runtime-CC2caFS9.js +1 -0
  21. package/dist/preview/assets/runtime-CLaRFZzt.js +1 -0
  22. package/dist/preview/assets/runtime-Ckuz5Kxm.js +1 -0
  23. package/dist/preview/assets/{runtime-BQnHKogz.js → runtime-CnKlH0mi.js} +1 -1
  24. package/dist/preview/assets/runtime-DO0anKbw.js +1 -0
  25. package/dist/preview/assets/{runtime-kLWO8JbC.js → runtime-DcStOiOi.js} +1 -1
  26. package/dist/preview/assets/runtime-EVgYW6_7.js +1 -0
  27. package/dist/preview/assets/runtime-i32sR7d3.js +1 -0
  28. package/dist/preview/index.html +2 -2
  29. package/dist/runtime/components/actions/buttons/2026-04-21/com.shwfed.actions.button.navigation/runtime.vue +16 -2
  30. package/dist/runtime/components/block-layout-editor/index.vue +1 -4
  31. package/dist/runtime/components/config/blocks/2026-05-17/com.shwfed.block.chart.xy/config.vue +5 -0
  32. package/dist/runtime/components/config/blocks/2026-05-17/com.shwfed.block.chart.xy/runtime.vue +2 -2
  33. package/dist/runtime/components/config/blocks/2026-06-01/com.shwfed.block.animated.number/item.vue +2 -2
  34. package/dist/runtime/components/config/blocks/2026-06-01/com.shwfed.block.animated.number/schema.js +2 -2
  35. package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/badge.vue +3 -2
  36. package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/schema.js +2 -2
  37. package/dist/runtime/components/form/config.vue +24 -16
  38. package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.combobox.single.remote/runtime.vue +6 -5
  39. package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.combobox.single.remote/schema.js +2 -2
  40. package/dist/runtime/components/form/fields/2026-05-23/com.shwfed.form.field.tree.multi/runtime.vue +3 -4
  41. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.multi/runtime.vue +3 -4
  42. package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.single/runtime.vue +3 -4
  43. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/runtime.vue +6 -5
  44. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/schema.js +2 -2
  45. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/runtime.vue +6 -5
  46. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/schema.js +2 -2
  47. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/runtime.vue +3 -4
  48. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/runtime.vue +3 -4
  49. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/runtime.vue +3 -4
  50. package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/runtime.vue +3 -4
  51. package/dist/runtime/components/form/schema.d.ts +1 -1
  52. package/dist/runtime/components/form/schema.js +8 -3
  53. package/dist/runtime/components/form/utils/initial.d.ts +5 -4
  54. package/dist/runtime/components/form/utils/initial.js +2 -2
  55. package/dist/runtime/components/form/utils/schema-meta.d.ts +2 -0
  56. package/dist/runtime/components/form/utils/schema-meta.js +24 -0
  57. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/runtime.vue +7 -6
  58. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.js +2 -2
  59. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/runtime.vue +7 -6
  60. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.js +2 -2
  61. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi/runtime.vue +7 -6
  62. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi/schema.js +2 -2
  63. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/runtime.vue +7 -6
  64. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.js +2 -2
  65. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single/runtime.vue +7 -6
  66. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single/schema.js +2 -2
  67. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/runtime.vue +7 -6
  68. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.js +2 -2
  69. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/runtime.vue +3 -4
  70. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/schema.js +2 -2
  71. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/runtime.vue +3 -4
  72. package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/schema.js +2 -2
  73. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/runtime.vue +7 -6
  74. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/schema.js +2 -2
  75. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/runtime.vue +7 -6
  76. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/schema.js +2 -2
  77. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/runtime.vue +3 -4
  78. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/schema.js +2 -2
  79. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/runtime.vue +3 -4
  80. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/schema.js +2 -2
  81. package/dist/runtime/components/table/config.vue +0 -36
  82. package/dist/runtime/components/table/index.vue +3 -4
  83. package/dist/runtime/components/table/schema.js +3 -3
  84. package/dist/runtime/components/ui/expression-editor/ExpressionEditor.d.vue.ts +4 -3
  85. package/dist/runtime/components/ui/expression-editor/ExpressionEditor.vue +135 -111
  86. package/dist/runtime/components/ui/expression-editor/ExpressionEditor.vue.d.ts +4 -3
  87. package/dist/runtime/share/expression.d.ts +36 -0
  88. package/dist/runtime/share/expression.js +38 -17
  89. package/dist/runtime/share/request.d.ts +29 -0
  90. package/dist/runtime/share/request.js +11 -0
  91. package/dist/runtime/vendor/cel-js/CLAUDE.md +3 -3
  92. package/dist/runtime/vendor/cel-js/PROMPT.md +44 -3
  93. package/dist/runtime/vendor/cel-js/lib/functions.js +2 -2
  94. package/dist/runtime/vendor/cel-js/lib/macros.js +66 -14
  95. package/dist/runtime/vendor/cel-js/lib/optional.js +52 -1
  96. package/package.json +1 -1
  97. package/dist/preview/assets/badge-C-IvPZBx.js +0 -1
  98. package/dist/preview/assets/config-DXlCQMVi.js +0 -1
  99. package/dist/preview/assets/config-Dj0rEZRq.js +0 -1
  100. package/dist/preview/assets/config-_aVQvlhc.js +0 -1
  101. package/dist/preview/assets/config-l01zamcS.js +0 -1
  102. package/dist/preview/assets/definition.vue_vue_type_script_setup_true_lang-BbuC0qEM.js +0 -1
  103. package/dist/preview/assets/index-BNaI1T0H.js +0 -680
  104. package/dist/preview/assets/index-BwoBmSxu.js +0 -1
  105. package/dist/preview/assets/item-GFiAkFW6.js +0 -1
  106. package/dist/preview/assets/runtime-5h5U6Ozr.js +0 -1
  107. package/dist/preview/assets/runtime-B6dXW6zW.js +0 -1
  108. package/dist/preview/assets/runtime-BEOIc4zU.js +0 -1
  109. package/dist/preview/assets/runtime-Bx7G-5dR.js +0 -1
  110. package/dist/preview/assets/runtime-TNDFpOlo.js +0 -1
  111. package/dist/preview/assets/runtime-g9hb36Vh.js +0 -1
@@ -0,0 +1 @@
1
+ import{d as q,u as B,o as O,w as y,a as M,c as E,n as T,b as V,r as x,e as o,g as z,f as A,h as s,i as J,j as L,p as P,l as U,k as W,m as D,q as g,s as G,t as h,v as H}from"./index-DUOkekYu.js";import K from"./index-Bv_aA34a.js";const X=q({name:"ShwfedBlockAnimatedNumberItem",__name:"item",props:{item:{}},setup(b){const n=b,j=G(),a=x(void 0),m=x(0);function u(){return D(j)}function S(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()!==""){const t=Number(e);return Number.isFinite(t)?t:0}return 0}const d=o(()=>a.value===void 0?g():H(a.value));function v(e){if(!e)return"";try{const t=h(s(e,{...u(),json:d.value}));return t==null?"":String(t)}catch{return""}}const w=o(()=>v(n.item.prefix)),_=o(()=>v(n.item.suffix));function C(e){if(e)try{const t=h(s(e,{...u(),json:d.value}));return t==null?void 0:typeof t=="string"||typeof t=="object"?t:String(t)}catch{return}}const F=o(()=>C(n.item.style));async function r(){const e=n.item.dataSource,t=u(),N=z(function*(){let i=g();e.request&&(i=yield*A(yield*s(e.request,t)));const k=yield*s(e.value,{...t,json:i});return{json:J(i),value:k}});try{const i=await L(P(N,U));a.value=i.json,m.value=S(i.value)}catch(i){console.warn("[shwfed-animated-number] fetch failed",i)}}const l=o(()=>(n.item.pollingInterval??0)>0),I=o(()=>Math.max(1,n.item.pollingInterval??1)*1e3),c=W(),{pause:p,resume:f}=B(()=>{r()},I,{immediate:!1});return O(()=>{r(),l.value&&c.value&&f()}),y(c,e=>{l.value&&(e?(r(),f()):p())}),y(()=>[n.item.dataSource.request??"",n.item.dataSource.value,n.item.pollingInterval??0].join("|"),()=>{r(),l.value&&c.value?f():p()}),(e,t)=>(M(),E(V(K),{value:m.value,prefix:w.value,suffix:_.value,style:T(F.value)},null,8,["value","prefix","suffix","style"]))}});export{X as default};
@@ -1 +1 @@
1
- import{_ as n}from"./definition.vue_vue_type_script_setup_true_lang-BbuC0qEM.js";import{d as o,c as a,b as c,a as f,aM as i}from"./index-BNaI1T0H.js";const _=o({name:"ShwfedPrototypeActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(t){const e=i;return(r,s)=>(f(),a(n,{"action-id":t.buttonId,effect:c(e)},null,8,["action-id","effect"]))}});export{_ as default};
1
+ import{_ as n}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js";import{d as o,c as a,b as c,a as f,aN as i}from"./index-DUOkekYu.js";const _=o({name:"ShwfedPrototypeActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(t){const e=i;return(r,s)=>(f(),a(n,{"action-id":t.buttonId,effect:c(e)},null,8,["action-id","effect"]))}});export{_ as default};
@@ -0,0 +1 @@
1
+ import{d as u,aK as p,aE as m,aL as a,aM as g,aH as d,c as l,b as x,h as E,m as _,aI as h,s as C,aJ as I,a as b}from"./index-DUOkekYu.js";import{_ as v}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js";const R=u({name:"ShwfedHttpRequestActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(t){const e=t,c=C(),i=(n,s)=>E(n,{..._(c),...s}),r=I(),o=h(),f=p(()=>{const n=o?m(()=>o()):a(!0);return g(n,s=>s?d(e.config.expression,i,{messageExpression:e.config.messageExpression,resultExpression:e.config.resultExpression,channel:r,triggers:{success:e.config.onSuccess,warning:e.config.onWarning,error:e.config.onError,info:e.config.onInfo}}):a(void 0))});return(n,s)=>(b(),l(v,{"action-id":t.buttonId,effect:x(f)},null,8,["action-id","effect"]))}});export{R as default};
@@ -0,0 +1 @@
1
+ import{d as l,G as u,g,aE as m,M as d,aF as p,aG as x,aH as E,c as _,b as h,h as k,m as w,aI as C,s as I,aJ as b,a as v}from"./index-DUOkekYu.js";import{_ as y}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js";const R=l({name:"ShwfedHttpRequestConfirmActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(s){const n=s,{locale:i}=u(),a=I(),t=(e,o)=>k(e,{...w(a),...o}),r=b(),c=C(),f=g(function*(){if(c&&!(yield*m(()=>c())))return;const e=d(n.config.markdown,i.value)??"",o=p(e,t);(yield*x({content:o,icon:n.config.icon,color:n.config.color}))||(yield*E(n.config.expression,t,{messageExpression:n.config.messageExpression,resultExpression:n.config.resultExpression,channel:r,triggers:{success:n.config.onSuccess,warning:n.config.onWarning,error:n.config.onError,info:n.config.onInfo}}))});return(e,o)=>(v(),_(y,{"action-id":s.buttonId,effect:h(f)},null,8,["action-id","effect"]))}});export{R as default};
@@ -0,0 +1 @@
1
+ import{d as i,G as x,aO as M,g as T,M as c,aP as p,t as S,c as b,H as d,b as u,r as N,y as k,aJ as I,aQ as L,a as H,S as w,n as A,I as r,aR as F,aS as R,ax as V,s as $,aT as f,D as m,aU as j}from"./index-DUOkekYu.js";import{_ as z}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js";const Y=i({name:"ShwfedModalLayoutActionRuntime",__name:"runtime",props:{buttonId:{},config:{},buttonTitle:{}},setup(n){const a=n,{locale:l}=x(),v=e=>{},g=$(),s=k(f,void 0),h=I(),o=N(null),C=M(a.buttonId,{close:()=>L(()=>{o.value?.()})},h),y=i({name:"ModalBoundaryBridge",setup(e,{slots:t}){return R(g),m(j,C),s&&m(f,s),()=>t.default?.()}}),E=(e,t)=>V()?.(e,t),_=T(function*(){const e=c(a.config.modalTitle,l.value)??c(a.buttonTitle,l.value)??"",{modal:t,close:B}=yield*p({title:e,width:a.config.modalWidth});o.value=()=>S(B()),yield*t,o.value=null});return(e,t)=>(H(),b(z,{"action-id":n.buttonId,effect:u(_)},{default:d(()=>[w("div",{style:A(n.config.modalMinHeight?`min-height: ${n.config.modalMinHeight}`:void 0)},[r(u(y),null,{default:d(()=>[r(F,{"slot-value":n.config.slot,configure:v,"find-entry":E},null,8,["slot-value"])]),_:1})],4)]),_:1},8,["action-id","effect"]))}});export{Y as default};
@@ -1 +1 @@
1
- import{_ as c}from"./definition.vue_vue_type_script_setup_true_lang-BbuC0qEM.js";import{d as s,aJ as o,aU as i,c as r,b as f,aI as u,a as m}from"./index-BNaI1T0H.js";const g=s({name:"ShwfedEventDispatchActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const n=e,t=u(),a=o(()=>i(t,n.config.triggers));return(p,d)=>(m(),r(c,{"action-id":e.buttonId,effect:f(a)},null,8,["action-id","effect"]))}});export{g as default};
1
+ import{_ as c}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js";import{d as s,aK as o,aV as i,c as r,b as f,aJ as u,a as m}from"./index-DUOkekYu.js";const g=s({name:"ShwfedEventDispatchActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const n=e,t=u(),a=o(()=>i(t,n.config.triggers));return(p,d)=>(m(),r(c,{"action-id":e.buttonId,effect:f(a)},null,8,["action-id","effect"]))}});export{g as default};
@@ -0,0 +1 @@
1
+ import{d as f,aK as u,aM as l,aE as d,c as m,b as w,h as p,m as h,s as _,a as g}from"./index-DUOkekYu.js";import{_ as b}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js";function v(){return{resolve:e=>({href:new URL(e,window.location.href).href})}}function x(e,t){return window.location.assign(e),Promise.resolve()}const B=f({name:"ShwfedNavigationActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const t=e,i=v(),a=_(),r=(n,o)=>p(n,{...h(a),...o});function c(n){try{return new URL(n,window.location.href).origin!==window.location.origin}catch{return!1}}const s=u(()=>l(r(t.config.url),n=>d(async()=>{const o=c(n);if(t.config.mode==="_blank"){window.open(o?n:i.resolve(n).href,"_blank");return}await x(n)})));return(n,o)=>(g(),m(b,{"action-id":e.buttonId,effect:w(s)},null,8,["action-id","effect"]))}});export{B as default};
@@ -1 +1 @@
1
- import{d as _,aJ as E,g as S,aN as r,aU as m,aV as b,aW as j,c as k,b as v,f as x,k as B,aI as L,q as C,a as R}from"./index-BNaI1T0H.js";import{_ as U}from"./definition.vue_vue_type_script_setup_true_lang-BbuC0qEM.js";const O=_({name:"ShwfedHttpDownloadActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(d){const c=d,g=C(),t=(e,n)=>x(e,{...B(g),...n}),l=L(),p=new Set(["success","error","warning","info"]);function f(e){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=e.name,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(n)}const y=E(()=>S(function*(){const{template:e,messageExpression:n,resultExpression:o}=c.config,u=yield*t(e.request);if(!e.download){const s=yield*u.file();return yield*r(()=>f(s)),yield*m(l,c.config.onSuccess)}const a={json:yield*u.json()},i=o===void 0?"success":yield*b(t(o,a),s=>p.has(s)?s:"success");if(n!==void 0){const s=yield*t(n,a);yield*r(()=>j[i](s))}if(i==="success"||i==="info"){const h=yield*(yield*t(e.download,a)).file();yield*r(()=>f(h))}const w={success:c.config.onSuccess,warning:c.config.onWarning,error:c.config.onError,info:c.config.onInfo};return yield*m(l,w[i])}));return(e,n)=>(R(),k(U,{"action-id":d.buttonId,effect:v(y)},null,8,["action-id","effect"]))}});export{O as default};
1
+ import{d as _,aK as E,g as S,aQ as r,aV as m,aW as b,aX as j,c as v,b as x,h as B,m as L,aJ as k,s as C,a as R}from"./index-DUOkekYu.js";import{_ as T}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js";const q=_({name:"ShwfedHttpDownloadActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(d){const c=d,g=C(),t=(e,n)=>B(e,{...L(g),...n}),l=k(),p=new Set(["success","error","warning","info"]);function f(e){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=e.name,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(n)}const y=E(()=>S(function*(){const{template:e,messageExpression:n,resultExpression:o}=c.config,u=yield*t(e.request);if(!e.download){const s=yield*u.file();return yield*r(()=>f(s)),yield*m(l,c.config.onSuccess)}const a={json:yield*u.json()},i=o===void 0?"success":yield*b(t(o,a),s=>p.has(s)?s:"success");if(n!==void 0){const s=yield*t(n,a);yield*r(()=>j[i](s))}if(i==="success"||i==="info"){const w=yield*(yield*t(e.download,a)).file();yield*r(()=>f(w))}const h={success:c.config.onSuccess,warning:c.config.onWarning,error:c.config.onError,info:c.config.onInfo};return yield*m(l,h[i])}));return(e,n)=>(R(),v(T,{"action-id":d.buttonId,effect:x(y)},null,8,["action-id","effect"]))}});export{q as default};
@@ -0,0 +1 @@
1
+ import{d as u,G as i,c as l,b as p,e as m,a as d,J as f,M as _,aF as k,h as w,m as x,s as g}from"./index-DUOkekYu.js";const B=u({name:"ShwfedMarkdownItemRuntime",__name:"runtime",props:{config:{}},setup(n){const o=n,{locale:t}=i(),a=g(),c=(e,s)=>w(e,{...x(a),...s}),r=m(()=>{const e=_(o.config.content,t.value)??"";return k(e,c)});return(e,s)=>(d(),l(p(f),{"data-slot":"buttons-markdown",source:r.value,class:"prose prose-sm prose-zinc px-1"},null,8,["source"]))}});export{B as default};
@@ -0,0 +1 @@
1
+ import{d as l,aY as g,aK as A,aM as y,aV as h,c as _,b,h as S,m as j,aJ as k,aZ as C,a as B,s as O}from"./index-DUOkekYu.js";import{_ as x}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js";const I=l({name:"ShwfedStateWriteActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(r){const s=r,i=O(),f=(e,t)=>S(e,{...j(i),...t}),n=g(),c=n.kind==="form"&&n.parent?n.parent:n,u=k(),m=C((e,t,a)=>{if(Array.isArray(e[t])&&Array.isArray(a))return e[t]=a,!0});function o(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function p(e,t){return o(e)&&o(t)?m({...t},e):t}const d=A(()=>y(f(s.config.expression),e=>{for(const t of Object.keys(e)){const a=p(c.getAt(t),e[t]);c.setAt(t,a)}return h(u,s.config.onSuccess)}));return(e,t)=>(B(),_(x,{"action-id":r.buttonId,effect:b(d)},null,8,["action-id","effect"]))}});export{I as default};
@@ -10,8 +10,8 @@
10
10
  `--primary`, the primary button variant renders as transparent. */
11
11
  body { --primary: #009689; }
12
12
  </style>
13
- <script type="module" crossorigin src="./assets/index-BNaI1T0H.js"></script>
14
- <link rel="stylesheet" crossorigin href="./assets/index-B0PL01fm.css">
13
+ <script type="module" crossorigin src="./assets/index-DUOkekYu.js"></script>
14
+ <link rel="stylesheet" crossorigin href="./assets/index-C9P-6gZd.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="app"></div>
@@ -1,5 +1,6 @@
1
1
  <script setup>
2
2
  import { Effect } from "effect";
3
+ import { navigateTo, useRouter } from "#app";
3
4
  import { cel as _rawCel } from "../../../../../utils/cel";
4
5
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
5
6
  import ShwfedActionDefinition from "../../../components/definition.vue";
@@ -8,13 +9,26 @@ const props = defineProps({
8
9
  buttonId: { type: String, required: true },
9
10
  config: { type: null, required: true }
10
11
  });
12
+ const router = useRouter();
11
13
  const inherited = injectCELContext();
12
14
  const $cel = (expression, context) => _rawCel(expression, { ...celBindings(inherited), ...context });
15
+ function isExternal(url) {
16
+ try {
17
+ return new URL(url, window.location.href).origin !== window.location.origin;
18
+ } catch {
19
+ return false;
20
+ }
21
+ }
13
22
  const effect = Effect.suspend(
14
23
  () => Effect.flatMap(
15
24
  $cel(props.config.url),
16
- (url) => Effect.sync(() => {
17
- window.open(url, props.config.mode);
25
+ (url) => Effect.promise(async () => {
26
+ const external = isExternal(url);
27
+ if (props.config.mode === "_blank") {
28
+ window.open(external ? url : router.resolve(url).href, "_blank");
29
+ return;
30
+ }
31
+ await navigateTo(url, { external });
18
32
  })
19
33
  )
20
34
  );
@@ -195,9 +195,8 @@ function recenter() {
195
195
  const frame = activeFrame.value;
196
196
  const frameW = frame.cols * stepPx.value;
197
197
  const frameH = frame.rows * stepPx.value;
198
- const rightInset = inlineItem.value ? inlinePaneWidth.value : 0;
199
198
  coordinate.value = {
200
- x: Math.round((rect.width - rightInset - frameW) / 2),
199
+ x: Math.round((rect.width - frameW) / 2),
201
200
  y: Math.round((rect.height - frameH) / 2)
202
201
  };
203
202
  }
@@ -823,7 +822,6 @@ function requestDrill(itemId) {
823
822
  function closeInline() {
824
823
  setSelection([]);
825
824
  }
826
- watch(() => inlineItemId.value !== null, () => recenterSoon());
827
825
  let paneResize = null;
828
826
  function beginPaneResize(e) {
829
827
  if (e.button !== 0) return;
@@ -841,7 +839,6 @@ useEventListener("mousemove", (e) => {
841
839
  useEventListener("mouseup", () => {
842
840
  if (!paneResize) return;
843
841
  paneResize = null;
844
- recenterSoon();
845
842
  });
846
843
  </script>
847
844
 
@@ -384,6 +384,7 @@ function removeY(i) {
384
384
  :model-value="block.x"
385
385
  result-type="list"
386
386
  :extra-vars="dataSourceVars"
387
+ unlisted-vars-are-dyn
387
388
  placeholder="返回列表,如 range(0, 12)"
388
389
  @update:model-value="setX"
389
390
  />
@@ -440,6 +441,7 @@ function removeY(i) {
440
441
  :model-value="s.value"
441
442
  result-type="list"
442
443
  :extra-vars="dataSourceVars"
444
+ unlisted-vars-are-dyn
443
445
  :placeholder="`\u7B2C ${i + 1} \u4E2A\u7CFB\u5217\uFF0C\u5982 source1.map(r, r.value)`"
444
446
  @update:model-value="(v) => setYValue(i, v)"
445
447
  />
@@ -576,6 +578,7 @@ function removeY(i) {
576
578
  :model-value="s.dash ?? ''"
577
579
  result-type="list"
578
580
  :extra-vars="dataSourceVars"
581
+ unlisted-vars-are-dyn
579
582
  placeholder="留空为实线,如 [4, 4]"
580
583
  @update:model-value="(v) => setYDash(i, v)"
581
584
  />
@@ -653,6 +656,7 @@ function removeY(i) {
653
656
  :model-value="s.width ?? ''"
654
657
  result-type="number"
655
658
  :extra-vars="dataSourceVars"
659
+ unlisted-vars-are-dyn
656
660
  placeholder="留空自动,如 24"
657
661
  @update:model-value="(v) => setYWidth(i, v)"
658
662
  />
@@ -680,6 +684,7 @@ function removeY(i) {
680
684
  :model-value="s.size ?? ''"
681
685
  result-type="list"
682
686
  :extra-vars="dataSourceVars"
687
+ unlisted-vars-are-dyn
683
688
  placeholder="留空用默认大小,如 source1.map(r, r.weight)"
684
689
  @update:model-value="(v) => setYSize(i, v)"
685
690
  />
@@ -20,6 +20,7 @@ import { Markdown } from "../../../../ui/markdown";
20
20
  import { cel } from "../../../../../utils/cel";
21
21
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
22
22
  import { getLocalizedText } from "../../../../../share/locale";
23
+ import { fetchJsonOption } from "../../../../../share/request";
23
24
  defineOptions({ name: "ShwfedBlockChartXyRuntime" });
24
25
  const block = defineModel("block", { type: null, ...{ required: true } });
25
26
  const { locale } = useI18n();
@@ -70,8 +71,7 @@ async function fetchAll() {
70
71
  const program = Effect.gen(function* () {
71
72
  let jsonOpt = Option.none();
72
73
  if (ds.request) {
73
- const builder = yield* cel(ds.request, ctx);
74
- jsonOpt = Option.some(yield* builder.json());
74
+ jsonOpt = yield* fetchJsonOption(yield* cel(ds.request, ctx));
75
75
  }
76
76
  return yield* cel(ds.data, { ...ctx, json: jsonOpt });
77
77
  });
@@ -6,6 +6,7 @@ import { useIntervalFn, useWindowFocus } from "@vueuse/core";
6
6
  import NumberFlow from "@number-flow/vue";
7
7
  import { cel } from "../../../../../utils/cel";
8
8
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
9
+ import { fetchJsonOption } from "../../../../../share/request";
9
10
  defineOptions({ name: "ShwfedBlockAnimatedNumberItem" });
10
11
  const props = defineProps({
11
12
  item: { type: null, required: true }
@@ -57,8 +58,7 @@ async function refresh() {
57
58
  const program = Effect.gen(function* () {
58
59
  let jsonOpt = Option.none();
59
60
  if (ds.request) {
60
- const builder = yield* cel(ds.request, ctx);
61
- jsonOpt = Option.some(yield* builder.json());
61
+ jsonOpt = yield* fetchJsonOption(yield* cel(ds.request, ctx));
62
62
  }
63
63
  const value = yield* cel(ds.value, { ...ctx, json: jsonOpt });
64
64
  return { json: Option.getOrUndefined(jsonOpt), value };
@@ -1,5 +1,5 @@
1
1
  import { Schema } from "effect";
2
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
2
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
3
3
  export { getStructFieldDescription, getStructFieldTitle } from "../../../../table/utils/schema-meta.js";
4
4
  export const type = "com.shwfed.block.animated.number";
5
5
  export const compatibilityDate = "2026-06-01";
@@ -18,7 +18,7 @@ function registerJson(env) {
18
18
  export function dataSourceSchema(configure) {
19
19
  const CelRequest = Expression({
20
20
  configure,
21
- resultType: "HttpRequest"
21
+ resultType: HttpRequestResult
22
22
  });
23
23
  const CelNumber = Expression({
24
24
  configure: (env) => {
@@ -7,6 +7,7 @@ import { useI18n } from "vue-i18n";
7
7
  import { getLocalizedText } from "../../../../../share/locale";
8
8
  import { cel } from "../../../../../utils/cel";
9
9
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
10
+ import { fetchJsonOption } from "../../../../../share/request";
10
11
  import { interpolateMarkdown } from "../../../../table/utils/runtime";
11
12
  import { Badge } from "../../../../ui/badge";
12
13
  import { Markdown } from "../../../../ui/markdown";
@@ -43,8 +44,8 @@ async function refresh() {
43
44
  if (!req) return;
44
45
  const ctx = baseContext();
45
46
  const program = Effect.gen(function* () {
46
- const builder = yield* cel(req, ctx);
47
- return yield* builder.json();
47
+ const json2 = yield* fetchJsonOption(yield* cel(req, ctx));
48
+ return Option.getOrUndefined(json2);
48
49
  });
49
50
  try {
50
51
  json.value = await Effect.runPromise(Effect.provide(program, Fetch.layer));
@@ -1,5 +1,5 @@
1
1
  import { Schema } from "effect";
2
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
2
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
3
3
  import { Slot, defaultSlot } from "../../../../../share/layout.js";
4
4
  export { getStructFieldDescription, getStructFieldTitle } from "../../../../table/utils/schema-meta.js";
5
5
  export const type = "com.shwfed.block.card";
@@ -20,7 +20,7 @@ export const BADGE_VARIANTS = ["default", "secondary", "destructive", "outline"]
20
20
  export function badgeSchema(configure) {
21
21
  const CelRequest = Expression({
22
22
  configure,
23
- resultType: "HttpRequest"
23
+ resultType: HttpRequestResult
24
24
  });
25
25
  const Content = LocaleMarkdown({
26
26
  configure: (env) => {
@@ -9,6 +9,8 @@ import { Textarea } from "../ui/textarea";
9
9
  import { provideEventAncestor } from "../../share/event-bus";
10
10
  import {
11
11
  FormConfig,
12
+ getNestedStructFieldDescription,
13
+ getNestedStructFieldTitle,
12
14
  getStructFieldDescription,
13
15
  getStructFieldTitle,
14
16
  metadata as formMetadata
@@ -25,6 +27,8 @@ const configure = props.configure ?? (() => {
25
27
  const formConfigSchema = FormConfig(configure);
26
28
  const generalFieldTitle = (f) => getStructFieldTitle(formConfigSchema, f) ?? f;
27
29
  const generalFieldDescription = (f) => getStructFieldDescription(formConfigSchema, f);
30
+ const initialFieldTitle = (f) => getNestedStructFieldTitle(formConfigSchema, "initial", f) ?? f;
31
+ const initialFieldDescription = (f) => getNestedStructFieldDescription(formConfigSchema, "initial", f);
28
32
  provideCELContext(buildFormCelScope(configure));
29
33
  const formEventAncestor = computed(() => {
30
34
  const id = config.value.id;
@@ -124,45 +128,49 @@ function updateStyle(value) {
124
128
  <Field orientation="vertical">
125
129
  <FieldLabel class="text-xs text-zinc-500">
126
130
  <template
127
- v-if="generalFieldDescription('initial')"
131
+ v-if="initialFieldDescription('request')"
128
132
  #tooltip
129
133
  >
130
134
  <Markdown
131
- :source="generalFieldDescription('initial')"
135
+ :source="initialFieldDescription('request')"
132
136
  block
133
137
  class="prose prose-sm prose-zinc"
134
138
  />
135
139
  </template>
136
- {{ generalFieldTitle("initial") }}(数据)
140
+ {{ initialFieldTitle("request") }}
137
141
  </FieldLabel>
138
142
  <ExpressionEditor
139
- :model-value="config.initial?.data ?? ''"
140
- placeholder="如 { 'name': '', 'age': 0 }"
141
- result-type="dyn"
142
- :extra-vars="{ json: { type: 'optional<dyn>', label: 'HTTP \u54CD\u5E94\u4F53', description: '\u300C\u8BF7\u6C42\u300D\u7684\u54CD\u5E94\u4F53\uFF08\u5DF2\u89E3\u6790 JSON\uFF09\uFF1B\u672A\u914D\u7F6E\u8BF7\u6C42\u65F6\u4E3A none' } }"
143
+ :model-value="config.initial?.request ?? ''"
144
+ placeholder="如 http.get('https://api.example.com/record/1')"
145
+ result-type="HttpRequest"
143
146
  multiline
144
147
  class="min-h-20"
145
- @update:model-value="(v) => setInitialField('data', v)"
148
+ @update:model-value="(v) => setInitialField('request', v)"
146
149
  />
147
150
  </Field>
148
151
 
149
152
  <Field orientation="vertical">
150
153
  <FieldLabel class="text-xs text-zinc-500">
151
- <template #tooltip>
154
+ <template
155
+ v-if="initialFieldDescription('data')"
156
+ #tooltip
157
+ >
152
158
  <Markdown
153
- source="可选的 HTTP 请求:返回 `HttpRequest`,由宿主发起,响应体作为 `json` 传给「数据」表达式"
159
+ :source="initialFieldDescription('data')"
154
160
  block
155
161
  class="prose prose-sm prose-zinc"
156
162
  />
157
163
  </template>
158
- {{ generalFieldTitle("initial") }}(请求)
164
+ {{ initialFieldTitle("data") }}
159
165
  </FieldLabel>
160
166
  <ExpressionEditor
161
- :model-value="config.initial?.request ?? ''"
162
- placeholder="如 http.get('https://api.example.com/record/1')"
163
- result-type="HttpRequest"
164
- class="min-h-10"
165
- @update:model-value="(v) => setInitialField('request', v)"
167
+ :model-value="config.initial?.data ?? ''"
168
+ placeholder="如 { 'name': '', 'age': 0 }"
169
+ result-type="dyn"
170
+ :extra-vars="{ json: { type: 'optional<dyn>', label: 'HTTP \u54CD\u5E94\u4F53', description: '\u300C\u8BF7\u6C42\u300D\u7684\u54CD\u5E94\u4F53\uFF08\u5DF2\u89E3\u6790 JSON\uFF09\uFF1B\u672A\u914D\u7F6E\u8BF7\u6C42\u65F6\u4E3A none' } }"
171
+ multiline
172
+ class="min-h-20"
173
+ @update:model-value="(v) => setInitialField('data', v)"
166
174
  />
167
175
  </Field>
168
176
 
@@ -1,10 +1,11 @@
1
1
  <script setup>
2
2
  import { Icon } from "@iconify/vue";
3
3
  import { watchDebounced } from "@vueuse/core";
4
- import { Effect } from "effect";
4
+ import { Effect, Option } from "effect";
5
5
  import { Fetch } from "fx-fetch";
6
6
  import { computed, nextTick, ref } from "vue";
7
7
  import { useI18n } from "vue-i18n";
8
+ import { asRequest, fetchJsonOption } from "../../../../../share/request";
8
9
  import { cel as _rawCel } from "../../../../../utils/cel";
9
10
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
10
11
  import { getLocalizedText } from "../../../../../share/locale";
@@ -100,8 +101,8 @@ const requestSignature = computed(() => {
100
101
  const expr = props.config.request;
101
102
  if (!expr) return null;
102
103
  try {
103
- const builder = Effect.runSync($cel(expr, { form: state.value ?? {} }));
104
- return JSON.stringify(builder.describe());
104
+ const req = asRequest(Effect.runSync($cel(expr, { form: state.value ?? {} })));
105
+ return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
105
106
  } catch {
106
107
  return null;
107
108
  }
@@ -117,8 +118,8 @@ async function fetchOptions() {
117
118
  const expr = props.config.request;
118
119
  isLoading.value = true;
119
120
  const program = Effect.gen(function* () {
120
- const builder = yield* $cel(expr, { form: state.value ?? {} });
121
- return yield* builder.json();
121
+ const body = yield* fetchJsonOption(yield* $cel(expr, { form: state.value ?? {} }));
122
+ return Option.getOrNull(body);
122
123
  });
123
124
  try {
124
125
  const result = await Effect.runPromise(Effect.provide(program, Fetch.layer));
@@ -1,5 +1,5 @@
1
1
  import { Schema } from "effect";
2
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
2
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
4
  import { commonFieldFields, derivedField, FieldOrientationSchema } from "../../../utils/common.js";
5
5
  export const type = "com.shwfed.form.field.combobox.single.remote";
@@ -35,7 +35,7 @@ function configureWithJson(configure) {
35
35
  const isListType = (actual) => actual === "dyn" || actual.startsWith("list");
36
36
  export function schema(configure) {
37
37
  const CelBool = Expression({ configure, resultType: "bool" });
38
- const CelHttpRequest = Expression({ configure, resultType: "HttpRequest" });
38
+ const CelHttpRequest = Expression({ configure, resultType: HttpRequestResult });
39
39
  const CelOptions = Expression({ configure: configureWithJson(configure), resultType: isListType });
40
40
  const CelOptionValue = Expression({ configure: configureWithOption(configure), resultType: "dyn" });
41
41
  const LocaleOptionLabel = LocaleMarkdown({ configure: configureWithOption(configure) });
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
4
4
  import { Fetch } from "fx-fetch";
5
5
  import { computed, ref, shallowRef, watch } from "vue";
6
6
  import { useI18n } from "vue-i18n";
7
+ import { fetchJsonOption } from "../../../../../share/request";
7
8
  import { cel as _rawCel } from "../../../../../utils/cel";
8
9
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
9
10
  import { getLocalizedText } from "../../../../../share/locale";
@@ -100,11 +101,9 @@ async function fetchTree() {
100
101
  const effect = Effect.gen(function* () {
101
102
  let jsonOpt = Option.none();
102
103
  if (dataSource.request) {
103
- const builder = yield* $cel(dataSource.request, {
104
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
104
105
  form: state.value ?? {}
105
- });
106
- const response = yield* builder.json();
107
- jsonOpt = Option.some(response);
106
+ }));
108
107
  }
109
108
  const dataRaw = yield* $cel(dataSource.data, {
110
109
  form: state.value ?? {},
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
4
4
  import { Fetch } from "fx-fetch";
5
5
  import { computed, ref, shallowRef, watch } from "vue";
6
6
  import { useI18n } from "vue-i18n";
7
+ import { fetchJsonOption } from "../../../../../share/request";
7
8
  import { cel as _rawCel } from "../../../../../utils/cel";
8
9
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
9
10
  import { getLocalizedText } from "../../../../../share/locale";
@@ -163,11 +164,9 @@ async function fetchTree() {
163
164
  const effect = Effect.gen(function* () {
164
165
  let jsonOpt = Option.none();
165
166
  if (dataSource.request) {
166
- const builder = yield* $cel(dataSource.request, {
167
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
167
168
  form: state.value ?? {}
168
- });
169
- const response = yield* builder.json();
170
- jsonOpt = Option.some(response);
169
+ }));
171
170
  }
172
171
  const dataRaw = yield* $cel(dataSource.data, {
173
172
  form: state.value ?? {},
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
4
4
  import { Fetch } from "fx-fetch";
5
5
  import { computed, ref, shallowRef, watch } from "vue";
6
6
  import { useI18n } from "vue-i18n";
7
+ import { fetchJsonOption } from "../../../../../share/request";
7
8
  import { cel as _rawCel } from "../../../../../utils/cel";
8
9
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
9
10
  import { getLocalizedText } from "../../../../../share/locale";
@@ -164,11 +165,9 @@ async function fetchTree() {
164
165
  const effect = Effect.gen(function* () {
165
166
  let jsonOpt = Option.none();
166
167
  if (dataSource.request) {
167
- const builder = yield* $cel(dataSource.request, {
168
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
168
169
  form: state.value ?? {}
169
- });
170
- const response = yield* builder.json();
171
- jsonOpt = Option.some(response);
170
+ }));
172
171
  }
173
172
  const dataRaw = yield* $cel(dataSource.data, {
174
173
  form: state.value ?? {},
@@ -1,10 +1,11 @@
1
1
  <script setup>
2
2
  import { Icon } from "@iconify/vue";
3
3
  import { watchDebounced } from "@vueuse/core";
4
- import { Effect } from "effect";
4
+ import { Effect, Option } from "effect";
5
5
  import { Fetch } from "fx-fetch";
6
6
  import { computed, ref } from "vue";
7
7
  import { useI18n } from "vue-i18n";
8
+ import { asRequest, fetchJsonOption } from "../../../../../share/request";
8
9
  import { cel as _rawCel } from "../../../../../utils/cel";
9
10
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
10
11
  import { interpolateMarkdown } from "../../../../table/utils/runtime";
@@ -101,8 +102,8 @@ const requestSignature = computed(() => {
101
102
  const expr = opts.request;
102
103
  if (!expr) return null;
103
104
  try {
104
- const builder = Effect.runSync($cel(expr, { form: state.value ?? {} }));
105
- return JSON.stringify(builder.describe());
105
+ const req = asRequest(Effect.runSync($cel(expr, { form: state.value ?? {} })));
106
+ return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
106
107
  } catch {
107
108
  return null;
108
109
  }
@@ -124,8 +125,8 @@ async function fetchOptions() {
124
125
  }
125
126
  isLoading.value = true;
126
127
  const program = Effect.gen(function* () {
127
- const builder = yield* $cel(expr, { form: state.value ?? {} });
128
- return yield* builder.json();
128
+ const body = yield* fetchJsonOption(yield* $cel(expr, { form: state.value ?? {} }));
129
+ return Option.getOrNull(body);
129
130
  });
130
131
  try {
131
132
  const result = await Effect.runPromise(Effect.provide(program, Fetch.layer));
@@ -1,5 +1,5 @@
1
1
  import { Effect, Schema } from "effect";
2
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
2
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
4
  import { commonFieldFields, derivedField, FieldOrientationSchema } from "../../../utils/common.js";
5
5
  export const type = "com.shwfed.form.field.combobox.multi";
@@ -59,7 +59,7 @@ export function itemSchema(configure) {
59
59
  export function remoteOptionsSchema(configure) {
60
60
  const CelRequest = Schema.Union(
61
61
  Schema.Literal(""),
62
- Expression({ configure, resultType: "HttpRequest" })
62
+ Expression({ configure, resultType: HttpRequestResult })
63
63
  );
64
64
  const CelOptions = Expression({ configure: configureWithJson(configure), resultType: isListType });
65
65
  const CelOptionValue = Expression({ configure: configureWithOption(configure), resultType: "dyn" });
@@ -1,10 +1,11 @@
1
1
  <script setup>
2
2
  import { Icon } from "@iconify/vue";
3
3
  import { watchDebounced } from "@vueuse/core";
4
- import { Effect } from "effect";
4
+ import { Effect, Option } from "effect";
5
5
  import { Fetch } from "fx-fetch";
6
6
  import { computed, nextTick, ref, watch } from "vue";
7
7
  import { useI18n } from "vue-i18n";
8
+ import { asRequest, fetchJsonOption } from "../../../../../share/request";
8
9
  import { cel as _rawCel } from "../../../../../utils/cel";
9
10
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
10
11
  import { interpolateMarkdown } from "../../../../table/utils/runtime";
@@ -101,8 +102,8 @@ const requestSignature = computed(() => {
101
102
  const expr = opts.request;
102
103
  if (!expr) return null;
103
104
  try {
104
- const builder = Effect.runSync($cel(expr, { form: state.value ?? {} }));
105
- return JSON.stringify(builder.describe());
105
+ const req = asRequest(Effect.runSync($cel(expr, { form: state.value ?? {} })));
106
+ return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
106
107
  } catch {
107
108
  return null;
108
109
  }
@@ -124,8 +125,8 @@ async function fetchOptions() {
124
125
  }
125
126
  isLoading.value = true;
126
127
  const program = Effect.gen(function* () {
127
- const builder = yield* $cel(expr, { form: state.value ?? {} });
128
- return yield* builder.json();
128
+ const body = yield* fetchJsonOption(yield* $cel(expr, { form: state.value ?? {} }));
129
+ return Option.getOrNull(body);
129
130
  });
130
131
  try {
131
132
  const result = await Effect.runPromise(Effect.provide(program, Fetch.layer));
@@ -1,5 +1,5 @@
1
1
  import { Effect, Schema } from "effect";
2
- import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
2
+ import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
3
3
  import { Locale } from "../../../../../share/locale.js";
4
4
  import { commonFieldFields, derivedField, FieldOrientationSchema } from "../../../utils/common.js";
5
5
  export const type = "com.shwfed.form.field.combobox.single";
@@ -59,7 +59,7 @@ export function itemSchema(configure) {
59
59
  export function remoteOptionsSchema(configure) {
60
60
  const CelRequest = Schema.Union(
61
61
  Schema.Literal(""),
62
- Expression({ configure, resultType: "HttpRequest" })
62
+ Expression({ configure, resultType: HttpRequestResult })
63
63
  );
64
64
  const CelOptions = Expression({ configure: configureWithJson(configure), resultType: isListType });
65
65
  const CelOptionValue = Expression({ configure: configureWithOption(configure), resultType: "dyn" });
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
4
4
  import { Fetch } from "fx-fetch";
5
5
  import { computed, ref, shallowRef, watch } from "vue";
6
6
  import { useI18n } from "vue-i18n";
7
+ import { fetchJsonOption } from "../../../../../share/request";
7
8
  import { cel as _rawCel } from "../../../../../utils/cel";
8
9
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
9
10
  import { getLocalizedText } from "../../../../../share/locale";
@@ -181,11 +182,9 @@ async function fetchTree() {
181
182
  const effect = Effect.gen(function* () {
182
183
  let jsonOpt = Option.none();
183
184
  if (dataSource.request) {
184
- const builder = yield* $cel(dataSource.request, {
185
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
185
186
  form: state.value ?? {}
186
- });
187
- const response = yield* builder.json();
188
- jsonOpt = Option.some(response);
187
+ }));
189
188
  }
190
189
  const dataRaw = yield* $cel(dataSource.data, {
191
190
  form: state.value ?? {},
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
4
4
  import { Fetch } from "fx-fetch";
5
5
  import { computed, ref, shallowRef, watch } from "vue";
6
6
  import { useI18n } from "vue-i18n";
7
+ import { fetchJsonOption } from "../../../../../share/request";
7
8
  import { cel as _rawCel } from "../../../../../utils/cel";
8
9
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
9
10
  import { getLocalizedText } from "../../../../../share/locale";
@@ -182,11 +183,9 @@ async function fetchTree() {
182
183
  const effect = Effect.gen(function* () {
183
184
  let jsonOpt = Option.none();
184
185
  if (dataSource.request) {
185
- const builder = yield* $cel(dataSource.request, {
186
+ jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
186
187
  form: state.value ?? {}
187
- });
188
- const response = yield* builder.json();
189
- jsonOpt = Option.some(response);
188
+ }));
190
189
  }
191
190
  const dataRaw = yield* $cel(dataSource.data, {
192
191
  form: state.value ?? {},