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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -587,9 +587,10 @@ var MetadataAPI = class {
587
587
  async getFields(objectType, options) {
588
588
  const objectTypeStr = String(objectType);
589
589
  const opts = options instanceof AbortSignal ? { signal: options, includeLookupRelations: true } : { signal: options?.signal, includeLookupRelations: options?.includeLookupRelations ?? true };
590
- if (!opts.includeLookupRelations) {
591
- const cached = this.client.getCached("fields", objectTypeStr);
592
- if (cached) {
590
+ const cached = this.client.getCached("fields", objectTypeStr);
591
+ if (cached) {
592
+ const cachedHasRelations = cached.fields.some((f) => f.relatedObjectType !== void 0);
593
+ if (!opts.includeLookupRelations || cachedHasRelations) {
593
594
  return cached;
594
595
  }
595
596
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/excludedFields.ts","../src/errors.ts","../src/utils/helpers.ts","../src/utils/queryBuilder.ts","../src/constants/fieldTypes.ts","../src/api/metadata.ts","../src/constants/objectIds.ts","../src/api/records.ts","../src/api/batch.ts","../src/api/fields.ts","../src/api/files.ts","../src/client.ts","../src/constants/objectNames.ts","../src/constants/index.ts"],"names":["EXCLUDED_FIELDS_FOR_STAR_QUERY","FireberryErrorCode","getExcludedFieldsForStarQuery"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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","/**\r\n * Error codes for Fireberry API errors\r\n */\r\nexport enum FireberryErrorCode {\r\n /** Unknown or unexpected error */\r\n UNKNOWN = 'UNKNOWN',\r\n /** Network error (connection failed, DNS, etc.) */\r\n NETWORK_ERROR = 'NETWORK_ERROR',\r\n /** Request timeout */\r\n TIMEOUT = 'TIMEOUT',\r\n /** Authentication failed (invalid API key) */\r\n AUTHENTICATION_FAILED = 'AUTHENTICATION_FAILED',\r\n /** Authorization failed (missing permissions) */\r\n AUTHORIZATION_FAILED = 'AUTHORIZATION_FAILED',\r\n /** Resource not found */\r\n NOT_FOUND = 'NOT_FOUND',\r\n /** Rate limit exceeded (429) */\r\n RATE_LIMITED = 'RATE_LIMITED',\r\n /** Invalid request parameters */\r\n INVALID_REQUEST = 'INVALID_REQUEST',\r\n /** Server error (5xx) */\r\n SERVER_ERROR = 'SERVER_ERROR',\r\n /** Request was aborted */\r\n ABORTED = 'ABORTED',\r\n /** Invalid response from API */\r\n INVALID_RESPONSE = 'INVALID_RESPONSE',\r\n}\r\n\r\n/**\r\n * Options for creating a FireberryError\r\n */\r\nexport interface FireberryErrorOptions {\r\n /** Error code */\r\n code: FireberryErrorCode;\r\n /** HTTP status code if applicable */\r\n statusCode?: number;\r\n /** Original error that caused this error */\r\n cause?: Error;\r\n /** Additional context data */\r\n context?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Custom error class for Fireberry API errors\r\n */\r\nexport class FireberryError extends Error {\r\n /** Error code */\r\n readonly code: FireberryErrorCode;\r\n /** HTTP status code if applicable */\r\n readonly statusCode?: number;\r\n /** Original error that caused this error */\r\n readonly cause?: Error;\r\n /** Additional context data */\r\n readonly context?: Record<string, unknown>;\r\n\r\n constructor(message: string, options: FireberryErrorOptions) {\r\n super(message);\r\n this.name = 'FireberryError';\r\n this.code = options.code;\r\n this.statusCode = options.statusCode;\r\n this.cause = options.cause;\r\n this.context = options.context;\r\n\r\n // Maintains proper stack trace in V8 environments\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, FireberryError);\r\n }\r\n }\r\n\r\n /**\r\n * Creates a string representation of the error\r\n */\r\n toString(): string {\r\n let str = `${this.name} [${this.code}]: ${this.message}`;\r\n if (this.statusCode) {\r\n str += ` (HTTP ${this.statusCode})`;\r\n }\r\n return str;\r\n }\r\n\r\n /**\r\n * Converts the error to a plain object for logging/serialization\r\n */\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n statusCode: this.statusCode,\r\n context: this.context,\r\n stack: this.stack,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Creates an error from an HTTP response\r\n */\r\nexport function createErrorFromResponse(\r\n response: Response,\r\n body?: unknown,\r\n): FireberryError {\r\n const status = response.status;\r\n let code: FireberryErrorCode;\r\n let message: string;\r\n\r\n switch (status) {\r\n case 400:\r\n code = FireberryErrorCode.INVALID_REQUEST;\r\n message = 'Invalid request parameters';\r\n break;\r\n case 401:\r\n code = FireberryErrorCode.AUTHENTICATION_FAILED;\r\n message = 'Authentication failed - invalid or missing API key';\r\n break;\r\n case 403:\r\n code = FireberryErrorCode.AUTHORIZATION_FAILED;\r\n message = 'Authorization failed - insufficient permissions';\r\n break;\r\n case 404:\r\n code = FireberryErrorCode.NOT_FOUND;\r\n message = 'Resource not found';\r\n break;\r\n case 429:\r\n code = FireberryErrorCode.RATE_LIMITED;\r\n message = 'Rate limit exceeded - too many requests';\r\n break;\r\n default:\r\n if (status >= 500) {\r\n code = FireberryErrorCode.SERVER_ERROR;\r\n message = `Server error (${status})`;\r\n } else {\r\n code = FireberryErrorCode.UNKNOWN;\r\n message = `HTTP error ${status}`;\r\n }\r\n }\r\n\r\n // Try to extract error message from response body\r\n if (body && typeof body === 'object') {\r\n const bodyObj = body as Record<string, unknown>;\r\n if (typeof bodyObj.message === 'string') {\r\n message = bodyObj.message;\r\n } else if (typeof bodyObj.error === 'string') {\r\n message = bodyObj.error;\r\n }\r\n }\r\n\r\n return new FireberryError(message, {\r\n code,\r\n statusCode: status,\r\n context: { body },\r\n });\r\n}\r\n\r\n/**\r\n * Creates an error from a network/fetch error\r\n */\r\nexport function createNetworkError(error: Error): FireberryError {\r\n // Check for abort\r\n if (error.name === 'AbortError') {\r\n return new FireberryError('Request was aborted', {\r\n code: FireberryErrorCode.ABORTED,\r\n cause: error,\r\n });\r\n }\r\n\r\n // Check for timeout\r\n if (error.name === 'TimeoutError' || error.message.includes('timeout')) {\r\n return new FireberryError('Request timed out', {\r\n code: FireberryErrorCode.TIMEOUT,\r\n cause: error,\r\n });\r\n }\r\n\r\n return new FireberryError(`Network error: ${error.message}`, {\r\n code: FireberryErrorCode.NETWORK_ERROR,\r\n cause: error,\r\n });\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 * 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 type { FireberryClient } from '../client';\r\nimport type {\r\n GetObjectsResult,\r\n GetFieldsResult,\r\n GetFieldValuesResult,\r\n FireberryObject,\r\n FireberryField,\r\n FieldValue,\r\n} from '../types/metadata';\r\nimport { FIELD_TYPE_MAPPINGS, FIELD_TYPE_IDS } from '../constants/fieldTypes';\r\nimport { EXCLUDED_LOOKUP_FIELDS } from '../constants/excludedFields';\r\n\r\n/** API endpoints used by MetadataAPI */\r\nconst ENDPOINTS = {\r\n OBJECTS: '/metadata/records',\r\n FIELDS: (objectType: string) => `/metadata/records/${objectType}/fields`,\r\n FIELD_VALUES: (objectType: string, fieldName: string) =>\r\n `/metadata/records/${objectType}/fields/${fieldName}/values`,\r\n QUERY: '/api/query',\r\n} as const;\r\n\r\n/**\r\n * Metadata API for retrieving Fireberry schema information\r\n */\r\nexport class MetadataAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Gets all available objects/entity types from Fireberry\r\n *\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns List of all objects\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.metadata.getObjects();\r\n * console.log(result.objects); // [{ objectType: 1, name: 'Account', ... }, ...]\r\n * ```\r\n */\r\n async getObjects(signal?: AbortSignal): Promise<GetObjectsResult> {\r\n // Check cache first\r\n const cached = this.client.getCached<GetObjectsResult>('objects');\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n const response = await this.client.request<{\r\n success: boolean;\r\n data?: FireberryObject[];\r\n }>({\r\n method: 'GET',\r\n endpoint: ENDPOINTS.OBJECTS,\r\n signal,\r\n });\r\n\r\n const result: GetObjectsResult = {\r\n objects: response.data || [],\r\n total: response.data?.length || 0,\r\n success: true,\r\n };\r\n\r\n // Cache the result\r\n this.client.setCache('objects', result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets all fields for a specific object type\r\n *\r\n * @param objectType - The object type ID (e.g., '1' for Account)\r\n * @param options - Optional settings\r\n * @param options.includeLookupRelations - Fetches related object types for lookup fields (default: true)\r\n * @param options.signal - Optional AbortSignal for cancellation\r\n * @returns List of fields with metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * // Lookup relations are included by default\r\n * const result = await client.metadata.getFields('1');\r\n * console.log(result.fields.find(f => f.fieldName === 'primarycontactid')?.relatedObjectType); // 2\r\n *\r\n * // Disable lookup relations for faster response\r\n * const result = await client.metadata.getFields('1', { includeLookupRelations: false });\r\n * ```\r\n */\r\n async getFields(\r\n objectType: string | number,\r\n options?: { includeLookupRelations?: boolean; signal?: AbortSignal } | AbortSignal,\r\n ): Promise<GetFieldsResult> {\r\n const objectTypeStr = String(objectType);\r\n\r\n // Handle both old signature (signal only) and new signature (options object)\r\n // Default includeLookupRelations to true\r\n const opts =\r\n options instanceof AbortSignal\r\n ? { signal: options, includeLookupRelations: true }\r\n : { signal: options?.signal, includeLookupRelations: options?.includeLookupRelations ?? true };\r\n\r\n // Check cache first (only if not requesting lookup relations, as cache may not have them)\r\n if (!opts.includeLookupRelations) {\r\n const cached = this.client.getCached<GetFieldsResult>('fields', objectTypeStr);\r\n if (cached) {\r\n return cached;\r\n }\r\n }\r\n\r\n const response = await this.client.request<{\r\n success: boolean;\r\n data?: Array<{\r\n fieldName: string;\r\n label: string;\r\n systemFieldTypeId: string;\r\n required?: boolean;\r\n defaultValue?: unknown;\r\n maxLength?: number;\r\n precision?: number;\r\n }>;\r\n }>({\r\n method: 'GET',\r\n endpoint: ENDPOINTS.FIELDS(objectTypeStr),\r\n signal: opts.signal,\r\n });\r\n\r\n // Enhance fields with readable field types\r\n let fields: FireberryField[] = (response.data || []).map((field) => ({\r\n ...field,\r\n fieldType: FIELD_TYPE_MAPPINGS[field.systemFieldTypeId] || field.systemFieldTypeId,\r\n }));\r\n\r\n // If requested, fetch related object types for lookup fields\r\n if (opts.includeLookupRelations) {\r\n const lookupFields = fields.filter(\r\n (field) => field.systemFieldTypeId === FIELD_TYPE_IDS.LOOKUP,\r\n );\r\n\r\n if (lookupFields.length > 0) {\r\n const lookupRelations = await this.fetchLookupRelations(\r\n objectTypeStr,\r\n lookupFields.map((f) => f.fieldName),\r\n opts.signal,\r\n );\r\n\r\n // Merge lookup relations into fields\r\n fields = fields.map((field) => ({\r\n ...field,\r\n relatedObjectType: lookupRelations.get(field.fieldName),\r\n }));\r\n }\r\n }\r\n\r\n const result: GetFieldsResult = {\r\n objectTypeId: objectTypeStr,\r\n fields,\r\n total: fields.length,\r\n success: true,\r\n };\r\n\r\n // Cache the result\r\n this.client.setCache('fields', objectTypeStr, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Fetches related object types for lookup fields using the query endpoint.\r\n * The query endpoint returns Columns metadata with fieldobjecttype even without records.\r\n * Excludes fields that cause API errors (e.g., deletedby, deletedon).\r\n */\r\n private async fetchLookupRelations(\r\n objectType: string,\r\n lookupFieldNames: string[],\r\n signal?: AbortSignal,\r\n ): Promise<Map<string, number>> {\r\n const relations = new Map<string, number>();\r\n\r\n // Filter out excluded fields that cause API errors\r\n const queryableFields = lookupFieldNames.filter(\r\n (fieldName) => !EXCLUDED_LOOKUP_FIELDS.includes(fieldName),\r\n );\r\n\r\n if (queryableFields.length === 0) {\r\n return relations;\r\n }\r\n\r\n const response = await this.client.request<{\r\n success: boolean;\r\n data?: {\r\n Columns?: Array<{\r\n fieldname: string;\r\n fieldobjecttype: number | null;\r\n }>;\r\n };\r\n }>({\r\n method: 'POST',\r\n endpoint: ENDPOINTS.QUERY,\r\n body: {\r\n objecttype: objectType,\r\n fields: queryableFields.join(','),\r\n query: '',\r\n page_size: 1,\r\n page_number: 1,\r\n show_real_value: 0,\r\n },\r\n signal,\r\n });\r\n\r\n // Extract fieldobjecttype from Columns metadata\r\n const columns = response.data?.Columns || [];\r\n for (const column of columns) {\r\n if (column.fieldobjecttype !== null && column.fieldobjecttype !== undefined) {\r\n relations.set(column.fieldname, column.fieldobjecttype);\r\n }\r\n }\r\n\r\n return relations;\r\n }\r\n\r\n /**\r\n * Gets all possible values for a dropdown field\r\n *\r\n * @param objectType - The object type ID\r\n * @param fieldName - The field name\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns List of dropdown values\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.metadata.getFieldValues('1', 'statuscode');\r\n * console.log(result.values); // [{ name: 'Active', value: '1' }, { name: 'Inactive', value: '2' }]\r\n * ```\r\n */\r\n async getFieldValues(\r\n objectType: string | number,\r\n fieldName: string,\r\n signal?: AbortSignal,\r\n ): Promise<GetFieldValuesResult> {\r\n const objectTypeStr = String(objectType);\r\n\r\n // Check cache first\r\n const cached = this.client.getCached<GetFieldValuesResult>(\r\n 'fieldValues',\r\n objectTypeStr,\r\n fieldName,\r\n );\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n const response = await this.client.request<{\r\n success: boolean;\r\n data?: {\r\n values?: FieldValue[];\r\n };\r\n }>({\r\n method: 'GET',\r\n endpoint: ENDPOINTS.FIELD_VALUES(objectTypeStr, fieldName),\r\n signal,\r\n });\r\n\r\n const result: GetFieldValuesResult = {\r\n objectTypeId: objectTypeStr,\r\n fieldName,\r\n values: response.data?.values || [],\r\n total: response.data?.values?.length || 0,\r\n success: true,\r\n };\r\n\r\n // Cache the result\r\n this.client.setCache('fieldValues', objectTypeStr, fieldName, result);\r\n\r\n return result;\r\n }\r\n}\r\n","/**\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","import type { FireberryClient } from '../client';\r\nimport type {\r\n FireberryRecord,\r\n CreateOptions,\r\n UpdateOptions,\r\n DeleteOptions,\r\n UpsertOptions,\r\n UpsertResult,\r\n} from '../types/records';\r\nimport { getObjectIdFieldName } from '../constants/objectIds';\r\n\r\n/**\r\n * Records API for CRUD operations on Fireberry records\r\n */\r\nexport class RecordsAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Creates a new record in Fireberry\r\n *\r\n * @param objectType - The object type ID (e.g., '1' for Account)\r\n * @param data - Record data to create\r\n * @param options - Optional settings\r\n * @returns Created record data\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.records.create('1', {\r\n * accountname: 'New Account',\r\n * emailaddress1: 'contact@example.com',\r\n * });\r\n * ```\r\n */\r\n async create(\r\n objectType: string | number,\r\n data: FireberryRecord,\r\n options?: CreateOptions,\r\n ): Promise<FireberryRecord> {\r\n const response = await this.client.request<{\r\n success: boolean;\r\n record: FireberryRecord;\r\n _id?: string;\r\n }>({\r\n method: 'POST',\r\n endpoint: `/api/v2/record/${objectType}`,\r\n body: data,\r\n signal: options?.signal,\r\n });\r\n\r\n return response.record;\r\n }\r\n\r\n /**\r\n * Updates an existing record in Fireberry\r\n *\r\n * @param objectType - The object type ID\r\n * @param recordId - The record ID to update\r\n * @param data - Record data to update\r\n * @param options - Optional settings\r\n * @returns Updated record data\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.records.update('1', 'abc123', {\r\n * accountname: 'Updated Account Name',\r\n * });\r\n * ```\r\n */\r\n async update(\r\n objectType: string | number,\r\n recordId: string,\r\n data: FireberryRecord,\r\n options?: UpdateOptions,\r\n ): Promise<FireberryRecord> {\r\n const response = await this.client.request<{\r\n success: boolean;\r\n record: FireberryRecord;\r\n _id?: string;\r\n }>({\r\n method: 'PUT',\r\n endpoint: `/api/v2/record/${objectType}/${recordId}`,\r\n body: data,\r\n signal: options?.signal,\r\n });\r\n\r\n return response.record;\r\n }\r\n\r\n /**\r\n * Deletes a record from Fireberry\r\n *\r\n * @param objectType - The object type ID\r\n * @param recordId - The record ID to delete\r\n * @param options - Optional settings\r\n * @returns Success status\r\n *\r\n * @example\r\n * ```typescript\r\n * await client.records.delete('1', 'abc123');\r\n * ```\r\n */\r\n async delete(\r\n objectType: string | number,\r\n recordId: string,\r\n options?: DeleteOptions,\r\n ): Promise<{ success: boolean; id: string }> {\r\n // Note: Delete uses /api/record (not /api/v2/record)\r\n await this.client.request({\r\n method: 'DELETE',\r\n endpoint: `/api/record/${objectType}/${recordId}`,\r\n signal: options?.signal,\r\n });\r\n\r\n return {\r\n success: true,\r\n id: recordId,\r\n };\r\n }\r\n\r\n /**\r\n * Upserts a record (creates if not exists, updates if exists)\r\n *\r\n * @param objectType - The object type ID\r\n * @param keyFields - Fields to use for matching existing records\r\n * @param data - Record data to upsert\r\n * @param options - Optional settings\r\n * @returns Upsert result with operation type and record data\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.records.upsert('1', ['emailaddress1'], {\r\n * accountname: 'Acme Corp',\r\n * emailaddress1: 'contact@acme.com',\r\n * });\r\n * console.log(result.operationType); // 'create' or 'update'\r\n * ```\r\n */\r\n async upsert(\r\n objectType: string | number,\r\n keyFields: string[],\r\n data: FireberryRecord,\r\n options?: UpsertOptions,\r\n ): Promise<UpsertResult> {\r\n const objectTypeStr = String(objectType);\r\n\r\n // Build key values from data\r\n const upsertKeyValues: Record<string, unknown> = {};\r\n for (const key of keyFields) {\r\n if (!(key in data)) {\r\n throw new Error(`Missing value for upsert key field: ${key}`);\r\n }\r\n upsertKeyValues[key] = data[key];\r\n }\r\n\r\n // Build query to check if record exists\r\n const queryConditions = keyFields.map((key) => `(${key} = ${data[key]})`);\r\n const queryString = queryConditions.join(' and ');\r\n\r\n // Query for existing record\r\n const queryResult = await this.client.query({\r\n objectType: objectTypeStr,\r\n fields: '*',\r\n query: queryString,\r\n limit: 1,\r\n showRealValue: true,\r\n signal: options?.signal,\r\n });\r\n\r\n const existingRecords = queryResult.records as FireberryRecord[];\r\n\r\n if (existingRecords.length > 0) {\r\n // Record exists - UPDATE\r\n const existingRecord = existingRecords[0];\r\n const idFieldName = getObjectIdFieldName(objectTypeStr);\r\n const recordId = String(existingRecord[idFieldName]);\r\n\r\n const updatedRecord = await this.update(objectTypeStr, recordId, data, options);\r\n\r\n return {\r\n success: true,\r\n operationType: 'update',\r\n upsertKeys: keyFields,\r\n upsertKeyValues,\r\n oldRecord: existingRecord,\r\n newRecord: updatedRecord,\r\n };\r\n } else {\r\n // Record doesn't exist - CREATE\r\n const createdRecord = await this.create(objectTypeStr, data, options);\r\n\r\n return {\r\n success: true,\r\n operationType: 'create',\r\n upsertKeys: keyFields,\r\n upsertKeyValues,\r\n oldRecord: null,\r\n newRecord: createdRecord,\r\n };\r\n }\r\n }\r\n}\r\n","import type { FireberryClient } from '../client';\r\nimport type {\r\n FireberryRecord,\r\n BatchCreateOptions,\r\n BatchUpdateOptions,\r\n BatchUpdateRecord,\r\n BatchDeleteOptions,\r\n BatchResult,\r\n BatchDeleteResult,\r\n} from '../types/records';\r\nimport { chunkArray } from '../utils/helpers';\r\n\r\n/** Maximum records per batch API call */\r\nconst BATCH_SIZE = 20;\r\n\r\n/**\r\n * Batch API for bulk operations on Fireberry records\r\n * Automatically chunks large datasets into API-compatible batches of 20\r\n */\r\nexport class BatchAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Creates multiple records in batch\r\n * Automatically chunks into batches of 20 records\r\n *\r\n * @param objectType - The object type ID\r\n * @param records - Array of records to create\r\n * @param options - Optional settings\r\n * @returns Batch result with all created records\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.batch.create('1', [\r\n * { accountname: 'Account 1' },\r\n * { accountname: 'Account 2' },\r\n * ]);\r\n * console.log(result.count); // 2\r\n * ```\r\n */\r\n async create(\r\n objectType: string | number,\r\n records: FireberryRecord[],\r\n options?: BatchCreateOptions,\r\n ): Promise<BatchResult> {\r\n const objectTypeStr = String(objectType);\r\n const batches = chunkArray(records, BATCH_SIZE);\r\n const allResponses: unknown[] = [];\r\n\r\n for (const batch of batches) {\r\n // Check for abort\r\n if (options?.signal?.aborted) {\r\n break;\r\n }\r\n\r\n const response = await this.client.request<{ data?: unknown[] }>({\r\n method: 'POST',\r\n endpoint: `/api/v3/record/${objectTypeStr}/batch/create`,\r\n body: { data: batch },\r\n signal: options?.signal,\r\n });\r\n\r\n if (response.data) {\r\n if (Array.isArray(response.data)) {\r\n allResponses.push(...response.data);\r\n } else {\r\n allResponses.push(response.data);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n data: allResponses,\r\n count: allResponses.length,\r\n };\r\n }\r\n\r\n /**\r\n * Updates multiple records in batch\r\n * Automatically chunks into batches of 20 records\r\n *\r\n * @param objectType - The object type ID\r\n * @param records - Array of records with ID and data to update\r\n * @param options - Optional settings\r\n * @returns Batch result with all updated records\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.batch.update('1', [\r\n * { id: 'abc123', record: { accountname: 'Updated 1' } },\r\n * { id: 'def456', record: { accountname: 'Updated 2' } },\r\n * ]);\r\n * ```\r\n */\r\n async update(\r\n objectType: string | number,\r\n records: BatchUpdateRecord[],\r\n options?: BatchUpdateOptions,\r\n ): Promise<BatchResult> {\r\n const objectTypeStr = String(objectType);\r\n const batches = chunkArray(records, BATCH_SIZE);\r\n const allResponses: unknown[] = [];\r\n\r\n for (const batch of batches) {\r\n // Check for abort\r\n if (options?.signal?.aborted) {\r\n break;\r\n }\r\n\r\n const response = await this.client.request<{ data?: unknown[] }>({\r\n method: 'POST',\r\n endpoint: `/api/v3/record/${objectTypeStr}/batch/update`,\r\n body: { data: batch },\r\n signal: options?.signal,\r\n });\r\n\r\n if (response.data) {\r\n if (Array.isArray(response.data)) {\r\n allResponses.push(...response.data);\r\n } else {\r\n allResponses.push(response.data);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n data: allResponses,\r\n count: allResponses.length,\r\n };\r\n }\r\n\r\n /**\r\n * Deletes multiple records in batch\r\n * Automatically chunks into batches of 20 records\r\n *\r\n * @param objectType - The object type ID\r\n * @param recordIds - Array of record IDs to delete\r\n * @param options - Optional settings\r\n * @returns Batch delete result with deleted IDs\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.batch.delete('1', ['abc123', 'def456']);\r\n * console.log(result.ids); // ['abc123', 'def456']\r\n * ```\r\n */\r\n async delete(\r\n objectType: string | number,\r\n recordIds: string[],\r\n options?: BatchDeleteOptions,\r\n ): Promise<BatchDeleteResult> {\r\n const objectTypeStr = String(objectType);\r\n const batches = chunkArray(recordIds, BATCH_SIZE);\r\n const allDeletedIds: string[] = [];\r\n\r\n for (const batch of batches) {\r\n // Check for abort\r\n if (options?.signal?.aborted) {\r\n break;\r\n }\r\n\r\n await this.client.request({\r\n method: 'POST',\r\n endpoint: `/api/v3/record/${objectTypeStr}/batch/delete`,\r\n body: { data: batch },\r\n signal: options?.signal,\r\n });\r\n\r\n allDeletedIds.push(...batch);\r\n }\r\n\r\n return {\r\n success: true,\r\n ids: allDeletedIds,\r\n count: allDeletedIds.length,\r\n };\r\n }\r\n}\r\n","import type { FireberryClient } from '../client';\r\nimport type { CreateFieldOptions, CreateFieldResult } from '../types/fields';\r\n\r\n/**\r\n * Field type to API endpoint mapping\r\n */\r\nconst FIELD_TYPE_ENDPOINTS: Record<string, string> = {\r\n text: 'text',\r\n email: 'email',\r\n url: 'url',\r\n phone: 'phone',\r\n number: 'number',\r\n textarea: 'textarea',\r\n html: 'html',\r\n date: 'date',\r\n datetime: 'datetime',\r\n lookup: 'lookup',\r\n summary: 'summary',\r\n formula: 'formula',\r\n picklist: 'picklist',\r\n};\r\n\r\n/**\r\n * Fields API for creating custom fields in Fireberry\r\n */\r\nexport class FieldsAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Creates a new custom field in a Fireberry object\r\n *\r\n * @param objectType - The object type ID\r\n * @param options - Field creation options\r\n * @returns Created field result\r\n *\r\n * @example\r\n * ```typescript\r\n * // Create a text field\r\n * const result = await client.fields.create('1', {\r\n * type: 'text',\r\n * fieldName: 'pcf_custom_field',\r\n * label: 'Custom Field',\r\n * maxLength: 100,\r\n * });\r\n *\r\n * // Create a picklist field\r\n * const result = await client.fields.create('1', {\r\n * type: 'picklist',\r\n * fieldName: 'pcf_status',\r\n * label: 'Status',\r\n * values: [\r\n * { name: 'Active', value: '1' },\r\n * { name: 'Inactive', value: '2' },\r\n * ],\r\n * });\r\n *\r\n * // Create a lookup field\r\n * const result = await client.fields.create('2', {\r\n * type: 'lookup',\r\n * fieldName: 'pcf_related_account',\r\n * label: 'Related Account',\r\n * relatedObjectId: '1',\r\n * });\r\n * ```\r\n */\r\n async create(\r\n objectType: string | number,\r\n options: CreateFieldOptions,\r\n ): Promise<CreateFieldResult> {\r\n const objectTypeStr = String(objectType);\r\n const { type, fieldName, label, defaultValue, follow, autoComplete } = options;\r\n\r\n // Build field data\r\n const fieldData: Record<string, unknown> = {\r\n fieldName,\r\n label,\r\n };\r\n\r\n // Add optional common properties\r\n if (defaultValue !== undefined) {\r\n fieldData.defaultValue = defaultValue;\r\n }\r\n if (follow !== undefined) {\r\n fieldData.follow = follow;\r\n }\r\n if (autoComplete !== undefined && ['text', 'email', 'url', 'phone', 'number'].includes(type)) {\r\n fieldData.autoComplete = autoComplete;\r\n }\r\n\r\n // Add field-type specific properties\r\n switch (type) {\r\n case 'text':\r\n case 'email':\r\n case 'url': {\r\n const opts = options as { maxLength?: number };\r\n if (opts.maxLength !== undefined && opts.maxLength > 0) {\r\n fieldData.maxLength = opts.maxLength;\r\n }\r\n break;\r\n }\r\n\r\n case 'number': {\r\n const opts = options as { precision?: number };\r\n if (opts.precision !== undefined) {\r\n fieldData.precision = opts.precision;\r\n }\r\n break;\r\n }\r\n\r\n case 'lookup': {\r\n const opts = options as { relatedObjectId: string };\r\n fieldData.relatedObjectId = opts.relatedObjectId;\r\n break;\r\n }\r\n\r\n case 'picklist': {\r\n const opts = options as { values: Array<{ name: string; value: string }> };\r\n fieldData.values = opts.values;\r\n break;\r\n }\r\n\r\n case 'summary': {\r\n const opts = options as {\r\n summaryType: string;\r\n relatedObjectId: string;\r\n summaryField?: string;\r\n };\r\n fieldData.summaryType = opts.summaryType;\r\n fieldData.relatedObjectId = opts.relatedObjectId;\r\n if (opts.summaryField) {\r\n fieldData.summaryField = opts.summaryField;\r\n }\r\n break;\r\n }\r\n\r\n case 'formula': {\r\n const opts = options as {\r\n formula: string;\r\n formulaFieldType: string;\r\n formulaPrecision?: number;\r\n };\r\n fieldData.formula = opts.formula;\r\n fieldData.fieldType = opts.formulaFieldType;\r\n if (opts.formulaFieldType === 'number' && opts.formulaPrecision !== undefined) {\r\n fieldData.precision = opts.formulaPrecision;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Get the API endpoint for this field type\r\n const endpoint = FIELD_TYPE_ENDPOINTS[type];\r\n if (!endpoint) {\r\n throw new Error(`Unsupported field type: ${type}`);\r\n }\r\n\r\n const response = await this.client.request<Record<string, unknown>>({\r\n method: 'POST',\r\n endpoint: `/api/v2/system-field/${objectTypeStr}/${endpoint}`,\r\n body: fieldData,\r\n });\r\n\r\n return {\r\n objectTypeId: objectTypeStr,\r\n fieldType: type,\r\n fieldData: response,\r\n success: true,\r\n };\r\n }\r\n}\r\n","import type { FireberryClient } from '../client';\r\nimport { FireberryError, FireberryErrorCode } from '../errors';\r\n\r\n/**\r\n * Options for file upload\r\n */\r\nexport interface FileUploadOptions {\r\n /** File content as Buffer */\r\n buffer: Buffer;\r\n /** File name */\r\n filename: string;\r\n /** MIME type */\r\n mimeType: string;\r\n}\r\n\r\n/**\r\n * Result of file upload\r\n */\r\nexport interface FileUploadResult {\r\n /** Success flag */\r\n success: boolean;\r\n /** Object type */\r\n objectType: string;\r\n /** Record ID */\r\n recordId: string;\r\n /** Uploaded file name */\r\n fileName: string;\r\n /** File MIME type */\r\n mimeType: string;\r\n /** File size in bytes */\r\n fileSize: number;\r\n /** API response */\r\n response: unknown;\r\n}\r\n\r\n/**\r\n * Files API for file operations in Fireberry\r\n */\r\nexport class FilesAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Uploads a file attachment to a Fireberry record\r\n *\r\n * @param objectType - The object type ID\r\n * @param recordId - The record ID to attach the file to\r\n * @param options - File upload options\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns Upload result\r\n *\r\n * @example\r\n * ```typescript\r\n * import { readFileSync } from 'fs';\r\n *\r\n * const fileBuffer = readFileSync('document.pdf');\r\n * const result = await client.files.upload('1', 'abc123', {\r\n * buffer: fileBuffer,\r\n * filename: 'document.pdf',\r\n * mimeType: 'application/pdf',\r\n * });\r\n * ```\r\n */\r\n async upload(\r\n objectType: string | number,\r\n recordId: string,\r\n options: FileUploadOptions,\r\n signal?: AbortSignal,\r\n ): Promise<FileUploadResult> {\r\n const objectTypeStr = String(objectType);\r\n const { buffer, filename, mimeType } = options;\r\n const config = this.client.getConfig();\r\n\r\n // Build the URL\r\n const url = `${config.baseUrl}/api/v2/record/${objectTypeStr}/${recordId}/files`;\r\n\r\n // Create form data\r\n // Note: In Node.js, we need to construct multipart/form-data manually\r\n // or use a library like form-data\r\n const boundary = `----FormBoundary${Date.now()}`;\r\n const formParts: Buffer[] = [];\r\n\r\n // Add file part\r\n const fileHeader = [\r\n `--${boundary}`,\r\n `Content-Disposition: form-data; name=\"file\"; filename=\"${filename}\"`,\r\n `Content-Type: ${mimeType}`,\r\n '',\r\n '',\r\n ].join('\\r\\n');\r\n\r\n formParts.push(Buffer.from(fileHeader));\r\n formParts.push(buffer);\r\n formParts.push(Buffer.from(`\\r\\n--${boundary}--\\r\\n`));\r\n\r\n const body = Buffer.concat(formParts);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': `multipart/form-data; boundary=${boundary}`,\r\n tokenid: config.apiKey,\r\n },\r\n body,\r\n signal,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new FireberryError(`File upload failed: ${response.statusText}`, {\r\n code: FireberryErrorCode.INVALID_REQUEST,\r\n statusCode: response.status,\r\n });\r\n }\r\n\r\n const responseData = await response.json();\r\n\r\n return {\r\n success: true,\r\n objectType: objectTypeStr,\r\n recordId,\r\n fileName: filename,\r\n mimeType,\r\n fileSize: buffer.length,\r\n response: responseData,\r\n };\r\n } catch (error) {\r\n if (error instanceof FireberryError) {\r\n throw error;\r\n }\r\n throw new FireberryError(`File upload failed: ${(error as Error).message}`, {\r\n code: FireberryErrorCode.NETWORK_ERROR,\r\n cause: error as Error,\r\n });\r\n }\r\n }\r\n}\r\n","import type {\r\n FireberryClientConfig,\r\n RequestOptions,\r\n CacheControl,\r\n} from './types/client';\r\nimport type { QueryOptions, QueryResult } from './types/query';\r\nimport {\r\n FireberryError,\r\n FireberryErrorCode,\r\n createErrorFromResponse,\r\n createNetworkError,\r\n} from './errors';\r\nimport { wait } from './utils/helpers';\r\nimport { QueryBuilder } from './utils/queryBuilder';\r\n\r\n// Import API modules\r\nimport { MetadataAPI } from './api/metadata';\r\nimport { RecordsAPI } from './api/records';\r\nimport { BatchAPI } from './api/batch';\r\nimport { FieldsAPI } from './api/fields';\r\nimport { FilesAPI } from './api/files';\r\n\r\n/**\r\n * Internal cache store for metadata\r\n */\r\ninterface CacheStore {\r\n objects?: { data: unknown; timestamp: number };\r\n fields: Map<string, { data: unknown; timestamp: number }>;\r\n fieldValues: Map<string, { data: unknown; timestamp: number }>;\r\n}\r\n\r\n/**\r\n * FireberryClient - Main client for interacting with the Fireberry CRM API\r\n *\r\n * @example\r\n * ```typescript\r\n * const client = new FireberryClient({\r\n * apiKey: 'your-api-key',\r\n * retryOn429: true,\r\n * maxRetries: 120,\r\n * });\r\n *\r\n * // Query records\r\n * const result = await client.query({\r\n * objectType: '1',\r\n * fields: ['accountid', 'name'],\r\n * query: '(statuscode = 1)',\r\n * });\r\n *\r\n * // Use query builder\r\n * const result = await client.queryBuilder()\r\n * .objectType('1')\r\n * .select('accountid', 'name')\r\n * .where('statuscode').equals('1')\r\n * .execute();\r\n * ```\r\n */\r\nexport class FireberryClient {\r\n private readonly config: Required<FireberryClientConfig>;\r\n private readonly cacheStore: CacheStore;\r\n\r\n /** Metadata API operations */\r\n readonly metadata: MetadataAPI;\r\n /** Records CRUD operations */\r\n readonly records: RecordsAPI;\r\n /** Batch operations */\r\n readonly batch: BatchAPI;\r\n /** Field management operations */\r\n readonly fields: FieldsAPI;\r\n /** File operations */\r\n readonly files: FilesAPI;\r\n\r\n /**\r\n * Creates a new FireberryClient instance\r\n */\r\n constructor(config: FireberryClientConfig) {\r\n this.config = {\r\n apiKey: config.apiKey,\r\n baseUrl: config.baseUrl || 'https://api.fireberry.com',\r\n timeout: config.timeout || 30000,\r\n retryOn429: config.retryOn429 ?? true,\r\n maxRetries: config.maxRetries || 120,\r\n retryDelay: config.retryDelay || 1000,\r\n cacheMetadata: config.cacheMetadata || false,\r\n cacheTTL: config.cacheTTL || 300000, // 5 minutes default\r\n };\r\n\r\n // Initialize cache store\r\n this.cacheStore = {\r\n fields: new Map(),\r\n fieldValues: new Map(),\r\n };\r\n\r\n // Initialize API modules\r\n this.metadata = new MetadataAPI(this);\r\n this.records = new RecordsAPI(this);\r\n this.batch = new BatchAPI(this);\r\n this.fields = new FieldsAPI(this);\r\n this.files = new FilesAPI(this);\r\n }\r\n\r\n /**\r\n * Gets the client configuration\r\n */\r\n getConfig(): Readonly<Required<FireberryClientConfig>> {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Cache control methods\r\n */\r\n readonly cache: CacheControl = {\r\n clear: () => {\r\n this.cacheStore.objects = undefined;\r\n this.cacheStore.fields.clear();\r\n this.cacheStore.fieldValues.clear();\r\n },\r\n clearObjects: () => {\r\n this.cacheStore.objects = undefined;\r\n },\r\n clearFields: (objectType: string) => {\r\n this.cacheStore.fields.delete(objectType);\r\n },\r\n clearFieldValues: (objectType: string, fieldName?: string) => {\r\n if (fieldName) {\r\n this.cacheStore.fieldValues.delete(`${objectType}:${fieldName}`);\r\n } else {\r\n // Clear all field values for this object type\r\n for (const key of this.cacheStore.fieldValues.keys()) {\r\n if (key.startsWith(`${objectType}:`)) {\r\n this.cacheStore.fieldValues.delete(key);\r\n }\r\n }\r\n }\r\n },\r\n };\r\n\r\n /**\r\n * Gets cached data if valid, or undefined if not cached or expired\r\n */\r\n getCached<T>(type: 'objects'): T | undefined;\r\n getCached<T>(type: 'fields', objectType: string): T | undefined;\r\n getCached<T>(type: 'fieldValues', objectType: string, fieldName: string): T | undefined;\r\n getCached<T>(\r\n type: 'objects' | 'fields' | 'fieldValues',\r\n objectType?: string,\r\n fieldName?: string,\r\n ): T | undefined {\r\n if (!this.config.cacheMetadata) {\r\n return undefined;\r\n }\r\n\r\n const now = Date.now();\r\n\r\n if (type === 'objects') {\r\n const cached = this.cacheStore.objects;\r\n if (cached && now - cached.timestamp < this.config.cacheTTL) {\r\n return cached.data as T;\r\n }\r\n } else if (type === 'fields' && objectType) {\r\n const cached = this.cacheStore.fields.get(objectType);\r\n if (cached && now - cached.timestamp < this.config.cacheTTL) {\r\n return cached.data as T;\r\n }\r\n } else if (type === 'fieldValues' && objectType && fieldName) {\r\n const key = `${objectType}:${fieldName}`;\r\n const cached = this.cacheStore.fieldValues.get(key);\r\n if (cached && now - cached.timestamp < this.config.cacheTTL) {\r\n return cached.data as T;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Sets cached data\r\n */\r\n setCache(type: 'objects', data: unknown): void;\r\n setCache(type: 'fields', objectType: string, data: unknown): void;\r\n setCache(type: 'fieldValues', objectType: string, fieldName: string, data: unknown): void;\r\n setCache(\r\n type: 'objects' | 'fields' | 'fieldValues',\r\n objectTypeOrData?: string | unknown,\r\n fieldNameOrData?: string | unknown,\r\n data?: unknown,\r\n ): void {\r\n if (!this.config.cacheMetadata) {\r\n return;\r\n }\r\n\r\n const now = Date.now();\r\n\r\n if (type === 'objects') {\r\n this.cacheStore.objects = { data: objectTypeOrData, timestamp: now };\r\n } else if (type === 'fields' && typeof objectTypeOrData === 'string') {\r\n this.cacheStore.fields.set(objectTypeOrData, {\r\n data: fieldNameOrData,\r\n timestamp: now,\r\n });\r\n } else if (\r\n type === 'fieldValues' &&\r\n typeof objectTypeOrData === 'string' &&\r\n typeof fieldNameOrData === 'string'\r\n ) {\r\n const key = `${objectTypeOrData}:${fieldNameOrData}`;\r\n this.cacheStore.fieldValues.set(key, { data, timestamp: now });\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new QueryBuilder instance\r\n */\r\n queryBuilder(): QueryBuilder {\r\n return new QueryBuilder(this);\r\n }\r\n\r\n /**\r\n * Executes a query against the Fireberry API\r\n */\r\n async query(options: QueryOptions): Promise<QueryResult> {\r\n const {\r\n objectType,\r\n fields,\r\n query,\r\n sortBy = 'modifiedon',\r\n sortType = 'desc',\r\n limit,\r\n page = 1,\r\n pageSize = 500,\r\n showRealValue = true,\r\n autoPage = true,\r\n signal,\r\n } = options;\r\n\r\n // Normalize fields to string\r\n let fieldsStr: string;\r\n if (Array.isArray(fields)) {\r\n fieldsStr = fields.join(',');\r\n } else if (typeof fields === 'string') {\r\n fieldsStr = fields;\r\n } else {\r\n fieldsStr = '*';\r\n }\r\n\r\n // Handle '*' expansion for object types with excluded fields\r\n if (fieldsStr === '*') {\r\n fieldsStr = await this.expandStarFields(objectType, signal);\r\n }\r\n\r\n // If autoPage is true, fetch all pages\r\n if (autoPage) {\r\n return this.queryAllPages({\r\n objectType,\r\n fields: fieldsStr,\r\n query,\r\n sortBy,\r\n sortType,\r\n showRealValue,\r\n limit,\r\n signal,\r\n });\r\n }\r\n\r\n // Single page query\r\n const body = {\r\n objecttype: objectType,\r\n fields: fieldsStr,\r\n query: query || '',\r\n sort_by: sortBy,\r\n sort_type: sortType,\r\n page_size: Math.min(pageSize, limit || 500),\r\n page_number: page,\r\n show_real_value: showRealValue ? 1 : 0,\r\n };\r\n\r\n const response = await this.request<{ data?: { Data?: Record<string, unknown>[] } }>({\r\n method: 'POST',\r\n endpoint: '/api/query',\r\n body,\r\n signal,\r\n });\r\n\r\n const records = response.data?.Data || [];\r\n\r\n return {\r\n records,\r\n total: records.length,\r\n success: true,\r\n };\r\n }\r\n\r\n /**\r\n * Fetches all pages of a query\r\n */\r\n private async queryAllPages(options: {\r\n objectType: string;\r\n fields: string;\r\n query?: string;\r\n sortBy: string;\r\n sortType: string;\r\n showRealValue: boolean;\r\n limit?: number;\r\n signal?: AbortSignal;\r\n }): Promise<QueryResult> {\r\n const { objectType, fields, query, sortBy, sortType, showRealValue, limit, signal } = options;\r\n const maxPageSize = 500;\r\n const allRecords: Record<string, unknown>[] = [];\r\n let currentPage = 1;\r\n let hasMore = true;\r\n\r\n while (hasMore) {\r\n // Check for abort\r\n if (signal?.aborted) {\r\n break;\r\n }\r\n\r\n const body = {\r\n objecttype: objectType,\r\n fields,\r\n query: query || '',\r\n sort_by: sortBy,\r\n sort_type: sortType,\r\n page_size: maxPageSize,\r\n page_number: currentPage,\r\n show_real_value: showRealValue ? 1 : 0,\r\n };\r\n\r\n const response = await this.request<{ data?: { Data?: Record<string, unknown>[] } }>({\r\n method: 'POST',\r\n endpoint: '/api/query',\r\n body,\r\n signal,\r\n });\r\n\r\n const pageData = response.data?.Data || [];\r\n allRecords.push(...pageData);\r\n\r\n // Check if we've reached the limit\r\n if (limit && allRecords.length >= limit) {\r\n allRecords.splice(limit);\r\n break;\r\n }\r\n\r\n // Check if there are more pages\r\n if (pageData.length < maxPageSize) {\r\n hasMore = false;\r\n } else {\r\n currentPage++;\r\n }\r\n }\r\n\r\n return {\r\n records: allRecords,\r\n total: allRecords.length,\r\n success: true,\r\n };\r\n }\r\n\r\n /**\r\n * Expands '*' fields to actual field names, excluding problematic fields for specific object types\r\n */\r\n private async expandStarFields(objectType: string, signal?: AbortSignal): Promise<string> {\r\n const { getExcludedFieldsForStarQuery } = await import('./constants/excludedFields');\r\n const excludedFields = getExcludedFieldsForStarQuery(objectType);\r\n\r\n // If no excluded fields for this object type, just return '*'\r\n if (excludedFields.length === 0) {\r\n return '*';\r\n }\r\n\r\n // Fetch metadata to get all field names\r\n const fieldsResult = await this.metadata.getFields(objectType, signal);\r\n const allFieldNames = fieldsResult.fields.map((f) => f.fieldName);\r\n\r\n // Filter out excluded fields\r\n const filteredFields = allFieldNames.filter(\r\n (fieldName) => !excludedFields.includes(fieldName),\r\n );\r\n\r\n return filteredFields.join(',');\r\n }\r\n\r\n /**\r\n * Makes a raw API request to the Fireberry API\r\n */\r\n async request<T = unknown>(options: RequestOptions): Promise<T> {\r\n const {\r\n method,\r\n endpoint,\r\n query: queryParams,\r\n body,\r\n headers: customHeaders,\r\n signal,\r\n } = options;\r\n\r\n // Build URL\r\n let url = `${this.config.baseUrl}${endpoint}`;\r\n\r\n // Add query parameters if any\r\n if (queryParams && Object.keys(queryParams).length > 0) {\r\n const params = new URLSearchParams();\r\n for (const [key, value] of Object.entries(queryParams)) {\r\n if (value !== undefined && value !== null) {\r\n params.set(key, String(value));\r\n }\r\n }\r\n url += `?${params.toString()}`;\r\n }\r\n\r\n // Build headers\r\n const headers: Record<string, string> = {\r\n Accept: 'application/json',\r\n tokenid: this.config.apiKey,\r\n ...customHeaders,\r\n };\r\n\r\n if (body) {\r\n headers['Content-Type'] = 'application/json';\r\n }\r\n\r\n // Build fetch options\r\n const fetchOptions: RequestInit = {\r\n method,\r\n headers,\r\n signal,\r\n };\r\n\r\n if (body) {\r\n fetchOptions.body = JSON.stringify(body);\r\n }\r\n\r\n // Execute with retry logic\r\n return this.executeWithRetry<T>(url, fetchOptions);\r\n }\r\n\r\n /**\r\n * Executes a fetch request with retry logic for 429 errors\r\n */\r\n private async executeWithRetry<T>(\r\n url: string,\r\n options: RequestInit,\r\n retryCount = 0,\r\n ): Promise<T> {\r\n try {\r\n // Create timeout controller\r\n const timeoutController = new AbortController();\r\n const timeoutId = setTimeout(() => {\r\n timeoutController.abort();\r\n }, this.config.timeout);\r\n\r\n // Combine signals if external signal provided\r\n const combinedSignal = options.signal\r\n ? this.combineSignals([options.signal, timeoutController.signal])\r\n : timeoutController.signal;\r\n\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: combinedSignal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n // Handle rate limiting\r\n if (response.status === 429 && this.config.retryOn429) {\r\n if (retryCount < this.config.maxRetries) {\r\n // Wait before retrying\r\n await wait(this.config.retryDelay);\r\n return this.executeWithRetry<T>(url, options, retryCount + 1);\r\n }\r\n throw new FireberryError('Rate limit exceeded after max retries', {\r\n code: FireberryErrorCode.RATE_LIMITED,\r\n statusCode: 429,\r\n context: { retryCount },\r\n });\r\n }\r\n\r\n // Parse response\r\n let body: unknown;\r\n const contentType = response.headers.get('content-type');\r\n if (contentType?.includes('application/json')) {\r\n body = await response.json();\r\n } else {\r\n body = await response.text();\r\n }\r\n\r\n // Handle errors\r\n if (!response.ok) {\r\n throw createErrorFromResponse(response, body);\r\n }\r\n\r\n return body as T;\r\n } catch (error) {\r\n // Handle abort\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw createNetworkError(error);\r\n }\r\n\r\n // Re-throw FireberryError\r\n if (error instanceof FireberryError) {\r\n throw error;\r\n }\r\n\r\n // Wrap other errors\r\n throw createNetworkError(error as Error);\r\n }\r\n }\r\n\r\n /**\r\n * Combines multiple abort signals into one\r\n */\r\n private combineSignals(signals: AbortSignal[]): AbortSignal {\r\n const controller = new AbortController();\r\n\r\n for (const signal of signals) {\r\n if (signal.aborted) {\r\n controller.abort();\r\n break;\r\n }\r\n signal.addEventListener('abort', () => controller.abort(), { once: true });\r\n }\r\n\r\n return controller.signal;\r\n }\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","// Field type constants\r\nexport { FIELD_TYPE_IDS, FIELD_TYPE_MAPPINGS } from './fieldTypes';\r\n\r\n// Object ID mappings\r\nexport { OBJECT_ID_MAP, getObjectIdFieldName } from './objectIds';\r\n\r\n// Object name mappings\r\nexport { OBJECT_NAME_MAP, getNameFieldByObjectType } from './objectNames';\r\n\r\n// Excluded fields for star queries and lookup relations\r\nexport {\r\n EXCLUDED_FIELDS_FOR_STAR_QUERY,\r\n EXCLUDED_LOOKUP_FIELDS,\r\n isExcludedFromStarQuery,\r\n getExcludedFieldsForStarQuery,\r\n} from './excludedFields';\r\n"]}
1
+ {"version":3,"sources":["../src/constants/excludedFields.ts","../src/errors.ts","../src/utils/helpers.ts","../src/utils/queryBuilder.ts","../src/constants/fieldTypes.ts","../src/api/metadata.ts","../src/constants/objectIds.ts","../src/api/records.ts","../src/api/batch.ts","../src/api/fields.ts","../src/api/files.ts","../src/client.ts","../src/constants/objectNames.ts","../src/constants/index.ts"],"names":["EXCLUDED_FIELDS_FOR_STAR_QUERY","FireberryErrorCode","getExcludedFieldsForStarQuery"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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","/**\r\n * Error codes for Fireberry API errors\r\n */\r\nexport enum FireberryErrorCode {\r\n /** Unknown or unexpected error */\r\n UNKNOWN = 'UNKNOWN',\r\n /** Network error (connection failed, DNS, etc.) */\r\n NETWORK_ERROR = 'NETWORK_ERROR',\r\n /** Request timeout */\r\n TIMEOUT = 'TIMEOUT',\r\n /** Authentication failed (invalid API key) */\r\n AUTHENTICATION_FAILED = 'AUTHENTICATION_FAILED',\r\n /** Authorization failed (missing permissions) */\r\n AUTHORIZATION_FAILED = 'AUTHORIZATION_FAILED',\r\n /** Resource not found */\r\n NOT_FOUND = 'NOT_FOUND',\r\n /** Rate limit exceeded (429) */\r\n RATE_LIMITED = 'RATE_LIMITED',\r\n /** Invalid request parameters */\r\n INVALID_REQUEST = 'INVALID_REQUEST',\r\n /** Server error (5xx) */\r\n SERVER_ERROR = 'SERVER_ERROR',\r\n /** Request was aborted */\r\n ABORTED = 'ABORTED',\r\n /** Invalid response from API */\r\n INVALID_RESPONSE = 'INVALID_RESPONSE',\r\n}\r\n\r\n/**\r\n * Options for creating a FireberryError\r\n */\r\nexport interface FireberryErrorOptions {\r\n /** Error code */\r\n code: FireberryErrorCode;\r\n /** HTTP status code if applicable */\r\n statusCode?: number;\r\n /** Original error that caused this error */\r\n cause?: Error;\r\n /** Additional context data */\r\n context?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Custom error class for Fireberry API errors\r\n */\r\nexport class FireberryError extends Error {\r\n /** Error code */\r\n readonly code: FireberryErrorCode;\r\n /** HTTP status code if applicable */\r\n readonly statusCode?: number;\r\n /** Original error that caused this error */\r\n readonly cause?: Error;\r\n /** Additional context data */\r\n readonly context?: Record<string, unknown>;\r\n\r\n constructor(message: string, options: FireberryErrorOptions) {\r\n super(message);\r\n this.name = 'FireberryError';\r\n this.code = options.code;\r\n this.statusCode = options.statusCode;\r\n this.cause = options.cause;\r\n this.context = options.context;\r\n\r\n // Maintains proper stack trace in V8 environments\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, FireberryError);\r\n }\r\n }\r\n\r\n /**\r\n * Creates a string representation of the error\r\n */\r\n toString(): string {\r\n let str = `${this.name} [${this.code}]: ${this.message}`;\r\n if (this.statusCode) {\r\n str += ` (HTTP ${this.statusCode})`;\r\n }\r\n return str;\r\n }\r\n\r\n /**\r\n * Converts the error to a plain object for logging/serialization\r\n */\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n statusCode: this.statusCode,\r\n context: this.context,\r\n stack: this.stack,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Creates an error from an HTTP response\r\n */\r\nexport function createErrorFromResponse(\r\n response: Response,\r\n body?: unknown,\r\n): FireberryError {\r\n const status = response.status;\r\n let code: FireberryErrorCode;\r\n let message: string;\r\n\r\n switch (status) {\r\n case 400:\r\n code = FireberryErrorCode.INVALID_REQUEST;\r\n message = 'Invalid request parameters';\r\n break;\r\n case 401:\r\n code = FireberryErrorCode.AUTHENTICATION_FAILED;\r\n message = 'Authentication failed - invalid or missing API key';\r\n break;\r\n case 403:\r\n code = FireberryErrorCode.AUTHORIZATION_FAILED;\r\n message = 'Authorization failed - insufficient permissions';\r\n break;\r\n case 404:\r\n code = FireberryErrorCode.NOT_FOUND;\r\n message = 'Resource not found';\r\n break;\r\n case 429:\r\n code = FireberryErrorCode.RATE_LIMITED;\r\n message = 'Rate limit exceeded - too many requests';\r\n break;\r\n default:\r\n if (status >= 500) {\r\n code = FireberryErrorCode.SERVER_ERROR;\r\n message = `Server error (${status})`;\r\n } else {\r\n code = FireberryErrorCode.UNKNOWN;\r\n message = `HTTP error ${status}`;\r\n }\r\n }\r\n\r\n // Try to extract error message from response body\r\n if (body && typeof body === 'object') {\r\n const bodyObj = body as Record<string, unknown>;\r\n if (typeof bodyObj.message === 'string') {\r\n message = bodyObj.message;\r\n } else if (typeof bodyObj.error === 'string') {\r\n message = bodyObj.error;\r\n }\r\n }\r\n\r\n return new FireberryError(message, {\r\n code,\r\n statusCode: status,\r\n context: { body },\r\n });\r\n}\r\n\r\n/**\r\n * Creates an error from a network/fetch error\r\n */\r\nexport function createNetworkError(error: Error): FireberryError {\r\n // Check for abort\r\n if (error.name === 'AbortError') {\r\n return new FireberryError('Request was aborted', {\r\n code: FireberryErrorCode.ABORTED,\r\n cause: error,\r\n });\r\n }\r\n\r\n // Check for timeout\r\n if (error.name === 'TimeoutError' || error.message.includes('timeout')) {\r\n return new FireberryError('Request timed out', {\r\n code: FireberryErrorCode.TIMEOUT,\r\n cause: error,\r\n });\r\n }\r\n\r\n return new FireberryError(`Network error: ${error.message}`, {\r\n code: FireberryErrorCode.NETWORK_ERROR,\r\n cause: error,\r\n });\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 * 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 type { FireberryClient } from '../client';\r\nimport type {\r\n GetObjectsResult,\r\n GetFieldsResult,\r\n GetFieldValuesResult,\r\n FireberryObject,\r\n FireberryField,\r\n FieldValue,\r\n} from '../types/metadata';\r\nimport { FIELD_TYPE_MAPPINGS, FIELD_TYPE_IDS } from '../constants/fieldTypes';\r\nimport { EXCLUDED_LOOKUP_FIELDS } from '../constants/excludedFields';\r\n\r\n/** API endpoints used by MetadataAPI */\r\nconst ENDPOINTS = {\r\n OBJECTS: '/metadata/records',\r\n FIELDS: (objectType: string) => `/metadata/records/${objectType}/fields`,\r\n FIELD_VALUES: (objectType: string, fieldName: string) =>\r\n `/metadata/records/${objectType}/fields/${fieldName}/values`,\r\n QUERY: '/api/query',\r\n} as const;\r\n\r\n/**\r\n * Metadata API for retrieving Fireberry schema information\r\n */\r\nexport class MetadataAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Gets all available objects/entity types from Fireberry\r\n *\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns List of all objects\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.metadata.getObjects();\r\n * console.log(result.objects); // [{ objectType: 1, name: 'Account', ... }, ...]\r\n * ```\r\n */\r\n async getObjects(signal?: AbortSignal): Promise<GetObjectsResult> {\r\n // Check cache first\r\n const cached = this.client.getCached<GetObjectsResult>('objects');\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n const response = await this.client.request<{\r\n success: boolean;\r\n data?: FireberryObject[];\r\n }>({\r\n method: 'GET',\r\n endpoint: ENDPOINTS.OBJECTS,\r\n signal,\r\n });\r\n\r\n const result: GetObjectsResult = {\r\n objects: response.data || [],\r\n total: response.data?.length || 0,\r\n success: true,\r\n };\r\n\r\n // Cache the result\r\n this.client.setCache('objects', result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Gets all fields for a specific object type\r\n *\r\n * @param objectType - The object type ID (e.g., '1' for Account)\r\n * @param options - Optional settings\r\n * @param options.includeLookupRelations - Fetches related object types for lookup fields (default: true)\r\n * @param options.signal - Optional AbortSignal for cancellation\r\n * @returns List of fields with metadata\r\n *\r\n * @example\r\n * ```typescript\r\n * // Lookup relations are included by default\r\n * const result = await client.metadata.getFields('1');\r\n * console.log(result.fields.find(f => f.fieldName === 'primarycontactid')?.relatedObjectType); // 2\r\n *\r\n * // Disable lookup relations for faster response\r\n * const result = await client.metadata.getFields('1', { includeLookupRelations: false });\r\n * ```\r\n */\r\n async getFields(\r\n objectType: string | number,\r\n options?: { includeLookupRelations?: boolean; signal?: AbortSignal } | AbortSignal,\r\n ): Promise<GetFieldsResult> {\r\n const objectTypeStr = String(objectType);\r\n\r\n // Handle both old signature (signal only) and new signature (options object)\r\n // Default includeLookupRelations to true\r\n const opts =\r\n options instanceof AbortSignal\r\n ? { signal: options, includeLookupRelations: true }\r\n : { signal: options?.signal, includeLookupRelations: options?.includeLookupRelations ?? true };\r\n\r\n // Check cache first\r\n const cached = this.client.getCached<GetFieldsResult>('fields', objectTypeStr);\r\n if (cached) {\r\n // If user wants lookup relations and cache has them (or doesn't need them), return cached\r\n // Since default is includeLookupRelations: true, cached results typically have relations\r\n const cachedHasRelations = cached.fields.some((f) => f.relatedObjectType !== undefined);\r\n if (!opts.includeLookupRelations || cachedHasRelations) {\r\n return cached;\r\n }\r\n // If user wants relations but cache doesn't have them, continue to fetch\r\n }\r\n\r\n const response = await this.client.request<{\r\n success: boolean;\r\n data?: Array<{\r\n fieldName: string;\r\n label: string;\r\n systemFieldTypeId: string;\r\n required?: boolean;\r\n defaultValue?: unknown;\r\n maxLength?: number;\r\n precision?: number;\r\n }>;\r\n }>({\r\n method: 'GET',\r\n endpoint: ENDPOINTS.FIELDS(objectTypeStr),\r\n signal: opts.signal,\r\n });\r\n\r\n // Enhance fields with readable field types\r\n let fields: FireberryField[] = (response.data || []).map((field) => ({\r\n ...field,\r\n fieldType: FIELD_TYPE_MAPPINGS[field.systemFieldTypeId] || field.systemFieldTypeId,\r\n }));\r\n\r\n // If requested, fetch related object types for lookup fields\r\n if (opts.includeLookupRelations) {\r\n const lookupFields = fields.filter(\r\n (field) => field.systemFieldTypeId === FIELD_TYPE_IDS.LOOKUP,\r\n );\r\n\r\n if (lookupFields.length > 0) {\r\n const lookupRelations = await this.fetchLookupRelations(\r\n objectTypeStr,\r\n lookupFields.map((f) => f.fieldName),\r\n opts.signal,\r\n );\r\n\r\n // Merge lookup relations into fields\r\n fields = fields.map((field) => ({\r\n ...field,\r\n relatedObjectType: lookupRelations.get(field.fieldName),\r\n }));\r\n }\r\n }\r\n\r\n const result: GetFieldsResult = {\r\n objectTypeId: objectTypeStr,\r\n fields,\r\n total: fields.length,\r\n success: true,\r\n };\r\n\r\n // Cache the result\r\n this.client.setCache('fields', objectTypeStr, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Fetches related object types for lookup fields using the query endpoint.\r\n * The query endpoint returns Columns metadata with fieldobjecttype even without records.\r\n * Excludes fields that cause API errors (e.g., deletedby, deletedon).\r\n */\r\n private async fetchLookupRelations(\r\n objectType: string,\r\n lookupFieldNames: string[],\r\n signal?: AbortSignal,\r\n ): Promise<Map<string, number>> {\r\n const relations = new Map<string, number>();\r\n\r\n // Filter out excluded fields that cause API errors\r\n const queryableFields = lookupFieldNames.filter(\r\n (fieldName) => !EXCLUDED_LOOKUP_FIELDS.includes(fieldName),\r\n );\r\n\r\n if (queryableFields.length === 0) {\r\n return relations;\r\n }\r\n\r\n const response = await this.client.request<{\r\n success: boolean;\r\n data?: {\r\n Columns?: Array<{\r\n fieldname: string;\r\n fieldobjecttype: number | null;\r\n }>;\r\n };\r\n }>({\r\n method: 'POST',\r\n endpoint: ENDPOINTS.QUERY,\r\n body: {\r\n objecttype: objectType,\r\n fields: queryableFields.join(','),\r\n query: '',\r\n page_size: 1,\r\n page_number: 1,\r\n show_real_value: 0,\r\n },\r\n signal,\r\n });\r\n\r\n // Extract fieldobjecttype from Columns metadata\r\n const columns = response.data?.Columns || [];\r\n for (const column of columns) {\r\n if (column.fieldobjecttype !== null && column.fieldobjecttype !== undefined) {\r\n relations.set(column.fieldname, column.fieldobjecttype);\r\n }\r\n }\r\n\r\n return relations;\r\n }\r\n\r\n /**\r\n * Gets all possible values for a dropdown field\r\n *\r\n * @param objectType - The object type ID\r\n * @param fieldName - The field name\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns List of dropdown values\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.metadata.getFieldValues('1', 'statuscode');\r\n * console.log(result.values); // [{ name: 'Active', value: '1' }, { name: 'Inactive', value: '2' }]\r\n * ```\r\n */\r\n async getFieldValues(\r\n objectType: string | number,\r\n fieldName: string,\r\n signal?: AbortSignal,\r\n ): Promise<GetFieldValuesResult> {\r\n const objectTypeStr = String(objectType);\r\n\r\n // Check cache first\r\n const cached = this.client.getCached<GetFieldValuesResult>(\r\n 'fieldValues',\r\n objectTypeStr,\r\n fieldName,\r\n );\r\n if (cached) {\r\n return cached;\r\n }\r\n\r\n const response = await this.client.request<{\r\n success: boolean;\r\n data?: {\r\n values?: FieldValue[];\r\n };\r\n }>({\r\n method: 'GET',\r\n endpoint: ENDPOINTS.FIELD_VALUES(objectTypeStr, fieldName),\r\n signal,\r\n });\r\n\r\n const result: GetFieldValuesResult = {\r\n objectTypeId: objectTypeStr,\r\n fieldName,\r\n values: response.data?.values || [],\r\n total: response.data?.values?.length || 0,\r\n success: true,\r\n };\r\n\r\n // Cache the result\r\n this.client.setCache('fieldValues', objectTypeStr, fieldName, result);\r\n\r\n return result;\r\n }\r\n}\r\n","/**\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","import type { FireberryClient } from '../client';\r\nimport type {\r\n FireberryRecord,\r\n CreateOptions,\r\n UpdateOptions,\r\n DeleteOptions,\r\n UpsertOptions,\r\n UpsertResult,\r\n} from '../types/records';\r\nimport { getObjectIdFieldName } from '../constants/objectIds';\r\n\r\n/**\r\n * Records API for CRUD operations on Fireberry records\r\n */\r\nexport class RecordsAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Creates a new record in Fireberry\r\n *\r\n * @param objectType - The object type ID (e.g., '1' for Account)\r\n * @param data - Record data to create\r\n * @param options - Optional settings\r\n * @returns Created record data\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.records.create('1', {\r\n * accountname: 'New Account',\r\n * emailaddress1: 'contact@example.com',\r\n * });\r\n * ```\r\n */\r\n async create(\r\n objectType: string | number,\r\n data: FireberryRecord,\r\n options?: CreateOptions,\r\n ): Promise<FireberryRecord> {\r\n const response = await this.client.request<{\r\n success: boolean;\r\n record: FireberryRecord;\r\n _id?: string;\r\n }>({\r\n method: 'POST',\r\n endpoint: `/api/v2/record/${objectType}`,\r\n body: data,\r\n signal: options?.signal,\r\n });\r\n\r\n return response.record;\r\n }\r\n\r\n /**\r\n * Updates an existing record in Fireberry\r\n *\r\n * @param objectType - The object type ID\r\n * @param recordId - The record ID to update\r\n * @param data - Record data to update\r\n * @param options - Optional settings\r\n * @returns Updated record data\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.records.update('1', 'abc123', {\r\n * accountname: 'Updated Account Name',\r\n * });\r\n * ```\r\n */\r\n async update(\r\n objectType: string | number,\r\n recordId: string,\r\n data: FireberryRecord,\r\n options?: UpdateOptions,\r\n ): Promise<FireberryRecord> {\r\n const response = await this.client.request<{\r\n success: boolean;\r\n record: FireberryRecord;\r\n _id?: string;\r\n }>({\r\n method: 'PUT',\r\n endpoint: `/api/v2/record/${objectType}/${recordId}`,\r\n body: data,\r\n signal: options?.signal,\r\n });\r\n\r\n return response.record;\r\n }\r\n\r\n /**\r\n * Deletes a record from Fireberry\r\n *\r\n * @param objectType - The object type ID\r\n * @param recordId - The record ID to delete\r\n * @param options - Optional settings\r\n * @returns Success status\r\n *\r\n * @example\r\n * ```typescript\r\n * await client.records.delete('1', 'abc123');\r\n * ```\r\n */\r\n async delete(\r\n objectType: string | number,\r\n recordId: string,\r\n options?: DeleteOptions,\r\n ): Promise<{ success: boolean; id: string }> {\r\n // Note: Delete uses /api/record (not /api/v2/record)\r\n await this.client.request({\r\n method: 'DELETE',\r\n endpoint: `/api/record/${objectType}/${recordId}`,\r\n signal: options?.signal,\r\n });\r\n\r\n return {\r\n success: true,\r\n id: recordId,\r\n };\r\n }\r\n\r\n /**\r\n * Upserts a record (creates if not exists, updates if exists)\r\n *\r\n * @param objectType - The object type ID\r\n * @param keyFields - Fields to use for matching existing records\r\n * @param data - Record data to upsert\r\n * @param options - Optional settings\r\n * @returns Upsert result with operation type and record data\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.records.upsert('1', ['emailaddress1'], {\r\n * accountname: 'Acme Corp',\r\n * emailaddress1: 'contact@acme.com',\r\n * });\r\n * console.log(result.operationType); // 'create' or 'update'\r\n * ```\r\n */\r\n async upsert(\r\n objectType: string | number,\r\n keyFields: string[],\r\n data: FireberryRecord,\r\n options?: UpsertOptions,\r\n ): Promise<UpsertResult> {\r\n const objectTypeStr = String(objectType);\r\n\r\n // Build key values from data\r\n const upsertKeyValues: Record<string, unknown> = {};\r\n for (const key of keyFields) {\r\n if (!(key in data)) {\r\n throw new Error(`Missing value for upsert key field: ${key}`);\r\n }\r\n upsertKeyValues[key] = data[key];\r\n }\r\n\r\n // Build query to check if record exists\r\n const queryConditions = keyFields.map((key) => `(${key} = ${data[key]})`);\r\n const queryString = queryConditions.join(' and ');\r\n\r\n // Query for existing record\r\n const queryResult = await this.client.query({\r\n objectType: objectTypeStr,\r\n fields: '*',\r\n query: queryString,\r\n limit: 1,\r\n showRealValue: true,\r\n signal: options?.signal,\r\n });\r\n\r\n const existingRecords = queryResult.records as FireberryRecord[];\r\n\r\n if (existingRecords.length > 0) {\r\n // Record exists - UPDATE\r\n const existingRecord = existingRecords[0];\r\n const idFieldName = getObjectIdFieldName(objectTypeStr);\r\n const recordId = String(existingRecord[idFieldName]);\r\n\r\n const updatedRecord = await this.update(objectTypeStr, recordId, data, options);\r\n\r\n return {\r\n success: true,\r\n operationType: 'update',\r\n upsertKeys: keyFields,\r\n upsertKeyValues,\r\n oldRecord: existingRecord,\r\n newRecord: updatedRecord,\r\n };\r\n } else {\r\n // Record doesn't exist - CREATE\r\n const createdRecord = await this.create(objectTypeStr, data, options);\r\n\r\n return {\r\n success: true,\r\n operationType: 'create',\r\n upsertKeys: keyFields,\r\n upsertKeyValues,\r\n oldRecord: null,\r\n newRecord: createdRecord,\r\n };\r\n }\r\n }\r\n}\r\n","import type { FireberryClient } from '../client';\r\nimport type {\r\n FireberryRecord,\r\n BatchCreateOptions,\r\n BatchUpdateOptions,\r\n BatchUpdateRecord,\r\n BatchDeleteOptions,\r\n BatchResult,\r\n BatchDeleteResult,\r\n} from '../types/records';\r\nimport { chunkArray } from '../utils/helpers';\r\n\r\n/** Maximum records per batch API call */\r\nconst BATCH_SIZE = 20;\r\n\r\n/**\r\n * Batch API for bulk operations on Fireberry records\r\n * Automatically chunks large datasets into API-compatible batches of 20\r\n */\r\nexport class BatchAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Creates multiple records in batch\r\n * Automatically chunks into batches of 20 records\r\n *\r\n * @param objectType - The object type ID\r\n * @param records - Array of records to create\r\n * @param options - Optional settings\r\n * @returns Batch result with all created records\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.batch.create('1', [\r\n * { accountname: 'Account 1' },\r\n * { accountname: 'Account 2' },\r\n * ]);\r\n * console.log(result.count); // 2\r\n * ```\r\n */\r\n async create(\r\n objectType: string | number,\r\n records: FireberryRecord[],\r\n options?: BatchCreateOptions,\r\n ): Promise<BatchResult> {\r\n const objectTypeStr = String(objectType);\r\n const batches = chunkArray(records, BATCH_SIZE);\r\n const allResponses: unknown[] = [];\r\n\r\n for (const batch of batches) {\r\n // Check for abort\r\n if (options?.signal?.aborted) {\r\n break;\r\n }\r\n\r\n const response = await this.client.request<{ data?: unknown[] }>({\r\n method: 'POST',\r\n endpoint: `/api/v3/record/${objectTypeStr}/batch/create`,\r\n body: { data: batch },\r\n signal: options?.signal,\r\n });\r\n\r\n if (response.data) {\r\n if (Array.isArray(response.data)) {\r\n allResponses.push(...response.data);\r\n } else {\r\n allResponses.push(response.data);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n data: allResponses,\r\n count: allResponses.length,\r\n };\r\n }\r\n\r\n /**\r\n * Updates multiple records in batch\r\n * Automatically chunks into batches of 20 records\r\n *\r\n * @param objectType - The object type ID\r\n * @param records - Array of records with ID and data to update\r\n * @param options - Optional settings\r\n * @returns Batch result with all updated records\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.batch.update('1', [\r\n * { id: 'abc123', record: { accountname: 'Updated 1' } },\r\n * { id: 'def456', record: { accountname: 'Updated 2' } },\r\n * ]);\r\n * ```\r\n */\r\n async update(\r\n objectType: string | number,\r\n records: BatchUpdateRecord[],\r\n options?: BatchUpdateOptions,\r\n ): Promise<BatchResult> {\r\n const objectTypeStr = String(objectType);\r\n const batches = chunkArray(records, BATCH_SIZE);\r\n const allResponses: unknown[] = [];\r\n\r\n for (const batch of batches) {\r\n // Check for abort\r\n if (options?.signal?.aborted) {\r\n break;\r\n }\r\n\r\n const response = await this.client.request<{ data?: unknown[] }>({\r\n method: 'POST',\r\n endpoint: `/api/v3/record/${objectTypeStr}/batch/update`,\r\n body: { data: batch },\r\n signal: options?.signal,\r\n });\r\n\r\n if (response.data) {\r\n if (Array.isArray(response.data)) {\r\n allResponses.push(...response.data);\r\n } else {\r\n allResponses.push(response.data);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n data: allResponses,\r\n count: allResponses.length,\r\n };\r\n }\r\n\r\n /**\r\n * Deletes multiple records in batch\r\n * Automatically chunks into batches of 20 records\r\n *\r\n * @param objectType - The object type ID\r\n * @param recordIds - Array of record IDs to delete\r\n * @param options - Optional settings\r\n * @returns Batch delete result with deleted IDs\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await client.batch.delete('1', ['abc123', 'def456']);\r\n * console.log(result.ids); // ['abc123', 'def456']\r\n * ```\r\n */\r\n async delete(\r\n objectType: string | number,\r\n recordIds: string[],\r\n options?: BatchDeleteOptions,\r\n ): Promise<BatchDeleteResult> {\r\n const objectTypeStr = String(objectType);\r\n const batches = chunkArray(recordIds, BATCH_SIZE);\r\n const allDeletedIds: string[] = [];\r\n\r\n for (const batch of batches) {\r\n // Check for abort\r\n if (options?.signal?.aborted) {\r\n break;\r\n }\r\n\r\n await this.client.request({\r\n method: 'POST',\r\n endpoint: `/api/v3/record/${objectTypeStr}/batch/delete`,\r\n body: { data: batch },\r\n signal: options?.signal,\r\n });\r\n\r\n allDeletedIds.push(...batch);\r\n }\r\n\r\n return {\r\n success: true,\r\n ids: allDeletedIds,\r\n count: allDeletedIds.length,\r\n };\r\n }\r\n}\r\n","import type { FireberryClient } from '../client';\r\nimport type { CreateFieldOptions, CreateFieldResult } from '../types/fields';\r\n\r\n/**\r\n * Field type to API endpoint mapping\r\n */\r\nconst FIELD_TYPE_ENDPOINTS: Record<string, string> = {\r\n text: 'text',\r\n email: 'email',\r\n url: 'url',\r\n phone: 'phone',\r\n number: 'number',\r\n textarea: 'textarea',\r\n html: 'html',\r\n date: 'date',\r\n datetime: 'datetime',\r\n lookup: 'lookup',\r\n summary: 'summary',\r\n formula: 'formula',\r\n picklist: 'picklist',\r\n};\r\n\r\n/**\r\n * Fields API for creating custom fields in Fireberry\r\n */\r\nexport class FieldsAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Creates a new custom field in a Fireberry object\r\n *\r\n * @param objectType - The object type ID\r\n * @param options - Field creation options\r\n * @returns Created field result\r\n *\r\n * @example\r\n * ```typescript\r\n * // Create a text field\r\n * const result = await client.fields.create('1', {\r\n * type: 'text',\r\n * fieldName: 'pcf_custom_field',\r\n * label: 'Custom Field',\r\n * maxLength: 100,\r\n * });\r\n *\r\n * // Create a picklist field\r\n * const result = await client.fields.create('1', {\r\n * type: 'picklist',\r\n * fieldName: 'pcf_status',\r\n * label: 'Status',\r\n * values: [\r\n * { name: 'Active', value: '1' },\r\n * { name: 'Inactive', value: '2' },\r\n * ],\r\n * });\r\n *\r\n * // Create a lookup field\r\n * const result = await client.fields.create('2', {\r\n * type: 'lookup',\r\n * fieldName: 'pcf_related_account',\r\n * label: 'Related Account',\r\n * relatedObjectId: '1',\r\n * });\r\n * ```\r\n */\r\n async create(\r\n objectType: string | number,\r\n options: CreateFieldOptions,\r\n ): Promise<CreateFieldResult> {\r\n const objectTypeStr = String(objectType);\r\n const { type, fieldName, label, defaultValue, follow, autoComplete } = options;\r\n\r\n // Build field data\r\n const fieldData: Record<string, unknown> = {\r\n fieldName,\r\n label,\r\n };\r\n\r\n // Add optional common properties\r\n if (defaultValue !== undefined) {\r\n fieldData.defaultValue = defaultValue;\r\n }\r\n if (follow !== undefined) {\r\n fieldData.follow = follow;\r\n }\r\n if (autoComplete !== undefined && ['text', 'email', 'url', 'phone', 'number'].includes(type)) {\r\n fieldData.autoComplete = autoComplete;\r\n }\r\n\r\n // Add field-type specific properties\r\n switch (type) {\r\n case 'text':\r\n case 'email':\r\n case 'url': {\r\n const opts = options as { maxLength?: number };\r\n if (opts.maxLength !== undefined && opts.maxLength > 0) {\r\n fieldData.maxLength = opts.maxLength;\r\n }\r\n break;\r\n }\r\n\r\n case 'number': {\r\n const opts = options as { precision?: number };\r\n if (opts.precision !== undefined) {\r\n fieldData.precision = opts.precision;\r\n }\r\n break;\r\n }\r\n\r\n case 'lookup': {\r\n const opts = options as { relatedObjectId: string };\r\n fieldData.relatedObjectId = opts.relatedObjectId;\r\n break;\r\n }\r\n\r\n case 'picklist': {\r\n const opts = options as { values: Array<{ name: string; value: string }> };\r\n fieldData.values = opts.values;\r\n break;\r\n }\r\n\r\n case 'summary': {\r\n const opts = options as {\r\n summaryType: string;\r\n relatedObjectId: string;\r\n summaryField?: string;\r\n };\r\n fieldData.summaryType = opts.summaryType;\r\n fieldData.relatedObjectId = opts.relatedObjectId;\r\n if (opts.summaryField) {\r\n fieldData.summaryField = opts.summaryField;\r\n }\r\n break;\r\n }\r\n\r\n case 'formula': {\r\n const opts = options as {\r\n formula: string;\r\n formulaFieldType: string;\r\n formulaPrecision?: number;\r\n };\r\n fieldData.formula = opts.formula;\r\n fieldData.fieldType = opts.formulaFieldType;\r\n if (opts.formulaFieldType === 'number' && opts.formulaPrecision !== undefined) {\r\n fieldData.precision = opts.formulaPrecision;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Get the API endpoint for this field type\r\n const endpoint = FIELD_TYPE_ENDPOINTS[type];\r\n if (!endpoint) {\r\n throw new Error(`Unsupported field type: ${type}`);\r\n }\r\n\r\n const response = await this.client.request<Record<string, unknown>>({\r\n method: 'POST',\r\n endpoint: `/api/v2/system-field/${objectTypeStr}/${endpoint}`,\r\n body: fieldData,\r\n });\r\n\r\n return {\r\n objectTypeId: objectTypeStr,\r\n fieldType: type,\r\n fieldData: response,\r\n success: true,\r\n };\r\n }\r\n}\r\n","import type { FireberryClient } from '../client';\r\nimport { FireberryError, FireberryErrorCode } from '../errors';\r\n\r\n/**\r\n * Options for file upload\r\n */\r\nexport interface FileUploadOptions {\r\n /** File content as Buffer */\r\n buffer: Buffer;\r\n /** File name */\r\n filename: string;\r\n /** MIME type */\r\n mimeType: string;\r\n}\r\n\r\n/**\r\n * Result of file upload\r\n */\r\nexport interface FileUploadResult {\r\n /** Success flag */\r\n success: boolean;\r\n /** Object type */\r\n objectType: string;\r\n /** Record ID */\r\n recordId: string;\r\n /** Uploaded file name */\r\n fileName: string;\r\n /** File MIME type */\r\n mimeType: string;\r\n /** File size in bytes */\r\n fileSize: number;\r\n /** API response */\r\n response: unknown;\r\n}\r\n\r\n/**\r\n * Files API for file operations in Fireberry\r\n */\r\nexport class FilesAPI {\r\n constructor(private readonly client: FireberryClient) {}\r\n\r\n /**\r\n * Uploads a file attachment to a Fireberry record\r\n *\r\n * @param objectType - The object type ID\r\n * @param recordId - The record ID to attach the file to\r\n * @param options - File upload options\r\n * @param signal - Optional AbortSignal for cancellation\r\n * @returns Upload result\r\n *\r\n * @example\r\n * ```typescript\r\n * import { readFileSync } from 'fs';\r\n *\r\n * const fileBuffer = readFileSync('document.pdf');\r\n * const result = await client.files.upload('1', 'abc123', {\r\n * buffer: fileBuffer,\r\n * filename: 'document.pdf',\r\n * mimeType: 'application/pdf',\r\n * });\r\n * ```\r\n */\r\n async upload(\r\n objectType: string | number,\r\n recordId: string,\r\n options: FileUploadOptions,\r\n signal?: AbortSignal,\r\n ): Promise<FileUploadResult> {\r\n const objectTypeStr = String(objectType);\r\n const { buffer, filename, mimeType } = options;\r\n const config = this.client.getConfig();\r\n\r\n // Build the URL\r\n const url = `${config.baseUrl}/api/v2/record/${objectTypeStr}/${recordId}/files`;\r\n\r\n // Create form data\r\n // Note: In Node.js, we need to construct multipart/form-data manually\r\n // or use a library like form-data\r\n const boundary = `----FormBoundary${Date.now()}`;\r\n const formParts: Buffer[] = [];\r\n\r\n // Add file part\r\n const fileHeader = [\r\n `--${boundary}`,\r\n `Content-Disposition: form-data; name=\"file\"; filename=\"${filename}\"`,\r\n `Content-Type: ${mimeType}`,\r\n '',\r\n '',\r\n ].join('\\r\\n');\r\n\r\n formParts.push(Buffer.from(fileHeader));\r\n formParts.push(buffer);\r\n formParts.push(Buffer.from(`\\r\\n--${boundary}--\\r\\n`));\r\n\r\n const body = Buffer.concat(formParts);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': `multipart/form-data; boundary=${boundary}`,\r\n tokenid: config.apiKey,\r\n },\r\n body,\r\n signal,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new FireberryError(`File upload failed: ${response.statusText}`, {\r\n code: FireberryErrorCode.INVALID_REQUEST,\r\n statusCode: response.status,\r\n });\r\n }\r\n\r\n const responseData = await response.json();\r\n\r\n return {\r\n success: true,\r\n objectType: objectTypeStr,\r\n recordId,\r\n fileName: filename,\r\n mimeType,\r\n fileSize: buffer.length,\r\n response: responseData,\r\n };\r\n } catch (error) {\r\n if (error instanceof FireberryError) {\r\n throw error;\r\n }\r\n throw new FireberryError(`File upload failed: ${(error as Error).message}`, {\r\n code: FireberryErrorCode.NETWORK_ERROR,\r\n cause: error as Error,\r\n });\r\n }\r\n }\r\n}\r\n","import type {\r\n FireberryClientConfig,\r\n RequestOptions,\r\n CacheControl,\r\n} from './types/client';\r\nimport type { QueryOptions, QueryResult } from './types/query';\r\nimport {\r\n FireberryError,\r\n FireberryErrorCode,\r\n createErrorFromResponse,\r\n createNetworkError,\r\n} from './errors';\r\nimport { wait } from './utils/helpers';\r\nimport { QueryBuilder } from './utils/queryBuilder';\r\n\r\n// Import API modules\r\nimport { MetadataAPI } from './api/metadata';\r\nimport { RecordsAPI } from './api/records';\r\nimport { BatchAPI } from './api/batch';\r\nimport { FieldsAPI } from './api/fields';\r\nimport { FilesAPI } from './api/files';\r\n\r\n/**\r\n * Internal cache store for metadata\r\n */\r\ninterface CacheStore {\r\n objects?: { data: unknown; timestamp: number };\r\n fields: Map<string, { data: unknown; timestamp: number }>;\r\n fieldValues: Map<string, { data: unknown; timestamp: number }>;\r\n}\r\n\r\n/**\r\n * FireberryClient - Main client for interacting with the Fireberry CRM API\r\n *\r\n * @example\r\n * ```typescript\r\n * const client = new FireberryClient({\r\n * apiKey: 'your-api-key',\r\n * retryOn429: true,\r\n * maxRetries: 120,\r\n * });\r\n *\r\n * // Query records\r\n * const result = await client.query({\r\n * objectType: '1',\r\n * fields: ['accountid', 'name'],\r\n * query: '(statuscode = 1)',\r\n * });\r\n *\r\n * // Use query builder\r\n * const result = await client.queryBuilder()\r\n * .objectType('1')\r\n * .select('accountid', 'name')\r\n * .where('statuscode').equals('1')\r\n * .execute();\r\n * ```\r\n */\r\nexport class FireberryClient {\r\n private readonly config: Required<FireberryClientConfig>;\r\n private readonly cacheStore: CacheStore;\r\n\r\n /** Metadata API operations */\r\n readonly metadata: MetadataAPI;\r\n /** Records CRUD operations */\r\n readonly records: RecordsAPI;\r\n /** Batch operations */\r\n readonly batch: BatchAPI;\r\n /** Field management operations */\r\n readonly fields: FieldsAPI;\r\n /** File operations */\r\n readonly files: FilesAPI;\r\n\r\n /**\r\n * Creates a new FireberryClient instance\r\n */\r\n constructor(config: FireberryClientConfig) {\r\n this.config = {\r\n apiKey: config.apiKey,\r\n baseUrl: config.baseUrl || 'https://api.fireberry.com',\r\n timeout: config.timeout || 30000,\r\n retryOn429: config.retryOn429 ?? true,\r\n maxRetries: config.maxRetries || 120,\r\n retryDelay: config.retryDelay || 1000,\r\n cacheMetadata: config.cacheMetadata || false,\r\n cacheTTL: config.cacheTTL || 300000, // 5 minutes default\r\n };\r\n\r\n // Initialize cache store\r\n this.cacheStore = {\r\n fields: new Map(),\r\n fieldValues: new Map(),\r\n };\r\n\r\n // Initialize API modules\r\n this.metadata = new MetadataAPI(this);\r\n this.records = new RecordsAPI(this);\r\n this.batch = new BatchAPI(this);\r\n this.fields = new FieldsAPI(this);\r\n this.files = new FilesAPI(this);\r\n }\r\n\r\n /**\r\n * Gets the client configuration\r\n */\r\n getConfig(): Readonly<Required<FireberryClientConfig>> {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Cache control methods\r\n */\r\n readonly cache: CacheControl = {\r\n clear: () => {\r\n this.cacheStore.objects = undefined;\r\n this.cacheStore.fields.clear();\r\n this.cacheStore.fieldValues.clear();\r\n },\r\n clearObjects: () => {\r\n this.cacheStore.objects = undefined;\r\n },\r\n clearFields: (objectType: string) => {\r\n this.cacheStore.fields.delete(objectType);\r\n },\r\n clearFieldValues: (objectType: string, fieldName?: string) => {\r\n if (fieldName) {\r\n this.cacheStore.fieldValues.delete(`${objectType}:${fieldName}`);\r\n } else {\r\n // Clear all field values for this object type\r\n for (const key of this.cacheStore.fieldValues.keys()) {\r\n if (key.startsWith(`${objectType}:`)) {\r\n this.cacheStore.fieldValues.delete(key);\r\n }\r\n }\r\n }\r\n },\r\n };\r\n\r\n /**\r\n * Gets cached data if valid, or undefined if not cached or expired\r\n */\r\n getCached<T>(type: 'objects'): T | undefined;\r\n getCached<T>(type: 'fields', objectType: string): T | undefined;\r\n getCached<T>(type: 'fieldValues', objectType: string, fieldName: string): T | undefined;\r\n getCached<T>(\r\n type: 'objects' | 'fields' | 'fieldValues',\r\n objectType?: string,\r\n fieldName?: string,\r\n ): T | undefined {\r\n if (!this.config.cacheMetadata) {\r\n return undefined;\r\n }\r\n\r\n const now = Date.now();\r\n\r\n if (type === 'objects') {\r\n const cached = this.cacheStore.objects;\r\n if (cached && now - cached.timestamp < this.config.cacheTTL) {\r\n return cached.data as T;\r\n }\r\n } else if (type === 'fields' && objectType) {\r\n const cached = this.cacheStore.fields.get(objectType);\r\n if (cached && now - cached.timestamp < this.config.cacheTTL) {\r\n return cached.data as T;\r\n }\r\n } else if (type === 'fieldValues' && objectType && fieldName) {\r\n const key = `${objectType}:${fieldName}`;\r\n const cached = this.cacheStore.fieldValues.get(key);\r\n if (cached && now - cached.timestamp < this.config.cacheTTL) {\r\n return cached.data as T;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Sets cached data\r\n */\r\n setCache(type: 'objects', data: unknown): void;\r\n setCache(type: 'fields', objectType: string, data: unknown): void;\r\n setCache(type: 'fieldValues', objectType: string, fieldName: string, data: unknown): void;\r\n setCache(\r\n type: 'objects' | 'fields' | 'fieldValues',\r\n objectTypeOrData?: string | unknown,\r\n fieldNameOrData?: string | unknown,\r\n data?: unknown,\r\n ): void {\r\n if (!this.config.cacheMetadata) {\r\n return;\r\n }\r\n\r\n const now = Date.now();\r\n\r\n if (type === 'objects') {\r\n this.cacheStore.objects = { data: objectTypeOrData, timestamp: now };\r\n } else if (type === 'fields' && typeof objectTypeOrData === 'string') {\r\n this.cacheStore.fields.set(objectTypeOrData, {\r\n data: fieldNameOrData,\r\n timestamp: now,\r\n });\r\n } else if (\r\n type === 'fieldValues' &&\r\n typeof objectTypeOrData === 'string' &&\r\n typeof fieldNameOrData === 'string'\r\n ) {\r\n const key = `${objectTypeOrData}:${fieldNameOrData}`;\r\n this.cacheStore.fieldValues.set(key, { data, timestamp: now });\r\n }\r\n }\r\n\r\n /**\r\n * Creates a new QueryBuilder instance\r\n */\r\n queryBuilder(): QueryBuilder {\r\n return new QueryBuilder(this);\r\n }\r\n\r\n /**\r\n * Executes a query against the Fireberry API\r\n */\r\n async query(options: QueryOptions): Promise<QueryResult> {\r\n const {\r\n objectType,\r\n fields,\r\n query,\r\n sortBy = 'modifiedon',\r\n sortType = 'desc',\r\n limit,\r\n page = 1,\r\n pageSize = 500,\r\n showRealValue = true,\r\n autoPage = true,\r\n signal,\r\n } = options;\r\n\r\n // Normalize fields to string\r\n let fieldsStr: string;\r\n if (Array.isArray(fields)) {\r\n fieldsStr = fields.join(',');\r\n } else if (typeof fields === 'string') {\r\n fieldsStr = fields;\r\n } else {\r\n fieldsStr = '*';\r\n }\r\n\r\n // Handle '*' expansion for object types with excluded fields\r\n if (fieldsStr === '*') {\r\n fieldsStr = await this.expandStarFields(objectType, signal);\r\n }\r\n\r\n // If autoPage is true, fetch all pages\r\n if (autoPage) {\r\n return this.queryAllPages({\r\n objectType,\r\n fields: fieldsStr,\r\n query,\r\n sortBy,\r\n sortType,\r\n showRealValue,\r\n limit,\r\n signal,\r\n });\r\n }\r\n\r\n // Single page query\r\n const body = {\r\n objecttype: objectType,\r\n fields: fieldsStr,\r\n query: query || '',\r\n sort_by: sortBy,\r\n sort_type: sortType,\r\n page_size: Math.min(pageSize, limit || 500),\r\n page_number: page,\r\n show_real_value: showRealValue ? 1 : 0,\r\n };\r\n\r\n const response = await this.request<{ data?: { Data?: Record<string, unknown>[] } }>({\r\n method: 'POST',\r\n endpoint: '/api/query',\r\n body,\r\n signal,\r\n });\r\n\r\n const records = response.data?.Data || [];\r\n\r\n return {\r\n records,\r\n total: records.length,\r\n success: true,\r\n };\r\n }\r\n\r\n /**\r\n * Fetches all pages of a query\r\n */\r\n private async queryAllPages(options: {\r\n objectType: string;\r\n fields: string;\r\n query?: string;\r\n sortBy: string;\r\n sortType: string;\r\n showRealValue: boolean;\r\n limit?: number;\r\n signal?: AbortSignal;\r\n }): Promise<QueryResult> {\r\n const { objectType, fields, query, sortBy, sortType, showRealValue, limit, signal } = options;\r\n const maxPageSize = 500;\r\n const allRecords: Record<string, unknown>[] = [];\r\n let currentPage = 1;\r\n let hasMore = true;\r\n\r\n while (hasMore) {\r\n // Check for abort\r\n if (signal?.aborted) {\r\n break;\r\n }\r\n\r\n const body = {\r\n objecttype: objectType,\r\n fields,\r\n query: query || '',\r\n sort_by: sortBy,\r\n sort_type: sortType,\r\n page_size: maxPageSize,\r\n page_number: currentPage,\r\n show_real_value: showRealValue ? 1 : 0,\r\n };\r\n\r\n const response = await this.request<{ data?: { Data?: Record<string, unknown>[] } }>({\r\n method: 'POST',\r\n endpoint: '/api/query',\r\n body,\r\n signal,\r\n });\r\n\r\n const pageData = response.data?.Data || [];\r\n allRecords.push(...pageData);\r\n\r\n // Check if we've reached the limit\r\n if (limit && allRecords.length >= limit) {\r\n allRecords.splice(limit);\r\n break;\r\n }\r\n\r\n // Check if there are more pages\r\n if (pageData.length < maxPageSize) {\r\n hasMore = false;\r\n } else {\r\n currentPage++;\r\n }\r\n }\r\n\r\n return {\r\n records: allRecords,\r\n total: allRecords.length,\r\n success: true,\r\n };\r\n }\r\n\r\n /**\r\n * Expands '*' fields to actual field names, excluding problematic fields for specific object types\r\n */\r\n private async expandStarFields(objectType: string, signal?: AbortSignal): Promise<string> {\r\n const { getExcludedFieldsForStarQuery } = await import('./constants/excludedFields');\r\n const excludedFields = getExcludedFieldsForStarQuery(objectType);\r\n\r\n // If no excluded fields for this object type, just return '*'\r\n if (excludedFields.length === 0) {\r\n return '*';\r\n }\r\n\r\n // Fetch metadata to get all field names\r\n const fieldsResult = await this.metadata.getFields(objectType, signal);\r\n const allFieldNames = fieldsResult.fields.map((f) => f.fieldName);\r\n\r\n // Filter out excluded fields\r\n const filteredFields = allFieldNames.filter(\r\n (fieldName) => !excludedFields.includes(fieldName),\r\n );\r\n\r\n return filteredFields.join(',');\r\n }\r\n\r\n /**\r\n * Makes a raw API request to the Fireberry API\r\n */\r\n async request<T = unknown>(options: RequestOptions): Promise<T> {\r\n const {\r\n method,\r\n endpoint,\r\n query: queryParams,\r\n body,\r\n headers: customHeaders,\r\n signal,\r\n } = options;\r\n\r\n // Build URL\r\n let url = `${this.config.baseUrl}${endpoint}`;\r\n\r\n // Add query parameters if any\r\n if (queryParams && Object.keys(queryParams).length > 0) {\r\n const params = new URLSearchParams();\r\n for (const [key, value] of Object.entries(queryParams)) {\r\n if (value !== undefined && value !== null) {\r\n params.set(key, String(value));\r\n }\r\n }\r\n url += `?${params.toString()}`;\r\n }\r\n\r\n // Build headers\r\n const headers: Record<string, string> = {\r\n Accept: 'application/json',\r\n tokenid: this.config.apiKey,\r\n ...customHeaders,\r\n };\r\n\r\n if (body) {\r\n headers['Content-Type'] = 'application/json';\r\n }\r\n\r\n // Build fetch options\r\n const fetchOptions: RequestInit = {\r\n method,\r\n headers,\r\n signal,\r\n };\r\n\r\n if (body) {\r\n fetchOptions.body = JSON.stringify(body);\r\n }\r\n\r\n // Execute with retry logic\r\n return this.executeWithRetry<T>(url, fetchOptions);\r\n }\r\n\r\n /**\r\n * Executes a fetch request with retry logic for 429 errors\r\n */\r\n private async executeWithRetry<T>(\r\n url: string,\r\n options: RequestInit,\r\n retryCount = 0,\r\n ): Promise<T> {\r\n try {\r\n // Create timeout controller\r\n const timeoutController = new AbortController();\r\n const timeoutId = setTimeout(() => {\r\n timeoutController.abort();\r\n }, this.config.timeout);\r\n\r\n // Combine signals if external signal provided\r\n const combinedSignal = options.signal\r\n ? this.combineSignals([options.signal, timeoutController.signal])\r\n : timeoutController.signal;\r\n\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: combinedSignal,\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n // Handle rate limiting\r\n if (response.status === 429 && this.config.retryOn429) {\r\n if (retryCount < this.config.maxRetries) {\r\n // Wait before retrying\r\n await wait(this.config.retryDelay);\r\n return this.executeWithRetry<T>(url, options, retryCount + 1);\r\n }\r\n throw new FireberryError('Rate limit exceeded after max retries', {\r\n code: FireberryErrorCode.RATE_LIMITED,\r\n statusCode: 429,\r\n context: { retryCount },\r\n });\r\n }\r\n\r\n // Parse response\r\n let body: unknown;\r\n const contentType = response.headers.get('content-type');\r\n if (contentType?.includes('application/json')) {\r\n body = await response.json();\r\n } else {\r\n body = await response.text();\r\n }\r\n\r\n // Handle errors\r\n if (!response.ok) {\r\n throw createErrorFromResponse(response, body);\r\n }\r\n\r\n return body as T;\r\n } catch (error) {\r\n // Handle abort\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw createNetworkError(error);\r\n }\r\n\r\n // Re-throw FireberryError\r\n if (error instanceof FireberryError) {\r\n throw error;\r\n }\r\n\r\n // Wrap other errors\r\n throw createNetworkError(error as Error);\r\n }\r\n }\r\n\r\n /**\r\n * Combines multiple abort signals into one\r\n */\r\n private combineSignals(signals: AbortSignal[]): AbortSignal {\r\n const controller = new AbortController();\r\n\r\n for (const signal of signals) {\r\n if (signal.aborted) {\r\n controller.abort();\r\n break;\r\n }\r\n signal.addEventListener('abort', () => controller.abort(), { once: true });\r\n }\r\n\r\n return controller.signal;\r\n }\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","// Field type constants\r\nexport { FIELD_TYPE_IDS, FIELD_TYPE_MAPPINGS } from './fieldTypes';\r\n\r\n// Object ID mappings\r\nexport { OBJECT_ID_MAP, getObjectIdFieldName } from './objectIds';\r\n\r\n// Object name mappings\r\nexport { OBJECT_NAME_MAP, getNameFieldByObjectType } from './objectNames';\r\n\r\n// Excluded fields for star queries and lookup relations\r\nexport {\r\n EXCLUDED_FIELDS_FOR_STAR_QUERY,\r\n EXCLUDED_LOOKUP_FIELDS,\r\n isExcludedFromStarQuery,\r\n getExcludedFieldsForStarQuery,\r\n} from './excludedFields';\r\n"]}