@ram_28/kf-ai-sdk 2.0.25 → 2.0.27

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.
@@ -1 +1 @@
1
- "use strict";var l=Object.defineProperty;var o=(r,e,t)=>e in r?l(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var a=(r,e,t)=>o(r,typeof e!="symbol"?e+"":e,t);const n=require("./client-D5k4SYuw.cjs");class i{constructor(e){a(this,"_meta");a(this,"_parentBoId");this._meta=e}get id(){return this._meta._id}get label(){return this._meta.Name||this._meta._id}get readOnly(){return this._meta.ReadOnly??!1}get required(){var e;return((e=this._meta.Constraint)==null?void 0:e.Required)??this._meta.Required??!1}get defaultValue(){var e;return this._meta.DefaultValue??((e=this._meta.Constraint)==null?void 0:e.DefaultValue)}get primaryKey(){var e;return((e=this._meta.Constraint)==null?void 0:e.PrimaryKey)??!1}get meta(){return this._meta}}class d extends i{constructor(e){super(e)}get length(){var e;return(e=this._meta.Constraint)==null?void 0:e.Length}validate(e){return e!=null&&typeof e!="string"?{valid:!1,errors:[`${this.label} must be a string`]}:{valid:!0,errors:[]}}}class u extends i{constructor(e){super(e)}get integerPart(){var e;return((e=this._meta.Constraint)==null?void 0:e.IntegerPart)??9}get fractionPart(){var e;return(e=this._meta.Constraint)==null?void 0:e.FractionPart}validate(e){return e==null||e===""?{valid:!0,errors:[]}:typeof e!="number"||isNaN(e)?{valid:!1,errors:[`${this.label} must be a valid number`]}:{valid:!0,errors:[]}}}class f extends i{constructor(e){super(e)}validate(e){return e!=null&&typeof e!="boolean"?{valid:!1,errors:[`${this.label} must be a boolean`]}:{valid:!0,errors:[]}}}class c extends i{constructor(e){super(e)}validate(e){if(e==null||e==="")return{valid:!0,errors:[]};if(typeof e!="string")return{valid:!1,errors:[`${this.label} must be a valid date string`]};if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return{valid:!1,errors:[`${this.label} must be in YYYY-MM-DD format`]};const t=new Date(e+"T00:00:00");return isNaN(t.getTime())?{valid:!1,errors:[`${this.label} is not a valid date`]}:{valid:!0,errors:[]}}}class h extends i{constructor(e){super(e)}get precision(){var e;return((e=this._meta.Constraint)==null?void 0:e.Precision)??"Second"}validate(e){if(e==null||e==="")return{valid:!0,errors:[]};if(typeof e!="string")return{valid:!1,errors:[`${this.label} must be a valid date string`]};const t=new Date(e);return isNaN(t.getTime())?{valid:!1,errors:[`${this.label} is not a valid date`]}:{valid:!0,errors:[]}}}class m extends i{constructor(e){super(e)}get format(){var e;return((e=this._meta.Constraint)==null?void 0:e.Format)??"Plain"}validate(e){return e!=null&&typeof e!="string"?{valid:!1,errors:[`${this.label} must be a string`]}:{valid:!0,errors:[]}}}class b extends i{constructor(e){super(e)}get options(){var t;return(((t=this._meta.Constraint)==null?void 0:t.Enum)??[]).map(s=>({value:s,label:s}))}validate(e){if(e==null||e==="")return{valid:!0,errors:[]};if(this.options.length===0)return{valid:!0,errors:[]};const t=this.options.map(s=>s.value);return t.includes(e)?{valid:!0,errors:[]}:{valid:!1,errors:[`${this.label} must be one of: ${t.join(", ")}`]}}async fetchOptions(e="draft"){if(!this._parentBoId)throw new Error(`Field ${this.id} not bound to a BDO. Cannot fetch options.`);return(await n.api(this._parentBoId).fetchField(e,this.id)).map(s=>({value:s.Value,label:s.Label}))}}class p extends i{constructor(e){super(e)}get referenceBdo(){var e,t;return((t=(e=this._meta.View)==null?void 0:e.DataObject)==null?void 0:t.Id)??""}get referenceFields(){var e;return((e=this._meta.View)==null?void 0:e.Fields)??["_id"]}get searchFields(){var e;return((e=this._meta.View)==null?void 0:e.Search)??[]}validate(e){if(e==null)return{valid:!0,errors:[]};if(typeof e!="object")return{valid:!1,errors:[`${this.label} must be a valid reference object`]};const t=e;return!("_id"in t)||typeof t._id!="string"?{valid:!1,errors:[`${this.label} must have a valid _id`]}:{valid:!0,errors:[]}}async fetchOptions(e="draft"){if(!this._parentBoId)throw new Error(`Field ${this.id} not bound to a BDO. Cannot fetch options.`);return n.api(this._parentBoId).fetchField(e,this.id)}}class _ extends i{constructor(e){super(e)}get businessEntity(){var e;return(e=this._meta.View)==null?void 0:e.BusinessEntity}async fetchOptions(e="draft"){if(!this._parentBoId)throw new Error(`Field ${this.id} not bound to a BDO. Cannot fetch options.`);return n.api(this._parentBoId).fetchField(e,this.id)}validate(e){if(e==null)return{valid:!0,errors:[]};if(typeof e!="object")return{valid:!1,errors:[`${this.label} must be a valid user object`]};const t=e;return!("_id"in t)||typeof t._id!="string"?{valid:!1,errors:[`${this.label} must have a valid _id`]}:{valid:!0,errors:[]}}}class v extends i{constructor(e){super(e)}validate(e){if(e==null)return{valid:!0,errors:[]};if(!Array.isArray(e))return{valid:!1,errors:[`${this.label} must be an array of file objects`]};for(const t of e)if(!t||typeof t!="object"||!t._id)return{valid:!1,errors:[`Each file in ${this.label} must have an _id`]};return{valid:!0,errors:[]}}}exports.BaseField=i;exports.BooleanField=f;exports.DateField=c;exports.DateTimeField=h;exports.FileField=v;exports.NumberField=u;exports.ReferenceField=p;exports.SelectField=b;exports.StringField=d;exports.TextField=m;exports.UserField=_;
1
+ "use strict";var l=Object.defineProperty;var o=(r,e,t)=>e in r?l(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var a=(r,e,t)=>o(r,typeof e!="symbol"?e+"":e,t);const n=require("./client-B4tX3hPi.cjs");class i{constructor(e){a(this,"_meta");a(this,"_parentBoId");this._meta=e}get id(){return this._meta._id}get label(){return this._meta.Name||this._meta._id}get readOnly(){return this._meta.ReadOnly??!1}get required(){var e;return((e=this._meta.Constraint)==null?void 0:e.Required)??this._meta.Required??!1}get defaultValue(){var e;return this._meta.DefaultValue??((e=this._meta.Constraint)==null?void 0:e.DefaultValue)}get primaryKey(){var e;return((e=this._meta.Constraint)==null?void 0:e.PrimaryKey)??!1}get meta(){return this._meta}}class d extends i{constructor(e){super(e)}get length(){var e;return(e=this._meta.Constraint)==null?void 0:e.Length}validate(e){return e!=null&&typeof e!="string"?{valid:!1,errors:[`${this.label} must be a string`]}:{valid:!0,errors:[]}}}class u extends i{constructor(e){super(e)}get integerPart(){var e;return((e=this._meta.Constraint)==null?void 0:e.IntegerPart)??9}get fractionPart(){var e;return(e=this._meta.Constraint)==null?void 0:e.FractionPart}validate(e){return e==null||e===""?{valid:!0,errors:[]}:typeof e!="number"||isNaN(e)?{valid:!1,errors:[`${this.label} must be a valid number`]}:{valid:!0,errors:[]}}}class f extends i{constructor(e){super(e)}validate(e){return e!=null&&typeof e!="boolean"?{valid:!1,errors:[`${this.label} must be a boolean`]}:{valid:!0,errors:[]}}}class c extends i{constructor(e){super(e)}validate(e){if(e==null||e==="")return{valid:!0,errors:[]};if(typeof e!="string")return{valid:!1,errors:[`${this.label} must be a valid date string`]};if(!/^\d{4}-\d{2}-\d{2}$/.test(e))return{valid:!1,errors:[`${this.label} must be in YYYY-MM-DD format`]};const t=new Date(e+"T00:00:00");return isNaN(t.getTime())?{valid:!1,errors:[`${this.label} is not a valid date`]}:{valid:!0,errors:[]}}}class h extends i{constructor(e){super(e)}get precision(){var e;return((e=this._meta.Constraint)==null?void 0:e.Precision)??"Second"}validate(e){if(e==null||e==="")return{valid:!0,errors:[]};if(typeof e!="string")return{valid:!1,errors:[`${this.label} must be a valid date string`]};const t=new Date(e);return isNaN(t.getTime())?{valid:!1,errors:[`${this.label} is not a valid date`]}:{valid:!0,errors:[]}}}class m extends i{constructor(e){super(e)}get format(){var e;return((e=this._meta.Constraint)==null?void 0:e.Format)??"Plain"}validate(e){return e!=null&&typeof e!="string"?{valid:!1,errors:[`${this.label} must be a string`]}:{valid:!0,errors:[]}}}class b extends i{constructor(e){super(e)}get options(){var t;return(((t=this._meta.Constraint)==null?void 0:t.Enum)??[]).map(s=>({value:s,label:s}))}validate(e){if(e==null||e==="")return{valid:!0,errors:[]};if(this.options.length===0)return{valid:!0,errors:[]};const t=this.options.map(s=>s.value);return t.includes(e)?{valid:!0,errors:[]}:{valid:!1,errors:[`${this.label} must be one of: ${t.join(", ")}`]}}async fetchOptions(e="draft"){if(!this._parentBoId)throw new Error(`Field ${this.id} not bound to a BDO. Cannot fetch options.`);return(await n.api(this._parentBoId).fetchField(e,this.id)).map(s=>({value:s.Value,label:s.Label}))}}class p extends i{constructor(e){super(e)}get referenceBdo(){var e,t;return((t=(e=this._meta.View)==null?void 0:e.DataObject)==null?void 0:t.Id)??""}get referenceFields(){var e;return((e=this._meta.View)==null?void 0:e.Fields)??["_id"]}get searchFields(){var e;return((e=this._meta.View)==null?void 0:e.Search)??[]}validate(e){if(e==null)return{valid:!0,errors:[]};if(typeof e!="object")return{valid:!1,errors:[`${this.label} must be a valid reference object`]};const t=e;return!("_id"in t)||typeof t._id!="string"?{valid:!1,errors:[`${this.label} must have a valid _id`]}:{valid:!0,errors:[]}}async fetchOptions(e="draft"){if(!this._parentBoId)throw new Error(`Field ${this.id} not bound to a BDO. Cannot fetch options.`);return n.api(this._parentBoId).fetchField(e,this.id)}}class _ extends i{constructor(e){super(e)}get businessEntity(){var e;return(e=this._meta.View)==null?void 0:e.BusinessEntity}async fetchOptions(e="draft"){if(!this._parentBoId)throw new Error(`Field ${this.id} not bound to a BDO. Cannot fetch options.`);return n.api(this._parentBoId).fetchField(e,this.id)}validate(e){if(e==null)return{valid:!0,errors:[]};if(typeof e!="object")return{valid:!1,errors:[`${this.label} must be a valid user object`]};const t=e;return!("_id"in t)||typeof t._id!="string"?{valid:!1,errors:[`${this.label} must have a valid _id`]}:{valid:!0,errors:[]}}}class v extends i{constructor(e){super(e)}validate(e){if(e==null)return{valid:!0,errors:[]};if(!Array.isArray(e))return{valid:!1,errors:[`${this.label} must be an array of file objects`]};for(const t of e)if(!t||typeof t!="object"||!t._id)return{valid:!1,errors:[`Each file in ${this.label} must have an _id`]};return{valid:!0,errors:[]}}}exports.BaseField=i;exports.BooleanField=f;exports.DateField=c;exports.DateTimeField=h;exports.FileField=v;exports.NumberField=u;exports.ReferenceField=p;exports.SelectField=b;exports.StringField=d;exports.TextField=m;exports.UserField=_;
@@ -1,7 +1,7 @@
1
1
  var o = Object.defineProperty;
2
2
  var l = (r, e, t) => e in r ? o(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
3
  var a = (r, e, t) => l(r, typeof e != "symbol" ? e + "" : e, t);
4
- import { a as n } from "./client-_ayziI1d.js";
4
+ import { a as n } from "./client-DxWWVa0D.js";
5
5
  class s {
6
6
  constructor(e) {
7
7
  /** Full raw backend meta */
package/dist/api.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./client-D5k4SYuw.cjs"),u=require("./metadata-DWXQPDav.cjs"),o=require("./constants-DEmYwKfC.cjs"),p={DATE:"%Y-%m-%d",TIME:"%H:%M:%S",DATE_TIME:"%Y-%m-%d %H:%M:%S"};function D(t){const[e,a,r]=t.$__d__.split("-").map(Number);return new Date(e,a-1,r)}function g(t){return new Date(t.$__dt__*1e3)}function l(t){const e=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),r=String(t.getDate()).padStart(2,"0");return`${e}-${a}-${r}`}function S(t){const e=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),r=String(t.getDate()).padStart(2,"0"),s=String(t.getHours()).padStart(2,"0"),i=String(t.getMinutes()).padStart(2,"0"),c=String(t.getSeconds()).padStart(2,"0");return`${e}-${a}-${r} ${s}:${i}:${c}`}function y(t){const[e,a,r]=t.split("-").map(Number);return new Date(e,a-1,r)}function f(t){const[e,a]=t.split(" "),[r,s,i]=e.split("-").map(Number),[c,d,m]=a.split(":").map(Number);return new Date(r,s-1,i,c,d,m)}exports.api=n.api;exports.getApiBaseUrl=n.getApiBaseUrl;exports.getDefaultHeaders=n.getDefaultHeaders;exports.setApiBaseUrl=n.setApiBaseUrl;exports.setDefaultHeaders=n.setDefaultHeaders;exports.getBdoSchema=u.getBdoSchema;exports.listMetadata=u.listMetadata;exports.DateEncodingKey=o.DateEncodingKey;exports.DeleteStatus=o.DeleteStatus;exports.HttpMethod=o.HttpMethod;exports.MetricType=o.MetricType;exports.QueryType=o.QueryType;exports.DatetimeFormat=p;exports.decodeDate=D;exports.decodeDateTime=g;exports.formatDate=l;exports.formatDateTime=S;exports.parseDate=y;exports.parseDateTime=f;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./client-B4tX3hPi.cjs"),u=require("./metadata-C2JGyvqu.cjs"),o=require("./constants-DEmYwKfC.cjs"),p={DATE:"%Y-%m-%d",TIME:"%H:%M:%S",DATE_TIME:"%Y-%m-%d %H:%M:%S"};function D(t){const[e,a,r]=t.$__d__.split("-").map(Number);return new Date(e,a-1,r)}function g(t){return new Date(t.$__dt__*1e3)}function l(t){const e=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),r=String(t.getDate()).padStart(2,"0");return`${e}-${a}-${r}`}function S(t){const e=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),r=String(t.getDate()).padStart(2,"0"),s=String(t.getHours()).padStart(2,"0"),i=String(t.getMinutes()).padStart(2,"0"),c=String(t.getSeconds()).padStart(2,"0");return`${e}-${a}-${r} ${s}:${i}:${c}`}function y(t){const[e,a,r]=t.split("-").map(Number);return new Date(e,a-1,r)}function f(t){const[e,a]=t.split(" "),[r,s,i]=e.split("-").map(Number),[c,d,m]=a.split(":").map(Number);return new Date(r,s-1,i,c,d,m)}exports.api=n.api;exports.getApiBaseUrl=n.getApiBaseUrl;exports.getDefaultHeaders=n.getDefaultHeaders;exports.setApiBaseUrl=n.setApiBaseUrl;exports.setDefaultHeaders=n.setDefaultHeaders;exports.getBdoSchema=u.getBdoSchema;exports.listMetadata=u.listMetadata;exports.DateEncodingKey=o.DateEncodingKey;exports.DeleteStatus=o.DeleteStatus;exports.HttpMethod=o.HttpMethod;exports.MetricType=o.MetricType;exports.QueryType=o.QueryType;exports.DatetimeFormat=p;exports.decodeDate=D;exports.decodeDateTime=g;exports.formatDate=l;exports.formatDateTime=S;exports.parseDate=y;exports.parseDateTime=f;
package/dist/api.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { a as f, c as h, g as M, s as $, b as T } from "./client-_ayziI1d.js";
2
- import { g as H, l as b } from "./metadata-Cc1mBcLS.js";
1
+ import { a as f, c as h, g as M, s as $, b as T } from "./client-DxWWVa0D.js";
2
+ import { g as H, l as b } from "./metadata-D-6r1Eul.js";
3
3
  import { a as w, b as x, H as A, M as N, Q as Y } from "./constants-Cyi942Yr.js";
4
4
  const m = {
5
5
  /** Date format: "YYYY-MM-DD" */
package/dist/auth.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var J=Object.defineProperty;var X=(e,t,o)=>t in e?J(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var Q=(e,t,o)=>X(e,typeof t!="symbol"?t+"":t,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("react/jsx-runtime"),n=require("react"),M=require("@tanstack/react-query"),K=require("./client-D5k4SYuw.cjs"),W=require("./constants-DEmYwKfC.cjs"),Y={sessionEndpoint:"/api/id",providers:{google:{loginPath:"/api/auth/google/login",logoutPath:"/api/auth/logout"}},defaultProvider:"google",autoRedirect:!1,sessionCheckInterval:0,retry:{count:3,delay:1e3},staleTime:5*60*1e3,refetchOnWindowFocus:!1,refetchOnReconnect:!0};let h={...Y};function G(e){h={...h,...e,providers:{...h.providers,...e.providers},retry:{...h.retry,...e.retry}}}function Z(e,t){h.providers[e]=t}function b(){return{...h}}function k(){return h.baseUrl||K.getApiBaseUrl()||(typeof window<"u"?window.location.origin:"")}function H(e){return h.providers[e]}function D(){h={...Y}}class E extends Error{constructor(o,r){super(o);Q(this,"statusCode");this.name="AuthenticationError",this.statusCode=r}}async function ee(){const e=b(),t=k(),o=K.getDefaultHeaders(),r=await fetch(`${t}${e.sessionEndpoint}`,{method:"GET",headers:o,credentials:"include"});if(!r.ok)throw r.status===401||r.status===403?new E("Not authenticated",r.status):new E(`Session check failed: ${r.statusText}`,r.status);return await r.json()}function N(e,t){return new Promise(()=>{const o=b(),r=k();if(!r)throw new Error('Auth base URL is not configured. Call setApiBaseUrl("https://...") or configureAuth({ baseUrl: "https://..." }) first.');const i=e||o.defaultProvider,l=H(i);if(!l){const w=Object.keys(o.providers||{}).join(", ")||"none";throw new Error(`Auth provider "${i}" is not configured. Available providers: ${w}`)}if(!l.loginPath)throw new Error(`Login path not configured for provider "${i}". Configure it with: configureAuth({ providers: { ${i}: { loginPath: '/api/auth/...' } } })`);let g;try{g=new URL(`${r}${l.loginPath}`)}catch{throw new Error(`Failed to construct login URL. Base URL: "${r}", Login path: "${l.loginPath}". Ensure baseUrl is a valid URL (e.g., "https://example.com").`)}(t!=null&&t.callbackUrl||o.callbackUrl)&&g.searchParams.set("callbackUrl",(t==null?void 0:t.callbackUrl)||o.callbackUrl||window.location.href),t!=null&&t.params&&Object.entries(t.params).forEach(([w,v])=>{g.searchParams.set(w,v)}),window.open(g.toString(),"_blank")})}async function te(e){const t=b(),o=k(),r=H(t.defaultProvider),i=r==null?void 0:r.logoutPath;if(i&&(e==null?void 0:e.callLogoutEndpoint)!==!1)try{await fetch(`${o}${i}`,{method:"POST"})}catch(l){console.warn("Logout endpoint call failed:",l)}e!=null&&e.redirectUrl?window.location.href=e.redirectUrl:t.loginRedirectUrl?window.location.href=t.loginRedirectUrl:window.location.href="/"}const V=n.createContext(null),_=["auth","session"];function re({children:e,config:t,onAuthChange:o,onError:r,loadingComponent:i,unauthenticatedComponent:l,skipInitialCheck:g=!1}){const w=n.useRef(!1);t&&!w.current&&(G(t),w.current=!0);const v=M.useQueryClient(),c=b(),{data:a,isLoading:f,error:U,refetch:R,isFetching:P}=M.useQuery({queryKey:_,queryFn:ee,enabled:!g,retry:(s,A)=>A instanceof E&&(A.statusCode===401||A.statusCode===403)?!1:s<c.retry.count,retryDelay:c.retry.delay,staleTime:c.staleTime,gcTime:c.staleTime*2,refetchOnWindowFocus:c.refetchOnWindowFocus??!0,refetchOnReconnect:c.refetchOnReconnect??!0,refetchInterval:c.sessionCheckInterval||!1}),[L,S]=n.useState(null),d=n.useMemo(()=>f||P?"loading":Object.keys((a==null?void 0:a.userDetails)||{}).length>0?"authenticated":"unauthenticated",[f,P,a]),u=(a==null?void 0:a.userDetails)||null,x=(a==null?void 0:a.staticBaseUrl)||null,$=(a==null?void 0:a.buildId)||null,O=d==="authenticated",C=n.useRef(o);C.current=o;const m=n.useRef(r);m.current=r,n.useEffect(()=>{var s;f||(s=C.current)==null||s.call(C,d,u)},[d,u,f]),n.useEffect(()=>{var s;U&&(S(U),(s=m.current)==null||s.call(m,U))},[U]),n.useEffect(()=>{d==="unauthenticated"&&c.autoRedirect&&!f&&N()},[d,f,c.autoRedirect]);const j=n.useCallback((s,A)=>{N(s,A)},[]),p=n.useCallback(async s=>{v.removeQueries({queryKey:_}),await te(s)},[v]),q=n.useCallback(async()=>{if(P)return a||null;try{return(await R()).data||null}catch(s){return S(s),null}},[R,P,a]),B=n.useCallback(s=>(u==null?void 0:u.Role)===s,[u]),I=n.useCallback(s=>s.includes((u==null?void 0:u.Role)||""),[u]),T=n.useCallback(()=>{S(null)},[]),F=n.useCallback(()=>{R()},[R]),z=n.useMemo(()=>({user:u,staticBaseUrl:x,buildId:$,status:d,isAuthenticated:O,isLoading:f,login:j,logout:p,refreshSession:q,hasRole:B,hasAnyRole:I,error:L,clearError:T,_forceCheck:F}),[u,x,$,d,O,f,j,p,q,B,I,L,T,F]);return d==="loading"&&i?y.jsx(y.Fragment,{children:i}):d==="unauthenticated"&&!c.autoRedirect&&l?y.jsx(y.Fragment,{children:l}):y.jsx(V.Provider,{value:z,children:e})}function ne(){const e=n.useContext(V);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}function oe(){const e=ne();return n.useMemo(()=>({user:e.user,staticBaseUrl:e.staticBaseUrl,buildId:e.buildId,status:e.status,isAuthenticated:e.isAuthenticated,isLoading:e.isLoading,login:e.login,logout:e.logout,refreshSession:e.refreshSession,hasRole:e.hasRole,hasAnyRole:e.hasAnyRole,error:e.error,clearError:e.clearError}),[e.user,e.staticBaseUrl,e.buildId,e.status,e.isAuthenticated,e.isLoading,e.login,e.logout,e.refreshSession,e.hasRole,e.hasAnyRole,e.error,e.clearError])}exports.AuthProviderName=W.AuthProviderName;exports.AuthStatus=W.AuthStatus;exports.AuthProvider=re;exports.AuthenticationError=E;exports.configureAuth=G;exports.getAuthBaseUrl=k;exports.getAuthConfig=b;exports.resetAuthConfig=D;exports.setAuthProvider=Z;exports.useAuth=oe;
1
+ "use strict";var J=Object.defineProperty;var X=(e,t,o)=>t in e?J(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var Q=(e,t,o)=>X(e,typeof t!="symbol"?t+"":t,o);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("react/jsx-runtime"),n=require("react"),M=require("@tanstack/react-query"),K=require("./client-B4tX3hPi.cjs"),W=require("./constants-DEmYwKfC.cjs"),Y={sessionEndpoint:"/api/id",providers:{google:{loginPath:"/api/auth/google/login",logoutPath:"/api/auth/logout"}},defaultProvider:"google",autoRedirect:!1,sessionCheckInterval:0,retry:{count:3,delay:1e3},staleTime:5*60*1e3,refetchOnWindowFocus:!1,refetchOnReconnect:!0};let h={...Y};function G(e){h={...h,...e,providers:{...h.providers,...e.providers},retry:{...h.retry,...e.retry}}}function Z(e,t){h.providers[e]=t}function b(){return{...h}}function k(){return h.baseUrl||K.getApiBaseUrl()||(typeof window<"u"?window.location.origin:"")}function H(e){return h.providers[e]}function D(){h={...Y}}class E extends Error{constructor(o,r){super(o);Q(this,"statusCode");this.name="AuthenticationError",this.statusCode=r}}async function ee(){const e=b(),t=k(),o=K.getDefaultHeaders(),r=await fetch(`${t}${e.sessionEndpoint}`,{method:"GET",headers:o,credentials:"include"});if(!r.ok)throw r.status===401||r.status===403?new E("Not authenticated",r.status):new E(`Session check failed: ${r.statusText}`,r.status);return await r.json()}function N(e,t){return new Promise(()=>{const o=b(),r=k();if(!r)throw new Error('Auth base URL is not configured. Call setApiBaseUrl("https://...") or configureAuth({ baseUrl: "https://..." }) first.');const i=e||o.defaultProvider,l=H(i);if(!l){const w=Object.keys(o.providers||{}).join(", ")||"none";throw new Error(`Auth provider "${i}" is not configured. Available providers: ${w}`)}if(!l.loginPath)throw new Error(`Login path not configured for provider "${i}". Configure it with: configureAuth({ providers: { ${i}: { loginPath: '/api/auth/...' } } })`);let g;try{g=new URL(`${r}${l.loginPath}`)}catch{throw new Error(`Failed to construct login URL. Base URL: "${r}", Login path: "${l.loginPath}". Ensure baseUrl is a valid URL (e.g., "https://example.com").`)}(t!=null&&t.callbackUrl||o.callbackUrl)&&g.searchParams.set("callbackUrl",(t==null?void 0:t.callbackUrl)||o.callbackUrl||window.location.href),t!=null&&t.params&&Object.entries(t.params).forEach(([w,v])=>{g.searchParams.set(w,v)}),window.open(g.toString(),"_blank")})}async function te(e){const t=b(),o=k(),r=H(t.defaultProvider),i=r==null?void 0:r.logoutPath;if(i&&(e==null?void 0:e.callLogoutEndpoint)!==!1)try{await fetch(`${o}${i}`,{method:"POST"})}catch(l){console.warn("Logout endpoint call failed:",l)}e!=null&&e.redirectUrl?window.location.href=e.redirectUrl:t.loginRedirectUrl?window.location.href=t.loginRedirectUrl:window.location.href="/"}const V=n.createContext(null),_=["auth","session"];function re({children:e,config:t,onAuthChange:o,onError:r,loadingComponent:i,unauthenticatedComponent:l,skipInitialCheck:g=!1}){const w=n.useRef(!1);t&&!w.current&&(G(t),w.current=!0);const v=M.useQueryClient(),c=b(),{data:a,isLoading:f,error:U,refetch:R,isFetching:P}=M.useQuery({queryKey:_,queryFn:ee,enabled:!g,retry:(s,A)=>A instanceof E&&(A.statusCode===401||A.statusCode===403)?!1:s<c.retry.count,retryDelay:c.retry.delay,staleTime:c.staleTime,gcTime:c.staleTime*2,refetchOnWindowFocus:c.refetchOnWindowFocus??!0,refetchOnReconnect:c.refetchOnReconnect??!0,refetchInterval:c.sessionCheckInterval||!1}),[L,S]=n.useState(null),d=n.useMemo(()=>f||P?"loading":Object.keys((a==null?void 0:a.userDetails)||{}).length>0?"authenticated":"unauthenticated",[f,P,a]),u=(a==null?void 0:a.userDetails)||null,x=(a==null?void 0:a.staticBaseUrl)||null,$=(a==null?void 0:a.buildId)||null,O=d==="authenticated",C=n.useRef(o);C.current=o;const m=n.useRef(r);m.current=r,n.useEffect(()=>{var s;f||(s=C.current)==null||s.call(C,d,u)},[d,u,f]),n.useEffect(()=>{var s;U&&(S(U),(s=m.current)==null||s.call(m,U))},[U]),n.useEffect(()=>{d==="unauthenticated"&&c.autoRedirect&&!f&&N()},[d,f,c.autoRedirect]);const j=n.useCallback((s,A)=>{N(s,A)},[]),p=n.useCallback(async s=>{v.removeQueries({queryKey:_}),await te(s)},[v]),q=n.useCallback(async()=>{if(P)return a||null;try{return(await R()).data||null}catch(s){return S(s),null}},[R,P,a]),B=n.useCallback(s=>(u==null?void 0:u.Role)===s,[u]),I=n.useCallback(s=>s.includes((u==null?void 0:u.Role)||""),[u]),T=n.useCallback(()=>{S(null)},[]),F=n.useCallback(()=>{R()},[R]),z=n.useMemo(()=>({user:u,staticBaseUrl:x,buildId:$,status:d,isAuthenticated:O,isLoading:f,login:j,logout:p,refreshSession:q,hasRole:B,hasAnyRole:I,error:L,clearError:T,_forceCheck:F}),[u,x,$,d,O,f,j,p,q,B,I,L,T,F]);return d==="loading"&&i?y.jsx(y.Fragment,{children:i}):d==="unauthenticated"&&!c.autoRedirect&&l?y.jsx(y.Fragment,{children:l}):y.jsx(V.Provider,{value:z,children:e})}function ne(){const e=n.useContext(V);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}function oe(){const e=ne();return n.useMemo(()=>({user:e.user,staticBaseUrl:e.staticBaseUrl,buildId:e.buildId,status:e.status,isAuthenticated:e.isAuthenticated,isLoading:e.isLoading,login:e.login,logout:e.logout,refreshSession:e.refreshSession,hasRole:e.hasRole,hasAnyRole:e.hasAnyRole,error:e.error,clearError:e.clearError}),[e.user,e.staticBaseUrl,e.buildId,e.status,e.isAuthenticated,e.isLoading,e.login,e.logout,e.refreshSession,e.hasRole,e.hasAnyRole,e.error,e.clearError])}exports.AuthProviderName=W.AuthProviderName;exports.AuthStatus=W.AuthStatus;exports.AuthProvider=re;exports.AuthenticationError=E;exports.configureAuth=G;exports.getAuthBaseUrl=k;exports.getAuthConfig=b;exports.resetAuthConfig=D;exports.setAuthProvider=Z;exports.useAuth=oe;
package/dist/auth.mjs CHANGED
@@ -4,7 +4,7 @@ var N = (e, t, n) => X(e, typeof t != "symbol" ? t + "" : t, n);
4
4
  import { jsx as C, Fragment as W } from "react/jsx-runtime";
5
5
  import { useRef as p, useState as Z, useMemo as k, useEffect as L, useCallback as f, createContext as D, useContext as ee } from "react";
6
6
  import { useQueryClient as te, useQuery as re } from "@tanstack/react-query";
7
- import { c as ne, g as oe } from "./client-_ayziI1d.js";
7
+ import { c as ne, g as oe } from "./client-DxWWVa0D.js";
8
8
  import { c as me, A as be } from "./constants-Cyi942Yr.js";
9
9
  const H = {
10
10
  sessionEndpoint: "/api/id",
package/dist/bdo.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var v=Object.defineProperty;var A=(t,e,r)=>e in t?v(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var h=(t,e,r)=>A(t,typeof e!="symbol"?e+"":e,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./client-D5k4SYuw.cjs"),w=require("./attachment-constants-B5jlqoKI.cjs"),l=require("./FileField-DU4UWo_t.cjs"),S=require("./constants-DEmYwKfC.cjs");class x{constructor(e,r){h(this,"_data");h(this,"_bdo");h(this,"_accessorCache",new Map);return this._bdo=e,this._data={...r},new Proxy(this,{get(a,s,n){return s==="validate"||s==="toJSON"||s==="_bdo"||s==="_data"||s==="_accessorCache"||s==="_getAccessor"||s==="_requireInstanceId"||typeof s=="symbol"?Reflect.get(a,s,n):s==="_id"?a._data._id:a._getAccessor(s)},set(a,s,n){return s==="_bdo"||s==="_data"||s==="_accessorCache"||s==="validate"||s==="toJSON"?!1:typeof s=="symbol"?Reflect.set(a,s,n):(a._data[s]=n,!0)},has(a,s){return s==="validate"||s==="toJSON"?!0:s in a._data||s in a._bdo.getFields()},ownKeys(a){return[...Object.keys(a._bdo.getFields()),"validate","toJSON"]},getOwnPropertyDescriptor(a,s){if(s==="validate"||s==="toJSON")return{configurable:!0,enumerable:!1,value:a[s]};const n=a._bdo.getFields();if(s in n||s in a._data)return{configurable:!0,enumerable:!0,get:()=>a._getAccessor(s)}}})}_requireInstanceId(){return this._data._id||"draft"}_getAccessor(e){if(this._accessorCache.has(e))return this._accessorCache.get(e);const a=this._bdo.getFields()[e],s=(a==null?void 0:a.meta)??{_id:e,Name:e,Type:"String"},n=(a==null?void 0:a.readOnly)??!1,i=()=>{if(a){const _=a.validate(this._data[e]);if(!_.valid)return _}return this._bdo.hasMetadata()?this._bdo.validateFieldExpression(e,this._data[e],this.toJSON()):{valid:!0,errors:[]}},u=_=>{const f=this._data[e];return f??_};let y;if(n?y={label:(a==null?void 0:a.label)??e,required:(a==null?void 0:a.required)??!1,readOnly:!0,defaultValue:a==null?void 0:a.defaultValue,meta:s,get:()=>this._data[e],getOrDefault:u,validate:i}:y={label:(a==null?void 0:a.label)??e,required:(a==null?void 0:a.required)??!1,readOnly:!1,defaultValue:a==null?void 0:a.defaultValue,meta:s,get:()=>this._data[e],getOrDefault:u,set:_=>{this._data[e]=_},validate:i},s.Type==="Image"||s.Type==="File"){const _=this._bdo.getBoId(),f=y;s.Type==="Image"?(f.getDownloadUrl=async d=>{const m=this._requireInstanceId(),g=this._data[e];if(!(g!=null&&g._id))throw new Error(`${e} has no image to download`);return o.api(_).getDownloadUrl(m,e,g._id,d)},n||(f.upload=async d=>{w.validateFileExtension(d.name,"Image");const m=this._requireInstanceId(),g={FileName:d.name,Size:d.size,FileExtension:w.extractFileExtension(d.name)},[c]=await o.api(_).getUploadUrl(m,e,[g]);await fetch(c.UploadUrl.URL,{method:"PUT",headers:{"Content-Type":c.ContentType},body:d});const b={_id:c._id,_name:c._name,FileName:c.FileName,FileExtension:c.FileExtension,Size:c.Size,ContentType:c.ContentType};return this._data[e]=b,b},f.deleteAttachment=async()=>{const d=this._requireInstanceId(),m=this._data[e];if(!(m!=null&&m._id))throw new Error(`${e} has no image to delete`);await o.api(_).deleteAttachment(d,e,m._id),this._data[e]=null})):(f.getDownloadUrl=async(d,m)=>{const g=this._requireInstanceId();return o.api(_).getDownloadUrl(g,e,d,m)},f.getDownloadUrls=async d=>{const m=this._requireInstanceId();return o.api(_).getDownloadUrls(m,e,d)},n||(f.upload=async d=>{for(const F of d)w.validateFileExtension(F.name,"File");const m=this._requireInstanceId(),g=d.map(F=>({FileName:F.name,Size:F.size,FileExtension:w.extractFileExtension(F.name)})),c=await o.api(_).getUploadUrl(m,e,g),b=await Promise.all(d.map(async(F,N)=>(await fetch(c[N].UploadUrl.URL,{method:"PUT",headers:{"Content-Type":c[N].ContentType},body:F}),{_id:c[N]._id,_name:c[N]._name,FileName:c[N].FileName,FileExtension:c[N].FileExtension,Size:c[N].Size,ContentType:c[N].ContentType}))),U=this._data[e]??[];return this._data[e]=[...U,...b],b},f.deleteAttachment=async d=>{const m=this._requireInstanceId();await o.api(_).deleteAttachment(m,e,d);const g=this._data[e]??[];this._data[e]=g.filter(c=>c._id!==d)}))}return this._accessorCache.set(e,y),y}validate(){const e=this._bdo.getFields(),r=[],a=this.toJSON();for(const[s,n]of Object.entries(e)){if(n.readOnly)continue;const i=this._data[s],u=n.validate(i);if(!u.valid){r.push(...u.errors);continue}if(this._bdo.hasMetadata()){const y=this._bdo.validateFieldExpression(s,i,a);y.valid||r.push(...y.errors)}}return{valid:r.length===0,errors:r}}toJSON(){return{...this._data}}}const O={CONCAT:(...t)=>t.map(e=>String(e??"")).join(""),UPPER:t=>String(t??"").toUpperCase(),LOWER:t=>String(t??"").toLowerCase(),TRIM:t=>String(t??"").trim(),LENGTH:t=>String(t??"").length,SUBSTRING:(t,e,r)=>String(t??"").substring(e,r!==void 0?e+r:void 0),REPLACE:(t,e,r)=>String(t??"").replace(e,r),SUM:(...t)=>t.reduce((e,r)=>e+(Number(r)||0),0),AVG:(...t)=>{const e=t.filter(r=>r!=null&&!isNaN(Number(r)));return e.length===0?0:e.reduce((r,a)=>r+Number(a),0)/e.length},MIN:(...t)=>{const e=t.filter(r=>r!=null&&!isNaN(Number(r))).map(r=>Number(r));return e.length===0?0:Math.min(...e)},MAX:(...t)=>{const e=t.filter(r=>r!=null&&!isNaN(Number(r))).map(r=>Number(r));return e.length===0?0:Math.max(...e)},ABS:t=>Math.abs(Number(t)||0),ROUND:t=>Math.round(Number(t)||0),FLOOR:t=>Math.floor(Number(t)||0),CEIL:t=>Math.ceil(Number(t)||0),YEAR:t=>{const e=new Date(t);return isNaN(e.getTime())?0:e.getFullYear()},MONTH:t=>{const e=new Date(t);return isNaN(e.getTime())?0:e.getMonth()+1},DAY:t=>{const e=new Date(t);return isNaN(e.getTime())?0:e.getDate()},DATE_DIFF:(t,e)=>{const r=new Date(t),a=new Date(e);if(isNaN(r.getTime())||isNaN(a.getTime()))return 0;const s=Math.abs(r.getTime()-a.getTime());return Math.ceil(s/(1e3*60*60*24))},ADD_DAYS:(t,e)=>{const r=new Date(t);return isNaN(r.getTime())?new Date(NaN):(r.setDate(r.getDate()+e),r)},ADD_MONTHS:(t,e)=>{const r=new Date(t);return isNaN(r.getTime())?new Date(NaN):(r.setMonth(r.getMonth()+e),r)},IF:(t,e,r)=>t?e:r,UUID:()=>typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=Math.random()*16|0;return(t==="x"?e:e&3|8).toString(16)})};function D(){const t=new Date;return{NOW:t,TODAY:new Date(t.getFullYear(),t.getMonth(),t.getDate()),CURRENT_USER:{Id:"",Email:"",FirstName:"",LastName:""}}}function p(t,e){var r;switch(t.Type){case"Literal":return t.Value;case"Identifier":return e.formValues[t.Name];case"SystemIdentifier":return R(t,e);case"BinaryExpression":return M(t,e);case"LogicalExpression":return B(t,e);case"CallExpression":return I(t,e);case"MemberExpression":return q(t,e);case"AssignmentExpression":return((r=t.Arguments)==null?void 0:r.length)===1?p(t.Arguments[0],e):void 0;default:throw new Error(`Unsupported expression type: ${t.Type}`)}}function R(t,e){const r=t.Name,a=e.systemValues[r];return t.Property?a&&typeof a=="object"?a[t.Property.Name]:void 0:a}const C=/^\d{4}-\d{2}-\d{2}([ T]\d{2}:\d{2}(:\d{2})?)?$/;function E(t){if(t instanceof Date)return t.getTime();if(typeof t=="string"&&C.test(t)){const e=t.includes("T")||t.includes(" ")?t.replace(" ","T"):t+"T00:00:00";return new Date(e).getTime()}return NaN}function T(t,e){const r=E(t),a=E(e);return!isNaN(r)&&!isNaN(a)?{l:r,r:a}:{l:Number(t),r:Number(e)}}function M(t,e){if(!t.Arguments||t.Arguments.length<2)throw new Error("BinaryExpression requires 2 arguments");const[r,a]=t.Arguments,s=p(r,e),n=p(a,e);switch(t.Operator){case"==":return s==n;case"!=":return s!=n;case"<":{const{l:i,r:u}=T(s,n);return i<u}case"<=":{const{l:i,r:u}=T(s,n);return i<=u}case">":{const{l:i,r:u}=T(s,n);return i>u}case">=":{const{l:i,r:u}=T(s,n);return i>=u}case"+":return Number(s)+Number(n);case"-":return Number(s)-Number(n);case"*":return Number(s)*Number(n);case"/":return Number(n)!==0?Number(s)/Number(n):0;case"%":return Number(s)%Number(n);default:throw new Error(`Unsupported binary operator: ${t.Operator}`)}}function B(t,e){if(!t.Arguments||t.Arguments.length===0)throw new Error("LogicalExpression requires at least 1 argument");const r=t.Arguments;switch(t.Operator){case"AND":return r.every(a=>!!p(a,e));case"OR":return r.some(a=>!!p(a,e));case"!":return!p(r[0],e);default:throw new Error(`Unsupported logical operator: ${t.Operator}`)}}function I(t,e){if(!t.Callee)throw new Error("CallExpression requires a Callee");const r=O[t.Callee];if(!r)throw new Error(`Unknown function: ${t.Callee}`);const a=(t.Arguments??[]).map(s=>p(s,e));return r(...a)}function q(t,e){var s,n;if(!((s=t.Arguments)!=null&&s.length))return;const r=p(t.Arguments[0],e),a=(n=t.Arguments[0].Property)==null?void 0:n.Name;return a&&r&&typeof r=="object"?r[a]:r}class V{constructor(){h(this,"fieldRules",new Map);h(this,"metadata",null)}loadMetadata(e){var r,a;this.metadata=e,this.fieldRules.clear();for(const[s,n]of Object.entries(e.Fields)){const i=[];if(n.Validation&&Array.isArray(n.Validation)){for(const u of n.Validation)if(typeof u=="object"&&u.ExpressionTree)i.push(u);else if(typeof u=="string"){const y=(a=(r=e.Rules)==null?void 0:r.Validation)==null?void 0:a[u];y&&i.push(y)}}i.length>0&&this.fieldRules.set(s,i)}}hasMetadata(){return this.metadata!==null}getFieldRules(e){return this.fieldRules.get(e)??[]}validateField(e,r,a){const s=this.fieldRules.get(e);if(!s||s.length===0)return{valid:!0,errors:[]};const n={formValues:{...a,[e]:r},systemValues:D()};for(const i of s)try{if(!p(i.ExpressionTree,n))return{valid:!1,errors:[i.Message||`Validation failed: ${i.Name||i.Id}`]}}catch(u){console.warn(`Expression evaluation failed for rule ${i.Id}:`,u)}return{valid:!0,errors:[]}}validateAll(e){const r=[];for(const a of this.fieldRules.keys()){const s=this.validateField(a,e[a],e);s.valid||r.push(...s.errors)}return{valid:r.length===0,errors:r}}}class j{constructor(){h(this,"_id",new l.StringField({_id:"_id",Name:"ID",Type:"String",ReadOnly:!0}));h(this,"_created_at",new l.DateTimeField({_id:"_created_at",Name:"Created At",Type:"DateTime",ReadOnly:!0}));h(this,"_modified_at",new l.DateTimeField({_id:"_modified_at",Name:"Modified At",Type:"DateTime",ReadOnly:!0}));h(this,"_created_by",new l.UserField({_id:"_created_by",Name:"Created By",Type:"User",ReadOnly:!0}));h(this,"_modified_by",new l.UserField({_id:"_modified_by",Name:"Modified By",Type:"User",ReadOnly:!0}));h(this,"_version",new l.StringField({_id:"_version",Name:"Version",Type:"String",ReadOnly:!0}));h(this,"_m_version",new l.StringField({_id:"_m_version",Name:"Metadata Version",Type:"String",ReadOnly:!0}));h(this,"_fieldsBound",!1);h(this,"_fieldsCache",null);h(this,"_expressionEngine",new V)}getBoId(){return this.meta._id}getFields(){if(this._fieldsCache)return this._fieldsCache;const e={};for(const r of Object.keys(this)){const a=this[r];a instanceof l.BaseField&&(e[r]=a)}if(!this._fieldsBound){for(const r of Object.values(e))r._parentBoId=this.meta._id;this._fieldsBound=!0}return this._fieldsCache=e,e}loadMetadata(e){this._expressionEngine.loadMetadata(e)}hasMetadata(){return this._expressionEngine.hasMetadata()}validateFieldExpression(e,r,a){return this._expressionEngine.hasMetadata()?this._expressionEngine.validateField(e,r,a):{valid:!0,errors:[]}}async get(e){const r=await o.api(this.meta._id).get(e);return new x(this,r)}async list(e){return(await o.api(this.meta._id).list(e)).Data.map(a=>new x(this,a))}async count(e){return(await o.api(this.meta._id).count(e)).Count}async create(e){const r=await o.api(this.meta._id).create(e);return new x(this,{...e,_id:r._id})}async update(e,r){return o.api(this.meta._id).update(e,r)}async delete(e){return o.api(this.meta._id).delete(e)}async draft(e){return o.api(this.meta._id).draft(e)}async draftInteraction(e){return o.api(this.meta._id).draftInteraction(e)}createItem(e){return new x(this,e??{})}async draftUpdate(e,r){return o.api(this.meta._id).draftUpdate(e,r)}async draftPatch(e,r){return o.api(this.meta._id).draftPatch(e,r)}async metric(e){return o.api(this.meta._id).metric(e)}async pivot(e){return o.api(this.meta._id).pivot(e)}async getUploadUrl(e,r,a){return o.api(this.meta._id).getUploadUrl(e,r,a)}async getDownloadUrl(e,r,a,s){return o.api(this.meta._id).getDownloadUrl(e,r,a,s)}async getDownloadUrls(e,r,a){return o.api(this.meta._id).getDownloadUrls(e,r,a)}async deleteAttachment(e,r,a){return o.api(this.meta._id).deleteAttachment(e,r,a)}}class P extends l.BaseField{constructor(e){super(e)}get elementType(){return this._meta.Property}validate(e){return e!=null&&!Array.isArray(e)?{valid:!1,errors:[`${this.label} must be an array`]}:{valid:!0,errors:[]}}}class L extends l.BaseField{constructor(e){super(e)}get properties(){return this._meta.Property}validate(e){return e==null?{valid:!0,errors:[]}:typeof e!="object"||Array.isArray(e)?{valid:!1,errors:[`${this.label} must be a valid object`]}:{valid:!0,errors:[]}}}class $ extends l.BaseField{constructor(e){super(e)}validate(e){return e==null?{valid:!0,errors:[]}:typeof e!="object"||Array.isArray(e)?{valid:!1,errors:[`${this.label} must be a valid image object`]}:!e._id||!e.FileName?{valid:!1,errors:[`${this.label} must have _id and FileName`]}:{valid:!0,errors:[]}}}exports.BaseField=l.BaseField;exports.BooleanField=l.BooleanField;exports.DateField=l.DateField;exports.DateTimeField=l.DateTimeField;exports.FileField=l.FileField;exports.NumberField=l.NumberField;exports.ReferenceField=l.ReferenceField;exports.SelectField=l.SelectField;exports.StringField=l.StringField;exports.TextAreaField=l.TextField;exports.TextField=l.TextField;exports.UserField=l.UserField;exports.SystemField=S.SystemField;exports.ArrayField=P;exports.BaseBdo=j;exports.ImageField=$;exports.ObjectField=L;
1
+ "use strict";var v=Object.defineProperty;var A=(t,e,r)=>e in t?v(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var h=(t,e,r)=>A(t,typeof e!="symbol"?e+"":e,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./client-B4tX3hPi.cjs"),w=require("./attachment-constants-B5jlqoKI.cjs"),l=require("./FileField-Btr_gdGt.cjs"),S=require("./constants-DEmYwKfC.cjs");class x{constructor(e,r){h(this,"_data");h(this,"_bdo");h(this,"_accessorCache",new Map);return this._bdo=e,this._data={...r},new Proxy(this,{get(a,s,n){return s==="validate"||s==="toJSON"||s==="_bdo"||s==="_data"||s==="_accessorCache"||s==="_getAccessor"||s==="_requireInstanceId"||typeof s=="symbol"?Reflect.get(a,s,n):s==="_id"?a._data._id:a._getAccessor(s)},set(a,s,n){return s==="_bdo"||s==="_data"||s==="_accessorCache"||s==="validate"||s==="toJSON"?!1:typeof s=="symbol"?Reflect.set(a,s,n):(a._data[s]=n,!0)},has(a,s){return s==="validate"||s==="toJSON"?!0:s in a._data||s in a._bdo.getFields()},ownKeys(a){return[...Object.keys(a._bdo.getFields()),"validate","toJSON"]},getOwnPropertyDescriptor(a,s){if(s==="validate"||s==="toJSON")return{configurable:!0,enumerable:!1,value:a[s]};const n=a._bdo.getFields();if(s in n||s in a._data)return{configurable:!0,enumerable:!0,get:()=>a._getAccessor(s)}}})}_requireInstanceId(){return this._data._id||"draft"}_getAccessor(e){if(this._accessorCache.has(e))return this._accessorCache.get(e);const a=this._bdo.getFields()[e],s=(a==null?void 0:a.meta)??{_id:e,Name:e,Type:"String"},n=(a==null?void 0:a.readOnly)??!1,i=()=>{if(a){const _=a.validate(this._data[e]);if(!_.valid)return _}return this._bdo.hasMetadata()?this._bdo.validateFieldExpression(e,this._data[e],this.toJSON()):{valid:!0,errors:[]}},u=_=>{const f=this._data[e];return f??_};let y;if(n?y={label:(a==null?void 0:a.label)??e,required:(a==null?void 0:a.required)??!1,readOnly:!0,defaultValue:a==null?void 0:a.defaultValue,meta:s,get:()=>this._data[e],getOrDefault:u,validate:i}:y={label:(a==null?void 0:a.label)??e,required:(a==null?void 0:a.required)??!1,readOnly:!1,defaultValue:a==null?void 0:a.defaultValue,meta:s,get:()=>this._data[e],getOrDefault:u,set:_=>{this._data[e]=_},validate:i},s.Type==="Image"||s.Type==="File"){const _=this._bdo.getBoId(),f=y;s.Type==="Image"?(f.getDownloadUrl=async d=>{const m=this._requireInstanceId(),g=this._data[e];if(!(g!=null&&g._id))throw new Error(`${e} has no image to download`);return o.api(_).getDownloadUrl(m,e,g._id,d)},n||(f.upload=async d=>{w.validateFileExtension(d.name,"Image");const m=this._requireInstanceId(),g={FileName:d.name,Size:d.size,FileExtension:w.extractFileExtension(d.name)},[c]=await o.api(_).getUploadUrl(m,e,[g]);await fetch(c.UploadUrl.URL,{method:"PUT",headers:{"Content-Type":c.ContentType},body:d});const b={_id:c._id,_name:c._name,FileName:c.FileName,FileExtension:c.FileExtension,Size:c.Size,ContentType:c.ContentType};return this._data[e]=b,b},f.deleteAttachment=async()=>{const d=this._requireInstanceId(),m=this._data[e];if(!(m!=null&&m._id))throw new Error(`${e} has no image to delete`);await o.api(_).deleteAttachment(d,e,m._id),this._data[e]=null})):(f.getDownloadUrl=async(d,m)=>{const g=this._requireInstanceId();return o.api(_).getDownloadUrl(g,e,d,m)},f.getDownloadUrls=async d=>{const m=this._requireInstanceId();return o.api(_).getDownloadUrls(m,e,d)},n||(f.upload=async d=>{for(const F of d)w.validateFileExtension(F.name,"File");const m=this._requireInstanceId(),g=d.map(F=>({FileName:F.name,Size:F.size,FileExtension:w.extractFileExtension(F.name)})),c=await o.api(_).getUploadUrl(m,e,g),b=await Promise.all(d.map(async(F,N)=>(await fetch(c[N].UploadUrl.URL,{method:"PUT",headers:{"Content-Type":c[N].ContentType},body:F}),{_id:c[N]._id,_name:c[N]._name,FileName:c[N].FileName,FileExtension:c[N].FileExtension,Size:c[N].Size,ContentType:c[N].ContentType}))),U=this._data[e]??[];return this._data[e]=[...U,...b],b},f.deleteAttachment=async d=>{const m=this._requireInstanceId();await o.api(_).deleteAttachment(m,e,d);const g=this._data[e]??[];this._data[e]=g.filter(c=>c._id!==d)}))}return this._accessorCache.set(e,y),y}validate(){const e=this._bdo.getFields(),r=[],a=this.toJSON();for(const[s,n]of Object.entries(e)){if(n.readOnly)continue;const i=this._data[s],u=n.validate(i);if(!u.valid){r.push(...u.errors);continue}if(this._bdo.hasMetadata()){const y=this._bdo.validateFieldExpression(s,i,a);y.valid||r.push(...y.errors)}}return{valid:r.length===0,errors:r}}toJSON(){return{...this._data}}}const O={CONCAT:(...t)=>t.map(e=>String(e??"")).join(""),UPPER:t=>String(t??"").toUpperCase(),LOWER:t=>String(t??"").toLowerCase(),TRIM:t=>String(t??"").trim(),LENGTH:t=>String(t??"").length,SUBSTRING:(t,e,r)=>String(t??"").substring(e,r!==void 0?e+r:void 0),REPLACE:(t,e,r)=>String(t??"").replace(e,r),SUM:(...t)=>t.reduce((e,r)=>e+(Number(r)||0),0),AVG:(...t)=>{const e=t.filter(r=>r!=null&&!isNaN(Number(r)));return e.length===0?0:e.reduce((r,a)=>r+Number(a),0)/e.length},MIN:(...t)=>{const e=t.filter(r=>r!=null&&!isNaN(Number(r))).map(r=>Number(r));return e.length===0?0:Math.min(...e)},MAX:(...t)=>{const e=t.filter(r=>r!=null&&!isNaN(Number(r))).map(r=>Number(r));return e.length===0?0:Math.max(...e)},ABS:t=>Math.abs(Number(t)||0),ROUND:t=>Math.round(Number(t)||0),FLOOR:t=>Math.floor(Number(t)||0),CEIL:t=>Math.ceil(Number(t)||0),YEAR:t=>{const e=new Date(t);return isNaN(e.getTime())?0:e.getFullYear()},MONTH:t=>{const e=new Date(t);return isNaN(e.getTime())?0:e.getMonth()+1},DAY:t=>{const e=new Date(t);return isNaN(e.getTime())?0:e.getDate()},DATE_DIFF:(t,e)=>{const r=new Date(t),a=new Date(e);if(isNaN(r.getTime())||isNaN(a.getTime()))return 0;const s=Math.abs(r.getTime()-a.getTime());return Math.ceil(s/(1e3*60*60*24))},ADD_DAYS:(t,e)=>{const r=new Date(t);return isNaN(r.getTime())?new Date(NaN):(r.setDate(r.getDate()+e),r)},ADD_MONTHS:(t,e)=>{const r=new Date(t);return isNaN(r.getTime())?new Date(NaN):(r.setMonth(r.getMonth()+e),r)},IF:(t,e,r)=>t?e:r,UUID:()=>typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=Math.random()*16|0;return(t==="x"?e:e&3|8).toString(16)})};function D(){const t=new Date;return{NOW:t,TODAY:new Date(t.getFullYear(),t.getMonth(),t.getDate()),CURRENT_USER:{Id:"",Email:"",FirstName:"",LastName:""}}}function p(t,e){var r;switch(t.Type){case"Literal":return t.Value;case"Identifier":return e.formValues[t.Name];case"SystemIdentifier":return R(t,e);case"BinaryExpression":return M(t,e);case"LogicalExpression":return B(t,e);case"CallExpression":return I(t,e);case"MemberExpression":return q(t,e);case"AssignmentExpression":return((r=t.Arguments)==null?void 0:r.length)===1?p(t.Arguments[0],e):void 0;default:throw new Error(`Unsupported expression type: ${t.Type}`)}}function R(t,e){const r=t.Name,a=e.systemValues[r];return t.Property?a&&typeof a=="object"?a[t.Property.Name]:void 0:a}const C=/^\d{4}-\d{2}-\d{2}([ T]\d{2}:\d{2}(:\d{2})?)?$/;function E(t){if(t instanceof Date)return t.getTime();if(typeof t=="string"&&C.test(t)){const e=t.includes("T")||t.includes(" ")?t.replace(" ","T"):t+"T00:00:00";return new Date(e).getTime()}return NaN}function T(t,e){const r=E(t),a=E(e);return!isNaN(r)&&!isNaN(a)?{l:r,r:a}:{l:Number(t),r:Number(e)}}function M(t,e){if(!t.Arguments||t.Arguments.length<2)throw new Error("BinaryExpression requires 2 arguments");const[r,a]=t.Arguments,s=p(r,e),n=p(a,e);switch(t.Operator){case"==":return s==n;case"!=":return s!=n;case"<":{const{l:i,r:u}=T(s,n);return i<u}case"<=":{const{l:i,r:u}=T(s,n);return i<=u}case">":{const{l:i,r:u}=T(s,n);return i>u}case">=":{const{l:i,r:u}=T(s,n);return i>=u}case"+":return Number(s)+Number(n);case"-":return Number(s)-Number(n);case"*":return Number(s)*Number(n);case"/":return Number(n)!==0?Number(s)/Number(n):0;case"%":return Number(s)%Number(n);default:throw new Error(`Unsupported binary operator: ${t.Operator}`)}}function B(t,e){if(!t.Arguments||t.Arguments.length===0)throw new Error("LogicalExpression requires at least 1 argument");const r=t.Arguments;switch(t.Operator){case"AND":return r.every(a=>!!p(a,e));case"OR":return r.some(a=>!!p(a,e));case"!":return!p(r[0],e);default:throw new Error(`Unsupported logical operator: ${t.Operator}`)}}function I(t,e){if(!t.Callee)throw new Error("CallExpression requires a Callee");const r=O[t.Callee];if(!r)throw new Error(`Unknown function: ${t.Callee}`);const a=(t.Arguments??[]).map(s=>p(s,e));return r(...a)}function q(t,e){var s,n;if(!((s=t.Arguments)!=null&&s.length))return;const r=p(t.Arguments[0],e),a=(n=t.Arguments[0].Property)==null?void 0:n.Name;return a&&r&&typeof r=="object"?r[a]:r}class V{constructor(){h(this,"fieldRules",new Map);h(this,"metadata",null)}loadMetadata(e){var r,a;this.metadata=e,this.fieldRules.clear();for(const[s,n]of Object.entries(e.Fields)){const i=[];if(n.Validation&&Array.isArray(n.Validation)){for(const u of n.Validation)if(typeof u=="object"&&u.ExpressionTree)i.push(u);else if(typeof u=="string"){const y=(a=(r=e.Rules)==null?void 0:r.Validation)==null?void 0:a[u];y&&i.push(y)}}i.length>0&&this.fieldRules.set(s,i)}}hasMetadata(){return this.metadata!==null}getFieldRules(e){return this.fieldRules.get(e)??[]}validateField(e,r,a){const s=this.fieldRules.get(e);if(!s||s.length===0)return{valid:!0,errors:[]};const n={formValues:{...a,[e]:r},systemValues:D()};for(const i of s)try{if(!p(i.ExpressionTree,n))return{valid:!1,errors:[i.Message||`Validation failed: ${i.Name||i.Id}`]}}catch(u){console.warn(`Expression evaluation failed for rule ${i.Id}:`,u)}return{valid:!0,errors:[]}}validateAll(e){const r=[];for(const a of this.fieldRules.keys()){const s=this.validateField(a,e[a],e);s.valid||r.push(...s.errors)}return{valid:r.length===0,errors:r}}}class j{constructor(){h(this,"_id",new l.StringField({_id:"_id",Name:"ID",Type:"String",ReadOnly:!0}));h(this,"_created_at",new l.DateTimeField({_id:"_created_at",Name:"Created At",Type:"DateTime",ReadOnly:!0}));h(this,"_modified_at",new l.DateTimeField({_id:"_modified_at",Name:"Modified At",Type:"DateTime",ReadOnly:!0}));h(this,"_created_by",new l.UserField({_id:"_created_by",Name:"Created By",Type:"User",ReadOnly:!0}));h(this,"_modified_by",new l.UserField({_id:"_modified_by",Name:"Modified By",Type:"User",ReadOnly:!0}));h(this,"_version",new l.StringField({_id:"_version",Name:"Version",Type:"String",ReadOnly:!0}));h(this,"_m_version",new l.StringField({_id:"_m_version",Name:"Metadata Version",Type:"String",ReadOnly:!0}));h(this,"_fieldsBound",!1);h(this,"_fieldsCache",null);h(this,"_expressionEngine",new V)}getBoId(){return this.meta._id}getFields(){if(this._fieldsCache)return this._fieldsCache;const e={};for(const r of Object.keys(this)){const a=this[r];a instanceof l.BaseField&&(e[r]=a)}if(!this._fieldsBound){for(const r of Object.values(e))r._parentBoId=this.meta._id;this._fieldsBound=!0}return this._fieldsCache=e,e}loadMetadata(e){this._expressionEngine.loadMetadata(e)}hasMetadata(){return this._expressionEngine.hasMetadata()}validateFieldExpression(e,r,a){return this._expressionEngine.hasMetadata()?this._expressionEngine.validateField(e,r,a):{valid:!0,errors:[]}}async get(e){const r=await o.api(this.meta._id).get(e);return new x(this,r)}async list(e){return(await o.api(this.meta._id).list(e)).Data.map(a=>new x(this,a))}async count(e){return(await o.api(this.meta._id).count(e)).Count}async create(e){const r=await o.api(this.meta._id).create(e);return new x(this,{...e,_id:r._id})}async update(e,r){return o.api(this.meta._id).update(e,r)}async delete(e){return o.api(this.meta._id).delete(e)}async draft(e){return o.api(this.meta._id).draft(e)}async draftInteraction(e){return o.api(this.meta._id).draftInteraction(e)}createItem(e){return new x(this,e??{})}async draftUpdate(e,r){return o.api(this.meta._id).draftUpdate(e,r)}async draftPatch(e,r){return o.api(this.meta._id).draftPatch(e,r)}async metric(e){return o.api(this.meta._id).metric(e)}async pivot(e){return o.api(this.meta._id).pivot(e)}async getUploadUrl(e,r,a){return o.api(this.meta._id).getUploadUrl(e,r,a)}async getDownloadUrl(e,r,a,s){return o.api(this.meta._id).getDownloadUrl(e,r,a,s)}async getDownloadUrls(e,r,a){return o.api(this.meta._id).getDownloadUrls(e,r,a)}async deleteAttachment(e,r,a){return o.api(this.meta._id).deleteAttachment(e,r,a)}}class P extends l.BaseField{constructor(e){super(e)}get elementType(){return this._meta.Property}validate(e){return e!=null&&!Array.isArray(e)?{valid:!1,errors:[`${this.label} must be an array`]}:{valid:!0,errors:[]}}}class L extends l.BaseField{constructor(e){super(e)}get properties(){return this._meta.Property}validate(e){return e==null?{valid:!0,errors:[]}:typeof e!="object"||Array.isArray(e)?{valid:!1,errors:[`${this.label} must be a valid object`]}:{valid:!0,errors:[]}}}class $ extends l.BaseField{constructor(e){super(e)}validate(e){return e==null?{valid:!0,errors:[]}:typeof e!="object"||Array.isArray(e)?{valid:!1,errors:[`${this.label} must be a valid image object`]}:!e._id||!e.FileName?{valid:!1,errors:[`${this.label} must have _id and FileName`]}:{valid:!0,errors:[]}}}exports.BaseField=l.BaseField;exports.BooleanField=l.BooleanField;exports.DateField=l.DateField;exports.DateTimeField=l.DateTimeField;exports.FileField=l.FileField;exports.NumberField=l.NumberField;exports.ReferenceField=l.ReferenceField;exports.SelectField=l.SelectField;exports.StringField=l.StringField;exports.TextAreaField=l.TextField;exports.TextField=l.TextField;exports.UserField=l.UserField;exports.SystemField=S.SystemField;exports.ArrayField=P;exports.BaseBdo=j;exports.ImageField=$;exports.ObjectField=L;
package/dist/bdo.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  var R = Object.defineProperty;
2
2
  var D = (t, e, r) => e in t ? R(t, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : t[e] = r;
3
3
  var m = (t, e, r) => D(t, typeof e != "symbol" ? e + "" : e, r);
4
- import { a as o } from "./client-_ayziI1d.js";
4
+ import { a as o } from "./client-DxWWVa0D.js";
5
5
  import { v as E, e as v } from "./attachment-constants-C2UHWxmp.js";
6
- import { S as F, D as A, U, B as T } from "./FileField-CZjS2uLh.js";
7
- import { a as Q, b as Z, F as ee, N as te, R as re, c as ae, T as se, T as ne } from "./FileField-CZjS2uLh.js";
6
+ import { S as F, D as A, U, B as T } from "./FileField-DUnwFhXd.js";
7
+ import { a as Q, b as Z, F as ee, N as te, R as re, c as ae, T as se, T as ne } from "./FileField-DUnwFhXd.js";
8
8
  import { d as oe } from "./constants-Cyi942Yr.js";
9
9
  class w {
10
10
  constructor(e, r) {
@@ -1 +1 @@
1
- "use strict";let f={baseUrl:"",headers:{"Content-Type":"application/json"}};function u(o){f.baseUrl=o}function w(o){f.headers={...f.headers,...o}}function s(){return{...f.headers}}function p(){return f.baseUrl||""}function l(o){const a=f.baseUrl;return{async get(r){const t=await fetch(`${a}${o}/${r}/read`,{method:"GET",headers:s()});if(!t.ok)throw new Error(`Failed to get ${o} ${r}: ${t.statusText}`);return(await t.json()).Data},async create(r){const t=await fetch(`${a}${o}/create`,{method:"POST",headers:s(),body:JSON.stringify(r)});if(!t.ok)throw new Error(`Failed to create ${o}: ${t.statusText}`);return(await t.json()).Data},async update(r,t){const e=await fetch(`${a}${o}/${r}/update`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to update ${o} ${r}: ${e.statusText}`);return(await e.json()).Data},async delete(r){const t=await fetch(`${a}${o}/${r}/delete`,{method:"DELETE",headers:s()});if(!t.ok)throw new Error(`Failed to delete ${o} ${r}: ${t.statusText}`);return t.json()},async list(r){const t={Type:"List",...r},e=await fetch(`${a}${o}/list`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to list ${o}: ${e.statusText}`);return await e.json()},async count(r){var c,$;const t={Type:"Metric",GroupBy:[],Metric:[{Field:"_id",Type:"Count"}],...(r==null?void 0:r.Filter)&&{Filter:r.Filter}},e=await fetch(`${a}${o}/metric`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to count ${o}: ${e.statusText}`);return{Count:(($=(c=(await e.json()).Data)==null?void 0:c[0])==null?void 0:$.count__id)??0}},async draft(r){const t=await fetch(`${a}${o}/draft`,{method:"POST",headers:s(),body:JSON.stringify(r)});if(!t.ok)throw new Error(`Failed to create draft for ${o}: ${t.statusText}`);return t.json()},async draftUpdate(r,t){const e=await fetch(`${a}${o}/${r}/draft`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to update draft for ${o} ${r}: ${e.statusText}`);return e.json()},async draftPatch(r,t){const e=await fetch(`${a}${o}/${r}/draft`,{method:"PATCH",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to patch draft for ${o} ${r}: ${e.statusText}`);return e.json()},async draftInteraction(r){const t=await fetch(`${a}${o}/draft`,{method:"PATCH",headers:s(),body:JSON.stringify(r)});if(!t.ok)throw new Error(`Failed to create interactive draft for ${o}: ${t.statusText}`);const e=await t.json();return{...e.Data,_id:e.Data._id}},async metric(r){const t={Type:"Metric",...r},e=await fetch(`${a}${o}/metric`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to get metrics for ${o}: ${e.statusText}`);return e.json()},async pivot(r){const t={Type:"Pivot",...r},e=await fetch(`${a}${o}/pivot`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to get pivot data for ${o}: ${e.statusText}`);return e.json()},async fields(){const r=await fetch(`${a}${o}/fields`,{method:"GET",headers:s()});if(!r.ok)throw new Error(`Failed to get fields for ${o}: ${r.statusText}`);return r.json()},async fetchField(r,t){const e=await fetch(`${a}${o}/${r}/field/${t}/fetch`,{method:"GET",headers:s()});if(!e.ok)throw new Error(`Failed to fetch field ${t} for ${o}: ${e.statusText}`);return(await e.json()).Data},async getUploadUrl(r,t,e){const n=await fetch(`${a}${o}/${r}/field/${t}/attachment/upload`,{method:"POST",headers:s(),body:JSON.stringify(e)});if(!n.ok)throw new Error(`Failed to get upload URL for ${o}/${t}: ${n.statusText}`);return(await n.json()).Data},async getDownloadUrl(r,t,e,n){let d=`${a}${o}/${r}/field/${t}/attachment/${e}/read`;n&&(d+=`?view_type=${n}`);const c=await fetch(d,{method:"GET",headers:s()});if(!c.ok)throw new Error(`Failed to get download URL for ${o}/${t}/${e}: ${c.statusText}`);const i=(await c.json()).Data;return i&&i.DownloadUrl&&!i.URL&&(i.URL=i.DownloadUrl),i},async getDownloadUrls(r,t,e){let n=`${a}${o}/${r}/field/${t}/attachment/read`;e&&(n+=`?view_type=${e}`);const d=await fetch(n,{method:"GET",headers:s()});if(!d.ok)throw new Error(`Failed to get download URLs for ${o}/${t}: ${d.statusText}`);const $=(await d.json()).Data;return Array.isArray($)&&$.forEach(i=>{i&&i.DownloadUrl&&!i.URL&&(i.URL=i.DownloadUrl)}),$},async deleteAttachment(r,t,e){const n=await fetch(`${a}${o}/${r}/field/${t}/attachment/${e}/delete`,{method:"DELETE",headers:s()});if(!n.ok)throw new Error(`Failed to delete attachment ${e} for ${o}/${t}: ${n.statusText}`)}}}function y(o){return l(`/api/app/${o}`)}exports.api=y;exports.createResourceClient=l;exports.getApiBaseUrl=p;exports.getDefaultHeaders=s;exports.setApiBaseUrl=u;exports.setDefaultHeaders=w;
1
+ "use strict";let f={baseUrl:"",headers:{"Content-Type":"application/json"}};function u(o){f.baseUrl=o}function w(o){f.headers={...f.headers,...o}}function s(){return{...f.headers}}function y(){return f.baseUrl||""}function l(o){const a=f.baseUrl;return{async get(r){const t=await fetch(`${a}${o}/${r}/read`,{method:"GET",headers:s()});if(!t.ok)throw new Error(`Failed to get ${o} ${r}: ${t.statusText}`);return(await t.json()).Data},async create(r){const t=await fetch(`${a}${o}/create`,{method:"POST",headers:s(),body:JSON.stringify(r)});if(!t.ok)throw new Error(`Failed to create ${o}: ${t.statusText}`);return(await t.json()).Data},async update(r,t){const e=await fetch(`${a}${o}/${r}/update`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to update ${o} ${r}: ${e.statusText}`);return(await e.json()).Data},async delete(r){const t=await fetch(`${a}${o}/${r}/delete`,{method:"DELETE",headers:s()});if(!t.ok)throw new Error(`Failed to delete ${o} ${r}: ${t.statusText}`);return t.json()},async list(r){const t={Type:"List",...r},e=await fetch(`${a}${o}/list`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to list ${o}: ${e.statusText}`);return await e.json()},async count(r){var c,$;const t={Type:"Metric",GroupBy:[],Metric:[{Field:"_id",Type:"Count"}],...(r==null?void 0:r.Filter)&&{Filter:r.Filter}},e=await fetch(`${a}${o}/metric`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to count ${o}: ${e.statusText}`);return{Count:(($=(c=(await e.json()).Data)==null?void 0:c[0])==null?void 0:$.count__id)??0}},async draft(r){const t=await fetch(`${a}${o}/draft`,{method:"POST",headers:s(),body:JSON.stringify(r)});if(!t.ok)throw new Error(`Failed to create draft for ${o}: ${t.statusText}`);return t.json()},async draftUpdate(r,t){const e=await fetch(`${a}${o}/${r}/draft`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to update draft for ${o} ${r}: ${e.statusText}`);return e.json()},async draftPatch(r,t){const e=await fetch(`${a}${o}/${r}/draft`,{method:"PATCH",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to patch draft for ${o} ${r}: ${e.statusText}`);return e.json()},async draftInteraction(r){const t=await fetch(`${a}${o}/draft`,{method:"PATCH",headers:s(),body:JSON.stringify(r)});if(!t.ok)throw new Error(`Failed to create interactive draft for ${o}: ${t.statusText}`);const e=await t.json();return{...e.Data,_id:e.Data._id}},async metric(r){const t={Type:"Metric",...r},e=await fetch(`${a}${o}/metric`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to get metrics for ${o}: ${e.statusText}`);return e.json()},async pivot(r){const t={Type:"Pivot",...r},e=await fetch(`${a}${o}/pivot`,{method:"POST",headers:s(),body:JSON.stringify(t)});if(!e.ok)throw new Error(`Failed to get pivot data for ${o}: ${e.statusText}`);return e.json()},async fields(){const r=await fetch(`${a}${o}/fields`,{method:"GET",headers:s()});if(!r.ok)throw new Error(`Failed to get fields for ${o}: ${r.statusText}`);return r.json()},async fetchField(r,t){const e=await fetch(`${a}${o}/${r}/field/${t}/fetch`,{method:"GET",headers:s()});if(!e.ok)throw new Error(`Failed to fetch field ${t} for ${o}: ${e.statusText}`);return(await e.json()).Data},async getUploadUrl(r,t,e){const n=await fetch(`${a}${o}/${r}/field/${t}/attachment/upload`,{method:"POST",headers:s(),body:JSON.stringify(e)});if(!n.ok)throw new Error(`Failed to get upload URL for ${o}/${t}: ${n.statusText}`);const d=await n.json();return Array.isArray(d)?d:d.Data},async getDownloadUrl(r,t,e,n){let d=`${a}${o}/${r}/field/${t}/attachment/${e}/read`;n&&(d+=`?view_type=${n}`);const c=await fetch(d,{method:"GET",headers:s()});if(!c.ok)throw new Error(`Failed to get download URL for ${o}/${t}/${e}: ${c.statusText}`);const $=await c.json(),i=$.Data??$;return i&&i.DownloadUrl&&!i.URL&&(i.URL=i.DownloadUrl),i},async getDownloadUrls(r,t,e){let n=`${a}${o}/${r}/field/${t}/attachment/read`;e&&(n+=`?view_type=${e}`);const d=await fetch(n,{method:"GET",headers:s()});if(!d.ok)throw new Error(`Failed to get download URLs for ${o}/${t}: ${d.statusText}`);const c=await d.json(),$=Array.isArray(c)?c:c.Data;return Array.isArray($)&&$.forEach(i=>{i&&i.DownloadUrl&&!i.URL&&(i.URL=i.DownloadUrl)}),$},async deleteAttachment(r,t,e){const n=await fetch(`${a}${o}/${r}/field/${t}/attachment/${e}/delete`,{method:"DELETE",headers:s()});if(!n.ok)throw new Error(`Failed to delete attachment ${e} for ${o}/${t}: ${n.statusText}`)}}}function p(o){return l(`/api/app/${o}`)}exports.api=p;exports.createResourceClient=l;exports.getApiBaseUrl=y;exports.getDefaultHeaders=s;exports.setApiBaseUrl=u;exports.setDefaultHeaders=w;
@@ -13,7 +13,7 @@ function u(o) {
13
13
  function a() {
14
14
  return { ...f.headers };
15
15
  }
16
- function p() {
16
+ function y() {
17
17
  return f.baseUrl || "";
18
18
  }
19
19
  function l(o) {
@@ -224,7 +224,8 @@ function l(o) {
224
224
  throw new Error(
225
225
  `Failed to get upload URL for ${o}/${t}: ${n.statusText}`
226
226
  );
227
- return (await n.json()).Data;
227
+ const d = await n.json();
228
+ return Array.isArray(d) ? d : d.Data;
228
229
  },
229
230
  async getDownloadUrl(r, t, e, n) {
230
231
  let d = `${s}${o}/${r}/field/${t}/attachment/${e}/read`;
@@ -237,7 +238,7 @@ function l(o) {
237
238
  throw new Error(
238
239
  `Failed to get download URL for ${o}/${t}/${e}: ${c.statusText}`
239
240
  );
240
- const i = (await c.json()).Data;
241
+ const $ = await c.json(), i = $.Data ?? $;
241
242
  return i && i.DownloadUrl && !i.URL && (i.URL = i.DownloadUrl), i;
242
243
  },
243
244
  async getDownloadUrls(r, t, e) {
@@ -251,7 +252,7 @@ function l(o) {
251
252
  throw new Error(
252
253
  `Failed to get download URLs for ${o}/${t}: ${d.statusText}`
253
254
  );
254
- const $ = (await d.json()).Data;
255
+ const c = await d.json(), $ = Array.isArray(c) ? c : c.Data;
255
256
  return Array.isArray($) && $.forEach((i) => {
256
257
  i && i.DownloadUrl && !i.URL && (i.URL = i.DownloadUrl);
257
258
  }), $;
@@ -271,13 +272,13 @@ function l(o) {
271
272
  }
272
273
  };
273
274
  }
274
- function y(o) {
275
+ function h(o) {
275
276
  return l(`/api/app/${o}`);
276
277
  }
277
278
  export {
278
- y as a,
279
+ h as a,
279
280
  u as b,
280
- p as c,
281
+ y as c,
281
282
  l as d,
282
283
  a as g,
283
284
  w as s
@@ -1,6 +1,11 @@
1
+ import type { MutableRefObject } from "react";
1
2
  import type { UseFormReturn, FieldValues } from "react-hook-form";
2
3
  import type { BaseBdo } from "../../../bdo";
3
4
  import type { FormItemType, ExtractEditableType, ExtractReadonlyType } from "./types";
5
+ /** Callback to sync a field via the full pipeline (validate → API → reset dirty → update computed) */
6
+ export type SyncFieldFnType = (fieldName: string) => Promise<void>;
7
+ /** Callback to persist a field value directly to the server (no mutex, no validation) */
8
+ export type PersistFieldFnType = (fieldName: string, value: unknown) => Promise<void>;
4
9
  /**
5
10
  * Creates a Proxy-based Item that delegates to RHF for state management.
6
11
  *
@@ -12,7 +17,13 @@ import type { FormItemType, ExtractEditableType, ExtractReadonlyType } from "./t
12
17
  *
13
18
  * @param bdo - The BDO instance for field metadata
14
19
  * @param form - The RHF useForm return object
20
+ * @param refs - Optional refs for server sync
21
+ * @param refs.syncFieldRef - syncField pipeline ref (for set() — validates before API call)
22
+ * @param refs.persistRef - direct API ref (for upload/delete — no mutex, no re-validation)
15
23
  * @returns SmartFormItem proxy
16
24
  */
17
- export declare function createItemProxy<B extends BaseBdo<any, any, any>>(bdo: B, form: UseFormReturn<FieldValues>): FormItemType<ExtractEditableType<B>, ExtractReadonlyType<B>>;
25
+ export declare function createItemProxy<B extends BaseBdo<any, any, any>>(bdo: B, form: UseFormReturn<FieldValues>, refs?: {
26
+ syncFieldRef?: MutableRefObject<SyncFieldFnType | null>;
27
+ persistRef?: MutableRefObject<PersistFieldFnType | null>;
28
+ }, operation?: "create" | "update"): FormItemType<ExtractEditableType<B>, ExtractReadonlyType<B>>;
18
29
  //# sourceMappingURL=createItemProxy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createItemProxy.d.ts","sourceRoot":"","sources":["../../../../sdk/components/hooks/useBDOForm/createItemProxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAQ,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EAGpB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC9D,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,GAC/B,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAyS9D"}
1
+ {"version":3,"file":"createItemProxy.d.ts","sourceRoot":"","sources":["../../../../sdk/components/hooks/useBDOForm/createItemProxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAQ,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQ5C,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EAGpB,MAAM,SAAS,CAAC;AAEjB,sGAAsG;AACtG,MAAM,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnE,yFAAyF;AACzF,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC9D,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,EAChC,IAAI,CAAC,EAAE;IACL,YAAY,CAAC,EAAE,gBAAgB,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACxD,UAAU,CAAC,EAAE,gBAAgB,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;CAC1D,EACD,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAC9B,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAuT9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"useBDOForm.d.ts","sourceRoot":"","sources":["../../../../sdk/components/hooks/useBDOForm/useBDOForm.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAIrB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACzD,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAChC,oBAAoB,CAAC,CAAC,CAAC,CAwRzB"}
1
+ {"version":3,"file":"useBDOForm.d.ts","sourceRoot":"","sources":["../../../../sdk/components/hooks/useBDOForm/useBDOForm.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAIrB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACzD,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAChC,oBAAoB,CAAC,CAAC,CAAC,CA6TzB"}
package/dist/form.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const K=require("./constants-DEmYwKfC.cjs"),m=require("react"),w=require("./shared-nnmlRVs7.cjs"),J=require("@tanstack/react-query"),y=require("./client-D5k4SYuw.cjs"),P=require("./attachment-constants-B5jlqoKI.cjs"),W=require("./metadata-DWXQPDav.cjs");function X(T,n){const f=T.getFields(),D=new Map,C=T.getBoId(),c=()=>n.getValues("_id")||"draft";return new Proxy({},{get(q,e){if(typeof e=="symbol")return;if(e==="_id")return n.getValues("_id");if(e==="toJSON")return()=>n.getValues();if(e==="validate")return()=>n.trigger();if(D.has(e))return D.get(e);const s=f[e],o=(s==null?void 0:s.meta)??{_id:e,Name:e,Type:"String"},A=(s==null?void 0:s.readOnly)??!1,S=()=>{if(!s)return{valid:!0,errors:[]};let i=n.getValues(e);if("integerPart"in s&&typeof i=="string"&&i!==""){const a=Number(i);isNaN(a)||(i=a,n.setValue(e,a,{shouldDirty:!1}))}if(!s.required&&(i==null||i===""||Array.isArray(i)&&i.length===0))return{valid:!0,errors:[]};const l=s.validate(i);if(!l.valid)return l;const r=w.validateConstraints(s,i);if(!r.valid)return r;if(T.hasMetadata()){const a=T.validateFieldExpression(e,i,n.getValues());if(!a.valid)return a}return{valid:!0,errors:[]}},x=i=>{const l=n.getValues(e);return l??i};if(!A){const i=()=>{const r=n.getValues(e);return o.Type==="File"?r??[]:r},l={label:(s==null?void 0:s.label)??e,required:(s==null?void 0:s.required)??!1,readOnly:!1,defaultValue:s==null?void 0:s.defaultValue,meta:o,get:i,getOrDefault:x,set:r=>{n.setValue(e,r,{shouldDirty:!0,shouldTouch:!0,shouldValidate:!1})},validate:S};if(o.Type==="Image"||o.Type==="File"){const r=C;o.Type==="Image"?(l.upload=async a=>{P.validateFileExtension(a.name,"Image");const t=c(),[u]=await y.api(r).getUploadUrl(t,e,[{FileName:a.name,Size:a.size,FileExtension:P.extractFileExtension(a.name)}]);await fetch(u.UploadUrl.URL,{method:"PUT",headers:{"Content-Type":u.ContentType},body:a});const d={_id:u._id,_name:u._name,FileName:u.FileName,FileExtension:u.FileExtension,Size:u.Size,ContentType:u.ContentType};return n.setValue(e,d,{shouldDirty:!0}),d},l.deleteAttachment=async()=>{const a=n.getValues(e),t=c();if(!(a!=null&&a._id))throw new Error(`${e} has no image to delete`);await y.api(r).deleteAttachment(t,e,a._id),n.setValue(e,null,{shouldDirty:!0})},l.getDownloadUrl=async a=>{const t=n.getValues(e),u=c();if(!(t!=null&&t._id))throw new Error(`${e} has no image`);return y.api(r).getDownloadUrl(u,e,t._id,a)}):(l.upload=async a=>{for(const _ of a)P.validateFileExtension(_.name,"File");const t=c(),u=a.map(_=>({FileName:_.name,Size:_.size,FileExtension:P.extractFileExtension(_.name)})),d=await y.api(r).getUploadUrl(t,e,u),g=await Promise.all(a.map(async(_,h)=>(await fetch(d[h].UploadUrl.URL,{method:"PUT",headers:{"Content-Type":d[h].ContentType},body:_}),{_id:d[h]._id,_name:d[h]._name,FileName:d[h].FileName,FileExtension:d[h].FileExtension,Size:d[h].Size,ContentType:d[h].ContentType}))),L=n.getValues(e)??[];return n.setValue(e,[...L,...g],{shouldDirty:!0}),g},l.deleteAttachment=async a=>{const t=n.getValues(e)??[],u=c();await y.api(r).deleteAttachment(u,e,a),n.setValue(e,t.filter(d=>d._id!==a),{shouldDirty:!0})},l.getDownloadUrl=async(a,t)=>{const u=c();return y.api(r).getDownloadUrl(u,e,a,t)},l.getDownloadUrls=async a=>{const t=c();return y.api(r).getDownloadUrls(t,e,a)})}return D.set(e,l),l}const k=()=>{const i=n.getValues(e);return o.Type==="File"?i??[]:i},O={label:(s==null?void 0:s.label)??e,required:(s==null?void 0:s.required)??!1,readOnly:!0,defaultValue:s==null?void 0:s.defaultValue,meta:o,get:k,getOrDefault:x,validate:S};if(o.Type==="Image"||o.Type==="File"){const i=C;o.Type==="Image"?O.getDownloadUrl=async l=>{const r=n.getValues(e),a=c();if(!(r!=null&&r._id))throw new Error(`${e} has no image to download`);return y.api(i).getDownloadUrl(a,e,r._id,l)}:(O.getDownloadUrl=async(l,r)=>{const a=c();return y.api(i).getDownloadUrl(a,e,l,r)},O.getDownloadUrls=async l=>{const r=c();return y.api(i).getDownloadUrls(r,e,l)})}return D.set(e,O),O},has(q,e){return typeof e=="symbol"?!1:e==="_id"||e==="toJSON"||e==="validate"?!0:e in f},ownKeys(q){return[...Object.keys(f),"_id","toJSON","validate"]},getOwnPropertyDescriptor(q,e){if(typeof e!="symbol")return{configurable:!0,enumerable:e!=="toJSON"&&e!=="validate"}}})}function Y(T){const{bdo:n,recordId:f,operation:D,defaultValues:C,mode:c="onBlur",enableDraft:q=!1,enableConstraintValidation:e,enableExpressionValidation:s}=T,o=D??(f?"update":"create"),A=m.useMemo(()=>w.createResolver(n,{enableConstraintValidation:e}),[n,e]),{data:S,isLoading:x,isFetching:k,error:O}=J.useQuery({queryKey:["form-record",n.meta._id,f],queryFn:async()=>{const V=await n.get(f);return w.coerceRecordForForm(n.getFields(),V.toJSON())},enabled:o==="update"&&!!f,staleTime:0}),{data:i,isLoading:l,error:r}=J.useQuery({queryKey:["form-draft",n.meta._id],queryFn:async()=>y.api(n.meta._id).draftInteraction({}),enabled:o==="create",staleTime:1/0,gcTime:0,retry:1}),{data:a}=J.useQuery({queryKey:["form-schema",n.meta._id],queryFn:()=>W.getBdoSchema(n.meta._id),staleTime:30*60*1e3,gcTime:60*60*1e3,enabled:s!==!1});m.useEffect(()=>{a!=null&&a.BDOBlob?n.loadMetadata(a.BDOBlob):a!=null&&a.MetaBlob&&n.loadMetadata(a.MetaBlob)},[a,n]);const t=w.useForm({mode:c,resolver:A,defaultValues:C}),u=m.useRef(null);m.useEffect(()=>{o==="update"&&S&&S!==u.current&&(t.reset(S),u.current=S)},[S,o,t]),m.useEffect(()=>{i!=null&&i._id&&t.setValue("_id",i._id)},[i,t]);const d=m.useMemo(()=>X(n,t),[n,t]),g=n.getFields(),L=m.useRef(!1),_=m.useMemo(()=>Object.keys(g).filter(V=>g[V].readOnly),[g]),h=m.useCallback(async(V,F)=>{if(o==="create"&&(i!=null&&i._id))return y.api(n.meta._id).draftInteraction({_id:i._id,[V]:F});if(o==="update"&&f)return y.api(n.meta._id).update(f,{[V]:F})},[o,i,f,n]),M=m.useMemo(()=>w.createSyncField({apiFn:h,allFields:g,readonlyFieldNames:_,rhf:t,isComputingRef:L}),[h,g,_,t]),R=c==="onChange"||c==="all",N=c==="onBlur"||c==="onTouched"||c==="all",Q=m.useMemo(()=>w.createEnhancedRegister({rhf:t,allFields:g,syncField:M,syncOnBlur:N,syncOnChange:R}),[t,g,M,N,R]),$=m.useMemo(()=>w.createEnhancedControl({control:t.control,syncField:M,syncOnBlur:N,syncOnChange:R}),[t.control,M,N,R]),G=m.useCallback((V,F)=>t.handleSubmit(async(E,B)=>{try{const v={},z=t.getValues();if(o==="create")for(const[U,I]of Object.entries(g)){if(I.readOnly)continue;const b=z[U]!==void 0?z[U]:E[U];b!==void 0&&(v[U]=w.coerceFieldValue(I,b))}else{const U=t.formState.dirtyFields;for(const[I,b]of Object.entries(g)){if(b.readOnly||!U[I])continue;const H=z[I]!==void 0?z[I]:E[I];v[I]=w.coerceFieldValue(b,H)}}let j;o==="create"?(v._id=i==null?void 0:i._id,j=await y.api(n.meta._id).draft(v)):j=await y.api(n.meta._id).update(f,v),V==null||V(j,B)}catch(v){F==null||F(v,B)}},(E,B)=>{F==null||F(E,B)}),[t,n,o,f,g,i]);return{item:d,bdo:n,operation:o,recordId:f,register:Q,handleSubmit:G,watch:t.watch,setValue:t.setValue,getValues:t.getValues,reset:t.reset,trigger:t.trigger,control:$,formState:t.formState,errors:t.formState.errors,isDirty:t.formState.isDirty,isValid:t.formState.isValid,isSubmitting:t.formState.isSubmitting,isSubmitSuccessful:t.formState.isSubmitSuccessful,dirtyFields:t.formState.dirtyFields,isLoading:x||l,isFetching:k,loadError:O??r,draftId:i==null?void 0:i._id,isCreatingDraft:l}}exports.FormOperation=K.FormOperation;exports.InteractionMode=K.InteractionMode;exports.ValidationMode=K.ValidationMode;exports.useBDOForm=Y;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const G=require("./constants-DEmYwKfC.cjs"),m=require("react"),I=require("./shared-nnmlRVs7.cjs"),$=require("@tanstack/react-query"),h=require("./client-B4tX3hPi.cjs"),L=require("./attachment-constants-B5jlqoKI.cjs"),Z=require("./metadata-C2JGyvqu.cjs");function p(C,n,r,j){const M=C.getFields(),S=new Map,J=C.getBoId(),_=()=>j==="create"?"draft":n.getValues("_id")||"draft";return new Proxy({},{get(N,e){if(typeof e=="symbol")return;if(e==="_id")return n.getValues("_id");if(e==="toJSON")return()=>n.getValues();if(e==="validate")return()=>n.trigger();if(S.has(e))return S.get(e);const s=M[e],y=(s==null?void 0:s.meta)??{_id:e,Name:e,Type:"String"},K=(s==null?void 0:s.readOnly)??!1,E=()=>{if(!s)return{valid:!0,errors:[]};let o=n.getValues(e);if("integerPart"in s&&typeof o=="string"&&o!==""){const a=Number(o);isNaN(a)||(o=a,n.setValue(e,a,{shouldDirty:!1}))}if(!s.required&&(o==null||o===""||Array.isArray(o)&&o.length===0))return{valid:!0,errors:[]};const i=s.validate(o);if(!i.valid)return i;const t=I.validateConstraints(s,o);if(!t.valid)return t;if(C.hasMetadata()){const a=C.validateFieldExpression(e,o,n.getValues());if(!a.valid)return a}return{valid:!0,errors:[]}},k=o=>{const i=n.getValues(e);return i??o};if(!K){const o=()=>{const t=n.getValues(e);return y.Type==="File"?t??[]:t},i={label:(s==null?void 0:s.label)??e,required:(s==null?void 0:s.required)??!1,readOnly:!1,defaultValue:s==null?void 0:s.defaultValue,meta:y,get:o,getOrDefault:k,set:t=>{var a,u,l;n.setValue(e,t,{shouldDirty:!0,shouldTouch:!0,shouldValidate:!1}),(l=(u=(a=r==null?void 0:r.syncFieldRef)==null?void 0:a.current)==null?void 0:u.call(a,e))==null||l.catch(console.warn)},validate:E};if(y.Type==="Image"||y.Type==="File"){const t=J;y.Type==="Image"?(i.upload=async a=>{var c,T,O;L.validateFileExtension(a.name,"Image");const u=_(),[l]=await h.api(t).getUploadUrl(u,e,[{FileName:a.name,Size:a.size,FileExtension:L.extractFileExtension(a.name)}]);await fetch(l.UploadUrl.URL,{method:"PUT",headers:{"Content-Type":l.ContentType},body:a});const d={_id:l._id,_name:l._name,FileName:l.FileName,FileExtension:l.FileExtension,Size:l.Size,ContentType:l.ContentType};return n.setValue(e,d,{shouldDirty:!0}),(O=(T=(c=r==null?void 0:r.persistRef)==null?void 0:c.current)==null?void 0:T.call(c,e,d))==null||O.catch(console.warn),d},i.deleteAttachment=async()=>{var l,d,c;const a=n.getValues(e),u=_();if(!(a!=null&&a._id))throw new Error(`${e} has no image to delete`);await h.api(t).deleteAttachment(u,e,a._id),n.setValue(e,null,{shouldDirty:!0}),(c=(d=(l=r==null?void 0:r.persistRef)==null?void 0:l.current)==null?void 0:d.call(l,e,null))==null||c.catch(console.warn)},i.getDownloadUrl=async a=>{const u=n.getValues(e),l=_();if(!(u!=null&&u._id))throw new Error(`${e} has no image`);return h.api(t).getDownloadUrl(l,e,u._id,a)}):(i.upload=async a=>{var v,D,z;for(const F of a)L.validateFileExtension(F.name,"File");const u=_(),l=a.map(F=>({FileName:F.name,Size:F.size,FileExtension:L.extractFileExtension(F.name)})),d=await h.api(t).getUploadUrl(u,e,l),c=await Promise.all(a.map(async(F,V)=>(await fetch(d[V].UploadUrl.URL,{method:"PUT",headers:{"Content-Type":d[V].ContentType},body:F}),{_id:d[V]._id,_name:d[V]._name,FileName:d[V].FileName,FileExtension:d[V].FileExtension,Size:d[V].Size,ContentType:d[V].ContentType}))),O=[...n.getValues(e)??[],...c];return n.setValue(e,O,{shouldDirty:!0}),(z=(D=(v=r==null?void 0:r.persistRef)==null?void 0:v.current)==null?void 0:D.call(v,e,O))==null||z.catch(console.warn),c},i.deleteAttachment=async a=>{var c,T,O;const u=n.getValues(e)??[],l=_();await h.api(t).deleteAttachment(l,e,a);const d=u.filter(v=>v._id!==a);n.setValue(e,d,{shouldDirty:!0}),(O=(T=(c=r==null?void 0:r.persistRef)==null?void 0:c.current)==null?void 0:T.call(c,e,d))==null||O.catch(console.warn)},i.getDownloadUrl=async(a,u)=>{const l=_();return h.api(t).getDownloadUrl(l,e,a,u)},i.getDownloadUrls=async a=>{const u=_();return h.api(t).getDownloadUrls(u,e,a)})}return S.set(e,i),i}const g=()=>{const o=n.getValues(e);return y.Type==="File"?o??[]:o},R={label:(s==null?void 0:s.label)??e,required:(s==null?void 0:s.required)??!1,readOnly:!0,defaultValue:s==null?void 0:s.defaultValue,meta:y,get:g,getOrDefault:k,validate:E};if(y.Type==="Image"||y.Type==="File"){const o=J;y.Type==="Image"?R.getDownloadUrl=async i=>{const t=n.getValues(e),a=_();if(!(t!=null&&t._id))throw new Error(`${e} has no image to download`);return h.api(o).getDownloadUrl(a,e,t._id,i)}:(R.getDownloadUrl=async(i,t)=>{const a=_();return h.api(o).getDownloadUrl(a,e,i,t)},R.getDownloadUrls=async i=>{const t=_();return h.api(o).getDownloadUrls(t,e,i)})}return S.set(e,R),R},has(N,e){return typeof e=="symbol"?!1:e==="_id"||e==="toJSON"||e==="validate"?!0:e in M},ownKeys(N){return[...Object.keys(M),"_id","toJSON","validate"]},getOwnPropertyDescriptor(N,e){if(typeof e!="symbol")return{configurable:!0,enumerable:e!=="toJSON"&&e!=="validate"}}})}function ee(C){const{bdo:n,recordId:r,operation:j,defaultValues:M,mode:S="onBlur",enableDraft:J=!1,enableConstraintValidation:_,enableExpressionValidation:N}=C,e=j??(r?"update":"create"),s=m.useMemo(()=>I.createResolver(n,{enableConstraintValidation:_}),[n,_]),{data:y,isLoading:K,isFetching:E,error:k}=$.useQuery({queryKey:["form-record",n.meta._id,r],queryFn:async()=>{const f=await n.get(r);return I.coerceRecordForForm(n.getFields(),f.toJSON())},enabled:e==="update"&&!!r,staleTime:0}),{data:g,isLoading:R,error:o}=$.useQuery({queryKey:["form-draft",n.meta._id],queryFn:async()=>h.api(n.meta._id).draftInteraction({}),enabled:e==="create",staleTime:1/0,gcTime:0,retry:1}),{data:i}=$.useQuery({queryKey:["form-schema",n.meta._id],queryFn:()=>Z.getBdoSchema(n.meta._id),staleTime:30*60*1e3,gcTime:60*60*1e3,enabled:N!==!1});m.useEffect(()=>{i!=null&&i.BDOBlob?n.loadMetadata(i.BDOBlob):i!=null&&i.MetaBlob&&n.loadMetadata(i.MetaBlob)},[i,n]);const t=I.useForm({mode:S,resolver:s,defaultValues:M}),a=m.useRef(null);m.useEffect(()=>{var f;if(e==="update"&&y&&y!==a.current){const w=a.current!==null&&(y==null?void 0:y._id)===((f=a.current)==null?void 0:f._id);t.reset(y,w?{keepDirtyValues:!0}:void 0),a.current=y}},[y,e,t]),m.useEffect(()=>{g!=null&&g._id&&t.setValue("_id",g._id)},[g,t]);const u=m.useRef(null),l=m.useRef(null),d=m.useMemo(()=>p(n,t,{syncFieldRef:u,persistRef:l},e),[n,t,e]),c=n.getFields(),T=m.useRef(!1),O=m.useMemo(()=>Object.keys(c).filter(f=>c[f].readOnly),[c]),v=m.useCallback(async(f,w)=>{if(e==="create"&&(g!=null&&g._id))return h.api(n.meta._id).draftInteraction({_id:g._id,[f]:w});if(e==="update"&&r)return h.api(n.meta._id).update(r,{[f]:w})},[e,g,r,n]),D=m.useMemo(()=>I.createSyncField({apiFn:v,allFields:c,readonlyFieldNames:O,rhf:t,isComputingRef:T}),[v,c,O,t]);u.current=D;const z=m.useCallback(async(f,w)=>{try{await v(f,w)}catch(q){console.error("[useBDOForm] persistValue failed:",q)}},[v,e,r]);l.current=z;const F=S==="onChange"||S==="all",V=S==="onBlur"||S==="onTouched"||S==="all",H=m.useMemo(()=>I.createEnhancedRegister({rhf:t,allFields:c,syncField:D,syncOnBlur:V,syncOnChange:F}),[t,c,D,V,F]),W=m.useMemo(()=>I.createEnhancedControl({control:t.control,syncField:D,syncOnBlur:V,syncOnChange:F}),[t.control,D,V,F]),X=m.useCallback((f,w)=>t.handleSubmit(async(q,A)=>{try{const U={},P=t.getValues();if(e==="create")for(const[x,b]of Object.entries(c)){if(b.readOnly)continue;const B=P[x]!==void 0?P[x]:q[x];B!==void 0&&(U[x]=I.coerceFieldValue(b,B))}else{const x=t.formState.dirtyFields;for(const[b,B]of Object.entries(c)){if(B.readOnly||!x[b])continue;const Y=P[b]!==void 0?P[b]:q[b];U[b]=I.coerceFieldValue(B,Y)}}let Q;e==="create"?(U._id=g==null?void 0:g._id,Q=await h.api(n.meta._id).draft(U)):Q=await h.api(n.meta._id).update(r,U),f==null||f(Q,A)}catch(U){w==null||w(U,A)}},(q,A)=>{w==null||w(q,A)}),[t,n,e,r,c,g]);return{item:d,bdo:n,operation:e,recordId:r,register:H,handleSubmit:X,watch:t.watch,setValue:t.setValue,getValues:t.getValues,reset:t.reset,trigger:t.trigger,control:W,formState:t.formState,errors:t.formState.errors,isDirty:t.formState.isDirty,isValid:t.formState.isValid,isSubmitting:t.formState.isSubmitting,isSubmitSuccessful:t.formState.isSubmitSuccessful,dirtyFields:t.formState.dirtyFields,isLoading:K||R,isFetching:E,loadError:k??o,draftId:g==null?void 0:g._id,isCreatingDraft:R}}exports.FormOperation=G.FormOperation;exports.InteractionMode=G.InteractionMode;exports.ValidationMode=G.ValidationMode;exports.useBDOForm=ee;