quickbase-js 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +804 -59
- package/bin/quickbase-js.js +54 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +9 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/ticket.d.ts +84 -0
- package/dist/auth/ticket.d.ts.map +1 -0
- package/dist/auth/ticket.js +260 -0
- package/dist/auth/ticket.js.map +1 -0
- package/dist/cli/schema.d.ts +23 -0
- package/dist/cli/schema.d.ts.map +1 -0
- package/dist/cli/schema.js +425 -0
- package/dist/cli/schema.js.map +1 -0
- package/dist/client/request.d.ts +2 -1
- package/dist/client/request.d.ts.map +1 -1
- package/dist/client/request.js +165 -18
- package/dist/client/request.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +12 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/errors.d.ts +17 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +32 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/schema.d.ts +37 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +168 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/transform.d.ts +36 -0
- package/dist/core/transform.d.ts.map +1 -0
- package/dist/core/transform.js +205 -0
- package/dist/core/transform.js.map +1 -0
- package/dist/core/types.d.ts +104 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +14 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/quickbase.esm.js +6 -2
- package/dist/quickbase.esm.js.map +4 -4
- package/dist/quickbase.min.js +6 -2
- package/dist/quickbase.min.js.map +4 -4
- package/dist/xml/codepages.d.ts +60 -0
- package/dist/xml/codepages.d.ts.map +1 -0
- package/dist/xml/codepages.js +88 -0
- package/dist/xml/codepages.js.map +1 -0
- package/dist/xml/dbvars.d.ts +39 -0
- package/dist/xml/dbvars.d.ts.map +1 -0
- package/dist/xml/dbvars.js +54 -0
- package/dist/xml/dbvars.js.map +1 -0
- package/dist/xml/errors.d.ts +64 -0
- package/dist/xml/errors.d.ts.map +1 -0
- package/dist/xml/errors.js +102 -0
- package/dist/xml/errors.js.map +1 -0
- package/dist/xml/fields.d.ts +45 -0
- package/dist/xml/fields.d.ts.map +1 -0
- package/dist/xml/fields.js +86 -0
- package/dist/xml/fields.js.map +1 -0
- package/dist/xml/groups.d.ts +196 -0
- package/dist/xml/groups.d.ts.map +1 -0
- package/dist/xml/groups.js +424 -0
- package/dist/xml/groups.js.map +1 -0
- package/dist/xml/html.d.ts +61 -0
- package/dist/xml/html.d.ts.map +1 -0
- package/dist/xml/html.js +110 -0
- package/dist/xml/html.js.map +1 -0
- package/dist/xml/index.d.ts +453 -0
- package/dist/xml/index.d.ts.map +1 -0
- package/dist/xml/index.js +741 -0
- package/dist/xml/index.js.map +1 -0
- package/dist/xml/metadata.d.ts +49 -0
- package/dist/xml/metadata.d.ts.map +1 -0
- package/dist/xml/metadata.js +84 -0
- package/dist/xml/metadata.js.map +1 -0
- package/dist/xml/records.d.ts +106 -0
- package/dist/xml/records.d.ts.map +1 -0
- package/dist/xml/records.js +220 -0
- package/dist/xml/records.js.map +1 -0
- package/dist/xml/request.d.ts +115 -0
- package/dist/xml/request.d.ts.map +1 -0
- package/dist/xml/request.js +167 -0
- package/dist/xml/request.js.map +1 -0
- package/dist/xml/roles.d.ts +117 -0
- package/dist/xml/roles.d.ts.map +1 -0
- package/dist/xml/roles.js +241 -0
- package/dist/xml/roles.js.map +1 -0
- package/dist/xml/schema.d.ts +94 -0
- package/dist/xml/schema.d.ts.map +1 -0
- package/dist/xml/schema.js +354 -0
- package/dist/xml/schema.js.map +1 -0
- package/dist/xml/transform.d.ts +154 -0
- package/dist/xml/transform.d.ts.map +1 -0
- package/dist/xml/transform.js +182 -0
- package/dist/xml/transform.js.map +1 -0
- package/dist/xml/types.d.ts +531 -0
- package/dist/xml/types.d.ts.map +1 -0
- package/dist/xml/types.js +22 -0
- package/dist/xml/types.js.map +1 -0
- package/dist/xml/users.d.ts +92 -0
- package/dist/xml/users.d.ts.map +1 -0
- package/dist/xml/users.js +166 -0
- package/dist/xml/users.js.map +1 -0
- package/dist/xml/webhooks.d.ts +98 -0
- package/dist/xml/webhooks.d.ts.map +1 -0
- package/dist/xml/webhooks.js +202 -0
- package/dist/xml/webhooks.js.map +1 -0
- package/package.json +6 -2
package/dist/index.js
CHANGED
|
@@ -19,8 +19,11 @@
|
|
|
19
19
|
* console.log(app.name);
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
|
-
|
|
23
|
-
export {
|
|
22
|
+
// Schema utilities
|
|
23
|
+
export { SchemaError } from './core/schema.js';
|
|
24
|
+
export { QuickbaseError, RateLimitError, AuthenticationError, AuthorizationError, NotFoundError, ValidationError, TimeoutError, ServerError, ReadOnlyError, } from './core/index.js';
|
|
25
|
+
export { UserTokenStrategy, TempTokenStrategy, SsoTokenStrategy, TicketStrategy, // XML-API-TICKET: Remove if XML API discontinued
|
|
26
|
+
createAuthStrategy, } from './auth/index.js';
|
|
24
27
|
export { SlidingWindowThrottle, NoOpThrottle } from './client/index.js';
|
|
25
28
|
export * from './generated/types.js';
|
|
26
29
|
export { createApiMethods } from './generated/client.js';
|
|
@@ -92,8 +95,12 @@ export function createClient(config) {
|
|
|
92
95
|
...apiMethods,
|
|
93
96
|
request: executor.execute,
|
|
94
97
|
getConfig: () => resolvedConfig,
|
|
98
|
+
// XML-API: Expose auth strategy for XML client
|
|
99
|
+
getAuthStrategy: () => auth,
|
|
95
100
|
};
|
|
96
101
|
}
|
|
102
|
+
// XML-API: XML API exports - remove when QuickBase discontinues XML API
|
|
103
|
+
export { createXmlClient, XmlClient, XmlError, XmlErrorCode, isUnauthorized as isXmlUnauthorized, isNotFound as isXmlNotFound, isInvalidTicket as isXmlInvalidTicket, isXmlWriteAction, } from './xml/index.js';
|
|
97
104
|
// Default export
|
|
98
105
|
export default createClient;
|
|
99
106
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAuBH,mBAAmB;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EAAE,iDAAiD;AACjE,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIxE,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAIzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAyBzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,UAAU,YAAY,CAAC,MAAuB;IAClD,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAElD,MAAM,WAAW,GAAG;QAClB,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,OAAO,EAAE,cAAc,CAAC,OAAO;QAC/B,QAAQ,EAAE,cAAc,CAAC,QAAQ;QACjC,MAAM;KACP,CAAC;IAEF,MAAM,IAAI,GAAG,kBAAkB,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAElE,MAAM,QAAQ,GAAG,qBAAqB,CAAC;QACrC,MAAM,EAAE,cAAc;QACtB,IAAI;QACJ,QAAQ;QACR,MAAM;KACP,CAAC,CAAC;IAEH,2BAA2B;IAC3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC;IAEnF,OAAO;QACL,GAAG,UAAU;QACb,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc;QAC/B,+CAA+C;QAC/C,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;KAC5B,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,OAAO,EACL,eAAe,EACf,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,cAAc,IAAI,iBAAiB,EACnC,UAAU,IAAI,aAAa,EAC3B,eAAe,IAAI,kBAAkB,EACrC,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AA4DxB,iBAAiB;AACjB,eAAe,YAAY,CAAC"}
|
package/dist/quickbase.esm.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* QuickBase JS SDK v2.
|
|
2
|
+
* QuickBase JS SDK v2.2.0
|
|
3
3
|
* https://github.com/DrewBradfordXYZ/quickbase-js#readme
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
6
|
-
var te=Object.defineProperty;var re=(t,r,e)=>r in t?te(t,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[r]=e;var i=(t,r,e)=>re(t,typeof r!="symbol"?r+"":r,e);var l={baseUrl:"https://api.quickbase.com/v1",timeout:3e4,debug:!1,retry:{maxAttempts:3,initialDelayMs:1e3,maxDelayMs:3e4,multiplier:2},proactiveThrottle:{enabled:!1,requestsPer10Seconds:100},tempTokenLifespanMs:29e4,autoPaginate:!1,convertDates:!0};var h=class t extends Error{constructor(e,o,n){super(e,{cause:n?.cause});i(this,"statusCode");i(this,"description");i(this,"rayId");this.name="QuickbaseError",this.statusCode=o,this.description=n?.description,this.rayId=n?.rayId,Error.captureStackTrace&&Error.captureStackTrace(this,t)}toJSON(){return{name:this.name,message:this.message,statusCode:this.statusCode,description:this.description,rayId:this.rayId}}},y=class extends h{constructor(e,o){super(o||`Rate limited. Retry after ${e.retryAfter??"unknown"} seconds`,429,{rayId:e.qbApiRay||e.cfRay});i(this,"retryAfter");i(this,"rateLimitInfo");this.name="RateLimitError",this.retryAfter=e.retryAfter,this.rateLimitInfo=e}toJSON(){return{...super.toJSON(),retryAfter:this.retryAfter,rateLimitInfo:this.rateLimitInfo}}},R=class extends h{constructor(r,e){super(r,401,e),this.name="AuthenticationError"}},I=class extends h{constructor(r,e){super(r,403,e),this.name="AuthorizationError"}},C=class extends h{constructor(r,e){super(r,404,e),this.name="NotFoundError"}},D=class extends h{constructor(e,o){super(e,400,o);i(this,"errors");this.name="ValidationError",this.errors=o?.errors}toJSON(){return{...super.toJSON(),errors:this.errors}}},b=class extends h{constructor(e,o){super(`Request timed out after ${e}ms`,0,o);i(this,"timeoutMs");this.name="TimeoutError",this.timeoutMs=e}toJSON(){return{...super.toJSON(),timeoutMs:this.timeoutMs}}},x=class extends h{constructor(r,e,o){super(e,r,o),this.name="ServerError"}};async function $(t,r){let e=t.headers.get("qb-api-ray")||t.headers.get("cf-ray")||void 0,o=null;try{o=await t.json()}catch{}let n=o?.message||t.statusText||"Unknown error",a=o?.description;switch(t.status){case 400:return new D(n,{description:a,rayId:e,errors:o?.errors});case 401:return new R(n,{rayId:e});case 403:return new I(n,{rayId:e});case 404:return new C(n,{rayId:e});case 429:{let s=t.headers.get("Retry-After"),u={timestamp:new Date,requestUrl:r,httpStatus:429,retryAfter:s?parseInt(s,10):void 0,cfRay:t.headers.get("cf-ray")||void 0,tid:t.headers.get("tid")||void 0,qbApiRay:t.headers.get("qb-api-ray")||void 0,attempt:1};return new y(u,n)}default:return t.status>=500?new x(t.status,n,{description:a,rayId:e}):new h(n,t.status,{description:a,rayId:e})}}function q(t){return t instanceof y||t instanceof x||t instanceof b}var F=class{constructor(r=!1,e="quickbase-js"){i(this,"enabled");i(this,"prefix");this.enabled=r,this.prefix=e}formatMessage(r,e){return`[${new Date().toISOString()}] [${this.prefix}] [${r}] ${e}`}debug(r,e){this.enabled&&(e!==void 0?console.log(this.formatMessage("DEBUG",r),e):console.log(this.formatMessage("DEBUG",r)))}info(r,e){this.enabled&&(e!==void 0?console.info(this.formatMessage("INFO",r),e):console.info(this.formatMessage("INFO",r)))}warn(r,e){e!==void 0?console.warn(this.formatMessage("WARN",r),e):console.warn(this.formatMessage("WARN",r))}error(r,e){e!==void 0?console.error(this.formatMessage("ERROR",r),e):console.error(this.formatMessage("ERROR",r))}rateLimit(r){this.enabled&&this.debug(`Rate limited (attempt ${r.attempt}): ${r.url} - Status ${r.status}, Retry-After: ${r.retryAfter??"not specified"}s`+(r.rayId?`, Ray: ${r.rayId}`:""))}timing(r,e,o){this.enabled&&this.debug(`${r} ${e} completed in ${o}ms`)}retry(r,e,o,n){this.enabled&&this.debug(`Retry ${r}/${e} in ${o}ms: ${n}`)}token(r,e){if(this.enabled){let o=e?` for dbid: ${e}`:"";this.debug(`Token ${r}${o}`)}}};function O(t){return new F(t)}function j(t){oe(t);let r={maxAttempts:t.rateLimit?.retry?.maxAttempts??l.retry.maxAttempts,initialDelayMs:t.rateLimit?.retry?.initialDelayMs??l.retry.initialDelayMs,maxDelayMs:t.rateLimit?.retry?.maxDelayMs??l.retry.maxDelayMs,multiplier:t.rateLimit?.retry?.multiplier??l.retry.multiplier},e={enabled:t.rateLimit?.proactiveThrottle?.enabled??l.proactiveThrottle.enabled,requestsPer10Seconds:t.rateLimit?.proactiveThrottle?.requestsPer10Seconds??l.proactiveThrottle.requestsPer10Seconds};return{realm:t.realm,baseUrl:t.baseUrl??l.baseUrl,timeout:t.timeout??l.timeout,debug:t.debug??l.debug,fetchApi:t.fetchApi??globalThis.fetch.bind(globalThis),auth:t.auth,retry:r,proactiveThrottle:e,onRateLimit:t.rateLimit?.onRateLimit,autoPaginate:t.autoPaginate??l.autoPaginate,convertDates:t.convertDates??l.convertDates}}function oe(t){if(!t.realm)throw new Error("QuickBase realm is required");if(typeof t.realm!="string")throw new Error("QuickBase realm must be a string");if(t.realm.includes("."))throw new Error('Realm should be just the subdomain (e.g., "mycompany" not "mycompany.quickbase.com")');if(!t.auth)throw new Error("Authentication configuration is required");if(ne(t.auth),t.timeout!==void 0&&(typeof t.timeout!="number"||t.timeout<=0))throw new Error("Timeout must be a positive number");t.rateLimit?.retry&&se(t.rateLimit.retry),t.rateLimit?.proactiveThrottle&&ae(t.rateLimit.proactiveThrottle)}function ne(t){switch(t.type){case"user-token":if(!t.userToken)throw new Error("User token is required for user-token auth");break;case"temp-token":break;case"sso":if(!t.samlToken)throw new Error("SAML token is required for SSO auth");break;default:throw new Error(`Unknown auth type: ${t.type}`)}}function se(t){if(t.maxAttempts!==void 0&&(typeof t.maxAttempts!="number"||t.maxAttempts<0))throw new Error("maxAttempts must be a non-negative number");if(t.initialDelayMs!==void 0&&(typeof t.initialDelayMs!="number"||t.initialDelayMs<0))throw new Error("initialDelayMs must be a non-negative number");if(t.maxDelayMs!==void 0&&(typeof t.maxDelayMs!="number"||t.maxDelayMs<0))throw new Error("maxDelayMs must be a non-negative number");if(t.multiplier!==void 0&&(typeof t.multiplier!="number"||t.multiplier<1))throw new Error("multiplier must be a number >= 1")}function ae(t){if(t.requestsPer10Seconds!==void 0&&(typeof t.requestsPer10Seconds!="number"||t.requestsPer10Seconds<=0))throw new Error("requestsPer10Seconds must be a positive number")}function Q(t){return`${t}.quickbase.com`}var ie=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{1,3})?(Z|[+-]\d{2}:?\d{2})?)?$/;function K(t){return ie.test(t)}function v(t,r){if(!r||t===null||t===void 0||typeof t!="object")return t;if(Array.isArray(t))return t.map(o=>v(o,r));if(t instanceof Date)return t;let e={};for(let[o,n]of Object.entries(t))typeof n=="string"&&K(n)?e[o]=new Date(n):n instanceof Date?e[o]=n:typeof n=="object"&&n!==null?e[o]=v(n,r):e[o]=n;return e}var A=class{constructor(r,e){i(this,"userToken");i(this,"logger");this.userToken=r,this.logger=e.logger}async getToken(r){return this.userToken}getAuthorizationHeader(r){return`QB-USER-TOKEN ${r}`}async handleAuthError(r){return this.logger.debug("Auth error with user token - cannot refresh"),!1}invalidate(r){}};var P=class{constructor(r){i(this,"cache",new Map);i(this,"defaultLifespanMs");this.defaultLifespanMs=r}get(r){let e=this.cache.get(r);return e?Date.now()>=e.expiresAt-1e4?(this.cache.delete(r),null):e.token:null}set(r,e,o){let n=Date.now()+(o??this.defaultLifespanMs);this.cache.set(r,{token:e,expiresAt:n})}delete(r){return this.cache.delete(r)}clear(){this.cache.clear()}has(r){return this.get(r)!==null}getTimeToExpiry(r){let e=this.cache.get(r);if(!e)return null;let o=e.expiresAt-Date.now();return o>0?o:null}get size(){return this.cleanup(),this.cache.size}cleanup(){let r=Date.now();for(let[e,o]of this.cache)r>=o.expiresAt&&this.cache.delete(e)}};var E=class{constructor(r,e,o){i(this,"userToken");i(this,"appToken");i(this,"realm");i(this,"baseUrl");i(this,"fetchApi");i(this,"logger");i(this,"cache");i(this,"pendingFetches",new Map);this.userToken=r,this.appToken=o?.appToken,this.realm=e.realm,this.baseUrl=e.baseUrl,this.fetchApi=e.fetchApi,this.logger=e.logger,this.cache=new P(o?.tokenLifespanMs??l.tempTokenLifespanMs)}async getToken(r){if(!r)throw new Error("Database ID (dbid) is required for temporary token authentication");let e=this.cache.get(r);if(e)return this.logger.token("cache-hit",r),e;this.logger.token("cache-miss",r);let o=this.pendingFetches.get(r);if(o)return this.logger.debug(`Waiting for existing token fetch for dbid: ${r}`),o;let n=this.fetchToken(r);this.pendingFetches.set(r,n);try{return await n}finally{this.pendingFetches.delete(r)}}async fetchToken(r){this.logger.token("fetch",r);let e=`${this.baseUrl}/auth/temporary/${r}`,o={"QB-Realm-Hostname":`${this.realm}.quickbase.com`,"Content-Type":"application/json"};this.userToken&&(o.Authorization=`QB-USER-TOKEN ${this.userToken}`),this.appToken&&(o["QB-App-Token"]=this.appToken);let n=await this.fetchApi(e,{method:"GET",headers:o,credentials:"include"});if(!n.ok){let u=await n.text();throw new R(`Failed to fetch temporary token for ${r}: ${n.status} ${u}`,{rayId:n.headers.get("qb-api-ray")||void 0})}let s=(await n.json()).temporaryAuthorization;if(!s)throw new R(`No temporary token in response for ${r}`);return this.cache.set(r,s),this.logger.debug(`Cached new token for dbid: ${r}`),s}getAuthorizationHeader(r){return`QB-TEMP-TOKEN ${r}`}async handleAuthError(r){if(!r)return this.logger.debug("Auth error without dbid - cannot refresh temp token"),!1;this.invalidate(r);try{return this.logger.token("refresh",r),await this.getToken(r),!0}catch(e){return this.logger.error(`Failed to refresh temp token for ${r}`,e),!1}}invalidate(r){r?(this.logger.token("expire",r),this.cache.delete(r)):this.cache.clear()}};var S=class{constructor(r,e,o){i(this,"samlToken");i(this,"realm");i(this,"baseUrl");i(this,"fetchApi");i(this,"logger");i(this,"cache");i(this,"pendingExchange",null);this.samlToken=r,this.realm=e.realm,this.baseUrl=e.baseUrl,this.fetchApi=e.fetchApi,this.logger=e.logger,this.cache=new P(o?.tokenLifespanMs??l.tempTokenLifespanMs)}get cacheKey(){return"__sso__"}async getToken(r){let e=this.cache.get(this.cacheKey);if(e)return this.logger.token("cache-hit"),e;if(this.logger.token("cache-miss"),this.pendingExchange)return this.logger.debug("Waiting for existing SSO token exchange"),this.pendingExchange;let o=this.exchangeToken();this.pendingExchange=o;try{return await o}finally{this.pendingExchange=null}}async exchangeToken(){this.logger.token("fetch");let r=`${this.baseUrl}/auth/oauth/token`,e=new URLSearchParams({grant_type:"urn:ietf:params:oauth:grant-type:token-exchange",requested_token_type:"urn:quickbase:params:oauth:token-type:temp_token",subject_token:this.samlToken,subject_token_type:"urn:ietf:params:oauth:token-type:saml2"}),o=await this.fetchApi(r,{method:"POST",headers:{"QB-Realm-Hostname":`${this.realm}.quickbase.com`,"Content-Type":"application/x-www-form-urlencoded"},body:e.toString()});if(!o.ok){let s=await o.text();throw new R(`SSO token exchange failed: ${o.status} ${s}`,{rayId:o.headers.get("qb-api-ray")||void 0})}let a=(await o.json()).access_token;if(!a)throw new R("No access_token in SSO exchange response");return this.cache.set(this.cacheKey,a),this.logger.debug("Cached new SSO token"),a}getAuthorizationHeader(r){return`QB-TEMP-TOKEN ${r}`}async handleAuthError(r){this.invalidate();try{return this.logger.token("refresh"),await this.getToken(),!0}catch(e){return this.logger.error("Failed to refresh SSO token",e),!1}}invalidate(r){this.logger.token("expire"),this.cache.clear()}};function N(t,r){switch(t.type){case"user-token":return new A(t.userToken,r);case"temp-token":return new E(t.userToken,r,{appToken:t.appToken,tokenLifespanMs:t.tokenLifespanMs});case"sso":return new S(t.samlToken,r);default:throw new Error(`Unknown auth type: ${t.type}`)}}function _(t,r,e){let o=t.headers.get("Retry-After");return{timestamp:new Date,requestUrl:r,httpStatus:t.status,retryAfter:o?parseInt(o,10):void 0,cfRay:t.headers.get("cf-ray")||void 0,tid:t.headers.get("tid")||void 0,qbApiRay:t.headers.get("qb-api-ray")||void 0,attempt:e}}function B(t){return new Promise(r=>setTimeout(r,t))}function ue(t){if(t.dbid)return t.dbid;if(t.query?.tableId)return String(t.query.tableId);if(t.query?.appId)return String(t.query.appId);let r=t.path.match(/\/tables\/([^/?]+)/);if(r)return r[1];let e=t.path.match(/\/apps\/([^/?]+)/);if(e)return e[1];if(t.body&&typeof t.body=="object"){let o=t.body;if(typeof o.from=="string")return o.from;if(typeof o.to=="string")return o.to}}function J(t,r,e){let o=t.endsWith("/")?t:`${t}/`,n=r.startsWith("/")?r.slice(1):r,a=new URL(n,o);if(e)for(let[s,u]of Object.entries(e))u!==void 0&&a.searchParams.set(s,String(u));return a.toString()}async function pe(t,r,e,o){let n=await t.getToken(e),a=t.getAuthorizationHeader(n);return{"Content-Type":"application/json","QB-Realm-Hostname":r,Authorization:a,...o}}async function de(t,r,e){let{config:o,auth:n,throttle:a,logger:s}=r,u=J(o.baseUrl,t.path,t.query),m=Q(o.realm),d=await pe(n,m,e.dbid,t.headers);await a.acquire();let p={method:t.method,headers:d,credentials:"omit"};t.body!==void 0&&(p.body=JSON.stringify(t.body));let c=new AbortController,g=setTimeout(()=>c.abort(),o.timeout);p.signal=c.signal;let T=Date.now();try{let f=await o.fetchApi(u,p),w=Date.now()-T;return s.timing(t.method,t.path,w),f}catch(f){throw f instanceof Error&&f.name==="AbortError"?new b(o.timeout):f}finally{clearTimeout(g)}}async function le(t,r,e,o){let{config:n,logger:a}=o;if(t.ok)return t;if(t.status===429){let s=_(t,r,e.attempt);throw a.rateLimit({url:r,status:429,retryAfter:s.retryAfter,attempt:e.attempt,rayId:s.qbApiRay||s.cfRay}),n.onRateLimit&&n.onRateLimit(s),new y(s)}throw await $(t,r)}async function V(t,r){let{config:e,auth:o,logger:n}=r,a=e.retry.maxAttempts,s=ue(t),u={methodName:`${t.method} ${t.path}`,attempt:1,maxAttempts:a,dbid:s,startTime:Date.now()},m=null;for(let d=1;d<=a;d++){u.attempt=d;try{let p=await de(t,r,u),c=J(e.baseUrl,t.path,t.query);await le(p,c,u,r);let g=await p.json();return v(g,e.convertDates)}catch(p){if(m=p,!q(p)||d>=a)throw p;if(p instanceof h&&p.statusCode===401){if(!await o.handleAuthError(s))throw p;n.debug("Token refreshed, retrying request");continue}let c,g;p instanceof y?(c=p.retryAfter?p.retryAfter*1e3:M(d,e.retry),g="Rate limited (429)"):p instanceof b?(c=M(d,e.retry),g="Timeout"):p instanceof h&&p.statusCode>=500?(c=M(d,e.retry),g=`Server error (${p.statusCode})`):(c=M(d,e.retry),g="Retryable error"),n.retry(d,a,c,g),await B(c)}}throw m||new Error("Request failed")}function M(t,r){let e=r.initialDelayMs*Math.pow(r.multiplier,t-1),o=e*.1*(Math.random()*2-1);return Math.min(e+o,r.maxDelayMs)}function z(t){return{execute:r=>V(r,t)}}var U=class{constructor(r=100){i(this,"requestsPer10Seconds");i(this,"timestamps",[]);this.requestsPer10Seconds=r}async acquire(){let r=Date.now(),e=r-1e4;for(;this.timestamps.length>0&&this.timestamps[0]<e;)this.timestamps.shift();if(this.timestamps.length>=this.requestsPer10Seconds){let n=this.timestamps[0]+1e4-r;if(n>0)return await this.sleep(n),this.acquire()}this.timestamps.push(Date.now())}getWindowCount(){let r=Date.now()-1e4;return this.timestamps.filter(e=>e>=r).length}getRemaining(){return Math.max(0,this.requestsPer10Seconds-this.getWindowCount())}reset(){this.timestamps.length=0}sleep(r){return new Promise(e=>setTimeout(e,r))}},G=class{async acquire(){}getWindowCount(){return 0}getRemaining(){return 1/0}reset(){}};function H(t){return t.enabled?new U(t.requestsPer10Seconds):new G}function Z(t){return t.totalRecords!==void 0&&t.skip!==void 0?"skip":t.nextPageToken!==void 0||t.nextToken!==void 0?"token":"none"}function X(t,r,e){let{metadata:o}=t;if(r==="skip")return o.totalRecords!==void 0&&e<o.totalRecords;if(r==="token"){let n=o.nextPageToken??o.nextToken;return n!==void 0&&n!==""}return!1}function Y(t){for(let r of Object.keys(t))if(Array.isArray(t[r]))return r;return"data"}function ee(t){if(!t||typeof t!="object")return!1;let r=t;if(!r.metadata||typeof r.metadata!="object"||!Object.values(r).some(Array.isArray))return!1;let o=r.metadata;return o.totalRecords!==void 0||o.numRecords!==void 0||o.nextPageToken!==void 0||o.nextToken!==void 0}var L=class{constructor(r,e){i(this,"executor");i(this,"paginatedExecutor");i(this,"defaultAutoPaginate");this.executor=r,this.paginatedExecutor=e?.paginatedExecutor,this.defaultAutoPaginate=e?.autoPaginate??!1}then(r,e){return(this.defaultAutoPaginate?this.all():this.executor()).then(r,e)}async all(){return this.paginate({})}async paginate(r={}){if(!this.paginatedExecutor)return this.executor();let{limit:e,skip:o=0}=r,n=[],a=null,s="none",u=o,m,d=await this.paginatedExecutor({skip:o});if(!ee(d))return d;a=d,s=Z(d.metadata);let p=Y(d),c=d[p]||[];for(e!==void 0&&c.length>e?n=c.slice(0,e):n=[...c],s==="skip"?u=o+c.length:s==="token"&&(m=d.metadata.nextPageToken??d.metadata.nextToken);X(a,s,n.length)&&!(e!==void 0&&n.length>=e);){let T;if(s==="skip")T=await this.paginatedExecutor({skip:u});else if(s==="token"&&m){let w=a.metadata.nextPageToken!==void 0?"nextPageToken":"nextToken";T=await this.paginatedExecutor({[w]:m})}else break;a=T;let f=T[p]||[];if(f.length===0)break;if(e!==void 0){let w=e-n.length;n=n.concat(f.slice(0,w))}else n=n.concat(f);if(s==="skip")u+=f.length;else if(s==="token"&&(m=T.metadata.nextPageToken??T.metadata.nextToken,!m))break}let g={...a,[p]:n,metadata:{...a.metadata,numRecords:n.length,skip:o}};return s==="token"&&(delete g.metadata.nextPageToken,delete g.metadata.nextToken),g}async noPaginate(){return this.executor()}toPromise(){return this.then()}};function k(t,r){return new L(t,r)}function W(t,r=!1){return{createApp(e){return t({method:"POST",path:"/apps",body:e})},getApp(e){return t({method:"GET",path:`/apps/${e.appId}`})},updateApp(e,o){return t({method:"POST",path:`/apps/${e.appId}`,body:o})},deleteApp(e,o){return t({method:"DELETE",path:`/apps/${e.appId}`,body:o})},getAppEvents(e){return t({method:"GET",path:`/apps/${e.appId}/events`})},copyApp(e,o){return t({method:"POST",path:`/apps/${e.appId}/copy`,body:o})},getAppTables(e){return t({method:"GET",path:"/tables",query:{appId:e.appId}})},createTable(e,o){return t({method:"POST",path:"/tables",query:{appId:e.appId},body:o})},getTable(e){return t({method:"GET",path:`/tables/${e.tableId}`,query:{appId:e.appId}})},updateTable(e,o){return t({method:"POST",path:`/tables/${e.tableId}`,query:{appId:e.appId},body:o})},deleteTable(e){return t({method:"DELETE",path:`/tables/${e.tableId}`,query:{appId:e.appId}})},getRelationships(e){return k(()=>t({method:"GET",path:`/tables/${e.tableId}/relationships`,query:{skip:e.skip}}),{paginatedExecutor:a=>t({method:"GET",path:`/tables/${e.tableId}/relationships`,query:{skip:e.skip,...a}}),autoPaginate:r})},createRelationship(e,o){return t({method:"POST",path:`/tables/${e.tableId}/relationship`,body:o})},updateRelationship(e,o){return t({method:"POST",path:`/tables/${e.tableId}/relationship/${e.relationshipId}`,body:o})},deleteRelationship(e){return t({method:"DELETE",path:`/tables/${e.tableId}/relationship/${e.relationshipId}`})},getTableReports(e){return t({method:"GET",path:"/reports",query:{tableId:e.tableId}})},getReport(e){return t({method:"GET",path:`/reports/${e.reportId}`,query:{tableId:e.tableId}})},runReport(e,o){return k(()=>t({method:"POST",path:`/reports/${e.reportId}/run`,query:{tableId:e.tableId,skip:e.skip,top:e.top},body:o}),{paginatedExecutor:s=>{let u=o,m=s.skip!==void 0||s.nextPageToken||s.nextToken?{...u||{},options:{...u?.options||{},...s.skip!==void 0?{skip:s.skip}:{}},...s.nextPageToken?{nextPageToken:s.nextPageToken}:{},...s.nextToken?{nextToken:s.nextToken}:{}}:o;return t({method:"POST",path:`/reports/${e.reportId}/run`,query:{tableId:e.tableId,skip:e.skip,top:e.top},body:m})},autoPaginate:r})},getFields(e){return t({method:"GET",path:"/fields",query:{tableId:e.tableId,includeFieldPerms:e.includeFieldPerms}})},createField(e,o){return t({method:"POST",path:"/fields",query:{tableId:e.tableId},body:o})},deleteFields(e,o){return t({method:"DELETE",path:"/fields",query:{tableId:e.tableId},body:o})},getField(e){return t({method:"GET",path:`/fields/${e.fieldId}`,query:{tableId:e.tableId,includeFieldPerms:e.includeFieldPerms}})},updateField(e,o){return t({method:"POST",path:`/fields/${e.fieldId}`,query:{tableId:e.tableId},body:o})},getFieldsUsage(e){return t({method:"GET",path:"/fields/usage",query:{tableId:e.tableId,skip:e.skip,top:e.top}})},getFieldUsage(e){return t({method:"GET",path:`/fields/usage/${e.fieldId}`,query:{tableId:e.tableId}})},runFormula(e){return t({method:"POST",path:"/formula/run",body:e})},upsert(e){return k(()=>t({method:"POST",path:"/records",body:e}),{paginatedExecutor:a=>{let s=e,u=a.skip!==void 0||a.nextPageToken||a.nextToken?{...s||{},options:{...s?.options||{},...a.skip!==void 0?{skip:a.skip}:{}},...a.nextPageToken?{nextPageToken:a.nextPageToken}:{},...a.nextToken?{nextToken:a.nextToken}:{}}:e;return t({method:"POST",path:"/records",body:u})},autoPaginate:r})},deleteRecords(e){return t({method:"DELETE",path:"/records",body:e})},runQuery(e){return k(()=>t({method:"POST",path:"/records/query",body:e}),{paginatedExecutor:a=>{let s=e,u=a.skip!==void 0||a.nextPageToken||a.nextToken?{...s||{},options:{...s?.options||{},...a.skip!==void 0?{skip:a.skip}:{}},...a.nextPageToken?{nextPageToken:a.nextPageToken}:{},...a.nextToken?{nextToken:a.nextToken}:{}}:e;return t({method:"POST",path:"/records/query",body:u})},autoPaginate:r})},getTempTokenDBID(e){return t({method:"GET",path:`/auth/temporary/${e.dbid}`})},exchangeSsoToken(e){return t({method:"POST",path:"/auth/oauth/token",body:e})},cloneUserToken(e){return t({method:"POST",path:"/usertoken/clone",body:e})},transferUserToken(e){return t({method:"POST",path:"/usertoken/transfer",body:e})},deactivateUserToken(){return t({method:"POST",path:"/usertoken/deactivate"})},deleteUserToken(){return t({method:"DELETE",path:"/usertoken"})},downloadFile(e){return t({method:"GET",path:`/files/${e.tableId}/${e.recordId}/${e.fieldId}/${e.versionNumber}`})},deleteFile(e){return t({method:"DELETE",path:`/files/${e.tableId}/${e.recordId}/${e.fieldId}/${e.versionNumber}`})},getUsers(e,o){return k(()=>t({method:"POST",path:"/users",query:{accountId:e.accountId},body:o}),{paginatedExecutor:s=>{let u=o,m=s.skip!==void 0||s.nextPageToken||s.nextToken?{...u||{},options:{...u?.options||{},...s.skip!==void 0?{skip:s.skip}:{}},...s.nextPageToken?{nextPageToken:s.nextPageToken}:{},...s.nextToken?{nextToken:s.nextToken}:{}}:o;return t({method:"POST",path:"/users",query:{accountId:e.accountId},body:m})},autoPaginate:r})},denyUsers(e,o){return t({method:"PUT",path:"/users/deny",query:{accountId:e.accountId},body:o})},denyUsersAndGroups(e,o){return t({method:"PUT",path:`/users/deny/${e.shouldDeleteFromGroups}`,query:{accountId:e.accountId},body:o})},undenyUsers(e,o){return t({method:"PUT",path:"/users/undeny",query:{accountId:e.accountId},body:o})},addMembersToGroup(e,o){return t({method:"POST",path:`/groups/${e.gid}/members`,body:o})},removeMembersFromGroup(e,o){return t({method:"DELETE",path:`/groups/${e.gid}/members`,body:o})},addManagersToGroup(e,o){return t({method:"POST",path:`/groups/${e.gid}/managers`,body:o})},removeManagersFromGroup(e,o){return t({method:"DELETE",path:`/groups/${e.gid}/managers`,body:o})},addSubgroupsToGroup(e,o){return t({method:"POST",path:`/groups/${e.gid}/subgroups`,body:o})},removeSubgroupsFromGroup(e,o){return t({method:"DELETE",path:`/groups/${e.gid}/subgroups`,body:o})},audit(e){return t({method:"POST",path:"/audit",body:e})},platformAnalyticReads(e){return t({method:"GET",path:"/analytics/reads",query:{day:e.day}})},platformAnalyticEventSummaries(e,o){return k(()=>t({method:"POST",path:"/analytics/events/summaries",query:{accountId:e.accountId},body:o}),{paginatedExecutor:s=>{let u=o,m=s.skip!==void 0||s.nextPageToken||s.nextToken?{...u||{},options:{...u?.options||{},...s.skip!==void 0?{skip:s.skip}:{}},...s.nextPageToken?{nextPageToken:s.nextPageToken}:{},...s.nextToken?{nextToken:s.nextToken}:{}}:o;return t({method:"POST",path:"/analytics/events/summaries",query:{accountId:e.accountId},body:m})},autoPaginate:r})},exportSolution(e){return t({method:"GET",path:`/solutions/${e.solutionId}`})},updateSolution(e,o){return t({method:"PUT",path:`/solutions/${e.solutionId}`,body:o})},createSolution(e){return t({method:"POST",path:"/solutions",body:e})},exportSolutionToRecord(e){return t({method:"GET",path:`/solutions/${e.solutionId}/torecord`,query:{tableId:e.tableId,fieldId:e.fieldId}})},createSolutionFromRecord(e){return t({method:"GET",path:"/solutions/fromrecord",query:{tableId:e.tableId,fieldId:e.fieldId,recordId:e.recordId}})},updateSolutionToRecord(e){return t({method:"GET",path:`/solutions/${e.solutionId}/fromrecord`,query:{tableId:e.tableId,fieldId:e.fieldId,recordId:e.recordId}})},changesetSolution(e,o){return t({method:"PUT",path:`/solutions/${e.solutionId}/changeset`,body:o})},changesetSolutionFromRecord(e){return t({method:"GET",path:`/solutions/${e.solutionId}/changeset/fromrecord`,query:{tableId:e.tableId,fieldId:e.fieldId,recordId:e.recordId}})},generateDocument(e){return t({method:"GET",path:`/docTemplates/${e.templateId}/generate`,query:{tableId:e.tableId,recordId:e.recordId,filename:e.filename,format:e.format,margin:e.margin,unit:e.unit,pageSize:e.pageSize,orientation:e.orientation,realm:e.realm}})}}}function me(t){let r=j(t),e=O(r.debug),o={realm:r.realm,baseUrl:r.baseUrl,fetchApi:r.fetchApi,logger:e},n=N(r.auth,o),a=H(r.proactiveThrottle),s=z({config:r,auth:n,throttle:a,logger:e});return{...W(s.execute,r.autoPaginate),request:s.execute,getConfig:()=>r}}var Et=me;export{R as AuthenticationError,I as AuthorizationError,G as NoOpThrottle,C as NotFoundError,h as QuickbaseError,y as RateLimitError,x as ServerError,U as SlidingWindowThrottle,S as SsoTokenStrategy,E as TempTokenStrategy,b as TimeoutError,A as UserTokenStrategy,D as ValidationError,W as createApiMethods,N as createAuthStrategy,me as createClient,Et as default};
|
|
6
|
+
var nr=Object.defineProperty;var or=(t,r,e)=>r in t?nr(t,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[r]=e;var m=(t,r,e)=>or(t,typeof r!="symbol"?r+"":r,e);var Z=class extends Error{constructor(r){super(r),this.name="SchemaError"}};function we(t){if(!t)return;let r=new Map,e=new Map,s=new Map,n=new Map;for(let[o,i]of Object.entries(t.tables)){let l=i.id;r.set(o,l),e.set(l,o);let d=new Map,c=new Map;for(let[f,R]of Object.entries(i.fields))d.set(f,R),c.set(R,f);s.set(l,d),n.set(l,c)}return{original:t,tableAliasToId:r,tableIdToAlias:e,fieldAliasToId:s,fieldIdToAlias:n}}function E(t,r){if(!t)return r;let e=t.tableAliasToId.get(r);if(e)return e;if(t.tableIdToAlias.has(r))return r;let s=Array.from(t.tableAliasToId.keys()),n=Se(r,s),o=n?` Did you mean '${n}'?`:"",i=s.length>0?` Available: ${s.join(", ")}`:"";throw new Z(`Unknown table alias '${r}'.${o}${i}`)}function _(t,r,e){if(typeof e=="number")return e;if(!t){let c=parseInt(e,10);return isNaN(c)?e:c}let s=t.fieldAliasToId.get(r);if(s){let c=s.get(e);if(c!==void 0)return c}let n=parseInt(e,10);if(!isNaN(n))return n;let o=s?Array.from(s.keys()):[],i=Se(e,o),l=i?` Did you mean '${i}'?`:"",d=t.tableIdToAlias.get(r)||r;throw new Z(`Unknown field alias '${e}' in table '${d}'.${l}`)}function D(t,r,e){return t?t.fieldIdToAlias.get(r)?.get(e):void 0}function N(t,r){if(t)return t.tableIdToAlias.get(r)}function Se(t,r,e=3){let s=t.toLowerCase(),n,o=e+1;for(let i of r){let l=ir(s,i.toLowerCase());l<o&&(o=l,n=i)}return o<=e?n:void 0}function ir(t,r){if(t.length===0)return r.length;if(r.length===0)return t.length;let e=Array.from({length:r.length+1},(s,n)=>Array.from({length:t.length+1},(o,i)=>n===0?i:i===0?n:0));for(let s=1;s<=r.length;s++)for(let n=1;n<=t.length;n++)r.charAt(s-1)===t.charAt(n-1)?e[s][n]=e[s-1][n-1]:e[s][n]=Math.min(e[s-1][n-1]+1,e[s][n-1]+1,e[s-1][n]+1);return e[r.length][t.length]}var w={baseUrl:"https://api.quickbase.com/v1",timeout:3e4,debug:!1,retry:{maxAttempts:3,initialDelayMs:1e3,maxDelayMs:3e4,multiplier:2},proactiveThrottle:{enabled:!1,requestsPer10Seconds:100},tempTokenLifespanMs:29e4,autoPaginate:!1,convertDates:!0};var S=class t extends Error{constructor(e,s,n){super(e,{cause:n?.cause});m(this,"statusCode");m(this,"description");m(this,"rayId");this.name="QuickbaseError",this.statusCode=s,this.description=n?.description,this.rayId=n?.rayId,Error.captureStackTrace&&Error.captureStackTrace(this,t)}toJSON(){return{name:this.name,message:this.message,statusCode:this.statusCode,description:this.description,rayId:this.rayId}}},F=class extends S{constructor(e,s){super(s||`Rate limited. Retry after ${e.retryAfter??"unknown"} seconds`,429,{rayId:e.qbApiRay||e.cfRay});m(this,"retryAfter");m(this,"rateLimitInfo");this.name="RateLimitError",this.retryAfter=e.retryAfter,this.rateLimitInfo=e}toJSON(){return{...super.toJSON(),retryAfter:this.retryAfter,rateLimitInfo:this.rateLimitInfo}}},G=class extends S{constructor(r,e){super(r,401,e),this.name="AuthenticationError"}},Y=class extends S{constructor(r,e){super(r,403,e),this.name="AuthorizationError"}},ee=class extends S{constructor(r,e){super(r,404,e),this.name="NotFoundError"}},te=class extends S{constructor(e,s){super(e,400,s);m(this,"errors");this.name="ValidationError",this.errors=s?.errors}toJSON(){return{...super.toJSON(),errors:this.errors}}},U=class extends S{constructor(e,s){super(`Request timed out after ${e}ms`,0,s);m(this,"timeoutMs");this.name="TimeoutError",this.timeoutMs=e}toJSON(){return{...super.toJSON(),timeoutMs:this.timeoutMs}}},W=class extends S{constructor(r,e,s){super(e,r,s),this.name="ServerError"}};async function pe(t,r){let e=t.headers.get("qb-api-ray")||t.headers.get("cf-ray")||void 0,s=null;try{s=await t.json()}catch{}let n=s?.message||t.statusText||"Unknown error",o=s?.description;switch(t.status){case 400:return new te(n,{description:o,rayId:e,errors:s?.errors});case 401:return new G(n,{rayId:e});case 403:return new Y(n,{rayId:e});case 404:return new ee(n,{rayId:e});case 429:{let i=t.headers.get("Retry-After"),l={timestamp:new Date,requestUrl:r,httpStatus:429,retryAfter:i?parseInt(i,10):void 0,cfRay:t.headers.get("cf-ray")||void 0,tid:t.headers.get("tid")||void 0,qbApiRay:t.headers.get("qb-api-ray")||void 0,attempt:1};return new F(l,n)}default:return t.status>=500?new W(t.status,n,{description:o,rayId:e}):new S(n,t.status,{description:o,rayId:e})}}function ie(t){return t instanceof F||t instanceof W||t instanceof U}var $=class t extends Error{constructor(e,s,n){let o=n?`Read-only mode: write operation blocked (XML action: ${n})`:`Read-only mode: write operation blocked (${e} ${s})`;super(o);m(this,"method");m(this,"path");m(this,"action");this.name="ReadOnlyError",this.method=e,this.path=s,this.action=n,Error.captureStackTrace&&Error.captureStackTrace(this,t)}toJSON(){return{name:this.name,message:this.message,method:this.method,path:this.path,action:this.action}}};var ae=class{constructor(r=!1,e="quickbase-js"){m(this,"enabled");m(this,"prefix");this.enabled=r,this.prefix=e}formatMessage(r,e){return`[${new Date().toISOString()}] [${this.prefix}] [${r}] ${e}`}debug(r,e){this.enabled&&(e!==void 0?console.log(this.formatMessage("DEBUG",r),e):console.log(this.formatMessage("DEBUG",r)))}info(r,e){this.enabled&&(e!==void 0?console.info(this.formatMessage("INFO",r),e):console.info(this.formatMessage("INFO",r)))}warn(r,e){e!==void 0?console.warn(this.formatMessage("WARN",r),e):console.warn(this.formatMessage("WARN",r))}error(r,e){e!==void 0?console.error(this.formatMessage("ERROR",r),e):console.error(this.formatMessage("ERROR",r))}rateLimit(r){this.enabled&&this.debug(`Rate limited (attempt ${r.attempt}): ${r.url} - Status ${r.status}, Retry-After: ${r.retryAfter??"not specified"}s`+(r.rayId?`, Ray: ${r.rayId}`:""))}timing(r,e,s){this.enabled&&this.debug(`${r} ${e} completed in ${s}ms`)}retry(r,e,s,n){this.enabled&&this.debug(`Retry ${r}/${e} in ${s}ms: ${n}`)}token(r,e){if(this.enabled){let s=e?` for dbid: ${e}`:"";this.debug(`Token ${r}${s}`)}}};function ge(t){return new ae(t)}function he(t){ar(t);let r={maxAttempts:t.rateLimit?.retry?.maxAttempts??w.retry.maxAttempts,initialDelayMs:t.rateLimit?.retry?.initialDelayMs??w.retry.initialDelayMs,maxDelayMs:t.rateLimit?.retry?.maxDelayMs??w.retry.maxDelayMs,multiplier:t.rateLimit?.retry?.multiplier??w.retry.multiplier},e={enabled:t.rateLimit?.proactiveThrottle?.enabled??w.proactiveThrottle.enabled,requestsPer10Seconds:t.rateLimit?.proactiveThrottle?.requestsPer10Seconds??w.proactiveThrottle.requestsPer10Seconds};return{realm:t.realm,baseUrl:t.baseUrl??w.baseUrl,timeout:t.timeout??w.timeout,debug:t.debug??w.debug,fetchApi:t.fetchApi??globalThis.fetch.bind(globalThis),auth:t.auth,retry:r,proactiveThrottle:e,onRateLimit:t.rateLimit?.onRateLimit,autoPaginate:t.autoPaginate??w.autoPaginate,convertDates:t.convertDates??w.convertDates,schema:we(t.schema),readOnly:t.readOnly??!1}}function ar(t){if(!t.realm)throw new Error("QuickBase realm is required");if(typeof t.realm!="string")throw new Error("QuickBase realm must be a string");if(t.realm.includes("."))throw new Error('Realm should be just the subdomain (e.g., "mycompany" not "mycompany.quickbase.com")');if(!t.auth)throw new Error("Authentication configuration is required");if(lr(t.auth),t.timeout!==void 0&&(typeof t.timeout!="number"||t.timeout<=0))throw new Error("Timeout must be a positive number");t.rateLimit?.retry&&dr(t.rateLimit.retry),t.rateLimit?.proactiveThrottle&&ur(t.rateLimit.proactiveThrottle)}function lr(t){switch(t.type){case"user-token":if(!t.userToken)throw new Error("User token is required for user-token auth");break;case"temp-token":break;case"sso":if(!t.samlToken)throw new Error("SAML token is required for SSO auth");break;case"ticket":if(!t.username)throw new Error("Username is required for ticket auth");if(!t.password)throw new Error("Password is required for ticket auth");break;default:throw new Error(`Unknown auth type: ${t.type}`)}}function dr(t){if(t.maxAttempts!==void 0&&(typeof t.maxAttempts!="number"||t.maxAttempts<0))throw new Error("maxAttempts must be a non-negative number");if(t.initialDelayMs!==void 0&&(typeof t.initialDelayMs!="number"||t.initialDelayMs<0))throw new Error("initialDelayMs must be a non-negative number");if(t.maxDelayMs!==void 0&&(typeof t.maxDelayMs!="number"||t.maxDelayMs<0))throw new Error("maxDelayMs must be a non-negative number");if(t.multiplier!==void 0&&(typeof t.multiplier!="number"||t.multiplier<1))throw new Error("multiplier must be a number >= 1")}function ur(t){if(t.requestsPer10Seconds!==void 0&&(typeof t.requestsPer10Seconds!="number"||t.requestsPer10Seconds<=0))throw new Error("requestsPer10Seconds must be a positive number")}function fe(t){return`${t}.quickbase.com`}var cr=/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d{1,3})?(Z|[+-]\d{2}:?\d{2})?)?$/;function Ce(t){return cr.test(t)}function re(t,r){if(!r||t===null||t===void 0||typeof t!="object")return t;if(Array.isArray(t))return t.map(s=>re(s,r));if(t instanceof Date)return t;let e={};for(let[s,n]of Object.entries(t))typeof n=="string"&&Ce(n)?e[s]=new Date(n):n instanceof Date?e[s]=n:typeof n=="object"&&n!==null?e[s]=re(n,r):e[s]=n;return e}var X=class{constructor(r,e){m(this,"userToken");m(this,"logger");this.userToken=r,this.logger=e.logger}async getToken(r){return this.userToken}getAuthorizationHeader(r){return`QB-USER-TOKEN ${r}`}async handleAuthError(r){return this.logger.debug("Auth error with user token - cannot refresh"),!1}invalidate(r){}};var B=class{constructor(r){m(this,"cache",new Map);m(this,"defaultLifespanMs");this.defaultLifespanMs=r}get(r){let e=this.cache.get(r);return e?Date.now()>=e.expiresAt-1e4?(this.cache.delete(r),null):e.token:null}set(r,e,s){let n=Date.now()+(s??this.defaultLifespanMs);this.cache.set(r,{token:e,expiresAt:n})}delete(r){return this.cache.delete(r)}clear(){this.cache.clear()}has(r){return this.get(r)!==null}getTimeToExpiry(r){let e=this.cache.get(r);if(!e)return null;let s=e.expiresAt-Date.now();return s>0?s:null}get size(){return this.cleanup(),this.cache.size}cleanup(){let r=Date.now();for(let[e,s]of this.cache)r>=s.expiresAt&&this.cache.delete(e)}};var j=class{constructor(r,e,s){m(this,"userToken");m(this,"appToken");m(this,"realm");m(this,"baseUrl");m(this,"fetchApi");m(this,"logger");m(this,"cache");m(this,"pendingFetches",new Map);this.userToken=r,this.appToken=s?.appToken,this.realm=e.realm,this.baseUrl=e.baseUrl,this.fetchApi=e.fetchApi,this.logger=e.logger,this.cache=new B(s?.tokenLifespanMs??w.tempTokenLifespanMs)}async getToken(r){if(!r)throw new Error("Database ID (dbid) is required for temporary token authentication");let e=this.cache.get(r);if(e)return this.logger.token("cache-hit",r),e;this.logger.token("cache-miss",r);let s=this.pendingFetches.get(r);if(s)return this.logger.debug(`Waiting for existing token fetch for dbid: ${r}`),s;let n=this.fetchToken(r);this.pendingFetches.set(r,n);try{return await n}finally{this.pendingFetches.delete(r)}}async fetchToken(r){this.logger.token("fetch",r);let e=`${this.baseUrl}/auth/temporary/${r}`,s={"QB-Realm-Hostname":`${this.realm}.quickbase.com`,"Content-Type":"application/json"};this.userToken&&(s.Authorization=`QB-USER-TOKEN ${this.userToken}`),this.appToken&&(s["QB-App-Token"]=this.appToken);let n=await this.fetchApi(e,{method:"GET",headers:s,credentials:"include"});if(!n.ok){let l=await n.text();throw new G(`Failed to fetch temporary token for ${r}: ${n.status} ${l}`,{rayId:n.headers.get("qb-api-ray")||void 0})}let i=(await n.json()).temporaryAuthorization;if(!i)throw new G(`No temporary token in response for ${r}`);return this.cache.set(r,i),this.logger.debug(`Cached new token for dbid: ${r}`),i}getAuthorizationHeader(r){return`QB-TEMP-TOKEN ${r}`}async handleAuthError(r){if(!r)return this.logger.debug("Auth error without dbid - cannot refresh temp token"),!1;this.invalidate(r);try{return this.logger.token("refresh",r),await this.getToken(r),!0}catch(e){return this.logger.error(`Failed to refresh temp token for ${r}`,e),!1}}invalidate(r){r?(this.logger.token("expire",r),this.cache.delete(r)):this.cache.clear()}};var Q=class{constructor(r,e,s){m(this,"samlToken");m(this,"realm");m(this,"baseUrl");m(this,"fetchApi");m(this,"logger");m(this,"cache");m(this,"pendingExchange",null);this.samlToken=r,this.realm=e.realm,this.baseUrl=e.baseUrl,this.fetchApi=e.fetchApi,this.logger=e.logger,this.cache=new B(s?.tokenLifespanMs??w.tempTokenLifespanMs)}get cacheKey(){return"__sso__"}async getToken(r){let e=this.cache.get(this.cacheKey);if(e)return this.logger.token("cache-hit"),e;if(this.logger.token("cache-miss"),this.pendingExchange)return this.logger.debug("Waiting for existing SSO token exchange"),this.pendingExchange;let s=this.exchangeToken();this.pendingExchange=s;try{return await s}finally{this.pendingExchange=null}}async exchangeToken(){this.logger.token("fetch");let r=`${this.baseUrl}/auth/oauth/token`,e=new URLSearchParams({grant_type:"urn:ietf:params:oauth:grant-type:token-exchange",requested_token_type:"urn:quickbase:params:oauth:token-type:temp_token",subject_token:this.samlToken,subject_token_type:"urn:ietf:params:oauth:token-type:saml2"}),s=await this.fetchApi(r,{method:"POST",headers:{"QB-Realm-Hostname":`${this.realm}.quickbase.com`,"Content-Type":"application/x-www-form-urlencoded"},body:e.toString()});if(!s.ok){let i=await s.text();throw new G(`SSO token exchange failed: ${s.status} ${i}`,{rayId:s.headers.get("qb-api-ray")||void 0})}let o=(await s.json()).access_token;if(!o)throw new G("No access_token in SSO exchange response");return this.cache.set(this.cacheKey,o),this.logger.debug("Cached new SSO token"),o}getAuthorizationHeader(r){return`QB-TEMP-TOKEN ${r}`}async handleAuthError(r){this.invalidate();try{return this.logger.token("refresh"),await this.getToken(),!0}catch(e){return this.logger.error("Failed to refresh SSO token",e),!1}}invalidate(r){this.logger.token("expire"),this.cache.clear()}};var V=class{constructor(r,e,s,n){m(this,"username");m(this,"password");m(this,"hours");m(this,"realm");m(this,"fetchApi");m(this,"logger");m(this,"onExpired");m(this,"persist");m(this,"storageKey");m(this,"ticket",null);m(this,"userId",null);m(this,"expiresAt",null);m(this,"authenticated",!1);m(this,"pendingAuth",null);this.username=r,this.password=e,this.hours=Math.min(Math.max(s?.hours??12,1),4380),this.onExpired=s?.onExpired,this.persist=s?.persist,this.realm=n.realm,this.fetchApi=n.fetchApi,this.logger=n.logger,this.storageKey=`qb_ticket_${this.realm}`,this.restoreFromStorage()}async getToken(r){if(this.ticket&&this.expiresAt&&Date.now()<this.expiresAt)return this.ticket;if(this.ticket&&this.expiresAt&&Date.now()>=this.expiresAt)throw this.clearTicket(),this.onExpired?.(),new Error("Ticket expired; create a new client with fresh credentials");if(this.authenticated)throw this.onExpired?.(),new Error("Ticket expired; create a new client with fresh credentials");if(this.pendingAuth)return this.pendingAuth;this.pendingAuth=this.authenticate();try{return await this.pendingAuth}finally{this.pendingAuth=null}}getAuthorizationHeader(r){return`QB-TICKET ${r}`}async handleAuthError(r){return this.clearTicket(),this.logger.debug("Ticket auth error - cannot refresh (password was cleared)"),this.onExpired?.(),!1}invalidate(r){this.clearTicket()}clearTicket(){this.ticket=null,this.expiresAt=null,this.clearFromStorage()}getUserId(){return this.userId}async authenticate(){if(!this.password)throw this.onExpired?.(),new Error("Ticket expired; create a new client with fresh credentials");let r=`https://${this.realm}.quickbase.com/db/main`,e=`<qdbapi>
|
|
7
|
+
<username>${this.escapeXml(this.username)}</username>
|
|
8
|
+
<password>${this.escapeXml(this.password)}</password>
|
|
9
|
+
<hours>${this.hours}</hours>
|
|
10
|
+
</qdbapi>`;this.logger.debug(`Authenticating via API_Authenticate for ${this.username}`);let n=await(await this.fetchApi(r,{method:"POST",headers:{"Content-Type":"application/xml","QUICKBASE-ACTION":"API_Authenticate"},body:e})).text(),o=this.parseXmlResponse(n);if(o.errcode!==0){let i=o.errdetail||o.errtext||"Unknown error";throw new Error(`Authentication failed: ${i} (code: ${o.errcode})`)}if(!o.ticket)throw new Error("No ticket returned from API_Authenticate");return this.ticket=o.ticket,this.userId=o.userid,this.expiresAt=Date.now()+this.hours*60*60*1e3,this.authenticated=!0,this.saveToStorage(),this.password=null,this.logger.debug(`Authenticated successfully, userId: ${this.userId}`),this.ticket}parseXmlResponse(r){let e=s=>r.match(new RegExp(`<${s}>([^<]*)</${s}>`))?.[1]??"";return{ticket:e("ticket"),userid:e("userid"),errcode:parseInt(e("errcode"),10)||0,errtext:e("errtext"),errdetail:e("errdetail")||void 0}}escapeXml(r){return r.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}getStorage(){if(!this.persist)return null;try{if(typeof globalThis>"u")return null;let r=globalThis;return(this.persist==="localStorage"?r.localStorage:r.sessionStorage)??null}catch{return null}}saveToStorage(){let r=this.getStorage();if(!(!r||!this.ticket||!this.userId||!this.expiresAt))try{let e={ticket:this.ticket,userId:this.userId,expiresAt:this.expiresAt};r.setItem(this.storageKey,JSON.stringify(e)),this.logger.debug(`Ticket saved to ${this.persist}`)}catch{this.logger.debug(`Failed to save ticket to ${this.persist}`)}}restoreFromStorage(){let r=this.getStorage();if(r)try{let e=r.getItem(this.storageKey);if(!e)return;let s=JSON.parse(e);if(Date.now()>=s.expiresAt-6e4){r.removeItem(this.storageKey),this.logger.debug("Stored ticket expired, removed from storage");return}this.ticket=s.ticket,this.userId=s.userId,this.expiresAt=s.expiresAt,this.authenticated=!0,this.password=null,this.logger.debug(`Ticket restored from ${this.persist}`)}catch{r.removeItem(this.storageKey)}}clearFromStorage(){let r=this.getStorage();if(r)try{r.removeItem(this.storageKey),this.logger.debug(`Ticket cleared from ${this.persist}`)}catch{}}};function Re(t,r){switch(t.type){case"user-token":return new X(t.userToken,r);case"temp-token":return new j(t.userToken,r,{appToken:t.appToken,tokenLifespanMs:t.tokenLifespanMs});case"sso":return new Q(t.samlToken,r);case"ticket":return new V(t.username,t.password,{hours:t.hours,onExpired:t.onExpired,persist:t.persist},r);default:throw new Error(`Unknown auth type: ${t.type}`)}}function be(t,r,e){let s=t.headers.get("Retry-After");return{timestamp:new Date,requestUrl:r,httpStatus:t.status,retryAfter:s?parseInt(s,10):void 0,cfRay:t.headers.get("cf-ray")||void 0,tid:t.headers.get("tid")||void 0,qbApiRay:t.headers.get("qb-api-ray")||void 0,attempt:e}}function ye(t){return new Promise(r=>setTimeout(r,t))}function Ge(t,r){let e={...t},s=r.tableId;return r.schema&&("from"in e&&typeof e.from=="string"&&(s=E(r.schema,e.from),e.from=s),"to"in e&&typeof e.to=="string"&&(s=E(r.schema,e.to),e.to=s),s&&("select"in e&&Array.isArray(e.select)&&(e.select=e.select.map(n=>_(r.schema,s,n))),"sortBy"in e&&Array.isArray(e.sortBy)&&(e.sortBy=e.sortBy.map(n=>({...n,fieldId:_(r.schema,s,n.fieldId)}))),"groupBy"in e&&Array.isArray(e.groupBy)&&(e.groupBy=e.groupBy.map(n=>({...n,fieldId:_(r.schema,s,n.fieldId)}))),"where"in e&&typeof e.where=="string"&&(e.where=pr(e.where,r.schema,s)))),"data"in e&&Array.isArray(e.data)&&(e.data=e.data.map(n=>mr(n,r.schema,s))),e}function mr(t,r,e){let s={};for(let[n,o]of Object.entries(t)){let i=n;if(r&&e)try{let l=_(r,e,n);i=String(l)}catch{}s[i]=gr(o)}return s}function pr(t,r,e){return t.replace(/\{['"]?([^.'"\}]+)['"]?\./g,(s,n)=>{try{return`{${_(r,e,n)}.`}catch{return s}})}function gr(t){return hr(t)?t:{value:t}}function hr(t){return t==null||typeof t!="object"||Array.isArray(t)?!1:"value"in t}function Ee(t,r){if(!t||typeof t!="object")return t;let e={...t};return"data"in e&&Array.isArray(e.data)&&r.tableId&&(e.data=e.data.map(s=>fr(s,r.schema,r.tableId))),e}function fr(t,r,e){let s={};for(let[n,o]of Object.entries(t)){let i=n,l=parseInt(n,10);if(!isNaN(l)&&r){let c=D(r,e,l);c&&(i=c)}let d=le(o);s[i]=d}return s}function le(t){if(t==null)return t;if(typeof t=="object"&&!Array.isArray(t)){let r=t;if("value"in r&&Object.keys(r).length===1||"value"in r)return le(r.value)}return Array.isArray(t)?t.map(le):t}function De(t,r){if(t){if("from"in t&&typeof t.from=="string")return r?E(r,t.from):t.from;if("to"in t&&typeof t.to=="string")return r?E(r,t.to):t.to}}var Fe={"POST /records":!0,"DELETE /records":!0,"POST /apps":!0,"DELETE /apps":!0,"POST /apps/":!0,"DELETE /apps/":!0,"POST /tables":!0,"DELETE /tables":!0,"POST /tables/":!0,"DELETE /tables/":!0,"POST /fields":!0,"DELETE /fields":!0,"POST /fields/":!0,"DELETE /files/":!0,"POST /usertoken":!0,"DELETE /usertoken":!0,"PUT /users":!0,"PUT /users/":!0,"POST /groups/":!0,"DELETE /groups/":!0,"POST /solutions":!0,"PUT /solutions/":!0,"GET /docTemplates/":!0,"GET /solutions/fromrecord":!0},Ue={"POST /records/query":!0,"POST /reports/":!0,"POST /formula/run":!0,"POST /audit":!0,"POST /users":!0,"POST /analytics/":!0};function Rr(t){let r=t.toUpperCase();return r==="POST"||r==="PUT"||r==="DELETE"||r==="PATCH"}function br(t,r){let e=`${t} ${r}`;if(Fe[e])return!0;for(let s=r.length-1;s>=0;s--)if(r[s]==="/"){let n=`${t} ${r.slice(0,s+1)}`;if(Fe[n])return!0}return!1}function $e(t){let r=`POST ${t}`;if(Ue[r])return!0;for(let e=t.length-1;e>=0;e--)if(t[e]==="/"){let s=`POST ${t.slice(0,e+1)}`;if(Ue[s])return!0}return!1}function yr(t,r,e){if(t.readOnly){if(br(r,e)){if(r==="POST"&&$e(e))return;throw new $(r,e)}if(Rr(r)){if(r==="POST"&&$e(e))return;throw new $(r,e)}}}function Tr(t,r){if(t.dbid)return r?.schema?E(r.schema,t.dbid):t.dbid;if(t.query?.tableId){let n=String(t.query.tableId);return r?.schema?E(r.schema,n):n}if(t.query?.appId)return String(t.query.appId);let e=t.path.match(/\/tables\/([^/?]+)/);if(e)return e[1];let s=t.path.match(/\/apps\/([^/?]+)/);if(s)return s[1];if(t.body&&typeof t.body=="object"){let n=De(t.body,r?.schema);if(n)return n}}function Me(t,r,e){let s=t.endsWith("/")?t:`${t}/`,n=r.startsWith("/")?r.slice(1):r,o=new URL(n,s);if(e)for(let[i,l]of Object.entries(e))l!==void 0&&o.searchParams.set(i,String(l));return o.toString()}async function Ar(t,r,e,s){let n=await t.getToken(e),o=t.getAuthorizationHeader(n);return{"Content-Type":"application/json","QB-Realm-Hostname":r,Authorization:o,...s}}async function Ir(t,r,e){let{config:s,auth:n,throttle:o,logger:i}=r,l=Me(s.baseUrl,t.path,t.query),d=fe(s.realm),c=await Ar(n,d,e.dbid,t.headers);await o.acquire();let f={method:t.method,headers:c,credentials:"omit"};t.body!==void 0&&(f.body=JSON.stringify(t.body));let R=new AbortController,A=setTimeout(()=>R.abort(),s.timeout);f.signal=R.signal;let T=Date.now();try{let k=await s.fetchApi(l,f),y=Date.now()-T;return i.timing(t.method,t.path,y),k}catch(k){throw k instanceof Error&&k.name==="AbortError"?new U(s.timeout):k}finally{clearTimeout(A)}}async function xr(t,r,e,s){let{config:n,logger:o}=s;if(t.ok)return t;if(t.status===429){let i=be(t,r,e.attempt);throw o.rateLimit({url:r,status:429,retryAfter:i.retryAfter,attempt:e.attempt,rayId:i.qbApiRay||i.cfRay}),n.onRateLimit&&n.onRateLimit(i),new F(i)}throw await pe(t,r)}async function _e(t,r){let{config:e,auth:s,logger:n}=r,o=e.retry.maxAttempts;yr(e,t.method,t.path);let i=Tr(t,e),l=t;if(e.schema&&t.body&&typeof t.body=="object"){let f=Ge(t.body,{schema:e.schema,tableId:i});l={...t,body:f}}let d={methodName:`${t.method} ${t.path}`,attempt:1,maxAttempts:o,dbid:i,startTime:Date.now()},c=null;for(let f=1;f<=o;f++){d.attempt=f;try{let R=await Ir(l,r,d),A=Me(e.baseUrl,t.path,t.query);await xr(R,A,d,r);let T=await R.json();return e.schema&&i&&(T=Ee(T,{schema:e.schema,tableId:i})),re(T,e.convertDates)}catch(R){if(c=R,!ie(R)||f>=o)throw R;if(R instanceof S&&R.statusCode===401){if(!await s.handleAuthError(i))throw R;n.debug("Token refreshed, retrying request");continue}let A,T;R instanceof F?(A=R.retryAfter?R.retryAfter*1e3:de(f,e.retry),T="Rate limited (429)"):R instanceof U?(A=de(f,e.retry),T="Timeout"):R instanceof S&&R.statusCode>=500?(A=de(f,e.retry),T=`Server error (${R.statusCode})`):(A=de(f,e.retry),T="Retryable error"),n.retry(f,o,A,T),await ye(A)}}throw c||new Error("Request failed")}function de(t,r){let e=r.initialDelayMs*Math.pow(r.multiplier,t-1),s=e*.1*(Math.random()*2-1);return Math.min(e+s,r.maxDelayMs)}function Te(t){return{execute:r=>_e(r,t)}}var se=class{constructor(r=100){m(this,"requestsPer10Seconds");m(this,"timestamps",[]);this.requestsPer10Seconds=r}async acquire(){let r=Date.now(),e=r-1e4;for(;this.timestamps.length>0&&this.timestamps[0]<e;)this.timestamps.shift();if(this.timestamps.length>=this.requestsPer10Seconds){let n=this.timestamps[0]+1e4-r;if(n>0)return await this.sleep(n),this.acquire()}this.timestamps.push(Date.now())}getWindowCount(){let r=Date.now()-1e4;return this.timestamps.filter(e=>e>=r).length}getRemaining(){return Math.max(0,this.requestsPer10Seconds-this.getWindowCount())}reset(){this.timestamps.length=0}sleep(r){return new Promise(e=>setTimeout(e,r))}},ne=class{async acquire(){}getWindowCount(){return 0}getRemaining(){return 1/0}reset(){}};function Ae(t){return t.enabled?new se(t.requestsPer10Seconds):new ne}function Oe(t){return t.totalRecords!==void 0&&t.skip!==void 0?"skip":t.nextPageToken!==void 0||t.nextToken!==void 0?"token":"none"}function qe(t,r,e){let{metadata:s}=t;if(r==="skip")return s.totalRecords!==void 0&&e<s.totalRecords;if(r==="token"){let n=s.nextPageToken??s.nextToken;return n!==void 0&&n!==""}return!1}function We(t){for(let r of Object.keys(t))if(Array.isArray(t[r]))return r;return"data"}function Be(t){if(!t||typeof t!="object")return!1;let r=t;if(!r.metadata||typeof r.metadata!="object"||!Object.values(r).some(Array.isArray))return!1;let s=r.metadata;return s.totalRecords!==void 0||s.numRecords!==void 0||s.nextPageToken!==void 0||s.nextToken!==void 0}var ue=class{constructor(r,e){m(this,"executor");m(this,"paginatedExecutor");m(this,"defaultAutoPaginate");this.executor=r,this.paginatedExecutor=e?.paginatedExecutor,this.defaultAutoPaginate=e?.autoPaginate??!1}then(r,e){return(this.defaultAutoPaginate?this.all():this.executor()).then(r,e)}async all(){return this.paginate({})}async paginate(r={}){if(!this.paginatedExecutor)return this.executor();let{limit:e,skip:s=0}=r,n=[],o=null,i="none",l=s,d,c=await this.paginatedExecutor({skip:s});if(!Be(c))return c;o=c,i=Oe(c.metadata);let f=We(c),R=c[f]||[];for(e!==void 0&&R.length>e?n=R.slice(0,e):n=[...R],i==="skip"?l=s+R.length:i==="token"&&(d=c.metadata.nextPageToken??c.metadata.nextToken);qe(o,i,n.length)&&!(e!==void 0&&n.length>=e);){let T;if(i==="skip")T=await this.paginatedExecutor({skip:l});else if(i==="token"&&d){let y=o.metadata.nextPageToken!==void 0?"nextPageToken":"nextToken";T=await this.paginatedExecutor({[y]:d})}else break;o=T;let k=T[f]||[];if(k.length===0)break;if(e!==void 0){let y=e-n.length;n=n.concat(k.slice(0,y))}else n=n.concat(k);if(i==="skip")l+=k.length;else if(i==="token"&&(d=T.metadata.nextPageToken??T.metadata.nextToken,!d))break}let A={...o,[f]:n,metadata:{...o.metadata,numRecords:n.length,skip:s}};return i==="token"&&(delete A.metadata.nextPageToken,delete A.metadata.nextToken),A}async noPaginate(){return this.executor()}toPromise(){return this.then()}};function O(t,r){return new ue(t,r)}function Ie(t,r=!1){return{createApp(e){return t({method:"POST",path:"/apps",body:e})},getApp(e){return t({method:"GET",path:`/apps/${e.appId}`})},updateApp(e,s){return t({method:"POST",path:`/apps/${e.appId}`,body:s})},deleteApp(e,s){return t({method:"DELETE",path:`/apps/${e.appId}`,body:s})},getAppEvents(e){return t({method:"GET",path:`/apps/${e.appId}/events`})},copyApp(e,s){return t({method:"POST",path:`/apps/${e.appId}/copy`,body:s})},getAppTables(e){return t({method:"GET",path:"/tables",query:{appId:e.appId}})},createTable(e,s){return t({method:"POST",path:"/tables",query:{appId:e.appId},body:s})},getTable(e){return t({method:"GET",path:`/tables/${e.tableId}`,query:{appId:e.appId}})},updateTable(e,s){return t({method:"POST",path:`/tables/${e.tableId}`,query:{appId:e.appId},body:s})},deleteTable(e){return t({method:"DELETE",path:`/tables/${e.tableId}`,query:{appId:e.appId}})},getRelationships(e){return O(()=>t({method:"GET",path:`/tables/${e.tableId}/relationships`,query:{skip:e.skip}}),{paginatedExecutor:o=>t({method:"GET",path:`/tables/${e.tableId}/relationships`,query:{skip:e.skip,...o}}),autoPaginate:r})},createRelationship(e,s){return t({method:"POST",path:`/tables/${e.tableId}/relationship`,body:s})},updateRelationship(e,s){return t({method:"POST",path:`/tables/${e.tableId}/relationship/${e.relationshipId}`,body:s})},deleteRelationship(e){return t({method:"DELETE",path:`/tables/${e.tableId}/relationship/${e.relationshipId}`})},getTableReports(e){return t({method:"GET",path:"/reports",query:{tableId:e.tableId}})},getReport(e){return t({method:"GET",path:`/reports/${e.reportId}`,query:{tableId:e.tableId}})},runReport(e,s){return O(()=>t({method:"POST",path:`/reports/${e.reportId}/run`,query:{tableId:e.tableId,skip:e.skip,top:e.top},body:s}),{paginatedExecutor:i=>{let l=s,d=i.skip!==void 0||i.nextPageToken||i.nextToken?{...l||{},options:{...l?.options||{},...i.skip!==void 0?{skip:i.skip}:{}},...i.nextPageToken?{nextPageToken:i.nextPageToken}:{},...i.nextToken?{nextToken:i.nextToken}:{}}:s;return t({method:"POST",path:`/reports/${e.reportId}/run`,query:{tableId:e.tableId,skip:e.skip,top:e.top},body:d})},autoPaginate:r})},getFields(e){return t({method:"GET",path:"/fields",query:{tableId:e.tableId,includeFieldPerms:e.includeFieldPerms}})},createField(e,s){return t({method:"POST",path:"/fields",query:{tableId:e.tableId},body:s})},deleteFields(e,s){return t({method:"DELETE",path:"/fields",query:{tableId:e.tableId},body:s})},getField(e){return t({method:"GET",path:`/fields/${e.fieldId}`,query:{tableId:e.tableId,includeFieldPerms:e.includeFieldPerms}})},updateField(e,s){return t({method:"POST",path:`/fields/${e.fieldId}`,query:{tableId:e.tableId},body:s})},getFieldsUsage(e){return t({method:"GET",path:"/fields/usage",query:{tableId:e.tableId,skip:e.skip,top:e.top}})},getFieldUsage(e){return t({method:"GET",path:`/fields/usage/${e.fieldId}`,query:{tableId:e.tableId}})},runFormula(e){return t({method:"POST",path:"/formula/run",body:e})},upsert(e){return O(()=>t({method:"POST",path:"/records",body:e}),{paginatedExecutor:o=>{let i=e,l=o.skip!==void 0||o.nextPageToken||o.nextToken?{...i||{},options:{...i?.options||{},...o.skip!==void 0?{skip:o.skip}:{}},...o.nextPageToken?{nextPageToken:o.nextPageToken}:{},...o.nextToken?{nextToken:o.nextToken}:{}}:e;return t({method:"POST",path:"/records",body:l})},autoPaginate:r})},deleteRecords(e){return t({method:"DELETE",path:"/records",body:e})},runQuery(e){return O(()=>t({method:"POST",path:"/records/query",body:e}),{paginatedExecutor:o=>{let i=e,l=o.skip!==void 0||o.nextPageToken||o.nextToken?{...i||{},options:{...i?.options||{},...o.skip!==void 0?{skip:o.skip}:{}},...o.nextPageToken?{nextPageToken:o.nextPageToken}:{},...o.nextToken?{nextToken:o.nextToken}:{}}:e;return t({method:"POST",path:"/records/query",body:l})},autoPaginate:r})},getTempTokenDBID(e){return t({method:"GET",path:`/auth/temporary/${e.dbid}`})},exchangeSsoToken(e){return t({method:"POST",path:"/auth/oauth/token",body:e})},cloneUserToken(e){return t({method:"POST",path:"/usertoken/clone",body:e})},transferUserToken(e){return t({method:"POST",path:"/usertoken/transfer",body:e})},deactivateUserToken(){return t({method:"POST",path:"/usertoken/deactivate"})},deleteUserToken(){return t({method:"DELETE",path:"/usertoken"})},downloadFile(e){return t({method:"GET",path:`/files/${e.tableId}/${e.recordId}/${e.fieldId}/${e.versionNumber}`})},deleteFile(e){return t({method:"DELETE",path:`/files/${e.tableId}/${e.recordId}/${e.fieldId}/${e.versionNumber}`})},getUsers(e,s){return O(()=>t({method:"POST",path:"/users",query:{accountId:e.accountId},body:s}),{paginatedExecutor:i=>{let l=s,d=i.skip!==void 0||i.nextPageToken||i.nextToken?{...l||{},options:{...l?.options||{},...i.skip!==void 0?{skip:i.skip}:{}},...i.nextPageToken?{nextPageToken:i.nextPageToken}:{},...i.nextToken?{nextToken:i.nextToken}:{}}:s;return t({method:"POST",path:"/users",query:{accountId:e.accountId},body:d})},autoPaginate:r})},denyUsers(e,s){return t({method:"PUT",path:"/users/deny",query:{accountId:e.accountId},body:s})},denyUsersAndGroups(e,s){return t({method:"PUT",path:`/users/deny/${e.shouldDeleteFromGroups}`,query:{accountId:e.accountId},body:s})},undenyUsers(e,s){return t({method:"PUT",path:"/users/undeny",query:{accountId:e.accountId},body:s})},addMembersToGroup(e,s){return t({method:"POST",path:`/groups/${e.gid}/members`,body:s})},removeMembersFromGroup(e,s){return t({method:"DELETE",path:`/groups/${e.gid}/members`,body:s})},addManagersToGroup(e,s){return t({method:"POST",path:`/groups/${e.gid}/managers`,body:s})},removeManagersFromGroup(e,s){return t({method:"DELETE",path:`/groups/${e.gid}/managers`,body:s})},addSubgroupsToGroup(e,s){return t({method:"POST",path:`/groups/${e.gid}/subgroups`,body:s})},removeSubgroupsFromGroup(e,s){return t({method:"DELETE",path:`/groups/${e.gid}/subgroups`,body:s})},audit(e){return t({method:"POST",path:"/audit",body:e})},platformAnalyticReads(e){return t({method:"GET",path:"/analytics/reads",query:{day:e.day}})},platformAnalyticEventSummaries(e,s){return O(()=>t({method:"POST",path:"/analytics/events/summaries",query:{accountId:e.accountId},body:s}),{paginatedExecutor:i=>{let l=s,d=i.skip!==void 0||i.nextPageToken||i.nextToken?{...l||{},options:{...l?.options||{},...i.skip!==void 0?{skip:i.skip}:{}},...i.nextPageToken?{nextPageToken:i.nextPageToken}:{},...i.nextToken?{nextToken:i.nextToken}:{}}:s;return t({method:"POST",path:"/analytics/events/summaries",query:{accountId:e.accountId},body:d})},autoPaginate:r})},exportSolution(e){return t({method:"GET",path:`/solutions/${e.solutionId}`})},updateSolution(e,s){return t({method:"PUT",path:`/solutions/${e.solutionId}`,body:s})},createSolution(e){return t({method:"POST",path:"/solutions",body:e})},exportSolutionToRecord(e){return t({method:"GET",path:`/solutions/${e.solutionId}/torecord`,query:{tableId:e.tableId,fieldId:e.fieldId}})},createSolutionFromRecord(e){return t({method:"GET",path:"/solutions/fromrecord",query:{tableId:e.tableId,fieldId:e.fieldId,recordId:e.recordId}})},updateSolutionToRecord(e){return t({method:"GET",path:`/solutions/${e.solutionId}/fromrecord`,query:{tableId:e.tableId,fieldId:e.fieldId,recordId:e.recordId}})},changesetSolution(e,s){return t({method:"PUT",path:`/solutions/${e.solutionId}/changeset`,body:s})},changesetSolutionFromRecord(e){return t({method:"GET",path:`/solutions/${e.solutionId}/changeset/fromrecord`,query:{tableId:e.tableId,fieldId:e.fieldId,recordId:e.recordId}})},generateDocument(e){return t({method:"GET",path:`/docTemplates/${e.templateId}/generate`,query:{tableId:e.tableId,recordId:e.recordId,filename:e.filename,format:e.format,margin:e.margin,unit:e.unit,pageSize:e.pageSize,orientation:e.orientation,realm:e.realm}})}}}var M={Success:0,Unauthorized:4,InvalidInput:5,NoSuchDatabase:6,AccessDenied:7,InvalidTicket:8,NoSuchRecord:30,NoSuchField:31,NoSuchUser:33},q=class extends Error{constructor(e,s,n,o){let i=n?`XML API error ${e}: ${s} (${n})`:`XML API error ${e}: ${s}`;super(i);m(this,"code");m(this,"text");m(this,"detail");m(this,"action");this.name="XmlError",this.code=e,this.text=s,this.detail=n,this.action=o}};function p(t){if(t.errcode!==0)throw new q(t.errcode,t.errtext,t.errdetail,t.action)}function Le(t){return t instanceof q?t.code===M.Unauthorized||t.code===M.AccessDenied:!1}function Ne(t){return t instanceof q?t.code===M.NoSuchDatabase||t.code===M.NoSuchRecord||t.code===M.NoSuchField||t.code===M.NoSuchUser:!1}function Xe(t){return t instanceof q?t.code===M.InvalidTicket:!1}function kr(t,r,e){let s={};for(let n of t){let o=r?D(r,e,n.id):void 0,i=o??String(n.id);s[i]=o?{...n,alias:o}:n}return s}function je(t,r){let e={};for(let s of t){let n=r?N(r,s.dbid):void 0,o=n??s.dbid;e[o]=n?{...s,alias:n}:s}return e}function Pr(t,r){let e={};for(let s of t){let n=r?N(r,s.id):void 0,o=n??s.id;e[o]=n?{...s,alias:n}:s}return e}function vr(t,r,e){let s={...t},n=D(r,e,t.id);if(n&&(s.alias=n),t.summaryReferenceFid!==void 0){let o=D(r,e,t.summaryReferenceFid);o&&(s.summaryReferenceFidAlias=o)}if(t.summaryTargetFid!==void 0){let o=D(r,e,t.summaryTargetFid);o&&(s.summaryTargetFidAlias=o)}return s}function xe(t,r,e){return{...t,fields:kr(t.fields,r,e)}}function Qe(t,r,e){let s={...t.table,fields:void 0,childTables:void 0};if(t.table.fields){let n={};for(let o of t.table.fields){let i=r?vr(o,r,e):o,l=r?D(r,e,o.id):void 0,d=l??String(o.id);n[d]=l?{...i,alias:l}:i}s.fields=n}if(t.table.childTables){let n={};for(let o of t.table.childTables){let i=r?N(r,o.dbid):void 0,l=i??o.dbid;n[l]=i?{...o,alias:i}:o}s.childTables=n}return{...t,table:s}}function Ve(t,r,e){if(!r)return t;let s=D(r,e,t.fieldId);return s?{...t,fieldAlias:s}:t}function Ke(t,r,e){if(!r)return t;let s=D(r,e,t.fieldId);return s?{...t,fieldAlias:s}:t}function He(t,r){return{...t,databases:je(t.databases,r)}}function ze(t,r){return{...t,databases:je(t.databases,r)}}function Je(t,r){let e=r?N(r,t.appId):void 0;return{...t,appAlias:e,tables:Pr(t.tables,r)}}function Ze(t,r){if(!r)return t;let e=N(r,t.dbid);return e?{...t,alias:e}:t}function g(t){return`<qdbapi>${t}</qdbapi>`}function u(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function a(t,r){return t.match(new RegExp(`<${r}(?:\\s[^>]*)?>([^<]*)</${r}>`))?.[1]??""}function P(t,r){return t.match(new RegExp(`${r}="([^"]*)"`))?.[1]??""}function I(t,r){let e=new RegExp(`<${r}[^>]*>([\\s\\S]*?)</${r}>`,"g"),s=[],n;for(;(n=e.exec(t))!==null;)s.push(n[0]);return s}function h(t){let r=a(t,"errdetail");return{action:a(t,"action"),errcode:parseInt(a(t,"errcode"),10)||0,errtext:a(t,"errtext"),errdetail:r||void 0}}function ce(t,r){let e=r.replace(/\]\]>/g,"]]]]><![CDATA[>");return`<${t}><![CDATA[${e}]]></${t}>`}function v(t){return t==="1"||t.toLowerCase()==="true"}function b(t,r=0){let e=parseInt(t,10);return isNaN(e)?r:e}function ke(t){let r=b(P(t,"id")),e=a(t,"name"),s=t.match(/<access[^>]*id="(\d+)"[^>]*>([^<]*)<\/access>/),n={id:s?b(s[1]??"0"):0,description:s?.[2]??""};return{id:r,name:e,access:n}}function wr(t){let r=ke(t),e=t.match(/<member[^>]*type="([^"]*)"[^>]*>([^<]*)<\/member>/),s=e&&e[1]&&e[2]?{type:e[1],name:e[2]}:void 0;return{...r,member:s}}function Sr(t){let r=P(t,"id"),e=P(t,"type")||"user",s=a(t,"name"),n=a(t,"firstName")||void 0,o=a(t,"lastName")||void 0,i=a(t,"lastAccess")||void 0,l=a(t,"lastAccessAppLocal")||void 0,c=I(t,"role").map(ke);return{id:r,type:e,name:s,firstName:n,lastName:o,lastAccess:i,lastAccessAppLocal:l,roles:c}}async function Ye(t,r){let e=g(""),s=await t.doXml(r,"API_GetRoleInfo",e),n=h(s);return p(n),{roles:I(s,"role").map(ke)}}async function et(t,r){let e=g(""),s=await t.doXml(r,"API_UserRoles",e),n=h(s);return p(n),{users:I(s,"user").map(Sr)}}async function tt(t,r,e,s){let n="";e&&(n+=`<userid>${u(e)}</userid>`),s&&(n+="<inclgrps>1</inclgrps>");let o=g(n),i=await t.doXml(r,"API_GetUserRole",o),l=h(i);p(l);let d=i.match(/<user[^>]*id="([^"]*)"[^>]*>([\s\S]*?)<\/user>/);if(!d||!d[1])throw new Error("Invalid API_GetUserRole response: no user element");let c=d[1],f=d[0],R=a(f,"name"),T=I(f,"role").map(wr);return{userId:c,userName:R,roles:T}}async function rt(t,r,e,s){let n=`<userid>${u(e)}</userid><roleid>${s}</roleid>`,o=g(n),i=await t.doXml(r,"API_AddUserToRole",o),l=h(i);p(l)}async function st(t,r,e,s){let n=`<userid>${u(e)}</userid><roleid>${s}</roleid>`,o=g(n),i=await t.doXml(r,"API_RemoveUserFromRole",o),l=h(i);p(l)}async function nt(t,r,e,s,n){let o=`<userid>${u(e)}</userid><roleid>${s}</roleid>`;n!==void 0&&n>0&&(o+=`<newRoleid>${n}</newRoleid>`);let i=g(o),l=await t.doXml(r,"API_ChangeUserRole",i),d=h(l);p(d)}function ot(t){let r=P(t,"id"),e=a(t,"name"),s=a(t,"description")||void 0,n=a(t,"managedByUser"),o=n?v(n):void 0;return{id:r,name:e,description:s,managedByUser:o}}function Cr(t){return{id:P(t,"id"),firstName:a(t,"firstName"),lastName:a(t,"lastName"),email:a(t,"email"),screenName:a(t,"screenName")||void 0,isAdmin:v(a(t,"isAdmin"))}}function Gr(t){return{id:P(t,"id"),firstName:a(t,"firstName"),lastName:a(t,"lastName"),email:a(t,"email"),screenName:a(t,"screenName")||void 0,isMember:v(a(t,"isMember"))}}function Er(t){return{id:P(t,"id")}}async function it(t,r,e,s){let n=`<name>${u(r)}</name>`;e&&(n+=`<description>${u(e)}</description>`),s&&(n+=`<accountID>${u(s)}</accountID>`);let o=g(n),i=await t.doXml("main","API_CreateGroup",o),l=h(i);p(l);let d=i.match(/<group[^>]*>([\s\S]*?)<\/group>/);if(!d)throw new Error("Invalid API_CreateGroup response: no group element");return{group:ot(d[0])}}async function at(t,r){let e=`<gid>${u(r)}</gid>`,s=g(e),n=await t.doXml("main","API_DeleteGroup",s),o=h(n);p(o)}async function lt(t,r,e,s,n){let o=`<gid>${u(r)}</gid>`;e&&(o+=`<name>${u(e)}</name>`),s&&(o+=`<description>${u(s)}</description>`),n&&(o+=`<accountID>${u(n)}</accountID>`);let i=g(o),l=await t.doXml("main","API_CopyGroup",i),d=h(l);p(d);let c=l.match(/<group[^>]*>([\s\S]*?)<\/group>/);if(!c)throw new Error("Invalid API_CopyGroup response: no group element");return{group:ot(c[0])}}async function dt(t,r,e,s,n){let o=`<gid>${u(r)}</gid>`;e&&(o+=`<name>${u(e)}</name>`),s&&(o+=`<description>${u(s)}</description>`),n&&(o+=`<accountID>${u(n)}</accountID>`);let i=g(o),l=await t.doXml("main","API_ChangeGroupInfo",i),d=h(l);p(d)}async function ut(t,r,e){let s=`<gid>${u(r)}</gid>`;e&&(s+="<includeAllMgrs>true</includeAllMgrs>");let n=g(s),o=await t.doXml("main","API_GetUsersInGroup",n),i=h(o);p(i);let l=o.match(/<group[^>]*id="([^"]*)"[^>]*>([\s\S]*?)<\/group>/);if(!l||!l[1])throw new Error("Invalid API_GetUsersInGroup response: no group element");let d=l[0],c=l[1],f=a(d,"name"),R=a(d,"description")||void 0,T=I(d,"user").map(Cr),y=I(d,"manager").map(Gr),C=I(d,"subgroup").map(Er);return{id:c,name:f,description:R,users:T,managers:y,subgroups:C}}async function ct(t,r,e,s){let n=`<gid>${u(r)}</gid>`;n+=`<uid>${u(e)}</uid>`,s&&(n+="<allowAdminAccess>true</allowAdminAccess>");let o=g(n),i=await t.doXml("main","API_AddUserToGroup",o),l=h(i);p(l)}async function mt(t,r,e){let s=`<gid>${u(r)}</gid><uid>${u(e)}</uid>`,n=g(s),o=await t.doXml("main","API_RemoveUserFromGroup",n),i=h(o);p(i)}async function pt(t,r,e){let s=`<gid>${u(e)}</gid>`,n=g(s),o=await t.doXml(r,"API_GetGroupRole",n),i=h(o);return p(i),{roles:I(o,"role").map(c=>({id:b(P(c,"id")),name:a(c,"name")}))}}async function gt(t,r,e,s){let n=`<gid>${u(e)}</gid><roleid>${s}</roleid>`,o=g(n),i=await t.doXml(r,"API_AddGroupToRole",o),l=h(i);p(l)}async function ht(t,r,e,s,n){let o=`<gid>${u(e)}</gid>`;n?o+="<allRoles>true</allRoles>":o+=`<roleid>${s}</roleid>`;let i=g(o),l=await t.doXml(r,"API_RemoveGroupFromRole",i),d=h(l);p(d)}async function ft(t,r,e){let s="";r&&(s+=`<userid>${u(r)}</userid>`),e&&(s+="<adminOnly>true</adminOnly>");let n=g(s),o=await t.doXml("main","API_GrantedGroups",n),i=h(o);return p(i),{groups:I(o,"group").map(c=>({id:P(c,"id"),name:a(c,"name")}))}}async function Rt(t,r){let e=`<gid>${u(r)}</gid>`,s=g(e),n=await t.doXml("main","API_GrantedDBsForGroup",s),o=h(n);return p(o),{databases:I(n,"dbinfo").map(d=>({dbid:a(d,"dbid"),name:a(d,"dbname")}))}}async function bt(t,r,e){let s=`<gid>${u(r)}</gid><subgroupid>${u(e)}</subgroupid>`,n=g(s),o=await t.doXml("main","API_AddSubgroup",n),i=h(o);p(i)}async function yt(t,r,e){let s=`<gid>${u(r)}</gid><subgroupid>${u(e)}</subgroupid>`,n=g(s),o=await t.doXml("main","API_RemoveSubgroup",n),i=h(o);p(i)}async function Tt(t,r){let e="";r&&(e=`<email>${u(r)}</email>`);let s=g(e),n=await t.doXml("main","API_GetUserInfo",s),o=h(n);p(o);let i=n.match(/<user[^>]*id="([^"]*)"[^>]*>([\s\S]*?)<\/user>/);if(!i||!i[1])throw new Error("Invalid API_GetUserInfo response: no user element");let l=i[0],d=i[1],c=a(l,"firstName"),f=a(l,"lastName"),R=a(l,"login")||void 0,A=a(l,"email")||void 0,T=a(l,"screenName")||void 0,k=a(l,"isVerified"),y=k?v(k):void 0,x=a(l,"externalAuth"),C=x?v(x):void 0;return{id:d,firstName:c,lastName:f,login:R,email:A,screenName:T,isVerified:y,externalAuth:C}}async function At(t,r,e,s,n,o){let i=`<email>${u(e)}</email><fname>${u(s)}</fname><lname>${u(n)}</lname>`;o!==void 0&&(i+=`<roleid>${o}</roleid>`);let l=g(i),d=await t.doXml(r,"API_ProvisionUser",l),c=h(d);p(c);let f=a(d,"userid");if(!f)throw new Error("Invalid API_ProvisionUser response: no userid element");return{userId:f}}async function It(t,r,e,s){let n=`<userid>${u(e)}</userid>`;s&&(n+=`<usertext>${u(s)}</usertext>`);let o=g(n),i=await t.doXml(r,"API_SendInvitation",o),l=h(i);p(l)}async function xt(t,r,e){let s=`<newmgr>${u(e)}</newmgr>`,n=g(s),o=await t.doXml(r,"API_ChangeManager",n),i=h(o);p(i)}async function kt(t,r,e,s){let n=`<rid>${e}</rid><newowner>${u(s)}</newowner>`,o=g(n),i=await t.doXml(r,"API_ChangeRecordOwner",o),l=h(i);p(l)}async function Pt(t,r){let e="";r?.excludeParents&&(e+="<excludeparents>1</excludeparents>"),r?.parentsOnly&&(e+="<Withembeddedtables>0</Withembeddedtables>"),r?.adminOnly&&(e+="<adminOnly>true</adminOnly>"),r?.includeAncestors&&(e+="<includeancestors>1</includeancestors>"),r?.withEmbeddedTables!==void 0&&(e+=`<withembeddedtables>${r.withEmbeddedTables?"1":"0"}</withembeddedtables>`),r?.realmAppsOnly&&(e+="<realmAppsOnly>true</realmAppsOnly>");let s=g(e),n=await t.doXml("main","API_GrantedDBs",s),o=h(n);return p(o),{databases:I(n,"dbinfo").map(d=>{let c={dbid:a(d,"dbid"),name:a(d,"dbname")},f=a(d,"ancestorappid");f&&(c.ancestorAppId=f);let R=a(d,"oldestancestorappid");return R&&(c.oldestAncestorAppId=R),c})}}async function vt(t,r,e){let s=`<dbname>${u(r)}</dbname>`;e&&(s+="<ParentsOnly>1</ParentsOnly>");let n=g(s),o=await t.doXml("main","API_FindDBByName",n),i=h(o);p(i);let l=a(o,"dbid");if(!l)throw new Error("Invalid API_FindDBByName response: no dbid element");return{dbid:l}}async function wt(t,r){let e=g(""),s=await t.doXml(r,"API_GetDBInfo",e),n=h(s);return p(n),{name:a(s,"dbname"),lastRecModTime:a(s,"lastRecModTime")||void 0,lastModifiedTime:a(s,"lastModifiedTime")||void 0,createdTime:a(s,"createdTime")||void 0,numRecords:b(a(s,"numRecords")),managerId:a(s,"mgrID")||void 0,managerName:a(s,"mgrName")||void 0,version:a(s,"version")||void 0,timeZone:a(s,"time_zone")||void 0}}async function St(t,r){let e=g(""),s=await t.doXml(r,"API_GetNumRecords",e),n=h(s);return p(n),b(a(s,"num_records"))}function Dr(t){let r={id:b(P(t,"id")),fieldType:P(t,"field_type"),baseType:P(t,"base_type"),label:a(t,"label")},e=P(t,"mode");e&&(r.mode=e);let s=a(t,"nowrap");s&&(r.nowrap=v(s));let n=a(t,"bold");n&&(r.bold=v(n));let o=a(t,"required");o&&(r.required=v(o));let i=a(t,"unique");i&&(r.unique=v(i));let l=a(t,"fieldhelp");l&&(r.fieldHelp=l);let d=a(t,"appears_by_default");d&&(r.appearsByDefault=v(d));let c=a(t,"find_enabled");c&&(r.findEnabled=v(c));let f=a(t,"allow_new_choices");f&&(r.allowNewChoices=v(f));let R=a(t,"sort_as_given");R&&(r.sortAsGiven=v(R));let A=a(t,"carrychoices");A&&(r.carryChoices=v(A));let T=a(t,"foreignkey");T&&(r.foreignKey=v(T));let k=a(t,"does_total");k&&(r.doesTotal=v(k));let y=a(t,"does_average");y&&(r.doesAverage=v(y));let x=a(t,"default_kind");x&&(r.defaultKind=x);let C=a(t,"default_value");C&&(r.defaultValue=C);let L=t.match(/<choices>([\s\S]*?)<\/choices>/);if(L&&L[1]){let oe=I(L[1],"choice");r.choices=oe.map(J=>a(J,"choice")||J.replace(/<\/?choice>/g,""))}let K=a(t,"summaryReferenceFid");K&&(r.summaryReferenceFid=b(K));let H=a(t,"summaryTargetFid");H&&(r.summaryTargetFid=b(H));let z=a(t,"summaryFunction");return z&&(r.summaryFunction=z),r}function Fr(t){let r={id:b(P(t,"id")),name:a(t,"qyname")||a(t,"qname"),type:a(t,"qytype")},e=a(t,"qydesc");e&&(r.description=e);let s=a(t,"qycrit");s&&(r.criteria=s);let n=a(t,"qyclst");n&&(r.columnList=n);let o=a(t,"qyslst");o&&(r.sortList=o);let i=a(t,"qyopts");i&&(r.options=i);let l=a(t,"qycalst");return l&&(r.calcFields=l),r}async function Ct(t,r){let e=g(""),s=await t.doXml(r,"API_GetSchema",e),n=h(s);p(n);let o=a(s,"time_zone")||void 0,i=a(s,"date_format")||void 0,l=s.match(/<table>([\s\S]*?)<\/table>/);if(!l)throw new Error("Invalid API_GetSchema response: no table element");let d=l[0],c={name:a(d,"name"),description:a(d,"desc")||void 0},f=d.match(/<original>([\s\S]*?)<\/original>/);if(f){let y=f[0],x={},C=a(y,"app_id");C&&(x.appId=C);let L=a(y,"table_id");L&&(x.tableId=L);let K=a(y,"cre_date");K&&(x.createdTime=K);let H=a(y,"mod_date");H&&(x.modifiedTime=H);let z=a(y,"next_record_id");z&&(x.nextRecordId=b(z));let oe=a(y,"next_field_id");oe&&(x.nextFieldId=b(oe));let J=a(y,"next_query_id");J&&(x.nextQueryId=b(J));let Pe=a(y,"def_sort_fid");Pe&&(x.defaultSortFid=b(Pe));let ve=a(y,"def_sort_order");ve&&(x.defaultSortOrder=b(ve)),c.original=x}let R=d.match(/<variables>([\s\S]*?)<\/variables>/);if(R){let y=I(R[0],"var");c.variables=y.map(x=>({name:P(x,"name"),value:a(x,"var")||""}))}let A=d.match(/<chdbids>([\s\S]*?)<\/chdbids>/);if(A){let y=I(A[0],"chdbid");c.childTables=y.map(x=>({name:P(x,"name"),dbid:a(x,"chdbid")||""}))}let T=d.match(/<queries>([\s\S]*?)<\/queries>/);if(T){let y=I(T[0],"query");c.queries=y.map(Fr)}let k=d.match(/<fields>([\s\S]*?)<\/fields>/);if(k&&k[0].length>20){let y=I(k[0],"field");c.fields=y.map(Dr)}return{table:c,timeZone:o,dateFormat:i}}async function Gt(t,r,e){let s=`<varname>${u(e)}</varname>`,n=g(s),o=await t.doXml(r,"API_GetDBVar",n),i=h(o);return p(i),a(o,"value")}async function Et(t,r,e,s){let n=`<varname>${u(e)}</varname><value>${u(s)}</value>`,o=g(n),i=await t.doXml(r,"API_SetDBVar",o),l=h(i);p(l)}async function Dt(t,r,e){let s=`<pageID>${u(String(e))}</pageID>`,n=g(s),o=await t.doXml(r,"API_GetDBPage",n);if(o.includes("<errcode>")&&!o.includes("<errcode>0</errcode>")){let i=h(o);p(i)}return o}async function Ft(t,r,e,s,n,o){let i="";s!==void 0&&(i+=`<pageid>${s}</pageid>`),i+=`<pagename>${u(e)}</pagename>`,i+=`<pagetype>${n}</pagetype>`,i+=ce("pagebody",o);let l=g(i),d=await t.doXml(r,"API_AddReplaceDBPage",l),c=h(d);return p(c),{pageId:b(a(d,"pageID"))}}function Ut(t){let r={id:b(a(t,"fid")),name:a(t,"name"),type:a(t,"type"),value:a(t,"value")},e=a(t,"printable");return e&&(r.printable=e),r}async function $t(t,r,e){let s="";e&&(s=`<query>${u(e)}</query>`);let n=g(s),o=await t.doXml(r,"API_DoQueryCount",n),i=h(o);return p(i),{numMatches:b(a(o,"numMatches"))}}async function Mt(t,r,e){let s=`<rid>${e}</rid>`,n=g(s),o=await t.doXml(r,"API_GetRecordInfo",n),i=h(o);p(i);let d=I(o,"field").map(Ut);return{recordId:b(a(o,"rid")),numFields:b(a(o,"num_fields")),updateId:a(o,"update_id")||void 0,fields:d}}async function _t(t,r,e){let s=`<key>${u(e)}</key>`,n=g(s),o=await t.doXml(r,"API_GetRecordInfo",n),i=h(o);p(i);let d=I(o,"field").map(Ut);return{recordId:b(a(o,"rid")),numFields:b(a(o,"num_fields")),updateId:a(o,"update_id")||void 0,fields:d}}async function Ot(t,r,e){let s=ce("records_csv",e.recordsCsv);e.clist&&e.clist.length>0&&(s+=`<clist>${e.clist.join(".")}</clist>`),e.skipFirst&&(s+="<skipfirst>1</skipfirst>"),e.mergeFieldId!==void 0&&(s+=`<mergeFieldId>${e.mergeFieldId}</mergeFieldId>`),e.decimalPercent&&(s+="<decimalPercent>1</decimalPercent>");let n=g(s),o=await t.doXml(r,"API_ImportFromCSV",n),i=h(o);p(i);let d=I(o,"rid").map(c=>{let f=b(c.replace(/<rid[^>]*>/,"").replace(/<\/rid>/,"")),R=P(c,"update_id")||void 0;return{recordId:f,updateId:R}});return{numRecsInput:b(a(o,"num_recs_input")),numRecsAdded:b(a(o,"num_recs_added")),numRecsUpdated:b(a(o,"num_recs_updated")),recordIds:d}}async function qt(t,r,e){let s=`<id>${e}</id>`,n=g(s),o=await t.doXml(r,"API_RunImport",n),i=h(o);p(i);let d=I(o,"rid").map(c=>{let f=b(c.replace(/<rid[^>]*>/,"").replace(/<\/rid>/,"")),R=P(c,"update_id")||void 0;return{recordId:f,updateId:R}});return{numRecsInput:b(a(o,"num_recs_input")),numRecsAdded:b(a(o,"num_recs_added")),numRecsUpdated:b(a(o,"num_recs_updated")),recordIds:d}}async function Wt(t,r,e){let s=`<rid>${e.rid}</rid>`;e.copyfid!==void 0&&(s+=`<copyfid>${e.copyfid}</copyfid>`),e.recurse&&(s+="<recurse>1</recurse>"),e.relfids&&e.relfids.length>0&&(s+=`<relfids>${e.relfids.join(".")}</relfids>`);let n=g(s),o=await t.doXml(r,"API_CopyMasterDetail",n),i=h(o);return p(i),{newRid:b(a(o,"newrid")),numCreated:b(a(o,"num_created"))}}function Bt(t){let r=`<label>${u(t.label)}</label>`;if(r+=`<WebhookURL>${u(t.webhookUrl)}</WebhookURL>`,t.description&&(r+=`<Description>${u(t.description)}</Description>`),t.query&&(r+=`<Query>${u(t.query)}</Query>`),t.workflowWhen&&(r+=`<WorkflowWhen>${u(t.workflowWhen)}</WorkflowWhen>`),t.headers&&t.headers.length>0&&(r+=`<WebhookHeaderCount>${t.headers.length}</WebhookHeaderCount>`,t.headers.forEach((e,s)=>{r+=`<WebhookHeaderKey${s+1}>${u(e.key)}</WebhookHeaderKey${s+1}>`,r+=`<WebhookHeaderValue${s+1}>${u(e.value)}</WebhookHeaderValue${s+1}>`})),t.message&&(r+=`<WebhookMessage>${u(t.message)}</WebhookMessage>`),t.messageFormat&&(r+=`<WebhookMessageFormat>${t.messageFormat}</WebhookMessageFormat>`),t.httpVerb&&(r+=`<WebhookHTTPVerb>${t.httpVerb}</WebhookHTTPVerb>`),t.triggerFields&&t.triggerFields.length>0){r+="<tfidsWhich>TRUE</tfidsWhich>";for(let e of t.triggerFields)r+=`<tfids>${e}</tfids>`}return r}function Ur(t,r){let e=`<actionId>${u(t)}</actionId>`;return e+=Bt(r),r.clearTriggerFields&&(e=e.replace(/<tfidsWhich>TRUE<\/tfidsWhich>/,""),e=e.replace(/<tfids>\d+<\/tfids>/g,""),e+="<tfidsWhich>tfidsAny</tfidsWhich>"),e}async function Lt(t,r,e){let s=Bt(e),n=g(s),o=await t.doXml(r,"API_Webhooks_Create",n),i=h(o);p(i)}async function Nt(t,r,e,s){let n=Ur(e,s),o=g(n),i=await t.doXml(r,"API_Webhooks_Edit",o),l=h(i);p(l)}async function Xt(t,r,e){if(e.length===0)throw new Error("actionIds array cannot be empty");let s=`<actionIDList>${e.join(",")}</actionIDList>`,n=g(s),o=await t.doXml(r,"API_Webhooks_Delete",n),i=h(o);return p(i),{numChanged:b(a(o,"numChanged"))}}async function jt(t,r,e){if(e.length===0)throw new Error("actionIds array cannot be empty");let s=`<actionIDList>${e.join(",")}</actionIDList>`,n=g(s),o=await t.doXml(r,"API_Webhooks_Activate",n),i=h(o);return p(i),{numChanged:b(a(o,"numChanged"))}}async function Qt(t,r,e){if(e.length===0)throw new Error("actionIds array cannot be empty");let s=`<actionIDList>${e.join(",")}</actionIDList>`,n=g(s),o=await t.doXml(r,"API_Webhooks_Deactivate",n),i=h(o);return p(i),{numChanged:b(a(o,"numChanged"))}}async function Vt(t,r,e){let s=`<actionId>${u(e)}</actionId>`,n=g(s),o=await t.doXml(r,"API_Webhooks_Copy",n),i=h(o);return p(i),{actionId:a(o,"actionId")}}async function Kt(t,r,e,s){if(s.length===0)throw new Error("choices array cannot be empty");let n=`<fid>${e}</fid>`;for(let d of s)n+=`<choice>${u(d)}</choice>`;let o=g(n),i=await t.doXml(r,"API_FieldAddChoices",o),l=h(i);return p(l),{fieldId:e,fieldName:a(i,"fname")||"",numAdded:b(a(i,"numadded"))}}async function Ht(t,r,e,s){if(s.length===0)throw new Error("choices array cannot be empty");let n=`<fid>${e}</fid>`;for(let d of s)n+=`<choice>${u(d)}</choice>`;let o=g(n),i=await t.doXml(r,"API_FieldRemoveChoices",o),l=h(i);return p(l),{fieldId:e,fieldName:a(i,"fname")||"",numRemoved:b(a(i,"numremoved"))}}async function zt(t,r,e){let s=`<fid>${e}</fid>`,n=g(s),o=await t.doXml(r,"API_SetKeyField",n),i=h(o);p(i)}async function Jt(t,r,e){let s="";if(e)for(let i of e)s+=`<field fid="${i.id}">${u(i.value)}</field>`;let n=g(s),o=await t.doXml(r,"API_GenAddRecordForm",n);if(o.includes("<errcode>")&&!o.includes("<errcode>0</errcode>")){let i=h(o);p(i)}return o}async function Zt(t,r,e){let s="";e?.query&&(s+=`<query>${u(e.query)}</query>`),e?.clist&&e.clist.length>0&&(s+=`<clist>${e.clist.join(".")}</clist>`),e?.slist&&e.slist.length>0&&(s+=`<slist>${e.slist.join(".")}</slist>`),e?.options&&(s+=`<options>${u(e.options)}</options>`),e?.format&&(s+=`<fmt>${e.format}</fmt>`);let n=g(s),o=await t.doXml(r,"API_GenResultsTable",n);if(o.includes("<errcode>")&&!o.includes("<errcode>0</errcode>")){let i=h(o);p(i)}return o}async function Yt(t,r,e){let s="";e.rid!==void 0&&(s+=`<rid>${e.rid}</rid>`),e.key&&(s+=`<key>${u(e.key)}</key>`),e.jht&&(s+="<jht>1</jht>"),e.dfid!==void 0&&(s+=`<dfid>${e.dfid}</dfid>`);let n=g(s),o=await t.doXml(r,"API_GetRecordAsHTML",n);if(o.includes("<errcode>")&&!o.includes("<errcode>0</errcode>")){let i=h(o);p(i)}return o}async function er(t,r){let e=`<dbid>${u(r)}</dbid>`,s=g(e),n=await t.doXml("main","API_GetAppDTMInfo",s),o=h(n);p(o);let l=I(n,"table").map(d=>({id:P(d,"id"),lastModifiedTime:a(d,"lastModifiedTime")||void 0,lastRecModTime:a(d,"lastRecModTime")||void 0}));return{appId:a(n,"app_id")||r,lastModifiedTime:a(n,"lastModifiedTime")||void 0,lastRecModTime:a(n,"lastRecModTime")||void 0,tables:l}}async function tr(t,r){let e=g(""),s=await t.doXml(r,"API_GetAncestorInfo",e),n=h(s);return p(n),{ancestorAppId:a(s,"ancestorappid")||void 0,oldestAncestorAppId:a(s,"oldestancestorappid")||void 0}}async function rr(t){let r=g(""),e=await t.doXml("main","API_SignOut",r),s=h(e);p(s)}var $r=new Set(["API_AddUserToRole","API_RemoveUserFromRole","API_ChangeUserRole","API_ProvisionUser","API_SendInvitation","API_ChangeManager","API_ChangeRecordOwner","API_CreateGroup","API_DeleteGroup","API_AddUserToGroup","API_RemoveUserFromGroup","API_AddGroupToRole","API_RemoveGroupFromRole","API_CopyGroup","API_ChangeGroupInfo","API_AddSubgroup","API_RemoveSubgroup","API_SetDBVar","API_AddReplaceDBPage","API_FieldAddChoices","API_FieldRemoveChoices","API_SetKeyField","API_Webhooks_Create","API_Webhooks_Edit","API_Webhooks_Delete","API_Webhooks_Activate","API_Webhooks_Deactivate","API_Webhooks_Copy","API_ImportFromCSV","API_RunImport","API_CopyMasterDetail","API_PurgeRecords","API_AddRecord","API_EditRecord","API_DeleteRecord","API_SignOut"]);function sr(t){return $r.has(t)}var me=class{constructor(r,e){m(this,"caller");m(this,"readOnly");m(this,"schema");this.caller=r,this.readOnly=e?.readOnly??!1,this.schema=e?.schema}resolveTable(r){return E(this.schema,r)}resolveField(r,e){return _(this.schema,r,e)}checkWriteAllowed(r){if(this.readOnly&&sr(r))throw new $("POST",`/db/${this.caller.realm()}`,r)}async executeXml(r,e,s){return this.checkWriteAllowed(e),this.caller.doXml(r,e,s)}realm(){return this.caller.realm()}async getRoleInfo(r){return Ye(this.caller,this.resolveTable(r))}async userRoles(r){return et(this.caller,this.resolveTable(r))}async getUserRole(r,e,s){return tt(this.caller,this.resolveTable(r),e,s)}async addUserToRole(r,e,s){return this.checkWriteAllowed("API_AddUserToRole"),rt(this.caller,this.resolveTable(r),e,s)}async removeUserFromRole(r,e,s){return this.checkWriteAllowed("API_RemoveUserFromRole"),st(this.caller,this.resolveTable(r),e,s)}async changeUserRole(r,e,s,n){return this.checkWriteAllowed("API_ChangeUserRole"),nt(this.caller,this.resolveTable(r),e,s,n)}async createGroup(r,e,s){return this.checkWriteAllowed("API_CreateGroup"),it(this.caller,r,e,s)}async deleteGroup(r){return this.checkWriteAllowed("API_DeleteGroup"),at(this.caller,r)}async copyGroup(r,e,s,n){return this.checkWriteAllowed("API_CopyGroup"),lt(this.caller,r,e,s,n)}async changeGroupInfo(r,e,s,n){return this.checkWriteAllowed("API_ChangeGroupInfo"),dt(this.caller,r,e,s,n)}async getUsersInGroup(r,e){return ut(this.caller,r,e)}async addUserToGroup(r,e,s){return this.checkWriteAllowed("API_AddUserToGroup"),ct(this.caller,r,e,s)}async removeUserFromGroup(r,e){return this.checkWriteAllowed("API_RemoveUserFromGroup"),mt(this.caller,r,e)}async getGroupRole(r,e){return pt(this.caller,this.resolveTable(r),e)}async addGroupToRole(r,e,s){return this.checkWriteAllowed("API_AddGroupToRole"),gt(this.caller,this.resolveTable(r),e,s)}async removeGroupFromRole(r,e,s,n){return this.checkWriteAllowed("API_RemoveGroupFromRole"),ht(this.caller,this.resolveTable(r),e,s,n)}async grantedGroups(r,e){return ft(this.caller,r,e)}async grantedDBsForGroup(r){let e=await Rt(this.caller,r);return ze(e,this.schema)}async addSubgroup(r,e){return this.checkWriteAllowed("API_AddSubgroup"),bt(this.caller,r,e)}async removeSubgroup(r,e){return this.checkWriteAllowed("API_RemoveSubgroup"),yt(this.caller,r,e)}async getUserInfo(r){return Tt(this.caller,r)}async provisionUser(r,e,s,n,o){return this.checkWriteAllowed("API_ProvisionUser"),At(this.caller,this.resolveTable(r),e,s,n,o)}async sendInvitation(r,e,s){return this.checkWriteAllowed("API_SendInvitation"),It(this.caller,this.resolveTable(r),e,s)}async changeManager(r,e){return this.checkWriteAllowed("API_ChangeManager"),xt(this.caller,this.resolveTable(r),e)}async changeRecordOwner(r,e,s){return this.checkWriteAllowed("API_ChangeRecordOwner"),kt(this.caller,this.resolveTable(r),e,s)}async grantedDBs(r){let e=await Pt(this.caller,r);return He(e,this.schema)}async findDBByName(r,e){let s=await vt(this.caller,r,e);return Ze(s,this.schema)}async getDBInfo(r){return wt(this.caller,this.resolveTable(r))}async getNumRecords(r){return St(this.caller,this.resolveTable(r))}async getSchema(r){let e=this.resolveTable(r),s=await Ct(this.caller,e);return Qe(s,this.schema,e)}async getDBVar(r,e){return Gt(this.caller,this.resolveTable(r),e)}async setDBVar(r,e,s){return this.checkWriteAllowed("API_SetDBVar"),Et(this.caller,this.resolveTable(r),e,s)}async getDBPage(r,e){return Dt(this.caller,this.resolveTable(r),e)}async addReplaceDBPage(r,e,s,n,o){return this.checkWriteAllowed("API_AddReplaceDBPage"),Ft(this.caller,this.resolveTable(r),e,s,n,o)}async fieldAddChoices(r,e,s){this.checkWriteAllowed("API_FieldAddChoices");let n=this.resolveTable(r),o=this.resolveField(n,e),i=await Kt(this.caller,n,o,s);return Ve(i,this.schema,n)}async fieldRemoveChoices(r,e,s){this.checkWriteAllowed("API_FieldRemoveChoices");let n=this.resolveTable(r),o=this.resolveField(n,e),i=await Ht(this.caller,n,o,s);return Ke(i,this.schema,n)}async setKeyField(r,e){this.checkWriteAllowed("API_SetKeyField");let s=this.resolveTable(r),n=this.resolveField(s,e);return zt(this.caller,s,n)}async doQueryCount(r,e){return $t(this.caller,this.resolveTable(r),e)}async getRecordInfo(r,e){let s=this.resolveTable(r),n=await Mt(this.caller,s,e);return xe(n,this.schema,s)}async getRecordInfoByKey(r,e){let s=this.resolveTable(r),n=await _t(this.caller,s,e);return xe(n,this.schema,s)}async importFromCSV(r,e){this.checkWriteAllowed("API_ImportFromCSV");let s=this.resolveTable(r),n={...e,clist:e.clist?.map(o=>this.resolveField(s,o)),mergeFieldId:e.mergeFieldId!==void 0?this.resolveField(s,e.mergeFieldId):void 0};return Ot(this.caller,s,n)}async runImport(r,e){return this.checkWriteAllowed("API_RunImport"),qt(this.caller,this.resolveTable(r),e)}async copyMasterDetail(r,e){this.checkWriteAllowed("API_CopyMasterDetail");let s=this.resolveTable(r),n={...e,copyfid:e.copyfid!==void 0?this.resolveField(s,e.copyfid):void 0,relfids:e.relfids?.map(o=>this.resolveField(s,o))};return Wt(this.caller,s,n)}async getAppDTMInfo(r){let e=await er(this.caller,this.resolveTable(r));return Je(e,this.schema)}async getAncestorInfo(r){return tr(this.caller,this.resolveTable(r))}async webhooksCreate(r,e){return this.checkWriteAllowed("API_Webhooks_Create"),Lt(this.caller,this.resolveTable(r),e)}async webhooksEdit(r,e,s){return this.checkWriteAllowed("API_Webhooks_Edit"),Nt(this.caller,this.resolveTable(r),e,s)}async webhooksDelete(r,e){return this.checkWriteAllowed("API_Webhooks_Delete"),Xt(this.caller,this.resolveTable(r),e)}async webhooksActivate(r,e){return this.checkWriteAllowed("API_Webhooks_Activate"),jt(this.caller,this.resolveTable(r),e)}async webhooksDeactivate(r,e){return this.checkWriteAllowed("API_Webhooks_Deactivate"),Qt(this.caller,this.resolveTable(r),e)}async webhooksCopy(r,e){return this.checkWriteAllowed("API_Webhooks_Copy"),Vt(this.caller,this.resolveTable(r),e)}async genAddRecordForm(r,e){let s=this.resolveTable(r),n=e?.map(o=>({id:this.resolveField(s,o.id),value:o.value}));return Jt(this.caller,s,n)}async genResultsTable(r,e){let s=this.resolveTable(r),n=e?{...e,clist:e.clist?.map(o=>this.resolveField(s,o)),slist:e.slist?.map(o=>this.resolveField(s,o))}:void 0;return Zt(this.caller,s,n)}async getRecordAsHTML(r,e){let s=this.resolveTable(r),n={...e,dfid:e.dfid!==void 0?this.resolveField(s,e.dfid):void 0};return Yt(this.caller,s,n)}async signOut(){return rr(this.caller)}};function Mr(t,r){let e=t.getConfig(),s=t.getAuthStrategy;if(!s)throw new Error("XML client requires access to auth strategy. Make sure you are using a compatible version of the QuickBase client.");let n=s(),o={realm:()=>e.realm,doXml:async(l,d,c)=>{let f=`https://${e.realm}.quickbase.com/db/${encodeURIComponent(l)}`,R=await n.getToken(l),A=n.getAuthorizationHeader(R),T=new AbortController,k=setTimeout(()=>T.abort(),e.timeout);try{let y=await e.fetchApi(f,{method:"POST",headers:{"Content-Type":"application/xml","QUICKBASE-ACTION":d,Authorization:A},body:c,signal:T.signal,credentials:"omit"}),x=await y.text();if(y.status===429){let C=y.headers.get("Retry-After");throw new Error(`Rate limited (429). Retry after: ${C??"unknown"} seconds`)}if(y.status>=500)throw new Error(`Server error: ${y.status} ${y.statusText}`);return x}catch(y){throw y instanceof Error&&y.name==="AbortError"?new Error(`Request timeout after ${e.timeout}ms`):y}finally{clearTimeout(k)}}},i={readOnly:r?.readOnly??e.readOnly??!1,schema:r?.schema??e.schema};return new me(o,i)}function _r(t){let r=he(t),e=ge(r.debug),s={realm:r.realm,baseUrl:r.baseUrl,fetchApi:r.fetchApi,logger:e},n=Re(r.auth,s),o=Ae(r.proactiveThrottle),i=Te({config:r,auth:n,throttle:o,logger:e});return{...Ie(i.execute,r.autoPaginate),request:i.execute,getConfig:()=>r,getAuthStrategy:()=>n}}var mo=_r;export{G as AuthenticationError,Y as AuthorizationError,ne as NoOpThrottle,ee as NotFoundError,S as QuickbaseError,F as RateLimitError,$ as ReadOnlyError,Z as SchemaError,W as ServerError,se as SlidingWindowThrottle,Q as SsoTokenStrategy,j as TempTokenStrategy,V as TicketStrategy,U as TimeoutError,X as UserTokenStrategy,te as ValidationError,me as XmlClient,q as XmlError,M as XmlErrorCode,Ie as createApiMethods,Re as createAuthStrategy,_r as createClient,Mr as createXmlClient,mo as default,Xe as isXmlInvalidTicket,Ne as isXmlNotFound,Le as isXmlUnauthorized,sr as isXmlWriteAction};
|
|
7
11
|
//# sourceMappingURL=quickbase.esm.js.map
|