@uipath/uipath-typescript 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/assets/index.cjs +5 -8
  2. package/dist/assets/index.d.ts +3 -1
  3. package/dist/assets/index.mjs +5 -8
  4. package/dist/attachments/index.cjs +5 -8
  5. package/dist/attachments/index.d.ts +3 -1
  6. package/dist/attachments/index.mjs +5 -8
  7. package/dist/buckets/index.cjs +5 -8
  8. package/dist/buckets/index.d.ts +3 -1
  9. package/dist/buckets/index.mjs +5 -8
  10. package/dist/cases/index.cjs +5 -8
  11. package/dist/cases/index.d.ts +3 -1
  12. package/dist/cases/index.mjs +5 -8
  13. package/dist/conversational-agent/index.cjs +38 -16
  14. package/dist/conversational-agent/index.d.ts +26 -4
  15. package/dist/conversational-agent/index.mjs +38 -16
  16. package/dist/core/index.cjs +7 -5
  17. package/dist/core/index.d.ts +2 -2
  18. package/dist/core/index.mjs +7 -5
  19. package/dist/entities/index.cjs +680 -284
  20. package/dist/entities/index.d.ts +559 -45
  21. package/dist/entities/index.mjs +681 -285
  22. package/dist/index.cjs +520 -89
  23. package/dist/index.d.ts +604 -52
  24. package/dist/index.mjs +521 -90
  25. package/dist/index.umd.js +520 -89
  26. package/dist/jobs/index.cjs +57 -27
  27. package/dist/jobs/index.d.ts +70 -11
  28. package/dist/jobs/index.mjs +57 -27
  29. package/dist/maestro-processes/index.cjs +5 -8
  30. package/dist/maestro-processes/index.d.ts +3 -1
  31. package/dist/maestro-processes/index.mjs +5 -8
  32. package/dist/processes/index.cjs +5 -8
  33. package/dist/processes/index.d.ts +3 -1
  34. package/dist/processes/index.mjs +5 -8
  35. package/dist/queues/index.cjs +5 -8
  36. package/dist/queues/index.d.ts +3 -1
  37. package/dist/queues/index.mjs +5 -8
  38. package/dist/tasks/index.cjs +5 -8
  39. package/dist/tasks/index.d.ts +3 -1
  40. package/dist/tasks/index.mjs +5 -8
  41. package/package.json +1 -1
@@ -45,31 +45,43 @@ typeof SuppressedError === "function" ? SuppressedError : function (error, suppr
45
45
  };
46
46
 
47
47
  /**
48
- * Type guards for error response types
48
+ * Base error class for all UiPath SDK errors
49
+ * Extends Error for standard error handling compatibility
49
50
  */
