fireberry-api-client 1.0.0-beta.2.3 → 1.0.0-beta.2.3.2

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.
@@ -3,31 +3,113 @@
3
3
  // src/constants/objectIds.ts
4
4
  var OBJECT_ID_MAP = {
5
5
  1: "accountid",
6
+ // Account
6
7
  2: "contactid",
8
+ // Contact
7
9
  3: "leadid",
10
+ // Lead
8
11
  4: "opportunityid",
12
+ // Opportunity
9
13
  5: "casesid",
14
+ // Cases
10
15
  6: "activityid",
16
+ // Activity
11
17
  7: "noteid",
18
+ // Note
12
19
  8: "competitorid",
20
+ // Competitor
13
21
  9: "crmuserid",
22
+ // CrmUser
14
23
  10: "taskid",
24
+ // Task
25
+ 12: "quoteid",
26
+ // Quote
15
27
  13: "crmorderid",
28
+ // CrmOrder
16
29
  14: "productid",
30
+ // Product
17
31
  17: "crmorderitemid",
32
+ // CrmOrderItem
18
33
  20: "emailtemplateid",
34
+ // EmailTemplate
19
35
  23: "businessunitid",
36
+ // BusinessUnit
37
+ 25: "orgid",
38
+ // Org
20
39
  27: "printtemplateid",
40
+ // PrintTemplate
21
41
  28: "contractid",
42
+ // Contract
22
43
  33: "accountproductid",
44
+ // AccountProduct
23
45
  46: "projectid",
46
+ // Project
47
+ 55: "wfruleid",
48
+ // WFRule
49
+ 58: "mdobjectid",
50
+ // MDObject
51
+ 64: "roleid",
52
+ // Role
24
53
  67: "campaignid",
54
+ // Campaign
55
+ 70: "crmuserloginid",
56
+ // CrmUserLogin
57
+ 73: "systemfieldid",
58
+ // SystemField
25
59
  76: "articleid",
60
+ // Article
61
+ 77: "linkid",
62
+ // Link
63
+ 78: "invoiceid",
64
+ // Invoice
65
+ 80: "invoicereceiptitemid",
66
+ // InvoiceReceiptItem
67
+ 81: "invoiceid",
68
+ // InvoiceNo
69
+ 82: "invoiceid",
70
+ // InvoiceDraft
71
+ 83: "invoiceid",
72
+ // InvoiceReceipt
73
+ 84: "invoiceid",
74
+ // InvoiceReno
75
+ 85: "invoiceid",
76
+ // InvoiceCredit
26
77
  86: "invoiceid",
78
+ // InvoiceDelivery
79
+ 89: "iprestrictionid",
80
+ // IpRestriction
81
+ 90: "transactionitemid",
82
+ // TransactionItem
83
+ 93: "chargeid",
84
+ // Charge
85
+ 100: "calllogid",
86
+ // calllog
27
87
  101: "attendanceclockid",
88
+ // AttendanceClock
28
89
  102: "activitylogid",
90
+ // ActivityLog
29
91
  104: "conversationid",
30
- 114: "calendarresourceid"
92
+ // Conversation
93
+ 105: "teaminboxid",
94
+ // TeamInbox
95
+ 106: "texttemplateid",
96
+ // TextTemplate
97
+ 107: "facebookconnectionid",
98
+ // FacebookConnection
99
+ 109: "auditlogid",
100
+ // AuditLog
101
+ 110: "smstemplateid",
102
+ // SMSTemplate
103
+ 111: "providerverificationid",
104
+ // ProviderVerification
105
+ 114: "calendarresourceid",
106
+ // CalendarResource
107
+ 115: "journeyid",
108
+ // Journey
109
+ 116: "profileid",
110
+ // Profile
111
+ 117: "landingpageid"
112
+ // LandingPage
31
113
  };
