quickbase-js 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +700 -90
  2. package/bin/quickbase-js.js +54 -0
  3. package/dist/auth/index.d.ts.map +1 -1
  4. package/dist/auth/index.js +5 -1
  5. package/dist/auth/index.js.map +1 -1
  6. package/dist/auth/ticket.d.ts +13 -0
  7. package/dist/auth/ticket.d.ts.map +1 -1
  8. package/dist/auth/ticket.js +103 -3
  9. package/dist/auth/ticket.js.map +1 -1
  10. package/dist/cli/schema.d.ts +23 -0
  11. package/dist/cli/schema.d.ts.map +1 -0
  12. package/dist/cli/schema.js +425 -0
  13. package/dist/cli/schema.js.map +1 -0
  14. package/dist/client/request.d.ts +2 -1
  15. package/dist/client/request.d.ts.map +1 -1
  16. package/dist/client/request.js +165 -18
  17. package/dist/client/request.js.map +1 -1
  18. package/dist/core/config.d.ts.map +1 -1
  19. package/dist/core/config.js +4 -0
  20. package/dist/core/config.js.map +1 -1
  21. package/dist/core/errors.d.ts +17 -0
  22. package/dist/core/errors.d.ts.map +1 -1
  23. package/dist/core/errors.js +32 -0
  24. package/dist/core/errors.js.map +1 -1
  25. package/dist/core/index.d.ts +2 -2
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/core/index.js +1 -1
  28. package/dist/core/index.js.map +1 -1
  29. package/dist/core/schema.d.ts +37 -0
  30. package/dist/core/schema.d.ts.map +1 -0
  31. package/dist/core/schema.js +168 -0
  32. package/dist/core/schema.js.map +1 -0
  33. package/dist/core/transform.d.ts +36 -0
  34. package/dist/core/transform.d.ts.map +1 -0
  35. package/dist/core/transform.js +205 -0
  36. package/dist/core/transform.js.map +1 -0
  37. package/dist/core/types.d.ts +108 -0
  38. package/dist/core/types.d.ts.map +1 -1
  39. package/dist/core/types.js.map +1 -1
  40. package/dist/index.d.ts +11 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +7 -1
  43. package/dist/index.js.map +1 -1
  44. package/dist/quickbase.esm.js +3 -3
  45. package/dist/quickbase.esm.js.map +4 -4
  46. package/dist/quickbase.min.js +3 -3
  47. package/dist/quickbase.min.js.map +4 -4
  48. package/dist/xml/codepages.d.ts +60 -0
  49. package/dist/xml/codepages.d.ts.map +1 -0
  50. package/dist/xml/codepages.js +88 -0
  51. package/dist/xml/codepages.js.map +1 -0
  52. package/dist/xml/dbvars.d.ts +39 -0
  53. package/dist/xml/dbvars.d.ts.map +1 -0
  54. package/dist/xml/dbvars.js +54 -0
  55. package/dist/xml/dbvars.js.map +1 -0
  56. package/dist/xml/errors.d.ts +64 -0
  57. package/dist/xml/errors.d.ts.map +1 -0
  58. package/dist/xml/errors.js +102 -0
  59. package/dist/xml/errors.js.map +1 -0
  60. package/dist/xml/fields.d.ts +45 -0
  61. package/dist/xml/fields.d.ts.map +1 -0
  62. package/dist/xml/fields.js +86 -0
  63. package/dist/xml/fields.js.map +1 -0
  64. package/dist/xml/groups.d.ts +196 -0
  65. package/dist/xml/groups.d.ts.map +1 -0
  66. package/dist/xml/groups.js +424 -0
  67. package/dist/xml/groups.js.map +1 -0
  68. package/dist/xml/html.d.ts +61 -0
  69. package/dist/xml/html.d.ts.map +1 -0
  70. package/dist/xml/html.js +110 -0
  71. package/dist/xml/html.js.map +1 -0
  72. package/dist/xml/index.d.ts +456 -0
  73. package/dist/xml/index.d.ts.map +1 -0
  74. package/dist/xml/index.js +747 -0
  75. package/dist/xml/index.js.map +1 -0
  76. package/dist/xml/metadata.d.ts +49 -0
  77. package/dist/xml/metadata.d.ts.map +1 -0
  78. package/dist/xml/metadata.js +84 -0
  79. package/dist/xml/metadata.js.map +1 -0
  80. package/dist/xml/records.d.ts +106 -0
  81. package/dist/xml/records.d.ts.map +1 -0
  82. package/dist/xml/records.js +220 -0
  83. package/dist/xml/records.js.map +1 -0
  84. package/dist/xml/request.d.ts +129 -0
  85. package/dist/xml/request.d.ts.map +1 -0
  86. package/dist/xml/request.js +190 -0
  87. package/dist/xml/request.js.map +1 -0
  88. package/dist/xml/roles.d.ts +117 -0
  89. package/dist/xml/roles.d.ts.map +1 -0
  90. package/dist/xml/roles.js +241 -0
  91. package/dist/xml/roles.js.map +1 -0
  92. package/dist/xml/schema.d.ts +94 -0
  93. package/dist/xml/schema.d.ts.map +1 -0
  94. package/dist/xml/schema.js +354 -0
  95. package/dist/xml/schema.js.map +1 -0
  96. package/dist/xml/transform.d.ts +154 -0
  97. package/dist/xml/transform.d.ts.map +1 -0
  98. package/dist/xml/transform.js +182 -0
  99. package/dist/xml/transform.js.map +1 -0
  100. package/dist/xml/types.d.ts +531 -0
  101. package/dist/xml/types.d.ts.map +1 -0
  102. package/dist/xml/types.js +22 -0
  103. package/dist/xml/types.js.map +1 -0
  104. package/dist/xml/users.d.ts +92 -0
  105. package/dist/xml/users.d.ts.map +1 -0
  106. package/dist/xml/users.js +166 -0
  107. package/dist/xml/users.js.map +1 -0
  108. package/dist/xml/webhooks.d.ts +98 -0
  109. package/dist/xml/webhooks.d.ts.map +1 -0
  110. package/dist/xml/webhooks.js +202 -0
  111. package/dist/xml/webhooks.js.map +1 -0
  112. package/package.json +6 -2