50
- function isOrchestratorError(error) {
51
- return typeof error === 'object' &&
52
- error !== null &&
53
- 'message' in error &&
54
- 'errorCode' in error &&
55
- typeof error.message === 'string' &&
56
- typeof error.errorCode === 'number';
57
- }
58
- function isEntityError(error) {
59
- return typeof error === 'object' &&
60
- error !== null &&
61
- 'error' in error &&
62
- typeof error.error === 'string';
63
- }
64
- function isPimsError(error) {
65
- return typeof error === 'object' &&
66
- error !== null &&
67
- 'type' in error &&
68
- 'title' in error &&
69
- 'status' in error &&
70
- typeof error.type === 'string' &&
71
- typeof error.title === 'string' &&
72
- typeof error.status === 'number';
51
+ class UiPathError extends Error {
52
+ constructor(type, params) {
53
+ super(params.message);
54
+ this.name = type;
55
+ this.type = type;
56
+ this.statusCode = params.statusCode;
57
+ this.requestId = params.requestId;
58
+ this.timestamp = new Date();
59
+ // Maintains proper stack trace for where our error was thrown
60
+ if (Error.captureStackTrace) {
61
+ Error.captureStackTrace(this, this.constructor);
62
+ }
63
+ }
64
+ /**
65
+ * Returns a clean JSON representation of the error
66
+ */
67
+ toJSON() {
68
+ return {
69
+ type: this.type,
70
+ message: this.message,
71
+ statusCode: this.statusCode,
72
+ requestId: this.requestId,
73
+ timestamp: this.timestamp
74
+ };
75
+ }
76
+ /**
77
+ * Returns detailed debug information including stack trace
78
+ */
79
+ getDebugInfo() {
80
+ return {
81
+ ...this.toJSON(),
82
+ stack: this.stack
83
+ };
84
+ }
73
85
  }
74
86
 
75
87
  /**
@@ -133,6 +145,161 @@ const ErrorMessages = {
133
145
  const ErrorNames = {
134
146
  ABORT_ERROR: 'AbortError'};
135
147
 
148
+ /**
149
+ * Error thrown when authentication fails (401 errors)
150
+ * Common scenarios:
151
+ * - Invalid credentials
152
+ * - Expired token
153
+ * - Missing authentication
154
+ */
155
+ class AuthenticationError extends UiPathError {
156
+ constructor(params = {}) {
157
+ super(ErrorType.AUTHENTICATION, {
158
+ message: params.message || ErrorMessages.AUTHENTICATION_FAILED,
159
+ statusCode: params.statusCode ?? HttpStatus.UNAUTHORIZED,
160
+ requestId: params.requestId
161
+ });
162
+ }
163
+ }
164
+
165
+ /**
166
+ * Error thrown when authorization fails (403 errors)
167
+ * Common scenarios:
168
+ * - Insufficient permissions
169
+ * - Access denied to resource
170
+ * - Invalid scope
171
+ */
172
+ class AuthorizationError extends UiPathError {
173
+ constructor(params = {}) {
174
+ super(ErrorType.AUTHORIZATION, {
175
+ message: params.message || ErrorMessages.ACCESS_DENIED,
176
+ statusCode: params.statusCode ?? HttpStatus.FORBIDDEN,
177
+ requestId: params.requestId
178
+ });
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Error thrown when validation fails (400 errors or client-side validation)
184
+ * Common scenarios:
185
+ * - Invalid input parameters
186
+ * - Missing required fields
187
+ * - Invalid data format
188
+ */
189
+ class ValidationError extends UiPathError {
190
+ constructor(params = {}) {
191
+ super(ErrorType.VALIDATION, {
192
+ message: params.message || ErrorMessages.VALIDATION_FAILED,
193
+ statusCode: params.statusCode ?? HttpStatus.BAD_REQUEST,
194
+ requestId: params.requestId
195
+ });
196
+ }
197
+ }
198
+
199
+ /**
200
+ * Error thrown when a resource is not found (404 errors)
201
+ * Common scenarios:
202
+ * - Resource doesn't exist
203
+ * - Invalid ID provided
204
+ * - Resource deleted
205
+ */
206
+ class NotFoundError extends UiPathError {
207
+ constructor(params = {}) {
208
+ super(ErrorType.NOT_FOUND, {
209
+ message: params.message || ErrorMessages.RESOURCE_NOT_FOUND,
210
+ statusCode: params.statusCode ?? HttpStatus.NOT_FOUND,
211
+ requestId: params.requestId
212
+ });
213
+ }
214
+ }
215
+
216
+ /**
217
+ * Error thrown when rate limit is exceeded (429 errors)
218
+ * Common scenarios:
219
+ * - Too many requests in a time window
220
+ * - API throttling
221
+ */
222
+ class RateLimitError extends UiPathError {
223
+ constructor(params = {}) {
224
+ super(ErrorType.RATE_LIMIT, {
225
+ message: params.message || ErrorMessages.RATE_LIMIT_EXCEEDED,
226
+ statusCode: params.statusCode ?? HttpStatus.TOO_MANY_REQUESTS,
227
+ requestId: params.requestId
228
+ });
229
+ }
230
+ }
231
+
232
+ /**
233
+ * Error thrown when server encounters an error (5xx errors)
234
+ * Common scenarios:
235
+ * - Internal server error
236
+ * - Service unavailable
237
+ * - Gateway timeout
238
+ */
239
+ class ServerError extends UiPathError {
240
+ constructor(params = {}) {
241
+ super(ErrorType.SERVER, {
242
+ message: params.message || ErrorMessages.INTERNAL_SERVER_ERROR,
243
+ statusCode: params.statusCode ?? HttpStatus.INTERNAL_SERVER_ERROR,
244
+ requestId: params.requestId
245
+ });
246
+ }
247
+ /**
248
+ * Checks if this is a temporary error that might succeed on retry
249
+ */
250
+ get isRetryable() {
251
+ return this.statusCode === HttpStatus.BAD_GATEWAY ||
252
+ this.statusCode === HttpStatus.SERVICE_UNAVAILABLE ||
253
+ this.statusCode === HttpStatus.GATEWAY_TIMEOUT;
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Error thrown when network/connection issues occur
259
+ * Common scenarios:
260
+ * - Connection timeout
261
+ * - DNS resolution failure
262
+ * - Network unreachable
263
+ * - Request aborted
264
+ */
265
+ class NetworkError extends UiPathError {
266
+ constructor(params = {}) {
267
+ super(ErrorType.NETWORK, {
268
+ message: params.message || ErrorMessages.NETWORK_ERROR,
269
+ statusCode: params.statusCode, // Network errors typically don't have HTTP status codes
270
+ requestId: params.requestId
271
+ });
272
+ }
273
+ }
274
+
275
+ /**
276
+ * Type guards for error response types
277
+ */
278
+ function isOrchestratorError(error) {
279
+ return typeof error === 'object' &&
280
+ error !== null &&
281
+ 'message' in error &&
282
+ 'errorCode' in error &&
283
+ typeof error.message === 'string' &&
284
+ typeof error.errorCode === 'number';
285
+ }
286
+ function isEntityError(error) {
287
+ return typeof error === 'object' &&
288
+ error !== null &&
289
+ 'error' in error &&
290
+ typeof error.error === 'string';
291
+ }
292
+ function isPimsError(error) {
293
+ return typeof error === 'object' &&
294
+ error !== null &&
295
+ 'type' in error &&
296
+ 'title' in error &&
297
+ 'status' in error &&
298
+ typeof error.type === 'string' &&
299
+ typeof error.title === 'string' &&
300
+ typeof error.status === 'number';
301
+ }
302
+
136
303
  /**
137
304
  * Parser for Orchestrator/Task error format
138
305
  */
@@ -283,173 +450,6 @@ class ErrorResponseParser {
283
450
  // Export singleton instance
284
451
  const errorResponseParser = new ErrorResponseParser();
285
452
 
286
- /**
287
- * Base error class for all UiPath SDK errors
288
- * Extends Error for standard error handling compatibility
289
- */
290
- class UiPathError extends Error {
291
- constructor(type, params) {
292
- super(params.message);
293
- this.name = type;
294
- this.type = type;
295
- this.statusCode = params.statusCode;
296
- this.requestId = params.requestId;
297
- this.timestamp = new Date();
298
- // Maintains proper stack trace for where our error was thrown
299
- if (Error.captureStackTrace) {
300
- Error.captureStackTrace(this, this.constructor);
301
- }
302
- }
303
- /**
304
- * Returns a clean JSON representation of the error
305
- */
306
- toJSON() {
307
- return {
308
- type: this.type,
309
- message: this.message,
310
- statusCode: this.statusCode,
311
- requestId: this.requestId,
312
- timestamp: this.timestamp
313
- };
314
- }
315
- /**
316
- * Returns detailed debug information including stack trace
317
- */
318
- getDebugInfo() {
319
- return {
320
- ...this.toJSON(),
321
- stack: this.stack
322
- };
323
- }
324
- }
325
-
326
- /**
327
- * Error thrown when authentication fails (401 errors)
328
- * Common scenarios:
329
- * - Invalid credentials
330
- * - Expired token
331
- * - Missing authentication
332
- */
333
- class AuthenticationError extends UiPathError {
334
- constructor(params = {}) {
335
- super(ErrorType.AUTHENTICATION, {
336
- message: params.message || ErrorMessages.AUTHENTICATION_FAILED,
337
- statusCode: params.statusCode ?? HttpStatus.UNAUTHORIZED,
338
- requestId: params.requestId
339
- });
340
- }
341
- }
342
-
343
- /**
344
- * Error thrown when authorization fails (403 errors)
345
- * Common scenarios:
346
- * - Insufficient permissions
347
- * - Access denied to resource
348
- * - Invalid scope
349
- */
350
- class AuthorizationError extends UiPathError {
351
- constructor(params = {}) {
352
- super(ErrorType.AUTHORIZATION, {
353
- message: params.message || ErrorMessages.ACCESS_DENIED,
354
- statusCode: params.statusCode ?? HttpStatus.FORBIDDEN,
355
- requestId: params.requestId
356
- });
357
- }
358
- }
359
-
360
- /**
361
- * Error thrown when validation fails (400 errors or client-side validation)
362
- * Common scenarios:
363
- * - Invalid input parameters
364
- * - Missing required fields
365
- * - Invalid data format
366
- */
367
- class ValidationError extends UiPathError {
368
- constructor(params = {}) {
369
- super(ErrorType.VALIDATION, {
370
- message: params.message || ErrorMessages.VALIDATION_FAILED,
371
- statusCode: params.statusCode ?? HttpStatus.BAD_REQUEST,
372
- requestId: params.requestId
373
- });
374
- }
375
- }
376
-
377
- /**
378
- * Error thrown when a resource is not found (404 errors)
379
- * Common scenarios:
380
- * - Resource doesn't exist
381
- * - Invalid ID provided
382
- * - Resource deleted
383
- */
384
- class NotFoundError extends UiPathError {
385
- constructor(params = {}) {
386
- super(ErrorType.NOT_FOUND, {
387
- message: params.message || ErrorMessages.RESOURCE_NOT_FOUND,
388
- statusCode: params.statusCode ?? HttpStatus.NOT_FOUND,
389
- requestId: params.requestId
390
- });
391
- }
392
- }
393
-
394
- /**
395
- * Error thrown when rate limit is exceeded (429 errors)
396
- * Common scenarios:
397
- * - Too many requests in a time window
398
- * - API throttling
399
- */
400
- class RateLimitError extends UiPathError {
401
- constructor(params = {}) {
402
- super(ErrorType.RATE_LIMIT, {
403
- message: params.message || ErrorMessages.RATE_LIMIT_EXCEEDED,
404
- statusCode: params.statusCode ?? HttpStatus.TOO_MANY_REQUESTS,
405
- requestId: params.requestId
406
- });
407
- }
408
- }
409
-
410
- /**
411
- * Error thrown when server encounters an error (5xx errors)
412
- * Common scenarios:
413
- * - Internal server error
414
- * - Service unavailable
415
- * - Gateway timeout
416
- */
417
- class ServerError extends UiPathError {
418
- constructor(params = {}) {
419
- super(ErrorType.SERVER, {
420
- message: params.message || ErrorMessages.INTERNAL_SERVER_ERROR,
421
- statusCode: params.statusCode ?? HttpStatus.INTERNAL_SERVER_ERROR,
422
- requestId: params.requestId
423
- });
424
- }
425
- /**
426
- * Checks if this is a temporary error that might succeed on retry
427
- */
428
- get isRetryable() {
429
- return this.statusCode === HttpStatus.BAD_GATEWAY ||
430
- this.statusCode === HttpStatus.SERVICE_UNAVAILABLE ||
431
- this.statusCode === HttpStatus.GATEWAY_TIMEOUT;
432
- }
433
- }
434
-
435
- /**
436
- * Error thrown when network/connection issues occur
437
- * Common scenarios:
438
- * - Connection timeout
439
- * - DNS resolution failure
440
- * - Network unreachable
441
- * - Request aborted
442
- */
443
- class NetworkError extends UiPathError {
444
- constructor(params = {}) {
445
- super(ErrorType.NETWORK, {
446
- message: params.message || ErrorMessages.NETWORK_ERROR,
447
- statusCode: params.statusCode, // Network errors typically don't have HTTP status codes
448
- requestId: params.requestId
449
- });
450
- }
451
- }
452
-
453
453
  /**
454
454
  * Factory for creating typed errors based on HTTP status codes
455
455
  * Follows the Factory pattern for clean error instantiation
@@ -526,15 +526,11 @@ const RESPONSE_TYPES = {
526
526
 
527
527
  class ApiClient {
528
528
  constructor(config, executionContext, tokenManager, clientConfig = {}) {
529
- this.defaultHeaders = {};
530
529
  this.config = config;
531
530
  this.executionContext = executionContext;
532
531
  this.clientConfig = clientConfig;
533
532
  this.tokenManager = tokenManager;
534
533
  }
535
- setDefaultHeaders(headers) {
536
- this.defaultHeaders = { ...this.defaultHeaders, ...headers };
537
- }
538
534
  /**
539
535
  * Gets a valid authentication token, refreshing if necessary.
540
536
  * Used internally for API requests and exposed for services that need manual auth headers.
@@ -550,7 +546,6 @@ class ApiClient {
550
546
  return {
551
547
  'Authorization': `Bearer ${token}`,
552
548
  'Content-Type': CONTENT_TYPES.JSON,
553
- ...this.defaultHeaders,
554
549
  ...this.clientConfig.headers
555
550
  };
556
551
  }
@@ -1411,6 +1406,8 @@ class BaseService {
1411
1406
  *
1412
1407
  * @param instance - UiPath SDK instance providing authentication and configuration.
1413
1408
  * Services receive this via dependency injection in the modular pattern.
1409
+ * @param headers - Optional default headers to include in every request (e.g. `x-uipath-external-user-id` for
1410
+ * CAS external-app auth)
1414
1411
  *
1415
1412
  * @example
1416
1413
  * ```typescript
@@ -1430,11 +1427,11 @@ class BaseService {
1430
1427
  * const entities = new Entities(sdk);
1431
1428
  * ```
1432
1429
  */
1433
- constructor(instance) {
1430
+ constructor(instance, headers) {
1434
1431
  // Private field - not visible via Object.keys() or any reflection
1435
1432
  _BaseService_apiClient.set(this, void 0);
1436
1433
  const { config, context, tokenManager } = SDKInternalsRegistry.get(instance);
1437
- __classPrivateFieldSet(this, _BaseService_apiClient, new ApiClient(config, context, tokenManager), "f");
1434
+ __classPrivateFieldSet(this, _BaseService_apiClient, new ApiClient(config, context, tokenManager, headers ? { headers } : {}), "f");
1438
1435
  }
1439
1436
  /**
1440
1437
  * Gets a valid authentication token, refreshing if necessary.
@@ -1693,27 +1690,41 @@ function createEntityMethods(entityData, service) {
1693
1690
  throw new Error('Entity ID is undefined');
1694
1691
  return service.deleteAttachment(entityData.id, recordId, fieldName);
1695
1692
  },
1693
+ async queryRecords(options) {
1694
+ if (!entityData.id)
1695
+ throw new Error('Entity ID is undefined');
1696
+ return service.queryRecordsById(entityData.id, options);
1697
+ },
1698
+ async importRecords(file) {
1699
+ if (!entityData.id)
1700
+ throw new Error('Entity ID is undefined');
1701
+ return service.importRecordsById(entityData.id, file);
1702
+ },
1696
1703
  async insert(data, options) {
1697
1704
  return this.insertRecord(data, options);
1698
1705
  },
1699
1706
  async batchInsert(data, options) {
1700
1707
  return this.insertRecords(data, options);
1701
1708
  },
1702
- async update(data, options) {
1703
- return this.updateRecords(data, options);
1709
+ async getRecords(options) {
1710
+ return this.getAllRecords(options);
1711
+ },
1712
+ async delete() {
1713
+ if (!entityData.id)
1714
+ throw new Error('Entity ID is undefined');
1715
+ return service.deleteById(entityData.id);
1704
1716
  },
1705
- async delete(recordIds, options) {
1706
- return this.deleteRecords(recordIds, options);
1717
+ async update(options) {
1718
+ if (!entityData.id)
1719
+ throw new Error('Entity ID is undefined');
1720
+ return service.updateById(entityData.id, options);
1707
1721
  },
1708
- async getRecords(options) {
1709
- return this.getAllRecords(options);
1710
- }
1711
1722
  };
1712
1723
  }
1713
1724
  /**
1714
- * Creates an actionable entity metadata by combining entity with operational methods
1725
+ * Creates an actionable entity by combining entity metadata with data and management methods
1715
1726
  *
1716
- * @param entityData - Entity metadata
1727
+ * @param entityMetadata - Entity metadata
1717
1728
  * @param service - The entity service instance
1718
1729
  * @returns Entity metadata with added methods
1719
1730
  */
@@ -1722,6 +1733,103 @@ function createEntityWithMethods(entityData, service) {
1722
1733
  return Object.assign({}, entityData, methods);
1723
1734
  }
1724
1735
 
1736
+ /**
1737
+ * Entity field data type names (SQL-level types returned by the API)
1738
+ */
1739
+ exports.EntityFieldDataType = void 0;
1740
+ (function (EntityFieldDataType) {
1741
+ EntityFieldDataType["UUID"] = "UUID";
1742
+ EntityFieldDataType["STRING"] = "STRING";
1743
+ EntityFieldDataType["INTEGER"] = "INTEGER";
1744
+ EntityFieldDataType["DATETIME"] = "DATETIME";
1745
+ EntityFieldDataType["DATETIME_WITH_TZ"] = "DATETIME_WITH_TZ";
1746
+ EntityFieldDataType["DECIMAL"] = "DECIMAL";
1747
+ EntityFieldDataType["FLOAT"] = "FLOAT";
1748
+ EntityFieldDataType["DOUBLE"] = "DOUBLE";
1749
+ EntityFieldDataType["DATE"] = "DATE";
1750
+ EntityFieldDataType["BOOLEAN"] = "BOOLEAN";
1751
+ EntityFieldDataType["BIG_INTEGER"] = "BIG_INTEGER";
1752
+ EntityFieldDataType["MULTILINE_TEXT"] = "MULTILINE_TEXT";
1753
+ EntityFieldDataType["FILE"] = "FILE";
1754
+ EntityFieldDataType["CHOICE_SET_SINGLE"] = "CHOICE_SET_SINGLE";
1755
+ EntityFieldDataType["CHOICE_SET_MULTIPLE"] = "CHOICE_SET_MULTIPLE";
1756
+ EntityFieldDataType["AUTO_NUMBER"] = "AUTO_NUMBER";
1757
+ EntityFieldDataType["RELATIONSHIP"] = "RELATIONSHIP";
1758
+ })(exports.EntityFieldDataType || (exports.EntityFieldDataType = {}));
1759
+ /**
1760
+ * Logical operator for combining query filter groups
1761
+ */
1762
+ exports.LogicalOperator = void 0;
1763
+ (function (LogicalOperator) {
1764
+ /** Combine conditions with AND — all conditions must match */
1765
+ LogicalOperator[LogicalOperator["And"] = 0] = "And";
1766
+ /** Combine conditions with OR — any condition must match */
1767
+ LogicalOperator[LogicalOperator["Or"] = 1] = "Or";
1768
+ })(exports.LogicalOperator || (exports.LogicalOperator = {}));
1769
+ /**
1770
+ * Comparison operators for entity query filters.
1771
+ * Not all operators are valid for all field types.
1772
+ */
1773
+ exports.QueryFilterOperator = void 0;
1774
+ (function (QueryFilterOperator) {
1775
+ QueryFilterOperator["Equals"] = "=";
1776
+ QueryFilterOperator["NotEquals"] = "!=";
1777
+ QueryFilterOperator["GreaterThan"] = ">";
1778
+ QueryFilterOperator["LessThan"] = "<";
1779
+ QueryFilterOperator["GreaterThanOrEqual"] = ">=";
1780
+ QueryFilterOperator["LessThanOrEqual"] = "<=";
1781
+ QueryFilterOperator["Contains"] = "contains";
1782
+ QueryFilterOperator["NotContains"] = "not contains";
1783
+ QueryFilterOperator["StartsWith"] = "startswith";
1784
+ QueryFilterOperator["EndsWith"] = "endswith";
1785
+ QueryFilterOperator["In"] = "in";
1786
+ QueryFilterOperator["NotIn"] = "not in";
1787
+ })(exports.QueryFilterOperator || (exports.QueryFilterOperator = {}));
1788
+ /**
1789
+ * Entity type enum
1790
+ */
1791
+ exports.EntityType = void 0;
1792
+ (function (EntityType) {
1793
+ EntityType["Entity"] = "Entity";
1794
+ EntityType["ChoiceSet"] = "ChoiceSet";
1795
+ EntityType["InternalEntity"] = "InternalEntity";
1796
+ EntityType["SystemEntity"] = "SystemEntity";
1797
+ })(exports.EntityType || (exports.EntityType = {}));
1798
+ /**
1799
+ * Reference types for fields
1800
+ */
1801
+ exports.ReferenceType = void 0;
1802
+ (function (ReferenceType) {
1803
+ ReferenceType["ManyToOne"] = "ManyToOne";
1804
+ })(exports.ReferenceType || (exports.ReferenceType = {}));
1805
+ /**
1806
+ * Field display types
1807
+ */
1808
+ exports.FieldDisplayType = void 0;
1809
+ (function (FieldDisplayType) {
1810
+ FieldDisplayType["Basic"] = "Basic";
1811
+ FieldDisplayType["Relationship"] = "Relationship";
1812
+ FieldDisplayType["File"] = "File";
1813
+ FieldDisplayType["ChoiceSetSingle"] = "ChoiceSetSingle";
1814
+ FieldDisplayType["ChoiceSetMultiple"] = "ChoiceSetMultiple";
1815
+ FieldDisplayType["AutoNumber"] = "AutoNumber";
1816
+ })(exports.FieldDisplayType || (exports.FieldDisplayType = {}));
1817
+ /**
1818
+ * Data direction type for external fields
1819
+ */
1820
+ exports.DataDirectionType = void 0;
1821
+ (function (DataDirectionType) {
1822
+ DataDirectionType["ReadOnly"] = "ReadOnly";
1823
+ DataDirectionType["ReadAndWrite"] = "ReadAndWrite";
1824
+ })(exports.DataDirectionType || (exports.DataDirectionType = {}));
1825
+ /**
1826
+ * Join type for source join criteria
1827
+ */
1828
+ exports.JoinType = void 0;
1829
+ (function (JoinType) {
1830
+ JoinType["LeftJoin"] = "LeftJoin";
1831
+ })(exports.JoinType || (exports.JoinType = {}));
1832
+
1725
1833
  /**
1726
1834
  * Base path constants for different services
1727
1835
  */
@@ -1730,6 +1838,12 @@ const DATAFABRIC_BASE = 'datafabric_';
1730
1838
  /**
1731
1839
  * Data Fabric Service Endpoints
1732
1840
  */
1841
+ /**
1842
+ * Default folder key used for tenant-level Data Fabric entities.
1843
+ * Tenant-level entities are not scoped to a folder; this is the
1844
+ * conventional placeholder value the API expects.
1845
+ */
1846
+ const DATA_FABRIC_TENANT_FOLDER_ID = '00000000-0000-0000-0000-000000000000';
1733
1847
  /**
1734
1848
  * Data Fabric Entity Service Endpoints
1735
1849
  */
@@ -1744,6 +1858,11 @@ const DATA_FABRIC_ENDPOINTS = {
1744
1858
  UPDATE_RECORD_BY_ID: (entityId, recordId) => `${DATAFABRIC_BASE}/api/EntityService/entity/${entityId}/update/${recordId}`,
1745
1859
  UPDATE_BY_ID: (entityId) => `${DATAFABRIC_BASE}/api/EntityService/entity/${entityId}/update-batch`,
1746
1860
  DELETE_BY_ID: (entityId) => `${DATAFABRIC_BASE}/api/EntityService/entity/${entityId}/delete-batch`,
1861
+ UPSERT: `${DATAFABRIC_BASE}/api/Entity`,
1862
+ DELETE: (entityId) => `${DATAFABRIC_BASE}/api/Entity/${entityId}`,
1863
+ UPDATE_METADATA: (entityId) => `${DATAFABRIC_BASE}/api/Entity/${entityId}/metadata`,
1864
+ QUERY_BY_ID: (entityId) => `${DATAFABRIC_BASE}/api/EntityService/entity/${entityId}/query`,
1865
+ BULK_UPLOAD_BY_ID: (entityId) => `${DATAFABRIC_BASE}/api/EntityService/entity/${entityId}/bulk-upload`,
1747
1866
  DOWNLOAD_ATTACHMENT: (entityId, recordId, fieldName) => `${DATAFABRIC_BASE}/api/Attachment/entity/${entityId}/${recordId}/${fieldName}`,
1748
1867
  UPLOAD_ATTACHMENT: (entityId, recordId, fieldName) => `${DATAFABRIC_BASE}/api/Attachment/entity/${entityId}/${recordId}/${fieldName}`,
1749
1868
  DELETE_ATTACHMENT: (entityId, recordId, fieldName) => `${DATAFABRIC_BASE}/api/Attachment/entity/${entityId}/${recordId}/${fieldName}`,
@@ -1789,69 +1908,6 @@ function createParams(paramsObj = {}) {
1789
1908
  return params;
1790
1909
  }
1791
1910
 
1792
- /**
1793
- * Entity field type names
1794
- */
1795
- exports.EntityFieldDataType = void 0;
1796
- (function (EntityFieldDataType) {
1797
- EntityFieldDataType["UUID"] = "UUID";
1798
- EntityFieldDataType["STRING"] = "STRING";
1799
- EntityFieldDataType["INTEGER"] = "INTEGER";
1800
- EntityFieldDataType["DATETIME"] = "DATETIME";
1801
- EntityFieldDataType["DATETIME_WITH_TZ"] = "DATETIME_WITH_TZ";
1802
- EntityFieldDataType["DECIMAL"] = "DECIMAL";
1803
- EntityFieldDataType["FLOAT"] = "FLOAT";
1804
- EntityFieldDataType["DOUBLE"] = "DOUBLE";
1805
- EntityFieldDataType["DATE"] = "DATE";
1806
- EntityFieldDataType["BOOLEAN"] = "BOOLEAN";
1807
- EntityFieldDataType["BIG_INTEGER"] = "BIG_INTEGER";
1808
- EntityFieldDataType["MULTILINE_TEXT"] = "MULTILINE_TEXT";
1809
- })(exports.EntityFieldDataType || (exports.EntityFieldDataType = {}));
1810
- /**
1811
- * Entity type enum
1812
- */
1813
- exports.EntityType = void 0;
1814
- (function (EntityType) {
1815
- EntityType["Entity"] = "Entity";
1816
- EntityType["ChoiceSet"] = "ChoiceSet";
1817
- EntityType["InternalEntity"] = "InternalEntity";
1818
- EntityType["SystemEntity"] = "SystemEntity";
1819
- })(exports.EntityType || (exports.EntityType = {}));
1820
- /**
1821
- * Reference types for fields
1822
- */
1823
- exports.ReferenceType = void 0;
1824
- (function (ReferenceType) {
1825
- ReferenceType["ManyToOne"] = "ManyToOne";
1826
- })(exports.ReferenceType || (exports.ReferenceType = {}));
1827
- /**
1828
- * Field display types
1829
- */
1830
- exports.FieldDisplayType = void 0;
1831
- (function (FieldDisplayType) {
1832
- FieldDisplayType["Basic"] = "Basic";
1833
- FieldDisplayType["Relationship"] = "Relationship";
1834
- FieldDisplayType["File"] = "File";
1835
- FieldDisplayType["ChoiceSetSingle"] = "ChoiceSetSingle";
1836
- FieldDisplayType["ChoiceSetMultiple"] = "ChoiceSetMultiple";
1837
- FieldDisplayType["AutoNumber"] = "AutoNumber";
1838
- })(exports.FieldDisplayType || (exports.FieldDisplayType = {}));
1839
- /**
1840
- * Data direction type for external fields
1841
- */
1842
- exports.DataDirectionType = void 0;
1843
- (function (DataDirectionType) {
1844
- DataDirectionType["ReadOnly"] = "ReadOnly";
1845
- DataDirectionType["ReadAndWrite"] = "ReadAndWrite";
1846
- })(exports.DataDirectionType || (exports.DataDirectionType = {}));
1847
- /**
1848
- * Join type for source join criteria
1849
- */
1850
- exports.JoinType = void 0;
1851
- (function (JoinType) {
1852
- JoinType["LeftJoin"] = "LeftJoin";
1853
- })(exports.JoinType || (exports.JoinType = {}));
1854
-
1855
1911
  /**
1856
1912
  * Entity field data types (SQL types from API)
1857
1913
  */
@@ -1870,6 +1926,7 @@ var SqlFieldType;
1870
1926
  SqlFieldType["DECIMAL"] = "DECIMAL";
1871
1927
  SqlFieldType["MULTILINE"] = "MULTILINE";
1872
1928
  })(SqlFieldType || (SqlFieldType = {}));
1929
+
1873
1930
  /**
1874
1931
  * Maps fields for Entities
1875
1932
  */
@@ -1879,6 +1936,40 @@ const EntityMap = {
1879
1936
  sqlType: 'fieldDataType',
1880
1937
  fieldDefinition: 'fieldMetaData'
1881
1938
  };
1939
+ /**
1940
+ * Maps EntityFieldDataType values to the API field payload components for create/update operations
1941
+ */
1942
+ const EntitySchemaFieldTypeMap = {
1943
+ [exports.EntityFieldDataType.UUID]: { sqlTypeName: SqlFieldType.UNIQUEIDENTIFIER, fieldDisplayType: exports.FieldDisplayType.Basic },
1944
+ [exports.EntityFieldDataType.STRING]: { sqlTypeName: SqlFieldType.NVARCHAR, fieldDisplayType: exports.FieldDisplayType.Basic },
1945
+ [exports.EntityFieldDataType.INTEGER]: { sqlTypeName: SqlFieldType.INT, fieldDisplayType: exports.FieldDisplayType.Basic },
1946
+ [exports.EntityFieldDataType.DATETIME]: { sqlTypeName: SqlFieldType.DATETIME2, fieldDisplayType: exports.FieldDisplayType.Basic },
1947
+ [exports.EntityFieldDataType.DATETIME_WITH_TZ]: { sqlTypeName: SqlFieldType.DATETIMEOFFSET, fieldDisplayType: exports.FieldDisplayType.Basic },
1948
+ [exports.EntityFieldDataType.DECIMAL]: { sqlTypeName: SqlFieldType.DECIMAL, fieldDisplayType: exports.FieldDisplayType.Basic },
1949
+ [exports.EntityFieldDataType.FLOAT]: { sqlTypeName: SqlFieldType.FLOAT, fieldDisplayType: exports.FieldDisplayType.Basic },
1950
+ [exports.EntityFieldDataType.DOUBLE]: { sqlTypeName: SqlFieldType.REAL, fieldDisplayType: exports.FieldDisplayType.Basic },
1951
+ [exports.EntityFieldDataType.DATE]: { sqlTypeName: SqlFieldType.DATE, fieldDisplayType: exports.FieldDisplayType.Basic },
1952
+ [exports.EntityFieldDataType.BOOLEAN]: { sqlTypeName: SqlFieldType.BIT, fieldDisplayType: exports.FieldDisplayType.Basic },
1953
+ [exports.EntityFieldDataType.BIG_INTEGER]: { sqlTypeName: SqlFieldType.BIGINT, fieldDisplayType: exports.FieldDisplayType.Basic },
1954
+ [exports.EntityFieldDataType.MULTILINE_TEXT]: { sqlTypeName: SqlFieldType.MULTILINE, fieldDisplayType: exports.FieldDisplayType.Basic },
1955
+ [exports.EntityFieldDataType.FILE]: { sqlTypeName: SqlFieldType.UNIQUEIDENTIFIER, fieldDisplayType: exports.FieldDisplayType.File },
1956
+ [exports.EntityFieldDataType.CHOICE_SET_SINGLE]: { sqlTypeName: SqlFieldType.INT, fieldDisplayType: exports.FieldDisplayType.ChoiceSetSingle },
1957
+ [exports.EntityFieldDataType.CHOICE_SET_MULTIPLE]: { sqlTypeName: SqlFieldType.NVARCHAR, fieldDisplayType: exports.FieldDisplayType.ChoiceSetMultiple },
1958
+ [exports.EntityFieldDataType.AUTO_NUMBER]: { sqlTypeName: SqlFieldType.DECIMAL, fieldDisplayType: exports.FieldDisplayType.AutoNumber },
1959
+ [exports.EntityFieldDataType.RELATIONSHIP]: { sqlTypeName: SqlFieldType.UNIQUEIDENTIFIER, fieldDisplayType: exports.FieldDisplayType.Relationship },
1960
+ };
1961
+ /**
1962
+ * Maps FieldDisplayType values to EntityFieldDataType for types that share SQL types
1963
+ * with other field types (File, ChoiceSetSingle, ChoiceSetMultiple, AutoNumber).
1964
+ * Used during read-side transformation to produce the correct EntityFieldDataType.
1965
+ */
1966
+ const FieldDisplayTypeToDataType = {
1967
+ [exports.FieldDisplayType.File]: exports.EntityFieldDataType.FILE,
1968
+ [exports.FieldDisplayType.ChoiceSetSingle]: exports.EntityFieldDataType.CHOICE_SET_SINGLE,
1969
+ [exports.FieldDisplayType.ChoiceSetMultiple]: exports.EntityFieldDataType.CHOICE_SET_MULTIPLE,
1970
+ [exports.FieldDisplayType.AutoNumber]: exports.EntityFieldDataType.AUTO_NUMBER,
1971
+ [exports.FieldDisplayType.Relationship]: exports.EntityFieldDataType.RELATIONSHIP,
1972
+ };
1882
1973
  /**
1883
1974
  * Maps SQL field types to friendly display names
1884
1975
  */
@@ -1894,7 +1985,7 @@ const EntityFieldTypeMap = {
1894
1985
  [SqlFieldType.DATE]: exports.EntityFieldDataType.DATE,
1895
1986
  [SqlFieldType.BIT]: exports.EntityFieldDataType.BOOLEAN,
1896
1987
  [SqlFieldType.DECIMAL]: exports.EntityFieldDataType.DECIMAL,
1897
- [SqlFieldType.MULTILINE]: exports.EntityFieldDataType.MULTILINE_TEXT
1988
+ [SqlFieldType.MULTILINE]: exports.EntityFieldDataType.MULTILINE_TEXT,
1898
1989
  };
1899
1990
 
1900
1991
  /**
@@ -1903,7 +1994,7 @@ const EntityFieldTypeMap = {
1903
1994
  // Connection string placeholder that will be replaced during build
1904
1995
  const CONNECTION_STRING = "InstrumentationKey=a6efa11d-1feb-4508-9738-e13e12dcae5e;IngestionEndpoint=https://westeurope-5.in.applicationinsights.azure.com/;LiveEndpoint=https://westeurope.livediagnostics.monitor.azure.com/;ApplicationId=7c58eb1c-9581-4ba6-839e-11725848a037";
1905
1996
  // SDK Version placeholder
1906
- const SDK_VERSION = "1.3.0";
1997
+ const SDK_VERSION = "1.3.2";
1907
1998
  const VERSION = "Version";
1908
1999
  const SERVICE = "Service";
1909
2000
  const CLOUD_ORGANIZATION_NAME = "CloudOrganizationName";
@@ -2498,6 +2589,99 @@ class EntityService extends BaseService {
2498
2589
  });
2499
2590
  return entities;
2500
2591
  }
2592
+ /**
2593
+ * Queries entity records with filters, sorting, and pagination
2594
+ *
2595
+ * @param id - UUID of the entity
2596
+ * @param options - Query options including filterGroup, selectedFields, sortOptions, and pagination
2597
+ * @returns Promise resolving to {@link NonPaginatedResponse} without pagination options,
2598
+ * or {@link PaginatedResponse} when `pageSize`, `cursor`, or `jumpToPage` are provided
2599
+ *
2600
+ * @example
2601
+ * ```typescript
2602
+ * import { Entities, LogicalOperator, QueryFilterOperator } from '@uipath/uipath-typescript/entities';
2603
+ *
2604
+ * const entities = new Entities(sdk);
2605
+ *
2606
+ * // Non-paginated query with a filter
2607
+ * const result = await entities.queryRecordsById("<entityId>", {
2608
+ * filterGroup: {
2609
+ * logicalOperator: LogicalOperator.And,
2610
+ * queryFilters: [
2611
+ * { fieldName: "status", operator: QueryFilterOperator.Equals, value: "active" }
2612
+ * ]
2613
+ * },
2614
+ * sortOptions: [{ fieldName: "created_at", isDescending: true }],
2615
+ * });
2616
+ * console.log(`Found ${result.totalCount} records`);
2617
+ *
2618
+ * // With pagination
2619
+ * const page1 = await entities.queryRecordsById("<entityId>", {
2620
+ * filterGroup: { queryFilters: [{ fieldName: "status", operator: QueryFilterOperator.Equals, value: "active" }] },
2621
+ * pageSize: 25,
2622
+ * });
2623
+ * if (page1.hasNextPage) {
2624
+ * const page2 = await entities.queryRecordsById("<entityId>", { cursor: page1.nextCursor });
2625
+ * }
2626
+ * ```
2627
+ */
2628
+ async queryRecordsById(id, options) {
2629
+ return PaginationHelpers.getAll({
2630
+ serviceAccess: this.createPaginationServiceAccess(),
2631
+ getEndpoint: () => DATA_FABRIC_ENDPOINTS.ENTITY.QUERY_BY_ID(id),
2632
+ method: HTTP_METHODS.POST,
2633
+ pagination: {
2634
+ paginationType: PaginationType.OFFSET,
2635
+ itemsField: ENTITY_PAGINATION.ITEMS_FIELD,
2636
+ totalCountField: ENTITY_PAGINATION.TOTAL_COUNT_FIELD,
2637
+ paginationParams: {
2638
+ pageSizeParam: ENTITY_OFFSET_PARAMS.PAGE_SIZE_PARAM,
2639
+ offsetParam: ENTITY_OFFSET_PARAMS.OFFSET_PARAM,
2640
+ countParam: ENTITY_OFFSET_PARAMS.COUNT_PARAM
2641
+ }
2642
+ },
2643
+ excludeFromPrefix: ['expansionLevel', 'filterGroup', 'selectedFields', 'sortOptions']
2644
+ }, options);
2645
+ }
2646
+ /**
2647
+ * Imports records from a CSV file into an entity
2648
+ *
2649
+ * @param id - UUID of the entity
2650
+ * @param file - CSV file to import (Blob, File, or Uint8Array)
2651
+ * @returns Promise resolving to import result with record counts
2652
+ *
2653
+ * @example
2654
+ * ```typescript
2655
+ * import { Entities } from '@uipath/uipath-typescript/entities';
2656
+ *
2657
+ * const entities = new Entities(sdk);
2658
+ *
2659
+ * // Browser: upload from file input
2660
+ * const fileInput = document.getElementById('csv-input') as HTMLInputElement;
2661
+ * const result = await entities.importRecordsById("<entityId>", fileInput.files[0]);
2662
+ *
2663
+ * // Node.js: read from disk
2664
+ * const fileBuffer = fs.readFileSync('records.csv');
2665
+ * const result = await entities.importRecordsById("<entityId>", new Blob([fileBuffer], { type: 'text/csv' }));
2666
+ *
2667
+ * console.log(`Inserted ${result.insertedRecords} of ${result.totalRecords} records`);
2668
+ * if (result.errorFileLink) {
2669
+ * console.log(`Error file link: ${result.errorFileLink}`);
2670
+ * }
2671
+ * ```
2672
+ * @internal
2673
+ */
2674
+ async importRecordsById(id, file) {
2675
+ const formData = new FormData();
2676
+ if (file instanceof Uint8Array) {
2677
+ formData.append('file', new Blob([file.buffer]));
2678
+ }
2679
+ else {
2680
+ formData.append('file', file);
2681
+ }
2682
+ const response = await this.post(DATA_FABRIC_ENDPOINTS.ENTITY.BULK_UPLOAD_BY_ID(id), formData);
2683
+ return response.data;
2684
+ }
2501
2685
  /**
2502
2686
  * Downloads an attachment from an entity record field
2503
2687
  *
@@ -2622,18 +2806,169 @@ class EntityService extends BaseService {
2622
2806
  return this.insertRecordsById(id, data, options);
2623
2807
  }
2624
2808
  /**
2625
- * @hidden
2626
- * @deprecated Use {@link updateRecordsById} instead.
2809
+ * Creates a new Data Fabric entity with the given schema
2810
+ *
2811
+ * @param name - Entity name — must start with a letter and contain
2812
+ * only letters, numbers, and underscores (e.g., `"productCatalog"`).
2813
+ * @param fields - Array of field definitions
2814
+ * @param options - Optional entity-level settings ({@link EntityCreateOptions})
2815
+ * @returns Promise resolving to the ID of the created entity
2816
+ *
2817
+ * @example
2818
+ * ```typescript
2819
+ * const entityId = await entities.create("product_catalog", [
2820
+ * { fieldName: "product_name", type: EntityFieldDataType.STRING, isRequired: true, isUnique: true },
2821
+ * { fieldName: "price", type: EntityFieldDataType.INTEGER, defaultValue: "0" },
2822
+ * ], { displayName: "Product Catalog", description: "Our product catalog", isRbacEnabled: true });
2823
+ * ```
2824
+ * @internal
2627
2825
  */
2628
- async updateById(id, data, options = {}) {
2629
- return this.updateRecordsById(id, data, options);
2826
+ async create(name, fields, options) {
2827
+ this.validateName(name, 'entity');
2828
+ for (const field of fields) {
2829
+ this.validateName(field.fieldName, 'field');
2830
+ }
2831
+ const opts = options ?? {};
2832
+ const payload = {
2833
+ ...(opts.description !== undefined && { description: opts.description }),
2834
+ displayName: opts.displayName ?? name,
2835
+ entityDefinition: {
2836
+ name,
2837
+ fields: fields.map(f => this.buildSchemaFieldPayload(f)),
2838
+ folderId: opts.folderKey ?? DATA_FABRIC_TENANT_FOLDER_ID,
2839
+ isRbacEnabled: opts.isRbacEnabled ?? false,
2840
+ isInsightsEnabled: opts.isAnalyticsEnabled ?? false,
2841
+ externalFields: opts.externalFields ?? [],
2842
+ },
2843
+ };
2844
+ const response = await this.post(DATA_FABRIC_ENDPOINTS.ENTITY.UPSERT, payload);
2845
+ return response.data;
2630
2846
  }
2631
2847
  /**
2632
- * @hidden
2633
- * @deprecated Use {@link deleteRecordsById} instead.
2848
+ * Deletes a Data Fabric entity and all its records
2849
+ *
2850
+ * @param id - UUID of the entity to delete
2851
+ * @returns Promise resolving when the entity is deleted
2852
+ *
2853
+ * @example
2854
+ * ```typescript
2855
+ * await entities.deleteById("<entityId>");
2856
+ * ```
2857
+ * @internal
2858
+ */
2859
+ async deleteById(id) {
2860
+ await this.delete(DATA_FABRIC_ENDPOINTS.ENTITY.DELETE(id));
2861
+ }
2862
+ /**
2863
+ * Updates an existing Data Fabric entity — schema and/or metadata.
2864
+ *
2865
+ * Provide any combination of schema fields (`addFields`, `removeFields`, `updateFields`) and
2866
+ * metadata fields (`displayName`, `description`, `isRbacEnabled`). Each group is applied
2867
+ * only when the corresponding fields are present.
2868
+ *
2869
+ * **Warning:** Schema changes (`addFields`, `removeFields`, `updateFields`) use a
2870
+ * read-modify-write pattern — concurrent calls on the same entity may silently
2871
+ * overwrite each other's changes.
2872
+ *
2873
+ * @param id - UUID of the entity to update
2874
+ * @param options - Changes to apply ({@link EntityUpdateByIdOptions})
2875
+ * @returns Promise resolving when the update is complete
2876
+ *
2877
+ * @example
2878
+ * ```typescript
2879
+ * // Schema-only
2880
+ * await entities.updateById("<entityId>", {
2881
+ * addFields: [{ fieldName: "notes", type: EntityFieldDataType.MULTILINE_TEXT }],
2882
+ * removeFields: [{ fieldName: "old_field" }],
2883
+ * });
2884
+ *
2885
+ * // Metadata-only
2886
+ * await entities.updateById("<entityId>", {
2887
+ * displayName: "My Updated Entity",
2888
+ * description: "Updated description",
2889
+ * });
2890
+ *
2891
+ * // Combined
2892
+ * await entities.updateById("<entityId>", {
2893
+ * updateFields: [{ id: "<fieldId>", displayName: "Unit Price", isRequired: true }],
2894
+ * displayName: "Price Catalog",
2895
+ * });
2896
+ * ```
2897
+ * @internal
2898
+ */
2899
+ async updateById(id, options) {
2900
+ const opts = options ?? {};
2901
+ const hasSchemaChanges = !!(opts.addFields?.length || opts.removeFields?.length || opts.updateFields?.length);
2902
+ const hasMetadataChanges = opts.displayName !== undefined || opts.description !== undefined || opts.isRbacEnabled !== undefined;
2903
+ if (hasSchemaChanges) {
2904
+ await this.applySchemaUpdate(id, opts);
2905
+ }
2906
+ if (hasMetadataChanges) {
2907
+ await this.patch(DATA_FABRIC_ENDPOINTS.ENTITY.UPDATE_METADATA(id), {
2908
+ ...(opts.displayName !== undefined && { displayName: opts.displayName }),
2909
+ ...(opts.description !== undefined && { description: opts.description }),
2910
+ ...(opts.isRbacEnabled !== undefined && { isRbacEnabled: opts.isRbacEnabled }),
2911
+ });
2912
+ }
2913
+ }
2914
+ /**
2915
+ * Fetches the current entity schema, applies the field delta, then posts the full updated schema.
2916
+ *
2917
+ * @param entityId - UUID of the entity to update
2918
+ * @param options - Field changes to apply
2919
+ * @private
2634
2920
  */
2635
- async deleteById(id, recordIds, options = {}) {
2636
- return this.deleteRecordsById(id, recordIds, options);
2921
+ async applySchemaUpdate(entityId, options) {
2922
+ const entityResponse = await this.get(DATA_FABRIC_ENDPOINTS.ENTITY.GET_BY_ID(entityId));
2923
+ const raw = entityResponse.data;
2924
+ // Carry forward existing non-system fields from GET response (skip system/primary-key fields)
2925
+ let fields = (raw.fields ?? [])
2926
+ .filter(f => !f.isSystemField && !f.isPrimaryKey);
2927
+ // Filter out removed fields
2928
+ if (options.removeFields?.length) {
2929
+ const removeSet = new Set(options.removeFields.map(r => r.fieldName));
2930
+ fields = fields.filter(f => !removeSet.has(f.name));
2931
+ }
2932
+ // Apply per-field metadata updates (matched by field ID)
2933
+ if (options.updateFields?.length) {
2934
+ const updateMap = new Map(options.updateFields.map(u => [u.id, u]));
2935
+ fields = fields.map(f => {
2936
+ const update = updateMap.get(f.id ?? '');
2937
+ if (!update)
2938
+ return f;
2939
+ return {
2940
+ ...f,
2941
+ ...(update.displayName !== undefined && { displayName: update.displayName }),
2942
+ ...(update.description !== undefined && { description: update.description }),
2943
+ ...(update.isRequired !== undefined && { isRequired: update.isRequired }),
2944
+ ...(update.isUnique !== undefined && { isUnique: update.isUnique }),
2945
+ ...(update.isRbacEnabled !== undefined && { isRbacEnabled: update.isRbacEnabled }),
2946
+ ...(update.isEncrypted !== undefined && { isEncrypted: update.isEncrypted }),
2947
+ ...(update.defaultValue !== undefined && { defaultValue: update.defaultValue }),
2948
+ };
2949
+ });
2950
+ }
2951
+ // Build and append new fields
2952
+ const newFields = [];
2953
+ if (options.addFields?.length) {
2954
+ for (const field of options.addFields) {
2955
+ this.validateName(field.fieldName, 'field');
2956
+ }
2957
+ newFields.push(...options.addFields.map(f => this.buildSchemaFieldPayload(f)));
2958
+ }
2959
+ await this.post(DATA_FABRIC_ENDPOINTS.ENTITY.UPSERT, {
2960
+ displayName: raw.displayName,
2961
+ description: raw.description,
2962
+ entityDefinition: {
2963
+ id: entityId,
2964
+ name: raw.name,
2965
+ fields: [...fields, ...newFields],
2966
+ folderId: raw.folderId ?? DATA_FABRIC_TENANT_FOLDER_ID,
2967
+ isRbacEnabled: raw.isRbacEnabled ?? false,
2968
+ isInsightsEnabled: raw.isInsightsEnabled ?? false,
2969
+ externalFields: raw.externalFields ?? [],
2970
+ },
2971
+ });
2637
2972
  }
2638
2973
  /**
2639
2974
  * Orchestrates all field mapping transformations
@@ -2657,11 +2992,20 @@ class EntityService extends BaseService {
2657
2992
  metadata.fields = metadata.fields.map(field => {
2658
2993
  // Rename sqlType to fieldDataType
2659
2994
  let transformedField = transformData(field, EntityMap);
2660
- // Map SQL field type to friendly name
2995
+ // Map field type: prefer fieldDisplayType for types that share SQL types (File, ChoiceSet, AutoNumber)
2661
2996
  if (transformedField.fieldDataType?.name) {
2662
- const sqlTypeName = transformedField.fieldDataType.name;
2663
- if (EntityFieldTypeMap[sqlTypeName]) {
2664
- transformedField.fieldDataType.name = EntityFieldTypeMap[sqlTypeName];
2997
+ const displayTypeMapped = transformedField.fieldDisplayType
2998
+ ? FieldDisplayTypeToDataType[transformedField.fieldDisplayType]
2999
+ : undefined;
3000
+ if (displayTypeMapped) {
3001
+ transformedField.fieldDataType.name = displayTypeMapped;
3002
+ }
3003
+ else {
3004
+ const rawSqlTypeName = field.sqlType?.name;
3005
+ const mapped = rawSqlTypeName ? EntityFieldTypeMap[rawSqlTypeName] : undefined;
3006
+ if (mapped) {
3007
+ transformedField.fieldDataType.name = mapped;
3008
+ }
2665
3009
  }
2666
3010
  }
2667
3011
  this.transformNestedReferences(transformedField);
@@ -2705,7 +3049,44 @@ class EntityService extends BaseService {
2705
3049
  return externalSource;
2706
3050
  });
2707
3051
  }
3052
+ /** Converts a user-facing EntityCreateFieldOptions to the raw API field payload */
3053
+ buildSchemaFieldPayload(field) {
3054
+ this.validateName(field.fieldName, 'field');
3055
+ const mapping = EntitySchemaFieldTypeMap[field.type ?? exports.EntityFieldDataType.STRING];
3056
+ return {
3057
+ name: field.fieldName,
3058
+ displayName: field.displayName ?? field.fieldName,
3059
+ sqlType: { name: mapping.sqlTypeName },
3060
+ fieldDisplayType: mapping.fieldDisplayType,
3061
+ description: field.description ?? '',
3062
+ isRequired: field.isRequired ?? false,
3063
+ isUnique: field.isUnique ?? false,
3064
+ isRbacEnabled: field.isRbacEnabled ?? false,
3065
+ isEncrypted: field.isEncrypted ?? false,
3066
+ ...(field.defaultValue !== undefined && { defaultValue: field.defaultValue }),
3067
+ ...(field.choiceSetId !== undefined && { choiceSetId: field.choiceSetId }),
3068
+ ...(field.referenceEntityName !== undefined && { referenceEntityName: field.referenceEntityName }),
3069
+ ...(field.referenceFieldName !== undefined && { referenceFieldName: field.referenceFieldName }),
3070
+ };
3071
+ }
3072
+ validateName(name, context) {
3073
+ if (name.length < 3 || name.length > 100 || !/^[a-zA-Z]\w*$/.test(name)) {
3074
+ const suggestion = name.replace(/\W/g, '').replace(/^[0-9_]+/, '');
3075
+ const defaultName = `My${context.charAt(0).toUpperCase() + context.slice(1)}`;
3076
+ throw new ValidationError({
3077
+ message: `Invalid ${context} name '${name}'. Must start with a letter, contain only letters, numbers, and underscores, 3–100 characters (e.g., "${suggestion || defaultName}").`
3078
+ });
3079
+ }
3080
+ if (context === 'field' && EntityService.RESERVED_FIELD_NAMES.has(name)) {
3081
+ throw new ValidationError({
3082
+ message: `Field name '${name}' is reserved. Reserved names: ${[...EntityService.RESERVED_FIELD_NAMES].join(', ')}.`
3083
+ });
3084
+ }
3085
+ }
2708
3086
  }
3087
+ EntityService.RESERVED_FIELD_NAMES = new Set([
3088
+ 'Id', 'CreatedBy', 'CreateTime', 'UpdatedBy', 'UpdateTime'
3089
+ ]);
2709
3090
  __decorate([
2710
3091
  track('Entities.GetById')
2711
3092
  ], EntityService.prototype, "getById", null);
@@ -2733,6 +3114,12 @@ __decorate([
2733
3114
  __decorate([
2734
3115
  track('Entities.GetAll')
2735
3116
  ], EntityService.prototype, "getAll", null);
3117
+ __decorate([
3118
+ track('Entities.QueryRecordsById')
3119
+ ], EntityService.prototype, "queryRecordsById", null);
3120
+ __decorate([
3121
+ track('Entities.ImportRecordsById')
3122
+ ], EntityService.prototype, "importRecordsById", null);
2736
3123
  __decorate([
2737
3124
  track('Entities.DownloadAttachment')
2738
3125
  ], EntityService.prototype, "downloadAttachment", null);
@@ -2742,6 +3129,15 @@ __decorate([
2742
3129
  __decorate([
2743
3130
  track('Entities.DeleteAttachment')
2744
3131
  ], EntityService.prototype, "deleteAttachment", null);
3132
+ __decorate([
3133
+ track('Entities.Create')
3134
+ ], EntityService.prototype, "create", null);
3135
+ __decorate([
3136
+ track('Entities.DeleteById')
3137
+ ], EntityService.prototype, "deleteById", null);
3138
+ __decorate([
3139
+ track('Entities.UpdateById')
3140
+ ], EntityService.prototype, "updateById", null);
2745
3141
 
2746
3142
  class ChoiceSetService extends BaseService {
2747
3143
  /**