@memberjunction/integration-connectors 5.35.0 → 5.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/AptifyConnector.d.ts +88 -0
  2. package/dist/AptifyConnector.d.ts.map +1 -0
  3. package/dist/AptifyConnector.js +737 -0
  4. package/dist/AptifyConnector.js.map +1 -0
  5. package/dist/BettyConnector.d.ts +288 -0
  6. package/dist/BettyConnector.d.ts.map +1 -0
  7. package/dist/BettyConnector.js +909 -0
  8. package/dist/BettyConnector.js.map +1 -0
  9. package/dist/BlackbaudConnector.d.ts +64 -0
  10. package/dist/BlackbaudConnector.d.ts.map +1 -0
  11. package/dist/BlackbaudConnector.js +916 -0
  12. package/dist/BlackbaudConnector.js.map +1 -0
  13. package/dist/ConstantContactConnector.d.ts +126 -0
  14. package/dist/ConstantContactConnector.d.ts.map +1 -0
  15. package/dist/ConstantContactConnector.js +636 -0
  16. package/dist/ConstantContactConnector.js.map +1 -0
  17. package/dist/GrowthZoneConnector.d.ts +185 -0
  18. package/dist/GrowthZoneConnector.d.ts.map +1 -0
  19. package/dist/GrowthZoneConnector.js +745 -0
  20. package/dist/GrowthZoneConnector.js.map +1 -0
  21. package/dist/HubSpotConnector.d.ts +2 -2
  22. package/dist/HubSpotConnector.d.ts.map +1 -1
  23. package/dist/HubSpotConnector.js +3 -3
  24. package/dist/HubSpotConnector.js.map +1 -1
  25. package/dist/IMISConnector.d.ts +155 -0
  26. package/dist/IMISConnector.d.ts.map +1 -0
  27. package/dist/IMISConnector.js +686 -0
  28. package/dist/IMISConnector.js.map +1 -0
  29. package/dist/MJToMJConnector.d.ts +279 -0
  30. package/dist/MJToMJConnector.d.ts.map +1 -0
  31. package/dist/MJToMJConnector.js +893 -0
  32. package/dist/MJToMJConnector.js.map +1 -0
  33. package/dist/MagnetMailConnector.d.ts +163 -0
  34. package/dist/MagnetMailConnector.d.ts.map +1 -0
  35. package/dist/MagnetMailConnector.js +816 -0
  36. package/dist/MagnetMailConnector.js.map +1 -0
  37. package/dist/MailchimpConnector.d.ts +188 -0
  38. package/dist/MailchimpConnector.d.ts.map +1 -0
  39. package/dist/MailchimpConnector.js +753 -0
  40. package/dist/MailchimpConnector.js.map +1 -0
  41. package/dist/NetForumConnector.d.ts +51 -0
  42. package/dist/NetForumConnector.d.ts.map +1 -0
  43. package/dist/NetForumConnector.js +419 -0
  44. package/dist/NetForumConnector.js.map +1 -0
  45. package/dist/NetSuiteConnector.d.ts +70 -0
  46. package/dist/NetSuiteConnector.d.ts.map +1 -0
  47. package/dist/NetSuiteConnector.js +605 -0
  48. package/dist/NetSuiteConnector.js.map +1 -0
  49. package/dist/NimbleAMSConnector.d.ts +49 -0
  50. package/dist/NimbleAMSConnector.d.ts.map +1 -0
  51. package/dist/NimbleAMSConnector.js +408 -0
  52. package/dist/NimbleAMSConnector.js.map +1 -0
  53. package/dist/PropFuelConnector.d.ts +68 -0
  54. package/dist/PropFuelConnector.d.ts.map +1 -0
  55. package/dist/PropFuelConnector.js +514 -0
  56. package/dist/PropFuelConnector.js.map +1 -0
  57. package/dist/RasaConnector.d.ts +26 -0
  58. package/dist/RasaConnector.d.ts.map +1 -1
  59. package/dist/RasaConnector.js +233 -1
  60. package/dist/RasaConnector.js.map +1 -1
  61. package/dist/Reach360Connector.d.ts +165 -0
  62. package/dist/Reach360Connector.d.ts.map +1 -0
  63. package/dist/Reach360Connector.js +710 -0
  64. package/dist/Reach360Connector.js.map +1 -0
  65. package/dist/SharePointConnector.d.ts +181 -0
  66. package/dist/SharePointConnector.d.ts.map +1 -0
  67. package/dist/SharePointConnector.js +796 -0
  68. package/dist/SharePointConnector.js.map +1 -0
  69. package/dist/WicketConnector.d.ts +1 -0
  70. package/dist/WicketConnector.d.ts.map +1 -1
  71. package/dist/WicketConnector.js +6 -0
  72. package/dist/WicketConnector.js.map +1 -1
  73. package/dist/WildApricotConnector.d.ts +188 -0
  74. package/dist/WildApricotConnector.d.ts.map +1 -0
  75. package/dist/WildApricotConnector.js +1092 -0
  76. package/dist/WildApricotConnector.js.map +1 -0
  77. package/dist/index.d.ts +16 -0
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +16 -0
  80. package/dist/index.js.map +1 -1
  81. package/package.json +6 -6