@@ -0,0 +1,166 @@
1
+ /**
2
+ * XML API User Management
3
+ *
4
+ * Endpoints for managing users and user-related operations.
5
+ *
6
+ * XML-API: Remove this file when QuickBase discontinues the XML API.
7
+ * To find all XML API code, search for: XML-API
8
+ */
9
+ import { checkError } from './errors.js';
10
+ import { buildRequest, escapeXml, parseBaseResponse, getTagContent, parseXmlBool, } from './request.js';
11
+ /**
12
+ * Get user information by email.
13
+ *
14
+ * Returns user ID, name, and other details for a registered QuickBase user.
15
+ * If no email is provided, returns info for the current user.
16
+ *
17
+ * @see https://help.quickbase.com/docs/api-getuserinfo
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * // Get info for specific user
22
+ * const user = await getUserInfo(caller, 'user@example.com');
23
+ * console.log(`User ID: ${user.id}, Name: ${user.firstName} ${user.lastName}`);
24
+ *
25
+ * // Get info for current user
26
+ * const me = await getUserInfo(caller);
27
+ * ```
28
+ */
29
+ export async function getUserInfo(caller, email) {
30
+ let inner = '';
31
+ if (email) {
32
+ inner = `<email>${escapeXml(email)}</email>`;
33
+ }
34
+ const body = buildRequest(inner);
35
+ const xml = await caller.doXml('main', 'API_GetUserInfo', body);
36
+ const base = parseBaseResponse(xml);
37
+ checkError(base);
38
+ // Parse user element
39
+ const userMatch = xml.match(/<user[^>]*id="([^"]*)"[^>]*>([\s\S]*?)<\/user>/);
40
+ if (!userMatch || !userMatch[1]) {
41
+ throw new Error('Invalid API_GetUserInfo response: no user element');
42
+ }
43
+ const userXml = userMatch[0];
44
+ const id = userMatch[1];
45
+ const firstName = getTagContent(userXml, 'firstName');
46
+ const lastName = getTagContent(userXml, 'lastName');
47
+ const login = getTagContent(userXml, 'login') || undefined;
48
+ const userEmail = getTagContent(userXml, 'email') || undefined;
49
+ const screenName = getTagContent(userXml, 'screenName') || undefined;
50
+ const isVerifiedStr = getTagContent(userXml, 'isVerified');
51
+ const isVerified = isVerifiedStr ? parseXmlBool(isVerifiedStr) : undefined;
52
+ const externalAuthStr = getTagContent(userXml, 'externalAuth');
53
+ const externalAuth = externalAuthStr ? parseXmlBool(externalAuthStr) : undefined;
54
+ return {
55
+ id,
56
+ firstName,
57
+ lastName,
58
+ login,
59
+ email: userEmail,
60
+ screenName,
61
+ isVerified,
62
+ externalAuth,
63
+ };
64
+ }
65
+ /**
66
+ * Create a new unregistered user and add them to an application.
67
+ *
68
+ * This is for users who are NOT yet registered with QuickBase.
69
+ * For existing users, use getUserInfo + addUserToRole + sendInvitation.
70
+ *
71
+ * After provisioning, call sendInvitation to email the user.
72
+ *
73
+ * @see https://help.quickbase.com/docs/api-provisionuser
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const result = await provisionUser(caller, 'bqxyz123', 'new@example.com', 'John', 'Doe', 11);
78
+ * console.log(`Created user: ${result.userId}`);
79
+ *
80
+ * // Now send invitation
81
+ * await sendInvitation(caller, 'bqxyz123', result.userId, 'Welcome to our app!');
82
+ * ```
83
+ */
84
+ export async function provisionUser(caller, appId, email, firstName, lastName, roleId) {
85
+ let inner = `<email>${escapeXml(email)}</email>` +
86
+ `<fname>${escapeXml(firstName)}</fname>` +
87
+ `<lname>${escapeXml(lastName)}</lname>`;
88
+ if (roleId !== undefined) {
89
+ inner += `<roleid>${roleId}</roleid>`;
90
+ }
91
+ const body = buildRequest(inner);
92
+ const xml = await caller.doXml(appId, 'API_ProvisionUser', body);
93
+ const base = parseBaseResponse(xml);
94
+ checkError(base);
95
+ const userId = getTagContent(xml, 'userid');
96
+ if (!userId) {
97
+ throw new Error('Invalid API_ProvisionUser response: no userid element');
98
+ }
99
+ return { userId };
100
+ }
101
+ /**
102
+ * Send an invitation email to a user.
103
+ *
104
+ * Use after adding a user to a role (via addUserToRole or provisionUser).
105
+ *
106
+ * @see https://help.quickbase.com/docs/api-sendinvitation
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * await sendInvitation(caller, 'bqxyz123', '112149.bhsv', 'Welcome to our team app!');
111
+ * ```
112
+ */
113
+ export async function sendInvitation(caller, appId, userId, userText) {
114
+ let inner = `<userid>${escapeXml(userId)}</userid>`;
115
+ if (userText) {
116
+ inner += `<usertext>${escapeXml(userText)}</usertext>`;
117
+ }
118
+ const body = buildRequest(inner);
119
+ const xml = await caller.doXml(appId, 'API_SendInvitation', body);
120
+ const base = parseBaseResponse(xml);
121
+ checkError(base);
122
+ }
123
+ /**
124
+ * Change the application manager.
125
+ *
126
+ * Requires account admin or realm admin permissions.
127
+ *
128
+ * @see https://help.quickbase.com/docs/api-changemanager
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * await changeManager(caller, 'bqxyz123', 'newmanager@example.com');
133
+ * ```
134
+ */
135
+ export async function changeManager(caller, appId, newManagerEmail) {
136
+ const inner = `<newmgr>${escapeXml(newManagerEmail)}</newmgr>`;
137
+ const body = buildRequest(inner);
138
+ const xml = await caller.doXml(appId, 'API_ChangeManager', body);
139
+ const base = parseBaseResponse(xml);
140
+ checkError(base);
141
+ }
142
+ /**
143
+ * Change the owner of a record.
144
+ *
145
+ * Transfers ownership from the current record owner to another user.
146
+ * Requires Full Administration rights on the application.
147
+ *
148
+ * @see https://help.quickbase.com/docs/api-changerecordowner
149
+ *
150
+ * @param newOwner - The new owner's QuickBase username or email address
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * // By record ID
155
+ * await changeRecordOwner(caller, 'bqtable123', 42, 'newowner@example.com');
156
+ * ```
157
+ */
158
+ export async function changeRecordOwner(caller, tableId, recordId, newOwner) {
159
+ const inner = `<rid>${recordId}</rid>` +
160
+ `<newowner>${escapeXml(newOwner)}</newowner>`;
161
+ const body = buildRequest(inner);
162
+ const xml = await caller.doXml(tableId, 'API_ChangeRecordOwner', body);
163
+ const base = parseBaseResponse(xml);
164
+ checkError(base);
165
+ }
166
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/xml/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * XML API Webhooks
3
+ *
4
+ * Endpoints for managing webhooks.
5
+ *
6
+ * XML-API: Remove this file when QuickBase discontinues the XML API.
7
+ * To find all XML API code, search for: XML-API
8
+ */
9
+ import type { XmlCaller, WebhooksCreateOptions, WebhooksEditOptions } from './types.js';
10
+ /**
11
+ * Create a webhook.
12
+ *
13
+ * @see https://help.quickbase.com/docs/api-webhooks-create
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * await webhooksCreate(caller, 'bqtable123', {
18
+ * label: 'Notify on new records',
19
+ * webhookUrl: 'https://example.com/webhook',
20
+ * workflowWhen: 'a',
21
+ * messageFormat: 'JSON',
22
+ * headers: [{ key: 'Content-Type', value: 'application/json' }],
23
+ * });
24
+ * ```
25
+ */
26
+ export declare function webhooksCreate(caller: XmlCaller, tableId: string, options: WebhooksCreateOptions): Promise<void>;
27
+ /**
28
+ * Edit a webhook.
29
+ *
30
+ * @see https://help.quickbase.com/docs/api-webhooks-edit
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * await webhooksEdit(caller, 'bqtable123', '15', {
35
+ * label: 'Updated webhook name',
36
+ * webhookUrl: 'https://example.com/new-endpoint',
37
+ * messageFormat: 'JSON',
38
+ * });
39
+ * ```
40
+ */
41
+ export declare function webhooksEdit(caller: XmlCaller, tableId: string, actionId: string, options: WebhooksEditOptions): Promise<void>;
42
+ /**
43
+ * Delete webhooks.
44
+ *
45
+ * @see https://help.quickbase.com/docs/api-webhooks-delete
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * const result = await webhooksDelete(caller, 'bqtable123', ['15', '16']);
50
+ * console.log(`Deleted ${result.numChanged} webhooks`);
51
+ * ```
52
+ */
53
+ export declare function webhooksDelete(caller: XmlCaller, tableId: string, actionIds: string[]): Promise<{
54
+ numChanged: number;
55
+ }>;
56
+ /**
57
+ * Activate webhooks.
58
+ *
59
+ * @see https://help.quickbase.com/docs/api-webhooks-activate
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const result = await webhooksActivate(caller, 'bqtable123', ['15']);
64
+ * console.log(`Activated ${result.numChanged} webhooks`);
65
+ * ```
66
+ */
67
+ export declare function webhooksActivate(caller: XmlCaller, tableId: string, actionIds: string[]): Promise<{
68
+ numChanged: number;
69
+ }>;
70
+ /**
71
+ * Deactivate webhooks.
72
+ *
73
+ * @see https://help.quickbase.com/docs/api-webhooks-deactivate
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const result = await webhooksDeactivate(caller, 'bqtable123', ['15']);
78
+ * console.log(`Deactivated ${result.numChanged} webhooks`);
79
+ * ```
80
+ */
81
+ export declare function webhooksDeactivate(caller: XmlCaller, tableId: string, actionIds: string[]): Promise<{
82
+ numChanged: number;
83
+ }>;
84
+ /**
85
+ * Copy a webhook.
86
+ *
87
+ * @see https://help.quickbase.com/docs/api-webhooks-copy
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const result = await webhooksCopy(caller, 'bqtable123', '15');
92
+ * console.log(`Created webhook copy with ID: ${result.actionId}`);
93
+ * ```
94
+ */
95
+ export declare function webhooksCopy(caller: XmlCaller, tableId: string, actionId: string): Promise<{
96
+ actionId: string;
97
+ }>;
98
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/xml/webhooks.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAsEpB;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAW/B"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * XML API Webhooks
3
+ *
4
+ * Endpoints for managing webhooks.
5
+ *
6
+ * XML-API: Remove this file when QuickBase discontinues the XML API.
7
+ * To find all XML API code, search for: XML-API
8
+ */
9
+ import { checkError } from './errors.js';
10
+ import { buildRequest, escapeXml, parseBaseResponse, getTagContent, parseXmlNumber, } from './request.js';
11
+ /**
12
+ * Build webhook XML from create options
13
+ */
14
+ function buildWebhookCreateXml(options) {
15
+ let inner = `<label>${escapeXml(options.label)}</label>`;
16
+ inner += `<WebhookURL>${escapeXml(options.webhookUrl)}</WebhookURL>`;
17
+ if (options.description) {
18
+ inner += `<Description>${escapeXml(options.description)}</Description>`;
19
+ }
20
+ if (options.query) {
21
+ inner += `<Query>${escapeXml(options.query)}</Query>`;
22
+ }
23
+ if (options.workflowWhen) {
24
+ inner += `<WorkflowWhen>${escapeXml(options.workflowWhen)}</WorkflowWhen>`;
25
+ }
26
+ if (options.headers && options.headers.length > 0) {
27
+ inner += `<WebhookHeaderCount>${options.headers.length}</WebhookHeaderCount>`;
28
+ options.headers.forEach((h, i) => {
29
+ inner += `<WebhookHeaderKey${i + 1}>${escapeXml(h.key)}</WebhookHeaderKey${i + 1}>`;
30
+ inner += `<WebhookHeaderValue${i + 1}>${escapeXml(h.value)}</WebhookHeaderValue${i + 1}>`;
31
+ });
32
+ }
33
+ if (options.message) {
34
+ inner += `<WebhookMessage>${escapeXml(options.message)}</WebhookMessage>`;
35
+ }
36
+ if (options.messageFormat) {
37
+ inner += `<WebhookMessageFormat>${options.messageFormat}</WebhookMessageFormat>`;
38
+ }
39
+ if (options.httpVerb) {
40
+ inner += `<WebhookHTTPVerb>${options.httpVerb}</WebhookHTTPVerb>`;
41
+ }
42
+ if (options.triggerFields && options.triggerFields.length > 0) {
43
+ inner += '<tfidsWhich>TRUE</tfidsWhich>';
44
+ for (const fid of options.triggerFields) {
45
+ inner += `<tfids>${fid}</tfids>`;
46
+ }
47
+ }
48
+ return inner;
49
+ }
50
+ /**
51
+ * Build webhook XML from edit options
52
+ */
53
+ function buildWebhookEditXml(actionId, options) {
54
+ let inner = `<actionId>${escapeXml(actionId)}</actionId>`;
55
+ inner += buildWebhookCreateXml(options);
56
+ // Handle clearing trigger fields
57
+ if (options.clearTriggerFields) {
58
+ // Remove any tfidsWhich/tfids we just added and replace with clear
59
+ inner = inner.replace(/<tfidsWhich>TRUE<\/tfidsWhich>/, '');
60
+ inner = inner.replace(/<tfids>\d+<\/tfids>/g, '');
61
+ inner += '<tfidsWhich>tfidsAny</tfidsWhich>';
62
+ }
63
+ return inner;
64
+ }
65
+ /**
66
+ * Create a webhook.
67
+ *
68
+ * @see https://help.quickbase.com/docs/api-webhooks-create
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * await webhooksCreate(caller, 'bqtable123', {
73
+ * label: 'Notify on new records',
74
+ * webhookUrl: 'https://example.com/webhook',
75
+ * workflowWhen: 'a',
76
+ * messageFormat: 'JSON',
77
+ * headers: [{ key: 'Content-Type', value: 'application/json' }],
78
+ * });
79
+ * ```
80
+ */
81
+ export async function webhooksCreate(caller, tableId, options) {
82
+ const inner = buildWebhookCreateXml(options);
83
+ const body = buildRequest(inner);
84
+ const xml = await caller.doXml(tableId, 'API_Webhooks_Create', body);
85
+ const base = parseBaseResponse(xml);
86
+ checkError(base);
87
+ }
88
+ /**
89
+ * Edit a webhook.
90
+ *
91
+ * @see https://help.quickbase.com/docs/api-webhooks-edit
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * await webhooksEdit(caller, 'bqtable123', '15', {
96
+ * label: 'Updated webhook name',
97
+ * webhookUrl: 'https://example.com/new-endpoint',
98
+ * messageFormat: 'JSON',
99
+ * });
100
+ * ```
101
+ */
102
+ export async function webhooksEdit(caller, tableId, actionId, options) {
103
+ const inner = buildWebhookEditXml(actionId, options);
104
+ const body = buildRequest(inner);
105
+ const xml = await caller.doXml(tableId, 'API_Webhooks_Edit', body);
106
+ const base = parseBaseResponse(xml);
107
+ checkError(base);
108
+ }
109
+ /**
110
+ * Delete webhooks.
111
+ *
112
+ * @see https://help.quickbase.com/docs/api-webhooks-delete
113
+ *
114
+ * @example
115
+ * ```typescript
116
+ * const result = await webhooksDelete(caller, 'bqtable123', ['15', '16']);
117
+ * console.log(`Deleted ${result.numChanged} webhooks`);
118
+ * ```
119
+ */
120
+ export async function webhooksDelete(caller, tableId, actionIds) {
121
+ if (actionIds.length === 0) {
122
+ throw new Error('actionIds array cannot be empty');
123
+ }
124
+ const inner = `<actionIDList>${actionIds.join(',')}</actionIDList>`;
125
+ const body = buildRequest(inner);
126
+ const xml = await caller.doXml(tableId, 'API_Webhooks_Delete', body);
127
+ const base = parseBaseResponse(xml);
128
+ checkError(base);
129
+ return {
130
+ numChanged: parseXmlNumber(getTagContent(xml, 'numChanged')),
131
+ };
132
+ }
133
+ /**
134
+ * Activate webhooks.
135
+ *
136
+ * @see https://help.quickbase.com/docs/api-webhooks-activate
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * const result = await webhooksActivate(caller, 'bqtable123', ['15']);
141
+ * console.log(`Activated ${result.numChanged} webhooks`);
142
+ * ```
143
+ */
144
+ export async function webhooksActivate(caller, tableId, actionIds) {
145
+ if (actionIds.length === 0) {
146
+ throw new Error('actionIds array cannot be empty');
147
+ }
148
+ const inner = `<actionIDList>${actionIds.join(',')}</actionIDList>`;
149
+ const body = buildRequest(inner);
150
+ const xml = await caller.doXml(tableId, 'API_Webhooks_Activate', body);
151
+ const base = parseBaseResponse(xml);
152
+ checkError(base);
153
+ return {
154
+ numChanged: parseXmlNumber(getTagContent(xml, 'numChanged')),
155
+ };
156
+ }
157
+ /**
158
+ * Deactivate webhooks.
159
+ *
160
+ * @see https://help.quickbase.com/docs/api-webhooks-deactivate
161
+ *
162
+ * @example
163
+ * ```typescript
164
+ * const result = await webhooksDeactivate(caller, 'bqtable123', ['15']);
165
+ * console.log(`Deactivated ${result.numChanged} webhooks`);
166
+ * ```
167
+ */
168
+ export async function webhooksDeactivate(caller, tableId, actionIds) {
169
+ if (actionIds.length === 0) {
170
+ throw new Error('actionIds array cannot be empty');
171
+ }
172
+ const inner = `<actionIDList>${actionIds.join(',')}</actionIDList>`;
173
+ const body = buildRequest(inner);
174
+ const xml = await caller.doXml(tableId, 'API_Webhooks_Deactivate', body);
175
+ const base = parseBaseResponse(xml);
176
+ checkError(base);
177
+ return {
178
+ numChanged: parseXmlNumber(getTagContent(xml, 'numChanged')),
179
+ };
180
+ }
181
+ /**
182
+ * Copy a webhook.
183
+ *
184
+ * @see https://help.quickbase.com/docs/api-webhooks-copy
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * const result = await webhooksCopy(caller, 'bqtable123', '15');
189
+ * console.log(`Created webhook copy with ID: ${result.actionId}`);
190
+ * ```
191
+ */
192
+ export async function webhooksCopy(caller, tableId, actionId) {
193
+ const inner = `<actionId>${escapeXml(actionId)}</actionId>`;
194
+ const body = buildRequest(inner);
195
+ const xml = await caller.doXml(tableId, 'API_Webhooks_Copy', body);
196
+ const base = parseBaseResponse(xml);
197
+ checkError(base);
198
+ return {
199
+ actionId: getTagContent(xml, 'actionId'),
200
+ };
201
+ }
202
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/xml/webhooks.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quickbase-js",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "description": "TypeScript/JavaScript client for the QuickBase JSON RESTful API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,8 +14,12 @@
14
14
  "browser": "./dist/quickbase.min.js"
15
15
  }
16
16
  },
17
+ "bin": {
18
+ "quickbase-js": "./bin/quickbase-js.js"
19
+ },
17
20
  "files": [
18
21
  "dist",
22
+ "bin",
19
23
  "README.md",
20
24
  "LICENSE"
21
25
  ],
@@ -64,7 +68,7 @@
64
68
  "node": ">=18.0.0"
65
69
  },
66
70
  "devDependencies": {
67
- "@types/node": "^20.0.0",
71
+ "@types/node": "^24.10.1",
68
72
  "dotenv": "^17.2.3",
69
73
  "esbuild": "^0.27.0",
70
74
  "tsx": "^4.7.0",