32
114
  function getObjectIdFieldName(objectTypeId) {
33
115
  const objectTypeNum = typeof objectTypeId === "string" ? parseInt(objectTypeId, 10) : objectTypeId;
@@ -51,49 +133,105 @@ var OBJECT_NAME_MAP = {
51
133
  4: "name",
52
134
  // Opportunity
53
135
  5: "title",
54
- // Case
136
+ // Cases
55
137
  6: "subject",
56
138
  // Activity
57
- 7: "subject",
139
+ 7: "notetext",
58
140
  // Note
59
- 8: "name",
141
+ 8: "competitorname",
60
142
  // Competitor
61
143
  9: "fullname",
62
- // CRM User
144
+ // CrmUser
63
145
  10: "subject",
64
146
  // Task
65
- 13: "name",
66
- // CRM Order
67
- 14: "productname",
147
+ 12: "quotenumber",
148
+ // Quote
149
+ 13: "crmordernumber",
150
+ // CrmOrder
151
+ 14: "name",
68
152
  // Product
69
153
  17: "productname",
70
- // CRM Order Item
71
- 20: "name",
72
- // Email Template
154
+ // CrmOrderItem
155
+ 20: "title",
156
+ // EmailTemplate
73
157
  23: "name",
74
- // Business Unit
158
+ // BusinessUnit
159
+ 25: "orgname",
160
+ // Org
75
161
  27: "name",
76
- // Print Template
77
- 28: "name",
162
+ // PrintTemplate
163
+ 28: "contractname",
78
164
  // Contract
79
- 33: "productname",
80
- // Account Product
81
- 46: "name",
165
+ 33: "productid",
166
+ // AccountProduct (uses productid as display)
167
+ 46: "projectname",
82
168
  // Project
83
- 67: "name",
169
+ 55: "rulename",
170
+ // WFRule
171
+ 58: "name",
172
+ // MDObject
173
+ 64: "rolename",
174
+ // Role
175
+ 67: "campaignname",
84
176
  // Campaign
85
- 76: "title",
177
+ 70: "browsername",
178
+ // CrmUserLogin
179
+ 73: "label",
180
+ // SystemField (using label as name field)
181
+ 76: "articlename",
86
182
  // Article
87
- 86: "name",
183
+ 77: "linkname",
184
+ // Link
185
+ 78: "invoicenumber",
88
186
  // Invoice
187
+ 80: "documentnumber",
188
+ // InvoiceReceiptItem
189
+ 81: "invoicenumber",
190
+ // InvoiceNo
191
+ 82: "invoicenumber",
192
+ // InvoiceDraft
193
+ 83: "invoicenumber",
194
+ // InvoiceReceipt
195
+ 84: "invoicenumber",
196
+ // InvoiceReno
197
+ 85: "invoicenumber",
198
+ // InvoiceCredit
199
+ 86: "invoicenumber",
200
+ // InvoiceDelivery
201
+ 89: "name",
202
+ // IpRestriction
203
+ 90: "documentnumber",
204
+ // TransactionItem
205
+ 93: "name",
206
+ // Charge
207
+ 100: "callerid",
208
+ // calllog
89
209
  101: "name",
90
- // Attendance Clock
91
- 102: "subject",
92
- // Activity Log
210
+ // AttendanceClock
211
+ 102: "activitylognumber",
212
+ // ActivityLog
93
213
  104: "subject",
94
214
  // Conversation
95
- 114: "name"
96
- // Calendar Resource
215
+ 105: "name",
216
+ // TeamInbox
217
+ 106: "name",
218
+ // TextTemplate
219
+ 107: "name",
220
+ // FacebookConnection
221
+ 109: "name",
222
+ // AuditLog
223
+ 110: "name",
224
+ // SMSTemplate
225
+ 111: "name",
226
+ // ProviderVerification
227
+ 114: "name",
228
+ // CalendarResource
229
+ 115: "name",
230
+ // Journey
231
+ 116: "name",
232
+ // Profile
233
+ 117: "name"
234
+ // LandingPage
97
235
  };
98
236
  function getNameFieldByObjectType(objectTypeId) {
99
237
  const objectTypeNum = typeof objectTypeId === "string" ? parseInt(objectTypeId, 10) : objectTypeId;
@@ -522,6 +660,34 @@ var QueryBuilder = class {
522
660
  this.currentField = field;
523
661
  return this.createConditionBuilder();
524
662
  }
663
+ /**
664
+ * Adds a WHERE condition for the primary ID field, automatically mapped based on object type
665
+ * @param value - The ID value to match
666
+ * @throws Error if objectType is not set
667
+ *
668
+ * @example
669
+ * ```typescript
670
+ * // Instead of knowing the exact field name:
671
+ * new QueryBuilder(client)
672
+ * .objectType(1)
673
+ * .whereId('abc123') // Automatically uses 'accountid' for object type 1
674
+ * .execute();
675
+ *
676
+ * // Equivalent to:
677
+ * new QueryBuilder(client)
678
+ * .objectType(1)
679
+ * .where('accountid').equals('abc123')
680
+ * .execute();
681
+ * ```
682
+ */
683
+ whereId(value) {
684
+ if (!this.objectTypeId) {
685
+ throw new Error("Object type must be set before using whereId(). Call .objectType() first.");
686
+ }
687
+ const idField = getObjectIdFieldName(this.objectTypeId);
688
+ this.addCondition(idField, "=", String(value));
689
+ return this;
690
+ }
525
691
  /**
526
692
  * Adds an AND logical operator
527
693
  */
@@ -743,7 +909,7 @@ var QueryBuilder = class {
743
909
  var EXCLUDED_FIELDS_FOR_STAR_QUERY = {
744
910
  "7": ["deletedon", "deletedby"],
745
911
  // Note
746
- "8": ["deletedon", "deletedby"],
912
+ "8": ["deletedon", "deletedby", "s", "w", "o", "t", "description"],
747
913
  // Competitor
748
914
  "114": ["deletedon", "deletedby"],
749
915
  // Calendar Resource
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/constants/objectIds.ts","../../src/constants/objectNames.ts","../../src/utils/fieldMapping.ts","../../src/constants/fieldTypes.ts","../../src/utils/fieldTypes.ts","../../src/utils/helpers.ts","../../src/utils/queryBuilder.ts","../../src/constants/excludedFields.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Object Type ID to Primary Key Field Mapping\r\n * Maps Fireberry object type IDs to their primary key field names\r\n */\r\nexport const OBJECT_ID_MAP: Record<number, string> = {\r\n 1: 'accountid',\r\n 2: 'contactid',\r\n 3: 'leadid',\r\n 4: 'opportunityid',\r\n 5: 'casesid',\r\n 6: 'activityid',\r\n 7: 'noteid',\r\n 8: 'competitorid',\r\n 9: 'crmuserid',\r\n 10: 'taskid',\r\n 13: 'crmorderid',\r\n 14: 'productid',\r\n 17: 'crmorderitemid',\r\n 20: 'emailtemplateid',\r\n 23: 'businessunitid',\r\n 27: 'printtemplateid',\r\n 28: 'contractid',\r\n 33: 'accountproductid',\r\n 46: 'projectid',\r\n 67: 'campaignid',\r\n 76: 'articleid',\r\n 86: 'invoiceid',\r\n 101: 'attendanceclockid',\r\n 102: 'activitylogid',\r\n 104: 'conversationid',\r\n 114: 'calendarresourceid',\r\n};\r\n\r\n/**\r\n * Gets the primary key field name for a given object type\r\n *\r\n * @param objectTypeId - The numeric object type ID\r\n * @returns The correct ID field name for the object type\r\n */\r\nexport function getObjectIdFieldName(objectTypeId: string | number): string {\r\n const objectTypeNum =\r\n typeof objectTypeId === 'string' ? parseInt(objectTypeId, 10) : objectTypeId;\r\n\r\n // Check if it's a mapped base object\r\n if (OBJECT_ID_MAP[objectTypeNum]) {\r\n return OBJECT_ID_MAP[objectTypeNum];\r\n }\r\n\r\n // For custom objects (1000 and up), use the pattern customobjectXid\r\n if (objectTypeNum >= 1000) {\r\n return `customobject${objectTypeNum}id`;\r\n }\r\n\r\n // Fallback to generic 'id' for unmapped objects\r\n return 'id';\r\n}\r\n","/**\r\n * Object Type ID to Name Field Mapping\r\n * Maps Fireberry object type IDs to their display name field\r\n */\r\nexport const OBJECT_NAME_MAP: Record<number, string> = {\r\n 1: 'accountname', // Account\r\n 2: 'fullname', // Contact\r\n 3: 'fullname', // Lead\r\n 4: 'name', // Opportunity\r\n 5: 'title', // Case\r\n 6: 'subject', // Activity\r\n 7: 'subject', // Note\r\n 8: 'name', // Competitor\r\n 9: 'fullname', // CRM User\r\n 10: 'subject', // Task\r\n 13: 'name', // CRM Order\r\n 14: 'productname', // Product\r\n 17: 'productname', // CRM Order Item\r\n 20: 'name', // Email Template\r\n 23: 'name', // Business Unit\r\n 27: 'name', // Print Template\r\n 28: 'name', // Contract\r\n 33: 'productname', // Account Product\r\n 46: 'name', // Project\r\n 67: 'name', // Campaign\r\n 76: 'title', // Article\r\n 86: 'name', // Invoice\r\n 101: 'name', // Attendance Clock\r\n 102: 'subject', // Activity Log\r\n 104: 'subject', // Conversation\r\n 114: 'name', // Calendar Resource\r\n};\r\n\r\n/**\r\n * Gets the display name field for a given object type\r\n *\r\n * @param objectTypeId - The numeric object type ID\r\n * @returns The name field for the object type\r\n */\r\nexport function getNameFieldByObjectType(objectTypeId: string | number): string {\r\n const objectTypeNum =\r\n typeof objectTypeId === 'string' ? parseInt(objectTypeId, 10) : objectTypeId;\r\n\r\n // Check if it's a mapped base object\r\n if (OBJECT_NAME_MAP[objectTypeNum]) {\r\n return OBJECT_NAME_MAP[objectTypeNum];\r\n }\r\n\r\n // For custom objects (1000 and up), use 'name'\r\n if (objectTypeNum >= 1000) {\r\n return 'name';\r\n }\r\n\r\n // Fallback to 'name' for unmapped objects\r\n return 'name';\r\n}\r\n","/**\r\n * Special field name mappings that don't follow standard patterns\r\n * Key: original field name, Value: corresponding label field\r\n */\r\nconst SPECIAL_LABEL_FIELD_MAPPINGS: Record<string, string> = {\r\n objectid: 'objecttitle',\r\n lastactionid: 'lastactiontitle',\r\n wfruleid: 'rulename', // Object 55 (Workflow Rules)\r\n noteid: 'subject', // Object 7 (Note) - noteid maps to subject\r\n};\r\n\r\n/**\r\n * Fields ending with \"id\" that should NOT have \"id\" replaced with \"name\"\r\n * These fields will use the default append \"name\" behavior instead\r\n */\r\nconst EXCLUDED_ID_FIELDS: string[] = [\r\n 'businessunitid', // → businessunitidname (not businessunitname)\r\n 'crmuserid', // → no name field exists\r\n 'languageid', // → languageidname (not languagename)\r\n];\r\n\r\n/**\r\n * Fields ending with \"code\" that should NOT have \"code\" removed\r\n * These fields will use the default append \"name\" behavior instead\r\n */\r\nconst EXCLUDED_CODE_FIELDS: string[] = [\r\n 'duplicaterecordcode', // → duplicaterecordcodename (not duplicaterecord)\r\n];\r\n\r\n/**\r\n * Fields that have NO corresponding label field at all\r\n * These fields should not have any name transformation applied\r\n * Return empty string to signal \"no label field exists\"\r\n */\r\nconst FIELDS_WITHOUT_LABEL_FIELD: string[] = [\r\n 'systemfieldid', // Object 73 - no name field exists\r\n 'fieldobjecttype', // Object 73 - base field doesn't exist, only *name exists\r\n 'invoiceid', // Objects 78, 81 - no name field exists\r\n 'calllogid', // Object 100 - no name field exists (primary key)\r\n 'attendanceclockid', // Object 101 - no name field exists (primary key)\r\n 'activitylogid', // Object 102 - no name field exists (primary key)\r\n 'conversationid', // Object 104 - no name field exists (primary key)\r\n 'texttemplateid', // Text Template - no name field exists (primary key)\r\n 'smstemplateid', // Object 110 - no name field exists (primary key)\r\n 'deletedby', // Object 7 - no name field exists\r\n 'recordid', // Object 7 - no name field exists\r\n 'objecttypecode', // Object 7 - no name field exists\r\n];\r\n\r\n/**\r\n * Object-type specific overrides for field name transformations\r\n * Key: object type ID, Value: { excludedIdFields, excludedCodeFields }\r\n */\r\nconst OBJECT_TYPE_OVERRIDES: Record<\r\n number,\r\n { excludedIdFields?: string[]; excludedCodeFields?: string[] }\r\n> = {\r\n // CRM Orders (13) - uses *idname and *codename patterns\r\n 13: {\r\n excludedIdFields: ['ownerid', 'accountid', 'printtemplateid', 'pcfaccountid'],\r\n excludedCodeFields: [\r\n 'rounddiscountcode',\r\n 'taxincludecode',\r\n 'currencycode',\r\n 'transmissioncode',\r\n 'creditrejectioncode1',\r\n 'creditrejectioncode2',\r\n 'apartmentcode1',\r\n 'apartmentcode2',\r\n 'restrictioncode1',\r\n 'restrictioncode2',\r\n 'casescode1',\r\n 'casescode2',\r\n 'returncode1',\r\n 'returncode2',\r\n 'statuscode',\r\n ],\r\n },\r\n // Products (14)\r\n 14: {\r\n excludedCodeFields: ['categorycode'], // → categoryname (not category)\r\n },\r\n // CRM Order Items (17) - uses *idname pattern\r\n 17: {\r\n excludedIdFields: ['crmorderid', 'productid', 'ownerid'],\r\n },\r\n // Email Templates (20)\r\n 20: {\r\n excludedIdFields: ['mdobjectid'],\r\n },\r\n // Print Templates (27)\r\n 27: {\r\n excludedIdFields: ['mdobjectid'],\r\n },\r\n // System Fields (73) - uses *idname pattern\r\n 73: {\r\n excludedIdFields: ['mdobjectid', 'ownerid'],\r\n },\r\n // Invoices (78) - uses *codename and *idname patterns extensively\r\n 78: {\r\n excludedIdFields: [\r\n 'crmorderid',\r\n 'invoicereceiptid',\r\n 'accountid',\r\n 'ownerid',\r\n 'invoicerenoid',\r\n ],\r\n excludedCodeFields: [\r\n 'taxincludecode',\r\n 'depositcode',\r\n 'rounddiscountcode',\r\n 'currencycode',\r\n 'statecode',\r\n 'invoicetypecode',\r\n ],\r\n },\r\n // Invoice No (81) - uses *codename and *idname patterns extensively\r\n 81: {\r\n excludedIdFields: [\r\n 'ownerid',\r\n 'invoicecreditid',\r\n 'crmorderid',\r\n 'invoicereceiptid',\r\n 'invoicedeliveryid',\r\n 'accountid',\r\n ],\r\n excludedCodeFields: ['currencycode', 'rounddiscountcode', 'statecode', 'taxincludecode'],\r\n },\r\n // Invoice Draft (82) - uses *codename and *idname patterns extensively\r\n 82: {\r\n excludedIdFields: ['accountid', 'crmorderid', 'ownerid', 'invoicerenoid'],\r\n excludedCodeFields: ['taxincludecode', 'statecode', 'rounddiscountcode', 'currencycode'],\r\n },\r\n // Invoice Receipt (83) - uses *codename and *idname patterns\r\n 83: {\r\n excludedIdFields: ['invoicenoid', 'crmorderid', 'ownerid', 'accountid'],\r\n excludedCodeFields: ['statecode', 'currencycode'],\r\n },\r\n // Invoice Tax Receipt (84) - uses *codename and *idname patterns\r\n 84: {\r\n excludedIdFields: ['crmorderid', 'ownerid', 'invoicecreditid', 'accountid'],\r\n excludedCodeFields: ['rounddiscountcode', 'statecode', 'taxincludecode', 'currencycode'],\r\n },\r\n // Invoice Credit (85) - uses *codename and *idname patterns\r\n 85: {\r\n excludedIdFields: ['ownerid', 'crmorderid', 'accountid'],\r\n excludedCodeFields: ['taxincludecode', 'rounddiscountcode', 'currencycode', 'statecode'],\r\n },\r\n // Invoice (86) - uses *codename and *idname patterns\r\n 86: {\r\n excludedIdFields: ['accountid', 'ownerid', 'crmorderid'],\r\n excludedCodeFields: ['statecode', 'rounddiscountcode', 'currencycode', 'taxincludecode'],\r\n },\r\n // Call Log (100) - uses *idname pattern\r\n 100: {\r\n excludedIdFields: ['contactid', 'leadid', 'accountid', 'ownerid'],\r\n },\r\n // Attendance Clock (101) - uses *idname pattern\r\n 101: {\r\n excludedIdFields: ['ownerid'],\r\n },\r\n // Activity Log (102) - uses *idname and *codename patterns\r\n 102: {\r\n excludedIdFields: ['contactid', 'ownerid'],\r\n excludedCodeFields: ['objecttypecode', 'typecode', 'resultcode'],\r\n },\r\n // Conversation (104) - uses *idname pattern\r\n 104: {\r\n excludedIdFields: ['leadid', 'ownerid', 'contactid', 'accountid'],\r\n },\r\n // Text Template (106) - uses *idname pattern\r\n 106: {\r\n excludedIdFields: ['ownerid'],\r\n },\r\n // SMS Template (110) - uses *idname pattern\r\n 110: {\r\n excludedIdFields: ['ownerid'],\r\n },\r\n};\r\n\r\n/**\r\n * Converts a field API name to its corresponding label field.\r\n *\r\n * Rules:\r\n * - Special mappings (e.g., objectid → objecttitle)\r\n * - Fields starting with \"pcf\" (custom fields): append \"name\" → pcf_field → pcf_fieldname\r\n * - Fields ending with \"code\" (unless excluded): remove \"code\" → statuscode → status\r\n * - Fields ending with \"id\" (unless excluded): replace \"id\" with \"name\" → accountid → accountname\r\n * - All other fields: append \"name\"\r\n *\r\n * @param fieldName - The field API name\r\n * @param objectType - The object type ID (required for object-specific overrides)\r\n * @returns The corresponding label field, or empty string if no label field exists\r\n */\r\nexport function getLabelFieldForField(fieldName: string, objectType: string | number): string {\r\n // Check special mappings first\r\n if (SPECIAL_LABEL_FIELD_MAPPINGS[fieldName]) {\r\n return SPECIAL_LABEL_FIELD_MAPPINGS[fieldName];\r\n }\r\n\r\n // Check if field has no label field at all - return empty string\r\n if (FIELDS_WITHOUT_LABEL_FIELD.includes(fieldName)) {\r\n return '';\r\n }\r\n\r\n // Check for custom object primary keys (customobject{N}id pattern) → name\r\n if (/^customobject\\d+id$/.test(fieldName)) {\r\n return 'name';\r\n }\r\n\r\n // Custom fields (pcf prefix) - just append \"name\"\r\n if (fieldName.startsWith('pcf')) {\r\n return `${fieldName}name`;\r\n }\r\n\r\n // Get object-type specific overrides\r\n const objectTypeNum =\r\n typeof objectType === 'string' ? parseInt(objectType, 10) : objectType;\r\n const overrides = OBJECT_TYPE_OVERRIDES[objectTypeNum] || null;\r\n\r\n // For custom objects (1000+), add default exclusions\r\n const isCustomObject = objectTypeNum >= 1000;\r\n const customObjectExclusions = isCustomObject ? ['ownerid'] : [];\r\n\r\n // Combine global and object-specific exclusions\r\n const excludedCodeFields = [\r\n ...EXCLUDED_CODE_FIELDS,\r\n ...(overrides?.excludedCodeFields || []),\r\n ];\r\n const excludedIdFields = [\r\n ...EXCLUDED_ID_FIELDS,\r\n ...(overrides?.excludedIdFields || []),\r\n ...customObjectExclusions,\r\n ];\r\n\r\n // Remove \"code\" suffix (unless excluded) → statuscode → status\r\n if (fieldName.endsWith('code') && !excludedCodeFields.includes(fieldName)) {\r\n return fieldName.slice(0, -4);\r\n }\r\n\r\n // Replace \"id\" suffix with \"name\" (unless excluded) → accountid → accountname\r\n if (fieldName.endsWith('id') && !excludedIdFields.includes(fieldName)) {\r\n return fieldName.slice(0, -2) + 'name';\r\n }\r\n\r\n // Default: append \"name\"\r\n return `${fieldName}name`;\r\n}\r\n","/**\r\n * Field Type System IDs from Fireberry CRM\r\n * These UUIDs identify different field types in the metadata API\r\n */\r\nexport const FIELD_TYPE_IDS = {\r\n DROPDOWN: 'b4919f2e-2996-48e4-a03c-ba39fb64386c',\r\n LOOKUP: 'a8fcdf65-91bc-46fd-82f6-1234758345a1',\r\n EMAIL: 'c713d2f7-8fa9-43c3-8062-f07486eaf567',\r\n TEXT: 'a1e7ed6f-5083-477b-b44c-9943a6181359',\r\n URL: 'c820d32f-44df-4c2a-9c1e-18734e864fd5',\r\n LONG_TEXT: '80108f9d-1e75-40fa-9fa9-02be4ddc1da1',\r\n DATETIME: 'ce972d02-5013-46d4-9d1d-f09df1ac346a',\r\n DATE: '83bf530c-e04c-462b-9ffc-a46f750fc072',\r\n HTML: 'ed2ad39d-32fc-4585-8f5b-2e93463f050a',\r\n TELEPHONE: '3f62f67a-1cee-403a-bec6-aa02a9804edb',\r\n NUMERIC: '6a34bfe3-fece-4da1-9136-a7b1e5ae3319',\r\n} as const;\r\n\r\n/**\r\n * Human-readable mappings for field types\r\n * Used for display purposes\r\n */\r\nexport const FIELD_TYPE_MAPPINGS: Record<string, string> = {\r\n [FIELD_TYPE_IDS.DROPDOWN]: 'Dropdown',\r\n [FIELD_TYPE_IDS.EMAIL]: 'Email',\r\n [FIELD_TYPE_IDS.TEXT]: 'Text',\r\n [FIELD_TYPE_IDS.LOOKUP]: 'Lookup',\r\n [FIELD_TYPE_IDS.URL]: 'URL',\r\n [FIELD_TYPE_IDS.LONG_TEXT]: 'Long Text',\r\n [FIELD_TYPE_IDS.DATETIME]: 'DateTime',\r\n [FIELD_TYPE_IDS.DATE]: 'Date',\r\n [FIELD_TYPE_IDS.HTML]: 'HTML',\r\n [FIELD_TYPE_IDS.TELEPHONE]: 'Telephone',\r\n [FIELD_TYPE_IDS.NUMERIC]: 'Number',\r\n};\r\n","import { FIELD_TYPE_IDS } from '../constants/fieldTypes';\r\n\r\n/**\r\n * Checks if a field is a dropdown type based on its systemFieldTypeId\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a dropdown\r\n */\r\nexport function isDropdownField(systemFieldTypeId: string): boolean {\r\n return systemFieldTypeId === FIELD_TYPE_IDS.DROPDOWN;\r\n}\r\n\r\n/**\r\n * Checks if a field is a lookup type based on its systemFieldTypeId\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a lookup\r\n */\r\nexport function isLookupField(systemFieldTypeId: string): boolean {\r\n return systemFieldTypeId === FIELD_TYPE_IDS.LOOKUP;\r\n}\r\n\r\n/**\r\n * Checks if a field is a dropdown or lookup type\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a dropdown or lookup\r\n */\r\nexport function isDropdownOrLookupField(systemFieldTypeId: string): boolean {\r\n return isDropdownField(systemFieldTypeId) || isLookupField(systemFieldTypeId);\r\n}\r\n\r\n/**\r\n * Checks if a field is a text type\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a text field\r\n */\r\nexport function isTextField(systemFieldTypeId: string): boolean {\r\n return systemFieldTypeId === FIELD_TYPE_IDS.TEXT;\r\n}\r\n\r\n/**\r\n * Checks if a field is a numeric type\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a numeric field\r\n */\r\nexport function isNumericField(systemFieldTypeId: string): boolean {\r\n return systemFieldTypeId === FIELD_TYPE_IDS.NUMERIC;\r\n}\r\n\r\n/**\r\n * Checks if a field is a date type (date or datetime)\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a date or datetime field\r\n */\r\nexport function isDateField(systemFieldTypeId: string): boolean {\r\n return (\r\n systemFieldTypeId === FIELD_TYPE_IDS.DATE ||\r\n systemFieldTypeId === FIELD_TYPE_IDS.DATETIME\r\n );\r\n}\r\n\r\n/**\r\n * Gets the field type name from its system ID\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns Human-readable field type name, or 'Unknown' if not found\r\n */\r\nexport function getFieldTypeName(systemFieldTypeId: string): string {\r\n const typeMap: Record<string, string> = {\r\n [FIELD_TYPE_IDS.DROPDOWN]: 'Dropdown',\r\n [FIELD_TYPE_IDS.LOOKUP]: 'Lookup',\r\n [FIELD_TYPE_IDS.EMAIL]: 'Email',\r\n [FIELD_TYPE_IDS.TEXT]: 'Text',\r\n [FIELD_TYPE_IDS.URL]: 'URL',\r\n [FIELD_TYPE_IDS.LONG_TEXT]: 'Long Text',\r\n [FIELD_TYPE_IDS.DATETIME]: 'DateTime',\r\n [FIELD_TYPE_IDS.DATE]: 'Date',\r\n [FIELD_TYPE_IDS.HTML]: 'HTML',\r\n [FIELD_TYPE_IDS.TELEPHONE]: 'Telephone',\r\n [FIELD_TYPE_IDS.NUMERIC]: 'Number',\r\n };\r\n return typeMap[systemFieldTypeId] || 'Unknown';\r\n}\r\n","/**\r\n * Waits for the specified number of milliseconds\r\n * Used for rate limit handling and retry logic\r\n *\r\n * @param ms - Time to wait in milliseconds\r\n * @returns Promise that resolves after the specified time\r\n */\r\nexport function wait(ms: number): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/**\r\n * Splits an array into chunks of specified size\r\n * Used for processing large batches in Fireberry-compatible pieces (max 20 items)\r\n *\r\n * @param array - Array to split\r\n * @param size - Maximum chunk size\r\n * @returns Array of chunks\r\n */\r\nexport function chunkArray<T>(array: T[], size: number): T[][] {\r\n const result: T[][] = [];\r\n for (let i = 0; i < array.length; i += size) {\r\n result.push(array.slice(i, i + size));\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Safely converts a value to a string for API usage\r\n * Handles null, undefined, numbers, and other types\r\n *\r\n * @param value - The value to convert\r\n * @returns String representation of the value\r\n */\r\nexport function safeStringValue(value: unknown): string {\r\n if (value === null || value === undefined) {\r\n return '';\r\n }\r\n if (typeof value === 'string') {\r\n return value;\r\n }\r\n if (typeof value === 'number' || typeof value === 'boolean') {\r\n return String(value);\r\n }\r\n if (typeof value === 'object') {\r\n return JSON.stringify(value);\r\n }\r\n return String(value);\r\n}\r\n\r\n/**\r\n * Normalizes fields input to an array\r\n * Accepts both array of strings and comma-separated string\r\n *\r\n * @param fields - Fields as array or comma-separated string\r\n * @returns Array of field names\r\n *\r\n * @example\r\n * normalizeFields('a,b,c') // ['a', 'b', 'c']\r\n * normalizeFields(['a', 'b']) // ['a', 'b']\r\n * normalizeFields('*') // ['*']\r\n */\r\nexport function normalizeFields(fields: string | string[]): string[] {\r\n if (Array.isArray(fields)) {\r\n return fields;\r\n }\r\n if (typeof fields === 'string') {\r\n // Handle empty string\r\n if (!fields.trim()) {\r\n return [];\r\n }\r\n // Split by comma and trim whitespace\r\n return fields.split(',').map((f) => f.trim()).filter((f) => f.length > 0);\r\n }\r\n return [];\r\n}\r\n\r\n/**\r\n * Joins fields array into a comma-separated string\r\n * Useful for API requests that expect fields as a string\r\n *\r\n * @param fields - Array of field names\r\n * @returns Comma-separated string of fields\r\n */\r\nexport function joinFields(fields: string[]): string {\r\n return fields.join(',');\r\n}\r\n\r\n/**\r\n * Checks if a fields input represents \"select all\"\r\n *\r\n * @param fields - Fields input (string or array)\r\n * @returns True if fields is '*' or ['*'] or empty\r\n */\r\nexport function isSelectAll(fields: string | string[]): boolean {\r\n if (Array.isArray(fields)) {\r\n return fields.length === 0 || (fields.length === 1 && fields[0] === '*');\r\n }\r\n return !fields || fields === '*';\r\n}\r\n\r\n/**\r\n * Deep clones an object\r\n * Used for safely copying configuration objects\r\n *\r\n * @param obj - Object to clone\r\n * @returns Deep cloned copy of the object\r\n */\r\nexport function deepClone<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * Checks if a value is a plain object (not array, null, etc.)\r\n *\r\n * @param value - Value to check\r\n * @returns True if value is a plain object\r\n */\r\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n","import type { QueryOperator } from '../types/query';\r\n\r\n/**\r\n * Escapes special characters in query values to prevent query injection.\r\n * This is a security measure to ensure user-provided values cannot modify\r\n * the query structure or inject additional query logic.\r\n *\r\n * @param value - The value to escape\r\n * @returns Escaped value safe for use in Fireberry queries\r\n */\r\nexport function escapeQueryValue(value: string): string {\r\n if (!value) {\r\n return '';\r\n }\r\n // Escape backslashes first to avoid double-escaping\r\n let escaped = value.replace(/\\\\/g, '\\\\\\\\');\r\n // Escape parentheses which could break out of conditions\r\n escaped = escaped.replace(/\\(/g, '\\\\(');\r\n escaped = escaped.replace(/\\)/g, '\\\\)');\r\n // Escape logical operators that could inject additional conditions\r\n // Using word boundaries to only match standalone operators\r\n escaped = escaped.replace(/\\bor\\b/gi, '\\\\or');\r\n escaped = escaped.replace(/\\band\\b/gi, '\\\\and');\r\n return escaped;\r\n}\r\n\r\n/**\r\n * Sanitizes a query string to ensure proper syntax for the Fireberry API\r\n * Handles common syntax issues and removes extraneous elements\r\n *\r\n * @param query - Query string to sanitize\r\n * @returns Sanitized query string\r\n */\r\nexport function sanitizeQuery(query: string): string {\r\n if (!query) {\r\n return '';\r\n }\r\n\r\n // First, protect special operators from being modified\r\n // Temporarily mark is-null and is-not-null operators\r\n query = query.replace(\r\n /\\(\\s*([a-zA-Z0-9_]+)\\s+(is-null|is-not-null)\\s*\\)/g,\r\n '($1 __SPECIAL_OPERATOR__$2)',\r\n );\r\n\r\n // Also protect text operators like start-with, not-start-with\r\n query = query.replace(\r\n /\\(\\s*([a-zA-Z0-9_]+)\\s+(start-with|not-start-with)\\s+([^)]+)\\s*\\)/g,\r\n '($1 __TEXT_OPERATOR__$2 $3)',\r\n );\r\n\r\n // Fix missing operators: (field value) -> (field = value)\r\n query = query.replace(\r\n /\\(\\s*([a-zA-Z0-9_]+(?:field|Field|system|System)[0-9]*)\\s+(?!__SPECIAL_OPERATOR__|__TEXT_OPERATOR__)([^()<>=!]+)\\s*\\)/g,\r\n '($1 = $2)',\r\n );\r\n\r\n // Fix with a more general pattern for any field-value pair without operator\r\n query = query.replace(\r\n /\\(\\s*([a-zA-Z0-9_]+)\\s+(?!__SPECIAL_OPERATOR__|__TEXT_OPERATOR__|<=|>=|!=|<|>|=\\s)([^()<>]+)\\s*\\)/g,\r\n '($1 = $2)',\r\n );\r\n\r\n // Restore special operators\r\n query = query.replace(/__SPECIAL_OPERATOR__/g, '');\r\n query = query.replace(/__TEXT_OPERATOR__/g, '');\r\n\r\n // Remove parentheses containing only a comparison operator\r\n query = query.replace(/\\(\\s*(?:<=|>=|!=|<|>|=)\\s*\\)/g, '');\r\n // Remove parentheses containing only text operators\r\n query = query.replace(/\\(\\s*(?:start-with|not-start-with)\\s*\\)/gi, '');\r\n // Remove parentheses containing only logical operators (AND/OR)\r\n query = query.replace(/\\(\\s*(?:and|or)\\s*\\)/gi, '');\r\n // Remove empty parentheses\r\n query = query.replace(/\\(\\s*\\)/g, '');\r\n // Remove logical operators without operands at start/end\r\n query = query.replace(/^\\s*(and|or)\\s*/gi, '');\r\n query = query.replace(/\\s*(and|or)\\s*$/gi, '');\r\n // Remove redundant nested parentheses: ((x)) -> (x)\r\n const nestedPattern = /\\(\\s*\\(([^()]+)\\)\\s*\\)/g;\r\n while (nestedPattern.test(query)) {\r\n query = query.replace(nestedPattern, '($1)');\r\n }\r\n // Collapse multiple spaces\r\n query = query.replace(/\\s+/g, ' ');\r\n return query.trim();\r\n}\r\n\r\n/**\r\n * Condition builder for fluent query construction\r\n */\r\nexport interface ConditionBuilder {\r\n /** Equals comparison (=) */\r\n equals(value: string | number): QueryBuilder;\r\n /** Not equals comparison (!=) */\r\n notEquals(value: string | number): QueryBuilder;\r\n /** Less than comparison (<) - works with numbers and dates */\r\n lessThan(value: string | number): QueryBuilder;\r\n /** Greater than comparison (>) - works with numbers and dates */\r\n greaterThan(value: string | number): QueryBuilder;\r\n /** Less than or equal (<=) - works with numbers ONLY (not dates!) */\r\n lessThanOrEqual(value: string | number): QueryBuilder;\r\n /** Greater than or equal (>=) - works with numbers ONLY (not dates!) */\r\n greaterThanOrEqual(value: string | number): QueryBuilder;\r\n /** Contains value (translates to start-with %value) */\r\n contains(value: string): QueryBuilder;\r\n /** Does not contain value (translates to not-start-with %value) */\r\n notContains(value: string): QueryBuilder;\r\n /** Starts with value (start-with) */\r\n startsWith(value: string): QueryBuilder;\r\n /** Does not start with value (not-start-with) */\r\n notStartsWith(value: string): QueryBuilder;\r\n /** Field is null (is-null) */\r\n isNull(): QueryBuilder;\r\n /** Field is not null (is-not-null) */\r\n isNotNull(): QueryBuilder;\r\n}\r\n\r\n/**\r\n * Internal representation of a query condition\r\n */\r\ninterface QueryCondition {\r\n field: string;\r\n operator: QueryOperator;\r\n value?: string;\r\n}\r\n\r\n/**\r\n * Fluent query builder for constructing Fireberry queries\r\n *\r\n * @example\r\n * ```typescript\r\n * // Build a query string\r\n * const query = new QueryBuilder()\r\n * .where('statuscode').equals('1')\r\n * .and()\r\n * .where('emailaddress1').contains('@example.com')\r\n * .build();\r\n * // Output: \"(statuscode = 1) and (emailaddress1 start-with %@example.com)\"\r\n *\r\n * // With select and execute (requires client)\r\n * const result = await new QueryBuilder(client)\r\n * .objectType('1')\r\n * .select('accountid', 'name', 'emailaddress1')\r\n * .where('statuscode').equals('1')\r\n * .limit(100)\r\n * .execute();\r\n * ```\r\n */\r\n/**\r\n * Client interface for query execution\r\n */\r\ninterface QueryClient {\r\n query(options: {\r\n objectType: string;\r\n fields: string[];\r\n query: string;\r\n showRealValue: boolean;\r\n sortBy?: string;\r\n sortType?: 'asc' | 'desc';\r\n limit?: number;\r\n page?: number;\r\n signal?: AbortSignal;\r\n }): Promise<QueryResult>;\r\n}\r\n\r\n/**\r\n * Query result type\r\n */\r\ninterface QueryResult {\r\n records: Record<string, unknown>[];\r\n total: number;\r\n success: boolean;\r\n}\r\n\r\nexport class QueryBuilder {\r\n private conditions: QueryCondition[] = [];\r\n private joinOperators: ('and' | 'or')[] = [];\r\n private currentField: string | null = null;\r\n private selectedFields: string[] = [];\r\n private objectTypeId: string | null = null;\r\n private sortByField: string | null = null;\r\n private sortDirection: 'asc' | 'desc' = 'desc';\r\n private limitValue: number | null = null;\r\n private pageNumber: number = 1;\r\n private showRealValueFlag: boolean = true;\r\n private client: QueryClient | null = null;\r\n\r\n /**\r\n * Creates a new QueryBuilder\r\n * @param client - Optional FireberryClient for executing queries\r\n */\r\n constructor(client?: QueryClient) {\r\n this.client = client ?? null;\r\n }\r\n\r\n /**\r\n * Sets the object type for the query\r\n * @param objectType - Object type ID (e.g., '1' for Account)\r\n */\r\n objectType(objectType: string | number): this {\r\n this.objectTypeId = String(objectType);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds fields to select\r\n * @param fields - Field names to select\r\n */\r\n select(...fields: string[]): this {\r\n this.selectedFields.push(...fields);\r\n return this;\r\n }\r\n\r\n /**\r\n * Starts a new WHERE condition\r\n * @param field - Field name to filter on\r\n */\r\n where(field: string): ConditionBuilder {\r\n this.currentField = field;\r\n return this.createConditionBuilder();\r\n }\r\n\r\n /**\r\n * Adds an AND logical operator\r\n */\r\n and(): this {\r\n if (this.conditions.length > 0) {\r\n this.joinOperators.push('and');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds an OR logical operator\r\n */\r\n or(): this {\r\n if (this.conditions.length > 0) {\r\n this.joinOperators.push('or');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the sort field and direction\r\n * @param field - Field to sort by\r\n * @param direction - Sort direction ('asc' or 'desc')\r\n */\r\n sortBy(field: string, direction: 'asc' | 'desc' = 'desc'): this {\r\n this.sortByField = field;\r\n this.sortDirection = direction;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the maximum number of records to return\r\n * @param count - Maximum record count\r\n */\r\n limit(count: number): this {\r\n this.limitValue = count;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the page number for pagination\r\n * @param page - Page number (1-based)\r\n */\r\n page(page: number): this {\r\n this.pageNumber = page;\r\n return this;\r\n }\r\n\r\n /**\r\n * Controls whether to show real values (labels) for dropdown fields\r\n * @param show - Whether to show real values (default: true)\r\n */\r\n showRealValue(show: boolean): this {\r\n this.showRealValueFlag = show;\r\n return this;\r\n }\r\n\r\n /**\r\n * Builds the query string from conditions\r\n * @returns The built query string\r\n */\r\n build(): string {\r\n if (this.conditions.length === 0) {\r\n return '';\r\n }\r\n\r\n const parts: string[] = [];\r\n\r\n for (let i = 0; i < this.conditions.length; i++) {\r\n const condition = this.conditions[i];\r\n let conditionStr: string;\r\n\r\n if (condition.operator === 'is-null' || condition.operator === 'is-not-null') {\r\n conditionStr = `(${condition.field} ${condition.operator})`;\r\n } else {\r\n const escapedValue = escapeQueryValue(condition.value || '');\r\n conditionStr = `(${condition.field} ${condition.operator} ${escapedValue})`;\r\n }\r\n\r\n parts.push(conditionStr);\r\n\r\n // Add join operator if there's a next condition\r\n if (i < this.joinOperators.length) {\r\n parts.push(this.joinOperators[i]);\r\n }\r\n }\r\n\r\n return parts.join(' ');\r\n }\r\n\r\n /**\r\n * Returns the selected fields array\r\n * Useful for inspecting the query configuration\r\n */\r\n getFields(): string[] {\r\n return [...this.selectedFields];\r\n }\r\n\r\n /**\r\n * Converts the query builder state to a payload compatible with @fireberry/sdk\r\n *\r\n * @returns Object with `fields` (comma-separated string) and `query` (filter string)\r\n *\r\n * @example\r\n * ```typescript\r\n * import FireberryClientSDK from '@fireberry/sdk/client';\r\n * import { QueryBuilder } from 'fireberry-api-client';\r\n *\r\n * const sdk = new FireberryClientSDK();\r\n * await sdk.initializeContext();\r\n *\r\n * const payload = new QueryBuilder()\r\n * .select('accountid', 'accountname')\r\n * .where('statuscode').equals('1')\r\n * .toSDKPayload();\r\n *\r\n * // Use with SDK\r\n * const results = await sdk.api.query(1, payload);\r\n * ```\r\n */\r\n toSDKPayload(): { fields: string; query: string; page_size?: number; page_number?: number } {\r\n const payload: { fields: string; query: string; page_size?: number; page_number?: number } = {\r\n fields: this.selectedFields.length > 0 ? this.selectedFields.join(',') : '*',\r\n query: this.build(),\r\n };\r\n\r\n if (this.limitValue !== null) {\r\n payload.page_size = this.limitValue;\r\n }\r\n\r\n if (this.pageNumber > 1) {\r\n payload.page_number = this.pageNumber;\r\n }\r\n\r\n return payload;\r\n }\r\n\r\n /**\r\n * Executes the query (requires client to be set)\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns Query results\r\n */\r\n async execute(signal?: AbortSignal): Promise<QueryResult> {\r\n if (!this.client) {\r\n throw new Error('QueryBuilder requires a client to execute queries. Pass a FireberryClient to the constructor.');\r\n }\r\n\r\n if (!this.objectTypeId) {\r\n throw new Error('Object type is required. Use .objectType() before executing.');\r\n }\r\n\r\n const queryOptions: Parameters<QueryClient['query']>[0] = {\r\n objectType: this.objectTypeId,\r\n fields: this.selectedFields.length > 0 ? this.selectedFields : ['*'],\r\n query: this.build(),\r\n showRealValue: this.showRealValueFlag,\r\n };\r\n\r\n if (this.sortByField) {\r\n queryOptions.sortBy = this.sortByField;\r\n queryOptions.sortType = this.sortDirection;\r\n }\r\n\r\n if (this.limitValue !== null) {\r\n queryOptions.limit = this.limitValue;\r\n }\r\n\r\n if (this.pageNumber > 1) {\r\n queryOptions.page = this.pageNumber;\r\n }\r\n\r\n if (signal) {\r\n queryOptions.signal = signal;\r\n }\r\n\r\n return this.client.query(queryOptions);\r\n }\r\n\r\n /**\r\n * Creates a condition builder for the current field\r\n */\r\n private createConditionBuilder(): ConditionBuilder {\r\n const field = this.currentField!;\r\n\r\n return {\r\n equals: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '=', String(value));\r\n return this;\r\n },\r\n notEquals: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '!=', String(value));\r\n return this;\r\n },\r\n lessThan: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '<', String(value));\r\n return this;\r\n },\r\n greaterThan: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '>', String(value));\r\n return this;\r\n },\r\n lessThanOrEqual: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '<=', String(value));\r\n return this;\r\n },\r\n greaterThanOrEqual: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '>=', String(value));\r\n return this;\r\n },\r\n contains: (value: string): QueryBuilder => {\r\n // Contains translates to \"start-with %value\"\r\n this.addCondition(field, 'start-with', `%${value}`);\r\n return this;\r\n },\r\n notContains: (value: string): QueryBuilder => {\r\n // Not contains translates to \"not-start-with %value\"\r\n this.addCondition(field, 'not-start-with', `%${value}`);\r\n return this;\r\n },\r\n startsWith: (value: string): QueryBuilder => {\r\n this.addCondition(field, 'start-with', value);\r\n return this;\r\n },\r\n notStartsWith: (value: string): QueryBuilder => {\r\n this.addCondition(field, 'not-start-with', value);\r\n return this;\r\n },\r\n isNull: (): QueryBuilder => {\r\n this.addCondition(field, 'is-null');\r\n return this;\r\n },\r\n isNotNull: (): QueryBuilder => {\r\n this.addCondition(field, 'is-not-null');\r\n return this;\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Adds a condition to the query\r\n */\r\n private addCondition(field: string, operator: QueryOperator, value?: string): void {\r\n this.conditions.push({ field, operator, value });\r\n this.currentField = null;\r\n }\r\n}\r\n","/**\r\n * Fields to exclude from queries when using '*' (all fields) for specific object types\r\n * These fields cause API errors when queried\r\n */\r\nexport const EXCLUDED_FIELDS_FOR_STAR_QUERY: Record<string, string[]> = {\r\n '7': ['deletedon', 'deletedby'], // Note\r\n '8': ['deletedon', 'deletedby'], // Competitor\r\n '114': ['deletedon', 'deletedby'], // Calendar Resource\r\n '115': ['deletedon', 'deletedby'], // Customer Journey\r\n '116': ['deletedon', 'deletedby'], // Profile\r\n '117': ['deletedon', 'deletedby'], // Landing Page\r\n};\r\n\r\n/**\r\n * Fields to exclude from lookup relation queries across ALL object types\r\n * These fields cause API errors when queried for lookup relationships\r\n */\r\nexport const EXCLUDED_LOOKUP_FIELDS: string[] = ['deletedby', 'deletedon'];\r\n\r\n/**\r\n * Checks if a field should be excluded from star queries for a given object type\r\n *\r\n * @param objectType - The object type ID\r\n * @param fieldName - The field name to check\r\n * @returns True if the field should be excluded\r\n */\r\nexport function isExcludedFromStarQuery(objectType: string | number, fieldName: string): boolean {\r\n const objectTypeStr = String(objectType);\r\n const excludedFields = EXCLUDED_FIELDS_FOR_STAR_QUERY[objectTypeStr];\r\n return excludedFields ? excludedFields.includes(fieldName) : false;\r\n}\r\n\r\n/**\r\n * Gets the list of excluded fields for a given object type\r\n *\r\n * @param objectType - The object type ID\r\n * @returns Array of field names to exclude, or empty array if none\r\n */\r\nexport function getExcludedFieldsForStarQuery(objectType: string | number): string[] {\r\n const objectTypeStr = String(objectType);\r\n return EXCLUDED_FIELDS_FOR_STAR_QUERY[objectTypeStr] || [];\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../src/constants/objectIds.ts","../../src/constants/objectNames.ts","../../src/utils/fieldMapping.ts","../../src/constants/fieldTypes.ts","../../src/utils/fieldTypes.ts","../../src/utils/helpers.ts","../../src/utils/queryBuilder.ts","../../src/constants/excludedFields.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Object Type ID to Primary Key Field Mapping\r\n * Maps Fireberry object type IDs to their primary key field names\r\n * Generated from actual API responses\r\n */\r\nexport const OBJECT_ID_MAP: Record<number, string> = {\r\n 1: 'accountid', // Account\r\n 2: 'contactid', // Contact\r\n 3: 'leadid', // Lead\r\n 4: 'opportunityid', // Opportunity\r\n 5: 'casesid', // Cases\r\n 6: 'activityid', // Activity\r\n 7: 'noteid', // Note\r\n 8: 'competitorid', // Competitor\r\n 9: 'crmuserid', // CrmUser\r\n 10: 'taskid', // Task\r\n 12: 'quoteid', // Quote\r\n 13: 'crmorderid', // CrmOrder\r\n 14: 'productid', // Product\r\n 17: 'crmorderitemid', // CrmOrderItem\r\n 20: 'emailtemplateid', // EmailTemplate\r\n 23: 'businessunitid', // BusinessUnit\r\n 25: 'orgid', // Org\r\n 27: 'printtemplateid', // PrintTemplate\r\n 28: 'contractid', // Contract\r\n 33: 'accountproductid', // AccountProduct\r\n 46: 'projectid', // Project\r\n 55: 'wfruleid', // WFRule\r\n 58: 'mdobjectid', // MDObject\r\n 64: 'roleid', // Role\r\n 67: 'campaignid', // Campaign\r\n 70: 'crmuserloginid', // CrmUserLogin\r\n 73: 'systemfieldid', // SystemField\r\n 76: 'articleid', // Article\r\n 77: 'linkid', // Link\r\n 78: 'invoiceid', // Invoice\r\n 80: 'invoicereceiptitemid', // InvoiceReceiptItem\r\n 81: 'invoiceid', // InvoiceNo\r\n 82: 'invoiceid', // InvoiceDraft\r\n 83: 'invoiceid', // InvoiceReceipt\r\n 84: 'invoiceid', // InvoiceReno\r\n 85: 'invoiceid', // InvoiceCredit\r\n 86: 'invoiceid', // InvoiceDelivery\r\n 89: 'iprestrictionid', // IpRestriction\r\n 90: 'transactionitemid', // TransactionItem\r\n 93: 'chargeid', // Charge\r\n 100: 'calllogid', // calllog\r\n 101: 'attendanceclockid', // AttendanceClock\r\n 102: 'activitylogid', // ActivityLog\r\n 104: 'conversationid', // Conversation\r\n 105: 'teaminboxid', // TeamInbox\r\n 106: 'texttemplateid', // TextTemplate\r\n 107: 'facebookconnectionid', // FacebookConnection\r\n 109: 'auditlogid', // AuditLog\r\n 110: 'smstemplateid', // SMSTemplate\r\n 111: 'providerverificationid', // ProviderVerification\r\n 114: 'calendarresourceid', // CalendarResource\r\n 115: 'journeyid', // Journey\r\n 116: 'profileid', // Profile\r\n 117: 'landingpageid', // LandingPage\r\n};\r\n\r\n/**\r\n * Gets the primary key field name for a given object type\r\n *\r\n * @param objectTypeId - The numeric object type ID\r\n * @returns The correct ID field name for the object type\r\n */\r\nexport function getObjectIdFieldName(objectTypeId: string | number): string {\r\n const objectTypeNum =\r\n typeof objectTypeId === 'string' ? parseInt(objectTypeId, 10) : objectTypeId;\r\n\r\n // Check if it's a mapped base object\r\n if (OBJECT_ID_MAP[objectTypeNum]) {\r\n return OBJECT_ID_MAP[objectTypeNum];\r\n }\r\n\r\n // For custom objects (1000 and up), use the pattern customobjectXid\r\n if (objectTypeNum >= 1000) {\r\n return `customobject${objectTypeNum}id`;\r\n }\r\n\r\n // Fallback to generic 'id' for unmapped objects\r\n return 'id';\r\n}\r\n","/**\r\n * Object Type ID to Name Field Mapping\r\n * Maps Fireberry object type IDs to their display name field\r\n * Generated from actual API responses\r\n */\r\nexport const OBJECT_NAME_MAP: Record<number, string> = {\r\n 1: 'accountname', // Account\r\n 2: 'fullname', // Contact\r\n 3: 'fullname', // Lead\r\n 4: 'name', // Opportunity\r\n 5: 'title', // Cases\r\n 6: 'subject', // Activity\r\n 7: 'notetext', // Note\r\n 8: 'competitorname', // Competitor\r\n 9: 'fullname', // CrmUser\r\n 10: 'subject', // Task\r\n 12: 'quotenumber', // Quote\r\n 13: 'crmordernumber', // CrmOrder\r\n 14: 'name', // Product\r\n 17: 'productname', // CrmOrderItem\r\n 20: 'title', // EmailTemplate\r\n 23: 'name', // BusinessUnit\r\n 25: 'orgname', // Org\r\n 27: 'name', // PrintTemplate\r\n 28: 'contractname', // Contract\r\n 33: 'productid', // AccountProduct (uses productid as display)\r\n 46: 'projectname', // Project\r\n 55: 'rulename', // WFRule\r\n 58: 'name', // MDObject\r\n 64: 'rolename', // Role\r\n 67: 'campaignname', // Campaign\r\n 70: 'browsername', // CrmUserLogin\r\n 73: 'label', // SystemField (using label as name field)\r\n 76: 'articlename', // Article\r\n 77: 'linkname', // Link\r\n 78: 'invoicenumber', // Invoice\r\n 80: 'documentnumber', // InvoiceReceiptItem\r\n 81: 'invoicenumber', // InvoiceNo\r\n 82: 'invoicenumber', // InvoiceDraft\r\n 83: 'invoicenumber', // InvoiceReceipt\r\n 84: 'invoicenumber', // InvoiceReno\r\n 85: 'invoicenumber', // InvoiceCredit\r\n 86: 'invoicenumber', // InvoiceDelivery\r\n 89: 'name', // IpRestriction\r\n 90: 'documentnumber', // TransactionItem\r\n 93: 'name', // Charge\r\n 100: 'callerid', // calllog\r\n 101: 'name', // AttendanceClock\r\n 102: 'activitylognumber', // ActivityLog\r\n 104: 'subject', // Conversation\r\n 105: 'name', // TeamInbox\r\n 106: 'name', // TextTemplate\r\n 107: 'name', // FacebookConnection\r\n 109: 'name', // AuditLog\r\n 110: 'name', // SMSTemplate\r\n 111: 'name', // ProviderVerification\r\n 114: 'name', // CalendarResource\r\n 115: 'name', // Journey\r\n 116: 'name', // Profile\r\n 117: 'name', // LandingPage\r\n};\r\n\r\n/**\r\n * Gets the display name field for a given object type\r\n *\r\n * @param objectTypeId - The numeric object type ID\r\n * @returns The name field for the object type\r\n */\r\nexport function getNameFieldByObjectType(objectTypeId: string | number): string {\r\n const objectTypeNum =\r\n typeof objectTypeId === 'string' ? parseInt(objectTypeId, 10) : objectTypeId;\r\n\r\n // Check if it's a mapped base object\r\n if (OBJECT_NAME_MAP[objectTypeNum]) {\r\n return OBJECT_NAME_MAP[objectTypeNum];\r\n }\r\n\r\n // For custom objects (1000 and up), use 'name'\r\n if (objectTypeNum >= 1000) {\r\n return 'name';\r\n }\r\n\r\n // Fallback to 'name' for unmapped objects\r\n return 'name';\r\n}\r\n","/**\r\n * Special field name mappings that don't follow standard patterns\r\n * Key: original field name, Value: corresponding label field\r\n */\r\nconst SPECIAL_LABEL_FIELD_MAPPINGS: Record<string, string> = {\r\n objectid: 'objecttitle',\r\n lastactionid: 'lastactiontitle',\r\n wfruleid: 'rulename', // Object 55 (Workflow Rules)\r\n noteid: 'subject', // Object 7 (Note) - noteid maps to subject\r\n};\r\n\r\n/**\r\n * Fields ending with \"id\" that should NOT have \"id\" replaced with \"name\"\r\n * These fields will use the default append \"name\" behavior instead\r\n */\r\nconst EXCLUDED_ID_FIELDS: string[] = [\r\n 'businessunitid', // → businessunitidname (not businessunitname)\r\n 'crmuserid', // → no name field exists\r\n 'languageid', // → languageidname (not languagename)\r\n];\r\n\r\n/**\r\n * Fields ending with \"code\" that should NOT have \"code\" removed\r\n * These fields will use the default append \"name\" behavior instead\r\n */\r\nconst EXCLUDED_CODE_FIELDS: string[] = [\r\n 'duplicaterecordcode', // → duplicaterecordcodename (not duplicaterecord)\r\n];\r\n\r\n/**\r\n * Fields that have NO corresponding label field at all\r\n * These fields should not have any name transformation applied\r\n * Return empty string to signal \"no label field exists\"\r\n */\r\nconst FIELDS_WITHOUT_LABEL_FIELD: string[] = [\r\n 'systemfieldid', // Object 73 - no name field exists\r\n 'fieldobjecttype', // Object 73 - base field doesn't exist, only *name exists\r\n 'invoiceid', // Objects 78, 81 - no name field exists\r\n 'calllogid', // Object 100 - no name field exists (primary key)\r\n 'attendanceclockid', // Object 101 - no name field exists (primary key)\r\n 'activitylogid', // Object 102 - no name field exists (primary key)\r\n 'conversationid', // Object 104 - no name field exists (primary key)\r\n 'texttemplateid', // Text Template - no name field exists (primary key)\r\n 'smstemplateid', // Object 110 - no name field exists (primary key)\r\n 'deletedby', // Object 7 - no name field exists\r\n 'recordid', // Object 7 - no name field exists\r\n 'objecttypecode', // Object 7 - no name field exists\r\n];\r\n\r\n/**\r\n * Object-type specific overrides for field name transformations\r\n * Key: object type ID, Value: { excludedIdFields, excludedCodeFields }\r\n */\r\nconst OBJECT_TYPE_OVERRIDES: Record<\r\n number,\r\n { excludedIdFields?: string[]; excludedCodeFields?: string[] }\r\n> = {\r\n // CRM Orders (13) - uses *idname and *codename patterns\r\n 13: {\r\n excludedIdFields: ['ownerid', 'accountid', 'printtemplateid', 'pcfaccountid'],\r\n excludedCodeFields: [\r\n 'rounddiscountcode',\r\n 'taxincludecode',\r\n 'currencycode',\r\n 'transmissioncode',\r\n 'creditrejectioncode1',\r\n 'creditrejectioncode2',\r\n 'apartmentcode1',\r\n 'apartmentcode2',\r\n 'restrictioncode1',\r\n 'restrictioncode2',\r\n 'casescode1',\r\n 'casescode2',\r\n 'returncode1',\r\n 'returncode2',\r\n 'statuscode',\r\n ],\r\n },\r\n // Products (14)\r\n 14: {\r\n excludedCodeFields: ['categorycode'], // → categoryname (not category)\r\n },\r\n // CRM Order Items (17) - uses *idname pattern\r\n 17: {\r\n excludedIdFields: ['crmorderid', 'productid', 'ownerid'],\r\n },\r\n // Email Templates (20)\r\n 20: {\r\n excludedIdFields: ['mdobjectid'],\r\n },\r\n // Print Templates (27)\r\n 27: {\r\n excludedIdFields: ['mdobjectid'],\r\n },\r\n // System Fields (73) - uses *idname pattern\r\n 73: {\r\n excludedIdFields: ['mdobjectid', 'ownerid'],\r\n },\r\n // Invoices (78) - uses *codename and *idname patterns extensively\r\n 78: {\r\n excludedIdFields: [\r\n 'crmorderid',\r\n 'invoicereceiptid',\r\n 'accountid',\r\n 'ownerid',\r\n 'invoicerenoid',\r\n ],\r\n excludedCodeFields: [\r\n 'taxincludecode',\r\n 'depositcode',\r\n 'rounddiscountcode',\r\n 'currencycode',\r\n 'statecode',\r\n 'invoicetypecode',\r\n ],\r\n },\r\n // Invoice No (81) - uses *codename and *idname patterns extensively\r\n 81: {\r\n excludedIdFields: [\r\n 'ownerid',\r\n 'invoicecreditid',\r\n 'crmorderid',\r\n 'invoicereceiptid',\r\n 'invoicedeliveryid',\r\n 'accountid',\r\n ],\r\n excludedCodeFields: ['currencycode', 'rounddiscountcode', 'statecode', 'taxincludecode'],\r\n },\r\n // Invoice Draft (82) - uses *codename and *idname patterns extensively\r\n 82: {\r\n excludedIdFields: ['accountid', 'crmorderid', 'ownerid', 'invoicerenoid'],\r\n excludedCodeFields: ['taxincludecode', 'statecode', 'rounddiscountcode', 'currencycode'],\r\n },\r\n // Invoice Receipt (83) - uses *codename and *idname patterns\r\n 83: {\r\n excludedIdFields: ['invoicenoid', 'crmorderid', 'ownerid', 'accountid'],\r\n excludedCodeFields: ['statecode', 'currencycode'],\r\n },\r\n // Invoice Tax Receipt (84) - uses *codename and *idname patterns\r\n 84: {\r\n excludedIdFields: ['crmorderid', 'ownerid', 'invoicecreditid', 'accountid'],\r\n excludedCodeFields: ['rounddiscountcode', 'statecode', 'taxincludecode', 'currencycode'],\r\n },\r\n // Invoice Credit (85) - uses *codename and *idname patterns\r\n 85: {\r\n excludedIdFields: ['ownerid', 'crmorderid', 'accountid'],\r\n excludedCodeFields: ['taxincludecode', 'rounddiscountcode', 'currencycode', 'statecode'],\r\n },\r\n // Invoice (86) - uses *codename and *idname patterns\r\n 86: {\r\n excludedIdFields: ['accountid', 'ownerid', 'crmorderid'],\r\n excludedCodeFields: ['statecode', 'rounddiscountcode', 'currencycode', 'taxincludecode'],\r\n },\r\n // Call Log (100) - uses *idname pattern\r\n 100: {\r\n excludedIdFields: ['contactid', 'leadid', 'accountid', 'ownerid'],\r\n },\r\n // Attendance Clock (101) - uses *idname pattern\r\n 101: {\r\n excludedIdFields: ['ownerid'],\r\n },\r\n // Activity Log (102) - uses *idname and *codename patterns\r\n 102: {\r\n excludedIdFields: ['contactid', 'ownerid'],\r\n excludedCodeFields: ['objecttypecode', 'typecode', 'resultcode'],\r\n },\r\n // Conversation (104) - uses *idname pattern\r\n 104: {\r\n excludedIdFields: ['leadid', 'ownerid', 'contactid', 'accountid'],\r\n },\r\n // Text Template (106) - uses *idname pattern\r\n 106: {\r\n excludedIdFields: ['ownerid'],\r\n },\r\n // SMS Template (110) - uses *idname pattern\r\n 110: {\r\n excludedIdFields: ['ownerid'],\r\n },\r\n};\r\n\r\n/**\r\n * Converts a field API name to its corresponding label field.\r\n *\r\n * Rules:\r\n * - Special mappings (e.g., objectid → objecttitle)\r\n * - Fields starting with \"pcf\" (custom fields): append \"name\" → pcf_field → pcf_fieldname\r\n * - Fields ending with \"code\" (unless excluded): remove \"code\" → statuscode → status\r\n * - Fields ending with \"id\" (unless excluded): replace \"id\" with \"name\" → accountid → accountname\r\n * - All other fields: append \"name\"\r\n *\r\n * @param fieldName - The field API name\r\n * @param objectType - The object type ID (required for object-specific overrides)\r\n * @returns The corresponding label field, or empty string if no label field exists\r\n */\r\nexport function getLabelFieldForField(fieldName: string, objectType: string | number): string {\r\n // Check special mappings first\r\n if (SPECIAL_LABEL_FIELD_MAPPINGS[fieldName]) {\r\n return SPECIAL_LABEL_FIELD_MAPPINGS[fieldName];\r\n }\r\n\r\n // Check if field has no label field at all - return empty string\r\n if (FIELDS_WITHOUT_LABEL_FIELD.includes(fieldName)) {\r\n return '';\r\n }\r\n\r\n // Check for custom object primary keys (customobject{N}id pattern) → name\r\n if (/^customobject\\d+id$/.test(fieldName)) {\r\n return 'name';\r\n }\r\n\r\n // Custom fields (pcf prefix) - just append \"name\"\r\n if (fieldName.startsWith('pcf')) {\r\n return `${fieldName}name`;\r\n }\r\n\r\n // Get object-type specific overrides\r\n const objectTypeNum =\r\n typeof objectType === 'string' ? parseInt(objectType, 10) : objectType;\r\n const overrides = OBJECT_TYPE_OVERRIDES[objectTypeNum] || null;\r\n\r\n // For custom objects (1000+), add default exclusions\r\n const isCustomObject = objectTypeNum >= 1000;\r\n const customObjectExclusions = isCustomObject ? ['ownerid'] : [];\r\n\r\n // Combine global and object-specific exclusions\r\n const excludedCodeFields = [\r\n ...EXCLUDED_CODE_FIELDS,\r\n ...(overrides?.excludedCodeFields || []),\r\n ];\r\n const excludedIdFields = [\r\n ...EXCLUDED_ID_FIELDS,\r\n ...(overrides?.excludedIdFields || []),\r\n ...customObjectExclusions,\r\n ];\r\n\r\n // Remove \"code\" suffix (unless excluded) → statuscode → status\r\n if (fieldName.endsWith('code') && !excludedCodeFields.includes(fieldName)) {\r\n return fieldName.slice(0, -4);\r\n }\r\n\r\n // Replace \"id\" suffix with \"name\" (unless excluded) → accountid → accountname\r\n if (fieldName.endsWith('id') && !excludedIdFields.includes(fieldName)) {\r\n return fieldName.slice(0, -2) + 'name';\r\n }\r\n\r\n // Default: append \"name\"\r\n return `${fieldName}name`;\r\n}\r\n","/**\r\n * Field Type System IDs from Fireberry CRM\r\n * These UUIDs identify different field types in the metadata API\r\n */\r\nexport const FIELD_TYPE_IDS = {\r\n DROPDOWN: 'b4919f2e-2996-48e4-a03c-ba39fb64386c',\r\n LOOKUP: 'a8fcdf65-91bc-46fd-82f6-1234758345a1',\r\n EMAIL: 'c713d2f7-8fa9-43c3-8062-f07486eaf567',\r\n TEXT: 'a1e7ed6f-5083-477b-b44c-9943a6181359',\r\n URL: 'c820d32f-44df-4c2a-9c1e-18734e864fd5',\r\n LONG_TEXT: '80108f9d-1e75-40fa-9fa9-02be4ddc1da1',\r\n DATETIME: 'ce972d02-5013-46d4-9d1d-f09df1ac346a',\r\n DATE: '83bf530c-e04c-462b-9ffc-a46f750fc072',\r\n HTML: 'ed2ad39d-32fc-4585-8f5b-2e93463f050a',\r\n TELEPHONE: '3f62f67a-1cee-403a-bec6-aa02a9804edb',\r\n NUMERIC: '6a34bfe3-fece-4da1-9136-a7b1e5ae3319',\r\n} as const;\r\n\r\n/**\r\n * Human-readable mappings for field types\r\n * Used for display purposes\r\n */\r\nexport const FIELD_TYPE_MAPPINGS: Record<string, string> = {\r\n [FIELD_TYPE_IDS.DROPDOWN]: 'Dropdown',\r\n [FIELD_TYPE_IDS.EMAIL]: 'Email',\r\n [FIELD_TYPE_IDS.TEXT]: 'Text',\r\n [FIELD_TYPE_IDS.LOOKUP]: 'Lookup',\r\n [FIELD_TYPE_IDS.URL]: 'URL',\r\n [FIELD_TYPE_IDS.LONG_TEXT]: 'Long Text',\r\n [FIELD_TYPE_IDS.DATETIME]: 'DateTime',\r\n [FIELD_TYPE_IDS.DATE]: 'Date',\r\n [FIELD_TYPE_IDS.HTML]: 'HTML',\r\n [FIELD_TYPE_IDS.TELEPHONE]: 'Telephone',\r\n [FIELD_TYPE_IDS.NUMERIC]: 'Number',\r\n};\r\n","import { FIELD_TYPE_IDS } from '../constants/fieldTypes';\r\n\r\n/**\r\n * Checks if a field is a dropdown type based on its systemFieldTypeId\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a dropdown\r\n */\r\nexport function isDropdownField(systemFieldTypeId: string): boolean {\r\n return systemFieldTypeId === FIELD_TYPE_IDS.DROPDOWN;\r\n}\r\n\r\n/**\r\n * Checks if a field is a lookup type based on its systemFieldTypeId\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a lookup\r\n */\r\nexport function isLookupField(systemFieldTypeId: string): boolean {\r\n return systemFieldTypeId === FIELD_TYPE_IDS.LOOKUP;\r\n}\r\n\r\n/**\r\n * Checks if a field is a dropdown or lookup type\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a dropdown or lookup\r\n */\r\nexport function isDropdownOrLookupField(systemFieldTypeId: string): boolean {\r\n return isDropdownField(systemFieldTypeId) || isLookupField(systemFieldTypeId);\r\n}\r\n\r\n/**\r\n * Checks if a field is a text type\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a text field\r\n */\r\nexport function isTextField(systemFieldTypeId: string): boolean {\r\n return systemFieldTypeId === FIELD_TYPE_IDS.TEXT;\r\n}\r\n\r\n/**\r\n * Checks if a field is a numeric type\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a numeric field\r\n */\r\nexport function isNumericField(systemFieldTypeId: string): boolean {\r\n return systemFieldTypeId === FIELD_TYPE_IDS.NUMERIC;\r\n}\r\n\r\n/**\r\n * Checks if a field is a date type (date or datetime)\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns True if the field is a date or datetime field\r\n */\r\nexport function isDateField(systemFieldTypeId: string): boolean {\r\n return (\r\n systemFieldTypeId === FIELD_TYPE_IDS.DATE ||\r\n systemFieldTypeId === FIELD_TYPE_IDS.DATETIME\r\n );\r\n}\r\n\r\n/**\r\n * Gets the field type name from its system ID\r\n *\r\n * @param systemFieldTypeId - The system field type ID from metadata\r\n * @returns Human-readable field type name, or 'Unknown' if not found\r\n */\r\nexport function getFieldTypeName(systemFieldTypeId: string): string {\r\n const typeMap: Record<string, string> = {\r\n [FIELD_TYPE_IDS.DROPDOWN]: 'Dropdown',\r\n [FIELD_TYPE_IDS.LOOKUP]: 'Lookup',\r\n [FIELD_TYPE_IDS.EMAIL]: 'Email',\r\n [FIELD_TYPE_IDS.TEXT]: 'Text',\r\n [FIELD_TYPE_IDS.URL]: 'URL',\r\n [FIELD_TYPE_IDS.LONG_TEXT]: 'Long Text',\r\n [FIELD_TYPE_IDS.DATETIME]: 'DateTime',\r\n [FIELD_TYPE_IDS.DATE]: 'Date',\r\n [FIELD_TYPE_IDS.HTML]: 'HTML',\r\n [FIELD_TYPE_IDS.TELEPHONE]: 'Telephone',\r\n [FIELD_TYPE_IDS.NUMERIC]: 'Number',\r\n };\r\n return typeMap[systemFieldTypeId] || 'Unknown';\r\n}\r\n","/**\r\n * Waits for the specified number of milliseconds\r\n * Used for rate limit handling and retry logic\r\n *\r\n * @param ms - Time to wait in milliseconds\r\n * @returns Promise that resolves after the specified time\r\n */\r\nexport function wait(ms: number): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n\r\n/**\r\n * Splits an array into chunks of specified size\r\n * Used for processing large batches in Fireberry-compatible pieces (max 20 items)\r\n *\r\n * @param array - Array to split\r\n * @param size - Maximum chunk size\r\n * @returns Array of chunks\r\n */\r\nexport function chunkArray<T>(array: T[], size: number): T[][] {\r\n const result: T[][] = [];\r\n for (let i = 0; i < array.length; i += size) {\r\n result.push(array.slice(i, i + size));\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Safely converts a value to a string for API usage\r\n * Handles null, undefined, numbers, and other types\r\n *\r\n * @param value - The value to convert\r\n * @returns String representation of the value\r\n */\r\nexport function safeStringValue(value: unknown): string {\r\n if (value === null || value === undefined) {\r\n return '';\r\n }\r\n if (typeof value === 'string') {\r\n return value;\r\n }\r\n if (typeof value === 'number' || typeof value === 'boolean') {\r\n return String(value);\r\n }\r\n if (typeof value === 'object') {\r\n return JSON.stringify(value);\r\n }\r\n return String(value);\r\n}\r\n\r\n/**\r\n * Normalizes fields input to an array\r\n * Accepts both array of strings and comma-separated string\r\n *\r\n * @param fields - Fields as array or comma-separated string\r\n * @returns Array of field names\r\n *\r\n * @example\r\n * normalizeFields('a,b,c') // ['a', 'b', 'c']\r\n * normalizeFields(['a', 'b']) // ['a', 'b']\r\n * normalizeFields('*') // ['*']\r\n */\r\nexport function normalizeFields(fields: string | string[]): string[] {\r\n if (Array.isArray(fields)) {\r\n return fields;\r\n }\r\n if (typeof fields === 'string') {\r\n // Handle empty string\r\n if (!fields.trim()) {\r\n return [];\r\n }\r\n // Split by comma and trim whitespace\r\n return fields.split(',').map((f) => f.trim()).filter((f) => f.length > 0);\r\n }\r\n return [];\r\n}\r\n\r\n/**\r\n * Joins fields array into a comma-separated string\r\n * Useful for API requests that expect fields as a string\r\n *\r\n * @param fields - Array of field names\r\n * @returns Comma-separated string of fields\r\n */\r\nexport function joinFields(fields: string[]): string {\r\n return fields.join(',');\r\n}\r\n\r\n/**\r\n * Checks if a fields input represents \"select all\"\r\n *\r\n * @param fields - Fields input (string or array)\r\n * @returns True if fields is '*' or ['*'] or empty\r\n */\r\nexport function isSelectAll(fields: string | string[]): boolean {\r\n if (Array.isArray(fields)) {\r\n return fields.length === 0 || (fields.length === 1 && fields[0] === '*');\r\n }\r\n return !fields || fields === '*';\r\n}\r\n\r\n/**\r\n * Deep clones an object\r\n * Used for safely copying configuration objects\r\n *\r\n * @param obj - Object to clone\r\n * @returns Deep cloned copy of the object\r\n */\r\nexport function deepClone<T>(obj: T): T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\n/**\r\n * Checks if a value is a plain object (not array, null, etc.)\r\n *\r\n * @param value - Value to check\r\n * @returns True if value is a plain object\r\n */\r\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n","import type { QueryOperator } from '../types/query';\r\nimport { getObjectIdFieldName } from '../constants/objectIds';\r\n\r\n/**\r\n * Escapes special characters in query values to prevent query injection.\r\n * This is a security measure to ensure user-provided values cannot modify\r\n * the query structure or inject additional query logic.\r\n *\r\n * @param value - The value to escape\r\n * @returns Escaped value safe for use in Fireberry queries\r\n */\r\nexport function escapeQueryValue(value: string): string {\r\n if (!value) {\r\n return '';\r\n }\r\n // Escape backslashes first to avoid double-escaping\r\n let escaped = value.replace(/\\\\/g, '\\\\\\\\');\r\n // Escape parentheses which could break out of conditions\r\n escaped = escaped.replace(/\\(/g, '\\\\(');\r\n escaped = escaped.replace(/\\)/g, '\\\\)');\r\n // Escape logical operators that could inject additional conditions\r\n // Using word boundaries to only match standalone operators\r\n escaped = escaped.replace(/\\bor\\b/gi, '\\\\or');\r\n escaped = escaped.replace(/\\band\\b/gi, '\\\\and');\r\n return escaped;\r\n}\r\n\r\n/**\r\n * Sanitizes a query string to ensure proper syntax for the Fireberry API\r\n * Handles common syntax issues and removes extraneous elements\r\n *\r\n * @param query - Query string to sanitize\r\n * @returns Sanitized query string\r\n */\r\nexport function sanitizeQuery(query: string): string {\r\n if (!query) {\r\n return '';\r\n }\r\n\r\n // First, protect special operators from being modified\r\n // Temporarily mark is-null and is-not-null operators\r\n query = query.replace(\r\n /\\(\\s*([a-zA-Z0-9_]+)\\s+(is-null|is-not-null)\\s*\\)/g,\r\n '($1 __SPECIAL_OPERATOR__$2)',\r\n );\r\n\r\n // Also protect text operators like start-with, not-start-with\r\n query = query.replace(\r\n /\\(\\s*([a-zA-Z0-9_]+)\\s+(start-with|not-start-with)\\s+([^)]+)\\s*\\)/g,\r\n '($1 __TEXT_OPERATOR__$2 $3)',\r\n );\r\n\r\n // Fix missing operators: (field value) -> (field = value)\r\n query = query.replace(\r\n /\\(\\s*([a-zA-Z0-9_]+(?:field|Field|system|System)[0-9]*)\\s+(?!__SPECIAL_OPERATOR__|__TEXT_OPERATOR__)([^()<>=!]+)\\s*\\)/g,\r\n '($1 = $2)',\r\n );\r\n\r\n // Fix with a more general pattern for any field-value pair without operator\r\n query = query.replace(\r\n /\\(\\s*([a-zA-Z0-9_]+)\\s+(?!__SPECIAL_OPERATOR__|__TEXT_OPERATOR__|<=|>=|!=|<|>|=\\s)([^()<>]+)\\s*\\)/g,\r\n '($1 = $2)',\r\n );\r\n\r\n // Restore special operators\r\n query = query.replace(/__SPECIAL_OPERATOR__/g, '');\r\n query = query.replace(/__TEXT_OPERATOR__/g, '');\r\n\r\n // Remove parentheses containing only a comparison operator\r\n query = query.replace(/\\(\\s*(?:<=|>=|!=|<|>|=)\\s*\\)/g, '');\r\n // Remove parentheses containing only text operators\r\n query = query.replace(/\\(\\s*(?:start-with|not-start-with)\\s*\\)/gi, '');\r\n // Remove parentheses containing only logical operators (AND/OR)\r\n query = query.replace(/\\(\\s*(?:and|or)\\s*\\)/gi, '');\r\n // Remove empty parentheses\r\n query = query.replace(/\\(\\s*\\)/g, '');\r\n // Remove logical operators without operands at start/end\r\n query = query.replace(/^\\s*(and|or)\\s*/gi, '');\r\n query = query.replace(/\\s*(and|or)\\s*$/gi, '');\r\n // Remove redundant nested parentheses: ((x)) -> (x)\r\n const nestedPattern = /\\(\\s*\\(([^()]+)\\)\\s*\\)/g;\r\n while (nestedPattern.test(query)) {\r\n query = query.replace(nestedPattern, '($1)');\r\n }\r\n // Collapse multiple spaces\r\n query = query.replace(/\\s+/g, ' ');\r\n return query.trim();\r\n}\r\n\r\n/**\r\n * Condition builder for fluent query construction\r\n */\r\nexport interface ConditionBuilder {\r\n /** Equals comparison (=) */\r\n equals(value: string | number): QueryBuilder;\r\n /** Not equals comparison (!=) */\r\n notEquals(value: string | number): QueryBuilder;\r\n /** Less than comparison (<) - works with numbers and dates */\r\n lessThan(value: string | number): QueryBuilder;\r\n /** Greater than comparison (>) - works with numbers and dates */\r\n greaterThan(value: string | number): QueryBuilder;\r\n /** Less than or equal (<=) - works with numbers ONLY (not dates!) */\r\n lessThanOrEqual(value: string | number): QueryBuilder;\r\n /** Greater than or equal (>=) - works with numbers ONLY (not dates!) */\r\n greaterThanOrEqual(value: string | number): QueryBuilder;\r\n /** Contains value (translates to start-with %value) */\r\n contains(value: string): QueryBuilder;\r\n /** Does not contain value (translates to not-start-with %value) */\r\n notContains(value: string): QueryBuilder;\r\n /** Starts with value (start-with) */\r\n startsWith(value: string): QueryBuilder;\r\n /** Does not start with value (not-start-with) */\r\n notStartsWith(value: string): QueryBuilder;\r\n /** Field is null (is-null) */\r\n isNull(): QueryBuilder;\r\n /** Field is not null (is-not-null) */\r\n isNotNull(): QueryBuilder;\r\n}\r\n\r\n/**\r\n * Internal representation of a query condition\r\n */\r\ninterface QueryCondition {\r\n field: string;\r\n operator: QueryOperator;\r\n value?: string;\r\n}\r\n\r\n/**\r\n * Fluent query builder for constructing Fireberry queries\r\n *\r\n * @example\r\n * ```typescript\r\n * // Build a query string\r\n * const query = new QueryBuilder()\r\n * .where('statuscode').equals('1')\r\n * .and()\r\n * .where('emailaddress1').contains('@example.com')\r\n * .build();\r\n * // Output: \"(statuscode = 1) and (emailaddress1 start-with %@example.com)\"\r\n *\r\n * // With select and execute (requires client)\r\n * const result = await new QueryBuilder(client)\r\n * .objectType('1')\r\n * .select('accountid', 'name', 'emailaddress1')\r\n * .where('statuscode').equals('1')\r\n * .limit(100)\r\n * .execute();\r\n * ```\r\n */\r\n/**\r\n * Client interface for query execution\r\n */\r\ninterface QueryClient {\r\n query(options: {\r\n objectType: string;\r\n fields: string[];\r\n query: string;\r\n showRealValue: boolean;\r\n sortBy?: string;\r\n sortType?: 'asc' | 'desc';\r\n limit?: number;\r\n page?: number;\r\n signal?: AbortSignal;\r\n }): Promise<QueryResult>;\r\n}\r\n\r\n/**\r\n * Query result type\r\n */\r\ninterface QueryResult {\r\n records: Record<string, unknown>[];\r\n total: number;\r\n success: boolean;\r\n}\r\n\r\nexport class QueryBuilder {\r\n private conditions: QueryCondition[] = [];\r\n private joinOperators: ('and' | 'or')[] = [];\r\n private currentField: string | null = null;\r\n private selectedFields: string[] = [];\r\n private objectTypeId: string | null = null;\r\n private sortByField: string | null = null;\r\n private sortDirection: 'asc' | 'desc' = 'desc';\r\n private limitValue: number | null = null;\r\n private pageNumber: number = 1;\r\n private showRealValueFlag: boolean = true;\r\n private client: QueryClient | null = null;\r\n\r\n /**\r\n * Creates a new QueryBuilder\r\n * @param client - Optional FireberryClient for executing queries\r\n */\r\n constructor(client?: QueryClient) {\r\n this.client = client ?? null;\r\n }\r\n\r\n /**\r\n * Sets the object type for the query\r\n * @param objectType - Object type ID (e.g., '1' for Account)\r\n */\r\n objectType(objectType: string | number): this {\r\n this.objectTypeId = String(objectType);\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds fields to select\r\n * @param fields - Field names to select\r\n */\r\n select(...fields: string[]): this {\r\n this.selectedFields.push(...fields);\r\n return this;\r\n }\r\n\r\n /**\r\n * Starts a new WHERE condition\r\n * @param field - Field name to filter on\r\n */\r\n where(field: string): ConditionBuilder {\r\n this.currentField = field;\r\n return this.createConditionBuilder();\r\n }\r\n\r\n /**\r\n * Adds a WHERE condition for the primary ID field, automatically mapped based on object type\r\n * @param value - The ID value to match\r\n * @throws Error if objectType is not set\r\n *\r\n * @example\r\n * ```typescript\r\n * // Instead of knowing the exact field name:\r\n * new QueryBuilder(client)\r\n * .objectType(1)\r\n * .whereId('abc123') // Automatically uses 'accountid' for object type 1\r\n * .execute();\r\n *\r\n * // Equivalent to:\r\n * new QueryBuilder(client)\r\n * .objectType(1)\r\n * .where('accountid').equals('abc123')\r\n * .execute();\r\n * ```\r\n */\r\n whereId(value: string | number): this {\r\n if (!this.objectTypeId) {\r\n throw new Error('Object type must be set before using whereId(). Call .objectType() first.');\r\n }\r\n const idField = getObjectIdFieldName(this.objectTypeId);\r\n this.addCondition(idField, '=', String(value));\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds an AND logical operator\r\n */\r\n and(): this {\r\n if (this.conditions.length > 0) {\r\n this.joinOperators.push('and');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds an OR logical operator\r\n */\r\n or(): this {\r\n if (this.conditions.length > 0) {\r\n this.joinOperators.push('or');\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the sort field and direction\r\n * @param field - Field to sort by\r\n * @param direction - Sort direction ('asc' or 'desc')\r\n */\r\n sortBy(field: string, direction: 'asc' | 'desc' = 'desc'): this {\r\n this.sortByField = field;\r\n this.sortDirection = direction;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the maximum number of records to return\r\n * @param count - Maximum record count\r\n */\r\n limit(count: number): this {\r\n this.limitValue = count;\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the page number for pagination\r\n * @param page - Page number (1-based)\r\n */\r\n page(page: number): this {\r\n this.pageNumber = page;\r\n return this;\r\n }\r\n\r\n /**\r\n * Controls whether to show real values (labels) for dropdown fields\r\n * @param show - Whether to show real values (default: true)\r\n */\r\n showRealValue(show: boolean): this {\r\n this.showRealValueFlag = show;\r\n return this;\r\n }\r\n\r\n /**\r\n * Builds the query string from conditions\r\n * @returns The built query string\r\n */\r\n build(): string {\r\n if (this.conditions.length === 0) {\r\n return '';\r\n }\r\n\r\n const parts: string[] = [];\r\n\r\n for (let i = 0; i < this.conditions.length; i++) {\r\n const condition = this.conditions[i];\r\n let conditionStr: string;\r\n\r\n if (condition.operator === 'is-null' || condition.operator === 'is-not-null') {\r\n conditionStr = `(${condition.field} ${condition.operator})`;\r\n } else {\r\n const escapedValue = escapeQueryValue(condition.value || '');\r\n conditionStr = `(${condition.field} ${condition.operator} ${escapedValue})`;\r\n }\r\n\r\n parts.push(conditionStr);\r\n\r\n // Add join operator if there's a next condition\r\n if (i < this.joinOperators.length) {\r\n parts.push(this.joinOperators[i]);\r\n }\r\n }\r\n\r\n return parts.join(' ');\r\n }\r\n\r\n /**\r\n * Returns the selected fields array\r\n * Useful for inspecting the query configuration\r\n */\r\n getFields(): string[] {\r\n return [...this.selectedFields];\r\n }\r\n\r\n /**\r\n * Converts the query builder state to a payload compatible with @fireberry/sdk\r\n *\r\n * @returns Object with `fields` (comma-separated string) and `query` (filter string)\r\n *\r\n * @example\r\n * ```typescript\r\n * import FireberryClientSDK from '@fireberry/sdk/client';\r\n * import { QueryBuilder } from 'fireberry-api-client';\r\n *\r\n * const sdk = new FireberryClientSDK();\r\n * await sdk.initializeContext();\r\n *\r\n * const payload = new QueryBuilder()\r\n * .select('accountid', 'accountname')\r\n * .where('statuscode').equals('1')\r\n * .toSDKPayload();\r\n *\r\n * // Use with SDK\r\n * const results = await sdk.api.query(1, payload);\r\n * ```\r\n */\r\n toSDKPayload(): { fields: string; query: string; page_size?: number; page_number?: number } {\r\n const payload: { fields: string; query: string; page_size?: number; page_number?: number } = {\r\n fields: this.selectedFields.length > 0 ? this.selectedFields.join(',') : '*',\r\n query: this.build(),\r\n };\r\n\r\n if (this.limitValue !== null) {\r\n payload.page_size = this.limitValue;\r\n }\r\n\r\n if (this.pageNumber > 1) {\r\n payload.page_number = this.pageNumber;\r\n }\r\n\r\n return payload;\r\n }\r\n\r\n /**\r\n * Executes the query (requires client to be set)\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns Query results\r\n */\r\n async execute(signal?: AbortSignal): Promise<QueryResult> {\r\n if (!this.client) {\r\n throw new Error('QueryBuilder requires a client to execute queries. Pass a FireberryClient to the constructor.');\r\n }\r\n\r\n if (!this.objectTypeId) {\r\n throw new Error('Object type is required. Use .objectType() before executing.');\r\n }\r\n\r\n const queryOptions: Parameters<QueryClient['query']>[0] = {\r\n objectType: this.objectTypeId,\r\n fields: this.selectedFields.length > 0 ? this.selectedFields : ['*'],\r\n query: this.build(),\r\n showRealValue: this.showRealValueFlag,\r\n };\r\n\r\n if (this.sortByField) {\r\n queryOptions.sortBy = this.sortByField;\r\n queryOptions.sortType = this.sortDirection;\r\n }\r\n\r\n if (this.limitValue !== null) {\r\n queryOptions.limit = this.limitValue;\r\n }\r\n\r\n if (this.pageNumber > 1) {\r\n queryOptions.page = this.pageNumber;\r\n }\r\n\r\n if (signal) {\r\n queryOptions.signal = signal;\r\n }\r\n\r\n return this.client.query(queryOptions);\r\n }\r\n\r\n /**\r\n * Creates a condition builder for the current field\r\n */\r\n private createConditionBuilder(): ConditionBuilder {\r\n const field = this.currentField!;\r\n\r\n return {\r\n equals: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '=', String(value));\r\n return this;\r\n },\r\n notEquals: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '!=', String(value));\r\n return this;\r\n },\r\n lessThan: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '<', String(value));\r\n return this;\r\n },\r\n greaterThan: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '>', String(value));\r\n return this;\r\n },\r\n lessThanOrEqual: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '<=', String(value));\r\n return this;\r\n },\r\n greaterThanOrEqual: (value: string | number): QueryBuilder => {\r\n this.addCondition(field, '>=', String(value));\r\n return this;\r\n },\r\n contains: (value: string): QueryBuilder => {\r\n // Contains translates to \"start-with %value\"\r\n this.addCondition(field, 'start-with', `%${value}`);\r\n return this;\r\n },\r\n notContains: (value: string): QueryBuilder => {\r\n // Not contains translates to \"not-start-with %value\"\r\n this.addCondition(field, 'not-start-with', `%${value}`);\r\n return this;\r\n },\r\n startsWith: (value: string): QueryBuilder => {\r\n this.addCondition(field, 'start-with', value);\r\n return this;\r\n },\r\n notStartsWith: (value: string): QueryBuilder => {\r\n this.addCondition(field, 'not-start-with', value);\r\n return this;\r\n },\r\n isNull: (): QueryBuilder => {\r\n this.addCondition(field, 'is-null');\r\n return this;\r\n },\r\n isNotNull: (): QueryBuilder => {\r\n this.addCondition(field, 'is-not-null');\r\n return this;\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * Adds a condition to the query\r\n */\r\n private addCondition(field: string, operator: QueryOperator, value?: string): void {\r\n this.conditions.push({ field, operator, value });\r\n this.currentField = null;\r\n }\r\n}\r\n","/**\r\n * Fields to exclude from queries when using '*' (all fields) for specific object types\r\n * These fields cause API errors when queried\r\n */\r\nexport const EXCLUDED_FIELDS_FOR_STAR_QUERY: Record<string, string[]> = {\r\n '7': ['deletedon', 'deletedby'], // Note\r\n '8': ['deletedon', 'deletedby', 's', 'w', 'o', 't', 'description'], // Competitor\r\n '114': ['deletedon', 'deletedby'], // Calendar Resource\r\n '115': ['deletedon', 'deletedby'], // Customer Journey\r\n '116': ['deletedon', 'deletedby'], // Profile\r\n '117': ['deletedon', 'deletedby'], // Landing Page\r\n};\r\n\r\n/**\r\n * Fields to exclude from lookup relation queries across ALL object types\r\n * These fields cause API errors when queried for lookup relationships\r\n */\r\nexport const EXCLUDED_LOOKUP_FIELDS: string[] = ['deletedby', 'deletedon'];\r\n\r\n/**\r\n * Checks if a field should be excluded from star queries for a given object type\r\n *\r\n * @param objectType - The object type ID\r\n * @param fieldName - The field name to check\r\n * @returns True if the field should be excluded\r\n */\r\nexport function isExcludedFromStarQuery(objectType: string | number, fieldName: string): boolean {\r\n const objectTypeStr = String(objectType);\r\n const excludedFields = EXCLUDED_FIELDS_FOR_STAR_QUERY[objectTypeStr];\r\n return excludedFields ? excludedFields.includes(fieldName) : false;\r\n}\r\n\r\n/**\r\n * Gets the list of excluded fields for a given object type\r\n *\r\n * @param objectType - The object type ID\r\n * @returns Array of field names to exclude, or empty array if none\r\n */\r\nexport function getExcludedFieldsForStarQuery(objectType: string | number): string[] {\r\n const objectTypeStr = String(objectType);\r\n return EXCLUDED_FIELDS_FOR_STAR_QUERY[objectTypeStr] || [];\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- export { C as ConditionBuilder, E as EXCLUDED_FIELDS_FOR_STAR_QUERY, F as FIELD_TYPE_IDS, a as FIELD_TYPE_MAPPINGS, O as OBJECT_ID_MAP, b as OBJECT_NAME_MAP, Q as QueryBuilder, e as escapeQueryValue, d as getExcludedFieldsForStarQuery, c as getNameFieldByObjectType, g as getObjectIdFieldName, i as isExcludedFromStarQuery, s as sanitizeQuery } from '../excludedFields-CGXgZN8Y.cjs';
1
+ export { C as ConditionBuilder, E as EXCLUDED_FIELDS_FOR_STAR_QUERY, F as FIELD_TYPE_IDS, a as FIELD_TYPE_MAPPINGS, O as OBJECT_ID_MAP, b as OBJECT_NAME_MAP, Q as QueryBuilder, e as escapeQueryValue, d as getExcludedFieldsForStarQuery, c as getNameFieldByObjectType, g as getObjectIdFieldName, i as isExcludedFromStarQuery, s as sanitizeQuery } from '../excludedFields-DSX1EYaT.cjs';
2
2
  export { f as getFieldTypeName, g as getLabelFieldForField, e as isDateField, i as isDropdownField, b as isDropdownOrLookupField, a as isLookupField, d as isNumericField, c as isTextField } from '../fieldTypes-BLzJTzpI.cjs';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- export { C as ConditionBuilder, E as EXCLUDED_FIELDS_FOR_STAR_QUERY, F as FIELD_TYPE_IDS, a as FIELD_TYPE_MAPPINGS, O as OBJECT_ID_MAP, b as OBJECT_NAME_MAP, Q as QueryBuilder, e as escapeQueryValue, d as getExcludedFieldsForStarQuery, c as getNameFieldByObjectType, g as getObjectIdFieldName, i as isExcludedFromStarQuery, s as sanitizeQuery } from '../excludedFields-CGXgZN8Y.js';
1
+ export { C as ConditionBuilder, E as EXCLUDED_FIELDS_FOR_STAR_QUERY, F as FIELD_TYPE_IDS, a as FIELD_TYPE_MAPPINGS, O as OBJECT_ID_MAP, b as OBJECT_NAME_MAP, Q as QueryBuilder, e as escapeQueryValue, d as getExcludedFieldsForStarQuery, c as getNameFieldByObjectType, g as getObjectIdFieldName, i as isExcludedFromStarQuery, s as sanitizeQuery } from '../excludedFields-DSX1EYaT.js';
2
2
  export { f as getFieldTypeName, g as getLabelFieldForField, e as isDateField, i as isDropdownField, b as isDropdownOrLookupField, a as isLookupField, d as isNumericField, c as isTextField } from '../fieldTypes-BLzJTzpI.js';
3
3
 
4
4
  /**