@@ -0,0 +1,49 @@
1
+ import { type UserInfo } from '@memberjunction/core';
2
+ import type { MJCompanyIntegrationEntity } from '@memberjunction/core-entities';
3
+ import { BaseRESTIntegrationConnector, type RESTAuthContext, type RESTResponse, type PaginationState, type PaginationType, type ConnectionTestResult, type DefaultFieldMapping, type FetchContext, type FetchBatchResult, type CreateRecordContext, type UpdateRecordContext, type DeleteRecordContext, type CRUDResult, type IntegrationObjectInfo, type ExternalObjectSchema, type ExternalFieldSchema } from '@memberjunction/integration-engine';
4
+ export interface NimbleAMSConnectionConfig {
5
+ InstanceURL: string;
6
+ ClientID: string;
7
+ ClientSecret: string;
8
+ AccessToken?: string;
9
+ RefreshToken?: string;
10
+ }
11
+ export declare class NimbleAMSConnector extends BaseRESTIntegrationConnector {
12
+ private tokenCache;
13
+ private lastRequestTime;
14
+ get IntegrationName(): string;
15
+ get SupportsCreate(): boolean;
16
+ get SupportsUpdate(): boolean;
17
+ get SupportsDelete(): boolean;
18
+ GetIntegrationObjects(): IntegrationObjectInfo[];
19
+ GetActionGeneratorConfig(): import("@memberjunction/integration-engine").ActionGeneratorConfig;
20
+ DiscoverObjects(companyIntegration: MJCompanyIntegrationEntity, contextUser: UserInfo): Promise<ExternalObjectSchema[]>;
21
+ DiscoverFields(companyIntegration: MJCompanyIntegrationEntity, objectName: string, contextUser: UserInfo): Promise<ExternalFieldSchema[]>;
22
+ private MapSFType;
23
+ protected Authenticate(companyIntegration: MJCompanyIntegrationEntity, contextUser: UserInfo): Promise<RESTAuthContext>;
24
+ private ObtainToken;
25
+ private ParseConfig;
26
+ TestConnection(companyIntegration: MJCompanyIntegrationEntity, contextUser: UserInfo): Promise<ConnectionTestResult>;
27
+ protected GetBaseURL(_ci: MJCompanyIntegrationEntity, auth: RESTAuthContext): string;
28
+ protected BuildPaginatedURL(basePath: string, _obj: {
29
+ PaginationType: string;
30
+ DefaultPageSize: number;
31
+ }, _page: number, _offset: number, cursor?: string): string;
32
+ protected NormalizeResponse(rawBody: unknown, _key: string | null): Record<string, unknown>[];
33
+ protected ExtractPaginationInfo(rawBody: unknown, _pt: PaginationType, _cp: number, _co: number, _ps: number): PaginationState;
34
+ FetchChanges(ctx: FetchContext): Promise<FetchBatchResult>;
35
+ CreateRecord(ctx: CreateRecordContext): Promise<CRUDResult>;
36
+ UpdateRecord(ctx: UpdateRecordContext): Promise<CRUDResult>;
37
+ DeleteRecord(ctx: DeleteRecordContext): Promise<CRUDResult>;
38
+ private BuildCRUDError;
39
+ protected BuildHeaders(auth: RESTAuthContext): Record<string, string>;
40
+ protected MakeHTTPRequest(_auth: RESTAuthContext, url: string, method: string, headers: Record<string, string>, body?: unknown): Promise<RESTResponse>;
41
+ private FetchWithTimeout;
42
+ private ParseBody;
43
+ private ToRESTResponse;
44
+ private Throttle;
45
+ private Sleep;
46
+ GetDefaultFieldMappings(objectName: string): DefaultFieldMapping[];
47
+ }
48
+ export declare function LoadNimbleAMSConnector(): void;
49
+ //# sourceMappingURL=NimbleAMSConnector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NimbleAMSConnector.d.ts","sourceRoot":"","sources":["../src/NimbleAMSConnector.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAoC,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAE,0BAA0B,EAAsB,MAAM,+BAA+B,CAAC;AACpG,OAAO,EAEH,4BAA4B,EAC5B,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAEzB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EAC3B,MAAM,oCAAoC,CAAC;AAI5C,MAAM,WAAW,yBAAyB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAqHD,qBACa,kBAAmB,SAAQ,4BAA4B;IAChE,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,eAAe,CAAK;IAE5B,IAAoB,eAAe,IAAI,MAAM,CAAyB;IACtE,IAAoB,cAAc,IAAI,OAAO,CAAiB;IAC9D,IAAoB,cAAc,IAAI,OAAO,CAAiB;IAC9D,IAAoB,cAAc,IAAI,OAAO,CAAiB;IAE9C,qBAAqB,IAAI,qBAAqB,EAAE;IAEhD,wBAAwB;IAalB,eAAe,CACjC,kBAAkB,EAAE,0BAA0B,EAAE,WAAW,EAAE,QAAQ,GACtE,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA+BZ,cAAc,CAChC,kBAAkB,EAAE,0BAA0B,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAC1F,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAqBjC,OAAO,CAAC,SAAS;cAWD,YAAY,CAAC,kBAAkB,EAAE,0BAA0B,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;YAU/G,WAAW;YASX,WAAW;IAiBZ,cAAc,CAAC,kBAAkB,EAAE,0BAA0B,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAYjI,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,0BAA0B,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM;cAKjE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAI1K,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;IAQ7F,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe;IAOxG,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiC1D,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IAY3D,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IAS3D,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IASjF,OAAO,CAAC,cAAc;cAOH,YAAY,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;cAI9D,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC;YAc9I,gBAAgB;YAWhB,SAAS;IACvB,OAAO,CAAC,cAAc;YACR,QAAQ;IACtB,OAAO,CAAC,KAAK;IAEG,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,EAAE;CAKrF;AAGD,wBAAgB,sBAAsB,SAAgC"}
@@ -0,0 +1,408 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ /**
8
+ * NimbleAMSConnector — Integration connector for Nimble AMS (Salesforce-native association management).
9
+ *
10
+ * API Documentation:
11
+ * - Nimble AMS API: https://help.nimbleams.com/help/live/api
12
+ * - Integration API: https://help.nimbleams.com/help/live/call-the-integration-api
13
+ * - Object Reference: https://nimbleuser.github.io/nams-api-docs/
14
+ *
15
+ * Auth: Salesforce OAuth 2.0 (Connected App — client_credentials or authorization_code flow)
16
+ * Base URL: https://{instance}.salesforce.com/services/data/v59.0 (Salesforce REST API)
17
+ * https://{instance}.salesforce.com/services/apexrest/NUINT/NUIntegrationService (Nimble Integration API)
18
+ * Pagination: Salesforce standard — nextRecordsUrl in query results (2000 records/batch)
19
+ * Rate limits: Salesforce org limits (100K API calls/24hr Enterprise, 15K Professional)
20
+ * Incremental: SOQL WHERE LastModifiedDate >= watermark
21
+ * CRUD: Full via Salesforce REST API /sobjects/{objectName}
22
+ *
23
+ * Nimble AMS Custom Objects (NU__ namespace):
24
+ * All Nimble AMS objects use the NU__ namespace prefix on the Salesforce platform.
25
+ * Standard Salesforce objects (Account, Contact) are also used alongside custom objects.
26
+ *
27
+ * API Categories:
28
+ * - Salesforce REST API (implemented) — SOQL queries, sObject CRUD on all NU__ objects
29
+ * - Nimble Integration API (implemented) — simplified inbound/outbound via named Integration Settings
30
+ * - Salesforce Bulk API 2.0 (NOT implemented) — for 10K+ record batches
31
+ * - Salesforce Streaming API (NOT implemented) — real-time CDC via PushTopics/CDC channels
32
+ * - Salesforce Metadata API (NOT implemented) — schema/config deployment, not data sync
33
+ */
34
+ import { RegisterClass } from '@memberjunction/global';
35
+ import { Metadata } from '@memberjunction/core';
36
+ import { BaseIntegrationConnector, BaseRESTIntegrationConnector, } from '@memberjunction/integration-engine';
37
+ // ─── Constants ────────────────────────────────────────────────────────────
38
+ const SF_API_VERSION = 'v59.0';
39
+ // Salesforce platform restricts SOQL `FIELDS(ALL)` to LIMIT <= 200 per query.
40
+ // nextRecordsUrl cursor pagination chains additional batches.
41
+ const SF_PAGE_SIZE = 200;
42
+ const TOKEN_REFRESH_BUFFER_MS = 60_000;
43
+ const MAX_RETRIES = 3;
44
+ const REQUEST_TIMEOUT_MS = 30_000;
45
+ const MIN_REQUEST_INTERVAL_MS = 50;
46
+ // ─── Nimble AMS Objects (NU__ namespace + standard SF objects) ─────────────
47
+ // Lean overlay: PK + key FKs + date fields. Full field list from Salesforce describe API at runtime.
48
+ const NIMBLE_OBJECTS = [
49
+ // Standard Salesforce objects used by Nimble AMS
50
+ { Name: 'Account', DisplayName: 'Account', Description: 'Organization/company accounts', SupportsWrite: true, Fields: [
51
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Salesforce record ID' },
52
+ { Name: 'LastModifiedDate', DisplayName: 'Last Modified', Type: 'datetime', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'Incremental date' },
53
+ ] },
54
+ { Name: 'Contact', DisplayName: 'Contact', Description: 'Individual contacts/members', SupportsWrite: true, Fields: [
55
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Salesforce record ID' },
56
+ { Name: 'AccountId', DisplayName: 'Account ID', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Account' },
57
+ { Name: 'LastModifiedDate', DisplayName: 'Last Modified', Type: 'datetime', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'Incremental date' },
58
+ ] },
59
+ // Nimble AMS custom objects (NU__ namespace)
60
+ { Name: 'NU__Membership__c', DisplayName: 'Membership', Description: 'Membership records', SupportsWrite: true, Fields: [
61
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
62
+ { Name: 'NU__Account__c', DisplayName: 'Account', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Account' },
63
+ { Name: 'LastModifiedDate', DisplayName: 'Last Modified', Type: 'datetime', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'Incremental date' },
64
+ ] },
65
+ { Name: 'NU__MembershipType__c', DisplayName: 'Membership Type', Description: 'Membership type definitions', SupportsWrite: true, Fields: [
66
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
67
+ ] },
68
+ { Name: 'NU__Event__c', DisplayName: 'Event', Description: 'Events and conferences', SupportsWrite: true, Fields: [
69
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
70
+ { Name: 'LastModifiedDate', DisplayName: 'Last Modified', Type: 'datetime', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'Incremental date' },
71
+ ] },
72
+ { Name: 'NU__EventRegistration__c', DisplayName: 'Event Registration', Description: 'Event registrations', SupportsWrite: true, Fields: [
73
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
74
+ { Name: 'NU__Event__c', DisplayName: 'Event', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Event' },
75
+ { Name: 'NU__Contact__c', DisplayName: 'Contact', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Contact' },
76
+ ] },
77
+ { Name: 'NU__Order__c', DisplayName: 'Order', Description: 'Sales orders', SupportsWrite: true, Fields: [
78
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
79
+ { Name: 'NU__Account__c', DisplayName: 'Account', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Account' },
80
+ { Name: 'LastModifiedDate', DisplayName: 'Last Modified', Type: 'datetime', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'Incremental date' },
81
+ ] },
82
+ { Name: 'NU__OrderItem__c', DisplayName: 'Order Item', Description: 'Order line items', SupportsWrite: true, Fields: [
83
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
84
+ { Name: 'NU__Order__c', DisplayName: 'Order', Type: 'string', IsRequired: true, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Order' },
85
+ ] },
86
+ { Name: 'NU__Payment__c', DisplayName: 'Payment', Description: 'Payment records', SupportsWrite: true, Fields: [
87
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
88
+ { Name: 'NU__Order__c', DisplayName: 'Order', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Order' },
89
+ ] },
90
+ { Name: 'NU__Invoice__c', DisplayName: 'Invoice', Description: 'Invoices', SupportsWrite: true, Fields: [
91
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
92
+ { Name: 'NU__Account__c', DisplayName: 'Account', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Account' },
93
+ ] },
94
+ { Name: 'NU__Committee__c', DisplayName: 'Committee', Description: 'Committees and boards', SupportsWrite: true, Fields: [
95
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
96
+ ] },
97
+ { Name: 'NU__CommitteeMembership__c', DisplayName: 'Committee Member', Description: 'Committee membership records', SupportsWrite: true, Fields: [
98
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
99
+ { Name: 'NU__Committee__c', DisplayName: 'Committee', Type: 'string', IsRequired: true, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Committee' },
100
+ { Name: 'NU__Contact__c', DisplayName: 'Contact', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Contact' },
101
+ ] },
102
+ { Name: 'NU__Donation__c', DisplayName: 'Donation', Description: 'Donation/gift records', SupportsWrite: true, Fields: [
103
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
104
+ { Name: 'NU__Account__c', DisplayName: 'Account', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Account' },
105
+ ] },
106
+ { Name: 'NU__Product__c', DisplayName: 'Product', Description: 'Products/items for sale', SupportsWrite: true, Fields: [
107
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
108
+ ] },
109
+ { Name: 'NU__Badge__c', DisplayName: 'Badge', Description: 'Badges/certifications', SupportsWrite: true, Fields: [
110
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
111
+ ] },
112
+ { Name: 'NU__Subscription__c', DisplayName: 'Subscription', Description: 'Publication subscriptions', SupportsWrite: true, Fields: [
113
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
114
+ { Name: 'NU__Account__c', DisplayName: 'Account', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Account' },
115
+ ] },
116
+ { Name: 'NU__Campaign__c', DisplayName: 'Campaign', Description: 'Fundraising campaigns', SupportsWrite: true, Fields: [
117
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
118
+ ] },
119
+ { Name: 'NU__Session__c', DisplayName: 'Session', Description: 'Event sessions', SupportsWrite: true, Fields: [
120
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
121
+ { Name: 'NU__Event__c', DisplayName: 'Event', Type: 'string', IsRequired: true, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Event' },
122
+ ] },
123
+ { Name: 'NU__Credential__c', DisplayName: 'Credential', Description: 'Professional credentials/certifications', SupportsWrite: true, Fields: [
124
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
125
+ { Name: 'NU__Contact__c', DisplayName: 'Contact', Type: 'string', IsRequired: false, IsReadOnly: false, IsPrimaryKey: false, Description: 'FK → Contact' },
126
+ ] },
127
+ { Name: 'NU__Chapter__c', DisplayName: 'Chapter', Description: 'Chapters/branches', SupportsWrite: true, Fields: [
128
+ { Name: 'Id', DisplayName: 'ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'Record ID' },
129
+ ] },
130
+ ];
131
+ // ─── Connector ────────────────────────────────────────────────────────────
132
+ let NimbleAMSConnector = class NimbleAMSConnector extends BaseRESTIntegrationConnector {
133
+ constructor() {
134
+ super(...arguments);
135
+ this.tokenCache = null;
136
+ this.lastRequestTime = 0;
137
+ }
138
+ get IntegrationName() { return 'Nimble AMS'; }
139
+ get SupportsCreate() { return true; }
140
+ get SupportsUpdate() { return true; }
141
+ get SupportsDelete() { return true; }
142
+ GetIntegrationObjects() { return NIMBLE_OBJECTS; }
143
+ GetActionGeneratorConfig() {
144
+ const config = super.GetActionGeneratorConfig();
145
+ if (!config)
146
+ return null;
147
+ config.IconClass = 'fa-solid fa-id-badge';
148
+ config.CategoryDescription = 'Nimble AMS (Salesforce-native) for memberships, events, orders, and donations';
149
+ config.ParentCategoryName = 'Association Management';
150
+ config.IncludeSearch = true;
151
+ config.IncludeList = true;
152
+ return config;
153
+ }
154
+ // ─── Discovery ─────────────────────────────────────────────────────
155
+ async DiscoverObjects(companyIntegration, contextUser) {
156
+ // Try Salesforce describe API for dynamic discovery of NU__ objects
157
+ try {
158
+ const auth = await this.Authenticate(companyIntegration, contextUser);
159
+ const headers = this.BuildHeaders(auth);
160
+ const url = `${auth.InstanceURL}/services/data/${auth.ApiVersion}/sobjects`;
161
+ const response = await this.MakeHTTPRequest(auth, url, 'GET', headers);
162
+ if (response.Status === 200) {
163
+ const body = response.Body;
164
+ const results = [];
165
+ for (const obj of (body.sobjects ?? [])) {
166
+ // Include NU__ namespace objects + standard objects used by Nimble
167
+ if (obj.name.startsWith('NU__') || ['Account', 'Contact', 'Lead', 'Opportunity', 'Campaign'].includes(obj.name)) {
168
+ if (obj.queryable) {
169
+ results.push({
170
+ Name: obj.name, Label: obj.label, Description: `${obj.label} (Nimble AMS)`,
171
+ SupportsIncrementalSync: true, SupportsWrite: obj.createable || obj.updateable,
172
+ });
173
+ }
174
+ }
175
+ }
176
+ if (results.length > 0)
177
+ return results;
178
+ }
179
+ }
180
+ catch { /* Fall through to static */ }
181
+ return NIMBLE_OBJECTS.map(obj => ({
182
+ Name: obj.Name, Label: obj.DisplayName, Description: obj.Description,
183
+ SupportsIncrementalSync: true, SupportsWrite: obj.SupportsWrite ?? false,
184
+ }));
185
+ }
186
+ async DiscoverFields(companyIntegration, objectName, contextUser) {
187
+ // Salesforce describe endpoint for field metadata
188
+ try {
189
+ const auth = await this.Authenticate(companyIntegration, contextUser);
190
+ const headers = this.BuildHeaders(auth);
191
+ const url = `${auth.InstanceURL}/services/data/${auth.ApiVersion}/sobjects/${objectName}/describe`;
192
+ const response = await this.MakeHTTPRequest(auth, url, 'GET', headers);
193
+ if (response.Status === 200) {
194
+ const body = response.Body;
195
+ return (body.fields ?? []).map(f => ({
196
+ Name: f.name, Label: f.label, Description: '', DataType: this.MapSFType(f.type),
197
+ IsRequired: !f.nillable, IsUniqueKey: f.name === 'Id' || f.unique, IsReadOnly: !f.createable && !f.updateable,
198
+ }));
199
+ }
200
+ }
201
+ catch { /* Fall through to static */ }
202
+ const obj = NIMBLE_OBJECTS.find(o => o.Name.toLowerCase() === objectName.toLowerCase());
203
+ if (!obj)
204
+ return [];
205
+ return obj.Fields.map(f => ({ Name: f.Name, Label: f.DisplayName, Description: f.Description, DataType: f.Type, IsRequired: f.IsRequired, IsUniqueKey: f.IsPrimaryKey, IsReadOnly: f.IsReadOnly }));
206
+ }
207
+ MapSFType(sfType) {
208
+ const map = {
209
+ 'id': 'string', 'string': 'string', 'textarea': 'string', 'url': 'string', 'email': 'string', 'phone': 'string',
210
+ 'boolean': 'boolean', 'int': 'number', 'double': 'decimal', 'currency': 'decimal', 'percent': 'decimal',
211
+ 'date': 'datetime', 'datetime': 'datetime', 'reference': 'string', 'picklist': 'string', 'multipicklist': 'string',
212
+ };
213
+ return map[sfType] ?? 'string';
214
+ }
215
+ // ─── Auth ──────────────────────────────────────────────────────────
216
+ async Authenticate(companyIntegration, contextUser) {
217
+ const config = await this.ParseConfig(companyIntegration, contextUser);
218
+ if (this.tokenCache && this.tokenCache.ExpiresAt > Date.now() + TOKEN_REFRESH_BUFFER_MS) {
219
+ return { Token: this.tokenCache.AccessToken, TokenType: 'Bearer', Config: config, InstanceURL: config.InstanceURL, ApiVersion: SF_API_VERSION };
220
+ }
221
+ const token = await this.ObtainToken(config);
222
+ this.tokenCache = token;
223
+ return { Token: token.AccessToken, TokenType: 'Bearer', Config: config, InstanceURL: config.InstanceURL, ApiVersion: SF_API_VERSION };
224
+ }
225
+ async ObtainToken(config) {
226
+ const tokenURL = `${config.InstanceURL}/services/oauth2/token`;
227
+ const body = new URLSearchParams({ grant_type: 'client_credentials', client_id: config.ClientID, client_secret: config.ClientSecret });
228
+ const response = await fetch(tokenURL, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: body.toString(), signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) });
229
+ if (!response.ok)
230
+ throw new Error(`Nimble AMS auth failed: ${response.status}`);
231
+ const data = await response.json();
232
+ return { AccessToken: data.access_token, ExpiresAt: Date.now() + (3600 * 1000) };
233
+ }
234
+ async ParseConfig(companyIntegration, contextUser, provider) {
235
+ // Use the typed property — never .Get()/.Set() on entity-typed objects (CLAUDE.md §2b).
236
+ const credentialID = companyIntegration.CredentialID;
237
+ if (credentialID) {
238
+ const md = provider ?? new Metadata();
239
+ const credential = await md.GetEntityObject('MJ: Credentials', contextUser);
240
+ const loaded = await credential.Load(credentialID);
241
+ if (loaded && credential.Values) {
242
+ const parsed = JSON.parse(credential.Values);
243
+ return { InstanceURL: parsed['InstanceURL'] ?? '', ClientID: parsed['ClientID'] ?? parsed['clientId'] ?? '', ClientSecret: parsed['ClientSecret'] ?? parsed['clientSecret'] ?? '', AccessToken: parsed['AccessToken'], RefreshToken: parsed['RefreshToken'] };
244
+ }
245
+ }
246
+ throw new Error('No Nimble AMS credentials found.');
247
+ }
248
+ // ─── TestConnection ────────────────────────────────────────────────
249
+ async TestConnection(companyIntegration, contextUser) {
250
+ try {
251
+ const auth = await this.Authenticate(companyIntegration, contextUser);
252
+ const headers = this.BuildHeaders(auth);
253
+ const response = await this.MakeHTTPRequest(auth, `${auth.InstanceURL}/services/data/${auth.ApiVersion}/sobjects`, 'GET', headers);
254
+ if (response.Status === 200)
255
+ return { Success: true, Message: 'Connected to Nimble AMS (Salesforce)' };
256
+ return { Success: false, Message: `API returned ${response.Status}` };
257
+ }
258
+ catch (err) {
259
+ return { Success: false, Message: err instanceof Error ? err.message : String(err) };
260
+ }
261
+ }
262
+ // ─── URL / Response / Pagination ───────────────────────────────────
263
+ GetBaseURL(_ci, auth) {
264
+ const a = auth;
265
+ return `${a.InstanceURL}/services/data/${a.ApiVersion}`;
266
+ }
267
+ BuildPaginatedURL(basePath, _obj, _page, _offset, cursor) {
268
+ return cursor ?? basePath;
269
+ }
270
+ NormalizeResponse(rawBody, _key) {
271
+ if (Array.isArray(rawBody))
272
+ return rawBody;
273
+ const body = rawBody;
274
+ if (Array.isArray(body['records']))
275
+ return body['records'];
276
+ if (body && Object.keys(body).length > 0)
277
+ return [body];
278
+ return [];
279
+ }
280
+ ExtractPaginationInfo(rawBody, _pt, _cp, _co, _ps) {
281
+ const body = rawBody;
282
+ return { HasMore: !body.done, NextCursor: body.nextRecordsUrl };
283
+ }
284
+ // ─── FetchChanges — SOQL-based ─────────────────────────────────────
285
+ async FetchChanges(ctx) {
286
+ const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
287
+ const headers = this.BuildHeaders(auth);
288
+ let soql = `SELECT FIELDS(ALL) FROM ${ctx.ObjectName} ORDER BY LastModifiedDate ASC LIMIT ${SF_PAGE_SIZE}`;
289
+ if (ctx.WatermarkValue) {
290
+ soql = `SELECT FIELDS(ALL) FROM ${ctx.ObjectName} WHERE LastModifiedDate >= ${ctx.WatermarkValue} ORDER BY LastModifiedDate ASC LIMIT ${SF_PAGE_SIZE}`;
291
+ }
292
+ const url = ctx.CurrentCursor
293
+ ? `${auth.InstanceURL}${ctx.CurrentCursor}`
294
+ : `${auth.InstanceURL}/services/data/${auth.ApiVersion}/query?q=${encodeURIComponent(soql)}`;
295
+ const response = await this.MakeHTTPRequest(auth, url, 'GET', headers);
296
+ if (response.Status < 200 || response.Status >= 300)
297
+ throw new Error(`Nimble AMS SOQL error: ${response.Status}`);
298
+ const body = response.Body;
299
+ const records = body.records ?? [];
300
+ const externalRecords = records.map(r => ({ ExternalID: String(r['Id'] ?? ''), ObjectType: ctx.ObjectName, Fields: r }));
301
+ let newWatermark;
302
+ if (body.done) {
303
+ for (const r of records) {
304
+ const mod = r['LastModifiedDate'];
305
+ if (mod && (!newWatermark || mod > newWatermark))
306
+ newWatermark = mod;
307
+ }
308
+ }
309
+ return { Records: externalRecords, HasMore: !body.done, NextCursor: body.nextRecordsUrl, NewWatermarkValue: body.done ? newWatermark : undefined };
310
+ }
311
+ // ─── CRUD ──────────────────────────────────────────────────────────
312
+ async CreateRecord(ctx) {
313
+ const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
314
+ const headers = { ...this.BuildHeaders(auth), 'Content-Type': 'application/json' };
315
+ const url = `${auth.InstanceURL}/services/data/${auth.ApiVersion}/sobjects/${ctx.ObjectName}`;
316
+ const response = await this.MakeHTTPRequest(auth, url, 'POST', headers, ctx.Attributes);
317
+ if (response.Status >= 200 && response.Status < 300) {
318
+ const body = response.Body;
319
+ return { Success: true, ExternalID: String(body['id'] ?? ''), StatusCode: response.Status };
320
+ }
321
+ return this.BuildCRUDError(response, 'CreateRecord', ctx.ObjectName);
322
+ }
323
+ async UpdateRecord(ctx) {
324
+ const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
325
+ const headers = { ...this.BuildHeaders(auth), 'Content-Type': 'application/json' };
326
+ const url = `${auth.InstanceURL}/services/data/${auth.ApiVersion}/sobjects/${ctx.ObjectName}/${ctx.ExternalID}`;
327
+ const response = await this.MakeHTTPRequest(auth, url, 'PATCH', headers, ctx.Attributes);
328
+ if (response.Status >= 200 && response.Status < 300)
329
+ return { Success: true, ExternalID: ctx.ExternalID, StatusCode: response.Status };
330
+ return this.BuildCRUDError(response, 'UpdateRecord', ctx.ObjectName);
331
+ }
332
+ async DeleteRecord(ctx) {
333
+ const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
334
+ const headers = this.BuildHeaders(auth);
335
+ const url = `${auth.InstanceURL}/services/data/${auth.ApiVersion}/sobjects/${ctx.ObjectName}/${ctx.ExternalID}`;
336
+ const response = await this.MakeHTTPRequest(auth, url, 'DELETE', headers);
337
+ if (response.Status === 204 || (response.Status >= 200 && response.Status < 300))
338
+ return { Success: true, ExternalID: ctx.ExternalID, StatusCode: response.Status };
339
+ return this.BuildCRUDError(response, 'DeleteRecord', ctx.ObjectName);
340
+ }
341
+ BuildCRUDError(response, op, obj) {
342
+ const bodyStr = typeof response.Body === 'string' ? response.Body : JSON.stringify(response.Body);
343
+ return { Success: false, ExternalID: '', StatusCode: response.Status, ErrorMessage: `${op} failed for ${obj}: HTTP ${response.Status} — ${bodyStr?.substring(0, 300)}` };
344
+ }
345
+ // ─── Headers + HTTP ────────────────────────────────────────────────
346
+ BuildHeaders(auth) {
347
+ return { 'Authorization': `Bearer ${auth.Token}`, 'Accept': 'application/json', 'User-Agent': 'MemberJunction-Integration/1.0' };
348
+ }
349
+ async MakeHTTPRequest(_auth, url, method, headers, body) {
350
+ await this.Throttle();
351
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
352
+ const response = await this.FetchWithTimeout(url, method, headers, body);
353
+ this.lastRequestTime = Date.now();
354
+ if (response.status === 401 && attempt === 0) {
355
+ this.tokenCache = null;
356
+ continue;
357
+ }
358
+ if (response.status === 429) {
359
+ const d = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 500, 60_000);
360
+ await this.Sleep(d);
361
+ continue;
362
+ }
363
+ if (response.status >= 500 && attempt < MAX_RETRIES) {
364
+ await this.Sleep(Math.min(1000 * Math.pow(2, attempt), 30_000));
365
+ continue;
366
+ }
367
+ const responseBody = await this.ParseBody(response);
368
+ return this.ToRESTResponse(response, responseBody);
369
+ }
370
+ throw new Error(`Nimble AMS request failed after ${MAX_RETRIES} retries: ${url}`);
371
+ }
372
+ async FetchWithTimeout(url, method, headers, body) {
373
+ const controller = new AbortController();
374
+ const tid = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
375
+ try {
376
+ const opts = { method, headers, signal: controller.signal };
377
+ if (body && (method === 'POST' || method === 'PUT' || method === 'PATCH'))
378
+ opts.body = JSON.stringify(body);
379
+ return await fetch(url, opts);
380
+ }
381
+ catch (err) {
382
+ if (err instanceof Error && err.name === 'AbortError')
383
+ throw new Error(`Request timed out: ${url}`);
384
+ throw err;
385
+ }
386
+ finally {
387
+ clearTimeout(tid);
388
+ }
389
+ }
390
+ async ParseBody(r) { const ct = r.headers.get('content-type') ?? ''; return ct.includes('json') ? r.json() : r.text(); }
391
+ ToRESTResponse(r, body) { const h = {}; r.headers.forEach((v, k) => { h[k.toLowerCase()] = v; }); return { Status: r.status, Body: body, Headers: h }; }
392
+ async Throttle() { const e = Date.now() - this.lastRequestTime; if (e < MIN_REQUEST_INTERVAL_MS)
393
+ await this.Sleep(MIN_REQUEST_INTERVAL_MS - e); }
394
+ Sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
395
+ GetDefaultFieldMappings(objectName) {
396
+ const obj = NIMBLE_OBJECTS.find(o => o.Name.toLowerCase() === objectName.toLowerCase());
397
+ if (!obj)
398
+ return [{ SourceFieldName: 'Id', DestinationFieldName: 'Id', IsKeyField: true }];
399
+ return obj.Fields.map(f => ({ SourceFieldName: f.Name, DestinationFieldName: f.Name, IsKeyField: f.IsPrimaryKey }));
400
+ }
401
+ };
402
+ NimbleAMSConnector = __decorate([
403
+ RegisterClass(BaseIntegrationConnector, 'NimbleAMSConnector')
404
+ ], NimbleAMSConnector);
405
+ export { NimbleAMSConnector };
406
+ // Tree-shaking prevention — REQUIRED
407
+ export function LoadNimbleAMSConnector() { }
408
+ //# sourceMappingURL=NimbleAMSConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NimbleAMSConnector.js","sourceRoot":"","sources":["../src/NimbleAMSConnector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import { type UserInfo } from '@memberjunction/core';
2
+ import type { MJCompanyIntegrationEntity } from '@memberjunction/core-entities';
3
+ import { BaseRESTIntegrationConnector, type RESTAuthContext, type RESTResponse, type PaginationState, type PaginationType, type ConnectionTestResult, type DefaultFieldMapping, type DefaultIntegrationConfig, type FetchContext, type FetchBatchResult, type ExternalObjectSchema, type ExternalFieldSchema, type IntegrationObjectInfo } from '@memberjunction/integration-engine';
4
+ /**
5
+ * Credentials for a PropFuel tenant. The BaseURL pattern is per-customer; the connector
6
+ * sends the ApiKey as a bearer token by default. Confirm the actual auth header
7
+ * (Bearer / X-API-Key / etc.) with PropFuel before deploying against production.
8
+ */
9
+ export interface PropFuelConnectionConfig {
10
+ BaseURL: string;
11
+ ApiKey: string;
12
+ /** Maximum retries for rate-limited or transient failures. Default: 3. */
13
+ MaxRetries?: number;
14
+ /** HTTP request timeout in milliseconds. Default: 30000. */
15
+ RequestTimeoutMs?: number;
16
+ /** Minimum milliseconds between API requests (client-side throttle). Default: 250. */
17
+ MinRequestIntervalMs?: number;
18
+ }
19
+ export declare class PropFuelConnector extends BaseRESTIntegrationConnector {
20
+ private authState;
21
+ private lastRequestTime;
22
+ get IntegrationName(): string;
23
+ get SupportsCreate(): boolean;
24
+ get SupportsUpdate(): boolean;
25
+ get SupportsDelete(): boolean;
26
+ get SupportsSearch(): boolean;
27
+ get SupportsListing(): boolean;
28
+ GetIntegrationObjects(): IntegrationObjectInfo[];
29
+ GetActionGeneratorConfig(): import("@memberjunction/integration-engine").ActionGeneratorConfig;
30
+ protected Authenticate(companyIntegration: MJCompanyIntegrationEntity, contextUser: UserInfo): Promise<RESTAuthContext>;
31
+ protected BuildHeaders(auth: RESTAuthContext): Record<string, string>;
32
+ protected MakeHTTPRequest(auth: RESTAuthContext, url: string, method: string, headers: Record<string, string>, body?: unknown): Promise<RESTResponse>;
33
+ protected NormalizeResponse(rawBody: unknown, responseDataKey: string | null): Record<string, unknown>[];
34
+ protected ExtractPaginationInfo(rawBody: unknown, paginationType: PaginationType, currentPage: number, currentOffset: number, pageSize: number): PaginationState;
35
+ protected GetBaseURL(_companyIntegration: MJCompanyIntegrationEntity, auth: RESTAuthContext): string;
36
+ TestConnection(companyIntegration: MJCompanyIntegrationEntity, contextUser: UserInfo): Promise<ConnectionTestResult>;
37
+ DiscoverObjects(companyIntegration: MJCompanyIntegrationEntity, contextUser: UserInfo): Promise<ExternalObjectSchema[]>;
38
+ /**
39
+ * Discovery strategy: fetch one sample record and infer the field set from its JSON
40
+ * shape, overlaying any static PK / FK metadata. Falls back to the static field list
41
+ * if the live call fails (offline / sandbox with no data / endpoint mismatch).
42
+ */
43
+ DiscoverFields(companyIntegration: MJCompanyIntegrationEntity, objectName: string, contextUser: UserInfo): Promise<ExternalFieldSchema[]>;
44
+ private InferFieldsFromSample;
45
+ private InferType;
46
+ FetchChanges(ctx: FetchContext): Promise<FetchBatchResult>;
47
+ private BuildFetchURL;
48
+ private ComputeNewWatermark;
49
+ GetDefaultConfiguration(): DefaultIntegrationConfig;
50
+ GetDefaultFieldMappings(objectName: string, _entityName: string): DefaultFieldMapping[];
51
+ private GetAuth;
52
+ private IsConfig;
53
+ private ParseConfig;
54
+ private ParseConfigFromCredential;
55
+ private ExtractConfig;
56
+ private ExecuteFetch;
57
+ private BuildRESTResponse;
58
+ private ParseJsonSafely;
59
+ private ShouldRetry;
60
+ private ComputeRetryDelay;
61
+ private Throttle;
62
+ private Sleep;
63
+ private ExtractIdFromRecord;
64
+ private StripTrailingSlash;
65
+ }
66
+ /** Tree-shaking prevention — import and call from module entry point. */
67
+ export declare function LoadPropFuelConnector(): void;
68
+ //# sourceMappingURL=PropFuelConnector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PropFuelConnector.d.ts","sourceRoot":"","sources":["../src/PropFuelConnector.ts"],"names":[],"mappings":"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"}