@memberjunction/integration-connectors 5.34.1 → 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.
- package/dist/AptifyConnector.d.ts +88 -0
- package/dist/AptifyConnector.d.ts.map +1 -0
- package/dist/AptifyConnector.js +737 -0
- package/dist/AptifyConnector.js.map +1 -0
- package/dist/BettyConnector.d.ts +288 -0
- package/dist/BettyConnector.d.ts.map +1 -0
- package/dist/BettyConnector.js +909 -0
- package/dist/BettyConnector.js.map +1 -0
- package/dist/BlackbaudConnector.d.ts +64 -0
- package/dist/BlackbaudConnector.d.ts.map +1 -0
- package/dist/BlackbaudConnector.js +916 -0
- package/dist/BlackbaudConnector.js.map +1 -0
- package/dist/ConstantContactConnector.d.ts +126 -0
- package/dist/ConstantContactConnector.d.ts.map +1 -0
- package/dist/ConstantContactConnector.js +636 -0
- package/dist/ConstantContactConnector.js.map +1 -0
- package/dist/GrowthZoneConnector.d.ts +185 -0
- package/dist/GrowthZoneConnector.d.ts.map +1 -0
- package/dist/GrowthZoneConnector.js +745 -0
- package/dist/GrowthZoneConnector.js.map +1 -0
- package/dist/HubSpotConnector.d.ts +2 -2
- package/dist/HubSpotConnector.d.ts.map +1 -1
- package/dist/HubSpotConnector.js +3 -3
- package/dist/HubSpotConnector.js.map +1 -1
- package/dist/IMISConnector.d.ts +155 -0
- package/dist/IMISConnector.d.ts.map +1 -0
- package/dist/IMISConnector.js +686 -0
- package/dist/IMISConnector.js.map +1 -0
- package/dist/MJToMJConnector.d.ts +279 -0
- package/dist/MJToMJConnector.d.ts.map +1 -0
- package/dist/MJToMJConnector.js +893 -0
- package/dist/MJToMJConnector.js.map +1 -0
- package/dist/MagnetMailConnector.d.ts +163 -0
- package/dist/MagnetMailConnector.d.ts.map +1 -0
- package/dist/MagnetMailConnector.js +816 -0
- package/dist/MagnetMailConnector.js.map +1 -0
- package/dist/MailchimpConnector.d.ts +188 -0
- package/dist/MailchimpConnector.d.ts.map +1 -0
- package/dist/MailchimpConnector.js +753 -0
- package/dist/MailchimpConnector.js.map +1 -0
- package/dist/NetForumConnector.d.ts +51 -0
- package/dist/NetForumConnector.d.ts.map +1 -0
- package/dist/NetForumConnector.js +419 -0
- package/dist/NetForumConnector.js.map +1 -0
- package/dist/NetSuiteConnector.d.ts +70 -0
- package/dist/NetSuiteConnector.d.ts.map +1 -0
- package/dist/NetSuiteConnector.js +605 -0
- package/dist/NetSuiteConnector.js.map +1 -0
- package/dist/NimbleAMSConnector.d.ts +49 -0
- package/dist/NimbleAMSConnector.d.ts.map +1 -0
- package/dist/NimbleAMSConnector.js +408 -0
- package/dist/NimbleAMSConnector.js.map +1 -0
- package/dist/PropFuelConnector.d.ts +68 -0
- package/dist/PropFuelConnector.d.ts.map +1 -0
- package/dist/PropFuelConnector.js +514 -0
- package/dist/PropFuelConnector.js.map +1 -0
- package/dist/RasaConnector.d.ts +26 -0
- package/dist/RasaConnector.d.ts.map +1 -1
- package/dist/RasaConnector.js +233 -1
- package/dist/RasaConnector.js.map +1 -1
- package/dist/Reach360Connector.d.ts +165 -0
- package/dist/Reach360Connector.d.ts.map +1 -0
- package/dist/Reach360Connector.js +710 -0
- package/dist/Reach360Connector.js.map +1 -0
- package/dist/SharePointConnector.d.ts +181 -0
- package/dist/SharePointConnector.d.ts.map +1 -0
- package/dist/SharePointConnector.js +796 -0
- package/dist/SharePointConnector.js.map +1 -0
- package/dist/WicketConnector.d.ts +1 -0
- package/dist/WicketConnector.d.ts.map +1 -1
- package/dist/WicketConnector.js +6 -0
- package/dist/WicketConnector.js.map +1 -1
- package/dist/WildApricotConnector.d.ts +188 -0
- package/dist/WildApricotConnector.d.ts.map +1 -0
- package/dist/WildApricotConnector.js +1092 -0
- package/dist/WildApricotConnector.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,605 @@
|
|
|
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
|
+
* NetSuiteConnector — Integration connector for Oracle NetSuite ERP platform.
|
|
9
|
+
*
|
|
10
|
+
* API Documentation: https://system.netsuite.com/help/helpcenter/en_US/APIs/REST_API_Browser/record/v1/2023.1/index.html
|
|
11
|
+
*
|
|
12
|
+
* Auth: OAuth 1.0 Token-Based Authentication (TBA) — non-expiring tokens.
|
|
13
|
+
* Credentials: ConsumerKey, ConsumerSecret, TokenID, TokenSecret, AccountID
|
|
14
|
+
* Authorization header with HMAC-SHA256 signature per OAuth 1.0 spec.
|
|
15
|
+
* Base URL: https://{accountId}.suitetalk.api.netsuite.com/services/rest/record/v1
|
|
16
|
+
* SuiteQL: https://{accountId}.suitetalk.api.netsuite.com/services/rest/query/v1/suiteql
|
|
17
|
+
* Pagination: limit/offset (max 1000 per page)
|
|
18
|
+
* Rate limits: 15 concurrent requests/account
|
|
19
|
+
* Incremental: SuiteQL queries with lastmodifieddate >= watermark
|
|
20
|
+
* CRUD: Full CRUD via REST Record API on ALL record types
|
|
21
|
+
*
|
|
22
|
+
* Discovery: DYNAMIC via GET /record/v1/metadata-catalog/
|
|
23
|
+
* - Enumerates ALL available record types for the account (100+ standard types)
|
|
24
|
+
* - Field metadata fetched per record type via GET /record/v1/metadata-catalog/{recordType}
|
|
25
|
+
* - New record types (including custom records) are picked up automatically
|
|
26
|
+
*
|
|
27
|
+
* API Categories:
|
|
28
|
+
* - REST Record API (implemented, dynamic) — direct CRUD on ALL record types via metadata catalog
|
|
29
|
+
* - SuiteQL API (implemented) — SQL-like queries for read + incremental sync
|
|
30
|
+
* - RESTlet API (NOT implemented) — custom SuiteScript server-side endpoints, not standard
|
|
31
|
+
* - SOAP/SuiteTalk SOAP (NOT implemented) — legacy XML, superseded by REST
|
|
32
|
+
* - CSV Import API (NOT implemented) — file-based batch upload, not API-driven
|
|
33
|
+
* - No webhooks/CDC — use SuiteQL lastmodifieddate polling instead
|
|
34
|
+
*/
|
|
35
|
+
import { createHmac, randomBytes } from 'crypto';
|
|
36
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
37
|
+
import { Metadata } from '@memberjunction/core';
|
|
38
|
+
import { BaseIntegrationConnector, BaseRESTIntegrationConnector, } from '@memberjunction/integration-engine';
|
|
39
|
+
// ─── Constants ────────────────────────────────────────────────────────────
|
|
40
|
+
const NS_PAGE_SIZE = 1000;
|
|
41
|
+
const MAX_RETRIES = 3;
|
|
42
|
+
const REQUEST_TIMEOUT_MS = 60_000;
|
|
43
|
+
const MIN_REQUEST_INTERVAL_MS = 100;
|
|
44
|
+
// Transaction record types in SuiteQL use the `transaction` table with a type filter.
|
|
45
|
+
// Non-transaction records query their own table (same name as REST endpoint).
|
|
46
|
+
const NS_TRANSACTION_TYPES = {
|
|
47
|
+
'salesorder': 'SalesOrd', 'invoice': 'CustInvc', 'purchaseorder': 'PurchOrd',
|
|
48
|
+
'journalentry': 'Journal', 'creditmemo': 'CustCred', 'vendorbill': 'VendBill',
|
|
49
|
+
'vendorcredit': 'VendCred', 'vendorpayment': 'VendPymt', 'customerpayment': 'CustPymt',
|
|
50
|
+
'customerrefund': 'CustRfnd', 'customerdeposit': 'CustDep', 'cashsale': 'CashSale',
|
|
51
|
+
'cashrefund': 'CashRfnd', 'check': 'Check', 'deposit': 'Deposit',
|
|
52
|
+
'expensereport': 'ExpRept', 'estimate': 'Estimate', 'returnauthorization': 'RtnAuth',
|
|
53
|
+
'itemfulfillment': 'ItemShip', 'itemreceipt': 'ItemRcpt', 'transferorder': 'TrnfrOrd',
|
|
54
|
+
'workorder': 'WorkOrd', 'assemblybuild': 'Build', 'inventoryadjustment': 'InvAdjst',
|
|
55
|
+
'inventorytransfer': 'InvTrnfr', 'depositapplication': 'DepAppl',
|
|
56
|
+
};
|
|
57
|
+
// ─── Connector ────────────────────────────────────────────────────────────
|
|
58
|
+
let NetSuiteConnector = class NetSuiteConnector extends BaseRESTIntegrationConnector {
|
|
59
|
+
constructor() {
|
|
60
|
+
super(...arguments);
|
|
61
|
+
this.lastRequestTime = 0;
|
|
62
|
+
/** Cache of discovered record types: lowercase name → { name, href } */
|
|
63
|
+
this.recordTypeCache = new Map();
|
|
64
|
+
}
|
|
65
|
+
get IntegrationName() { return 'NetSuite'; }
|
|
66
|
+
get SupportsCreate() { return true; }
|
|
67
|
+
get SupportsUpdate() { return true; }
|
|
68
|
+
get SupportsDelete() { return true; }
|
|
69
|
+
GetIntegrationObjects() {
|
|
70
|
+
// Returns discovered objects with minimal fields — DiscoverFields() fills the rest
|
|
71
|
+
const objects = [];
|
|
72
|
+
for (const [, item] of this.recordTypeCache) {
|
|
73
|
+
objects.push({
|
|
74
|
+
Name: item.name,
|
|
75
|
+
DisplayName: this.FormatDisplayName(item.name),
|
|
76
|
+
Description: `NetSuite ${this.FormatDisplayName(item.name)} record`,
|
|
77
|
+
SupportsWrite: true,
|
|
78
|
+
Fields: [
|
|
79
|
+
{ Name: 'id', DisplayName: 'Internal ID', Type: 'string', IsRequired: false, IsReadOnly: true, IsPrimaryKey: true, Description: 'NetSuite internal record ID' },
|
|
80
|
+
{ Name: 'lastmodifieddate', DisplayName: 'Last Modified', Type: 'datetime', IsRequired: false, IsReadOnly: true, IsPrimaryKey: false, Description: 'Last modification date' },
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return objects;
|
|
85
|
+
}
|
|
86
|
+
GetActionGeneratorConfig() {
|
|
87
|
+
const config = super.GetActionGeneratorConfig();
|
|
88
|
+
if (!config)
|
|
89
|
+
return null;
|
|
90
|
+
config.IconClass = 'fa-solid fa-file-invoice-dollar';
|
|
91
|
+
config.CategoryDescription = 'NetSuite ERP — all record types discovered dynamically via metadata catalog';
|
|
92
|
+
config.ParentCategoryName = 'ERP/Finance';
|
|
93
|
+
config.IncludeSearch = true;
|
|
94
|
+
config.IncludeList = true;
|
|
95
|
+
return config;
|
|
96
|
+
}
|
|
97
|
+
// ─── Discovery (DYNAMIC via metadata-catalog) ──────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* Discovers ALL available record types by calling the NetSuite REST metadata-catalog API.
|
|
100
|
+
* This covers 100+ standard record types plus any custom records (customrecord_{id}).
|
|
101
|
+
*/
|
|
102
|
+
async DiscoverObjects(companyIntegration, contextUser) {
|
|
103
|
+
const auth = await this.Authenticate(companyIntegration, contextUser);
|
|
104
|
+
const catalogURL = `${auth.RecordBaseURL}/metadata-catalog/`;
|
|
105
|
+
const headers = this.BuildRequestHeaders(auth, catalogURL, 'GET');
|
|
106
|
+
// Add header to request JSON-schema format with type listing
|
|
107
|
+
headers['Accept'] = 'application/schema+json';
|
|
108
|
+
const response = await this.MakeHTTPRequest(auth, catalogURL, 'GET', headers);
|
|
109
|
+
if (response.Status !== 200) {
|
|
110
|
+
console.warn(`[NetSuite] Metadata catalog returned ${response.Status}, falling back to SuiteQL discovery`);
|
|
111
|
+
return this.DiscoverObjectsViaSuiteQL(auth);
|
|
112
|
+
}
|
|
113
|
+
const body = response.Body;
|
|
114
|
+
// The metadata-catalog returns { items: [{ name, href }, ...] } or { links: [...] }
|
|
115
|
+
const items = body['items']
|
|
116
|
+
?? body['links']
|
|
117
|
+
?? [];
|
|
118
|
+
this.recordTypeCache.clear();
|
|
119
|
+
const results = [];
|
|
120
|
+
for (const item of items) {
|
|
121
|
+
if (!item.name)
|
|
122
|
+
continue;
|
|
123
|
+
this.recordTypeCache.set(item.name.toLowerCase(), item);
|
|
124
|
+
results.push({
|
|
125
|
+
Name: item.name,
|
|
126
|
+
Label: this.FormatDisplayName(item.name),
|
|
127
|
+
Description: `NetSuite ${this.FormatDisplayName(item.name)} record`,
|
|
128
|
+
SupportsIncrementalSync: true, // All NS records support lastmodifieddate via SuiteQL
|
|
129
|
+
SupportsWrite: true, // All REST record types support full CRUD
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
// If catalog returned nothing, fall back to SuiteQL
|
|
133
|
+
if (results.length === 0) {
|
|
134
|
+
return this.DiscoverObjectsViaSuiteQL(auth);
|
|
135
|
+
}
|
|
136
|
+
return results;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Fallback: discover record types via SuiteQL query against the recordType table.
|
|
140
|
+
*/
|
|
141
|
+
async DiscoverObjectsViaSuiteQL(auth) {
|
|
142
|
+
const query = `SELECT scriptid, name FROM customrecordtype UNION ALL SELECT 'customer' as scriptid, 'Customer' as name FROM dual`;
|
|
143
|
+
const url = `${auth.QueryBaseURL}/suiteql?limit=1000&offset=0`;
|
|
144
|
+
const headers = this.BuildRequestHeaders(auth, url, 'POST', true);
|
|
145
|
+
try {
|
|
146
|
+
const response = await this.MakeHTTPRequest(auth, url, 'POST', headers, { q: query });
|
|
147
|
+
if (response.Status === 200) {
|
|
148
|
+
const body = response.Body;
|
|
149
|
+
const results = [];
|
|
150
|
+
for (const item of (body.items ?? [])) {
|
|
151
|
+
const name = String(item['scriptid'] ?? item['name'] ?? '');
|
|
152
|
+
if (name) {
|
|
153
|
+
this.recordTypeCache.set(name.toLowerCase(), { name, href: '' });
|
|
154
|
+
results.push({
|
|
155
|
+
Name: name, Label: this.FormatDisplayName(name),
|
|
156
|
+
Description: `NetSuite ${this.FormatDisplayName(name)}`,
|
|
157
|
+
SupportsIncrementalSync: true, SupportsWrite: true,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (results.length > 0)
|
|
162
|
+
return results;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Fall through to hardcoded fallback
|
|
167
|
+
}
|
|
168
|
+
// Last resort: return a well-known set so the connector is usable even if discovery fails
|
|
169
|
+
return this.GetFallbackObjects();
|
|
170
|
+
}
|
|
171
|
+
GetFallbackObjects() {
|
|
172
|
+
const knownTypes = [
|
|
173
|
+
'customer', 'vendor', 'employee', 'contact', 'partner', 'lead', 'prospect',
|
|
174
|
+
'salesorder', 'invoice', 'purchaseorder', 'journalentry', 'creditmemo',
|
|
175
|
+
'vendorbill', 'vendorcredit', 'vendorpayment', 'customerpayment', 'customerrefund',
|
|
176
|
+
'cashsale', 'cashrefund', 'check', 'deposit', 'estimate', 'opportunity',
|
|
177
|
+
'expensereport', 'returnauthorization', 'itemfulfillment', 'itemreceipt',
|
|
178
|
+
'transferorder', 'workorder', 'assemblybuild', 'inventoryadjustment',
|
|
179
|
+
'account', 'department', 'classification', 'location', 'subsidiary', 'currency',
|
|
180
|
+
'inventoryitem', 'noninventoryitem', 'serviceitem', 'otherchargeitem',
|
|
181
|
+
'discountitem', 'assemblyitem', 'kititem', 'giftcertificateitem',
|
|
182
|
+
'task', 'phonecall', 'calendarevent', 'note', 'message',
|
|
183
|
+
'supportcase', 'issue', 'solution',
|
|
184
|
+
'job', 'charge', 'timeentry',
|
|
185
|
+
'term', 'paymentmethod', 'salestaxitem',
|
|
186
|
+
'file', 'folder',
|
|
187
|
+
];
|
|
188
|
+
for (const name of knownTypes) {
|
|
189
|
+
this.recordTypeCache.set(name, { name, href: '' });
|
|
190
|
+
}
|
|
191
|
+
return knownTypes.map(name => ({
|
|
192
|
+
Name: name,
|
|
193
|
+
Label: this.FormatDisplayName(name),
|
|
194
|
+
Description: `NetSuite ${this.FormatDisplayName(name)} record`,
|
|
195
|
+
SupportsIncrementalSync: true,
|
|
196
|
+
SupportsWrite: true,
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Discovers fields for a record type by fetching its metadata via the REST API.
|
|
201
|
+
* Falls back to fetching one sample record and inferring field names/types.
|
|
202
|
+
*/
|
|
203
|
+
async DiscoverFields(companyIntegration, objectName, contextUser) {
|
|
204
|
+
const auth = await this.Authenticate(companyIntegration, contextUser);
|
|
205
|
+
const recordType = objectName.toLowerCase();
|
|
206
|
+
// Try metadata endpoint first: GET /record/v1/metadata-catalog/{recordType}
|
|
207
|
+
try {
|
|
208
|
+
const metaURL = `${auth.RecordBaseURL}/metadata-catalog/${recordType}`;
|
|
209
|
+
const headers = this.BuildRequestHeaders(auth, metaURL, 'GET');
|
|
210
|
+
headers['Accept'] = 'application/schema+json';
|
|
211
|
+
const response = await this.MakeHTTPRequest(auth, metaURL, 'GET', headers);
|
|
212
|
+
if (response.Status === 200) {
|
|
213
|
+
return this.ParseFieldMetadata(response.Body);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// Fall through to sample-record approach
|
|
218
|
+
}
|
|
219
|
+
// Fallback: fetch one record and infer fields from the response
|
|
220
|
+
return this.InferFieldsFromSample(auth, recordType);
|
|
221
|
+
}
|
|
222
|
+
ParseFieldMetadata(body) {
|
|
223
|
+
const schema = body;
|
|
224
|
+
const properties = schema['properties'];
|
|
225
|
+
if (!properties)
|
|
226
|
+
return this.DefaultFields();
|
|
227
|
+
const fields = [];
|
|
228
|
+
const requiredFields = schema['required'] ?? [];
|
|
229
|
+
for (const [name, prop] of Object.entries(properties)) {
|
|
230
|
+
const nsType = String(prop['type'] ?? prop['format'] ?? 'string');
|
|
231
|
+
fields.push({
|
|
232
|
+
Name: name,
|
|
233
|
+
Label: String(prop['title'] ?? name),
|
|
234
|
+
Description: String(prop['description'] ?? ''),
|
|
235
|
+
DataType: this.MapNSFieldType(nsType),
|
|
236
|
+
IsRequired: requiredFields.includes(name),
|
|
237
|
+
IsUniqueKey: name === 'id',
|
|
238
|
+
IsReadOnly: prop['readOnly'] === true,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
// Ensure PK exists
|
|
242
|
+
if (!fields.some(f => f.Name === 'id')) {
|
|
243
|
+
fields.unshift({
|
|
244
|
+
Name: 'id', Label: 'Internal ID', Description: 'NetSuite internal record ID',
|
|
245
|
+
DataType: 'string', IsRequired: false, IsUniqueKey: true, IsReadOnly: true,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return fields;
|
|
249
|
+
}
|
|
250
|
+
async InferFieldsFromSample(auth, recordType) {
|
|
251
|
+
try {
|
|
252
|
+
const url = `${auth.RecordBaseURL}/${recordType}?limit=1`;
|
|
253
|
+
const headers = this.BuildRequestHeaders(auth, url, 'GET');
|
|
254
|
+
const response = await this.MakeHTTPRequest(auth, url, 'GET', headers);
|
|
255
|
+
if (response.Status === 200) {
|
|
256
|
+
const body = response.Body;
|
|
257
|
+
const sample = (body.items ?? [])[0];
|
|
258
|
+
if (sample) {
|
|
259
|
+
const fields = [];
|
|
260
|
+
for (const [key, value] of Object.entries(sample)) {
|
|
261
|
+
if (key === 'links')
|
|
262
|
+
continue; // Skip HATEOAS links
|
|
263
|
+
fields.push({
|
|
264
|
+
Name: key,
|
|
265
|
+
Label: this.FormatDisplayName(key),
|
|
266
|
+
Description: '',
|
|
267
|
+
DataType: this.InferTypeFromValue(value),
|
|
268
|
+
IsRequired: false,
|
|
269
|
+
IsUniqueKey: key === 'id',
|
|
270
|
+
IsReadOnly: key === 'id' || key === 'lastmodifieddate' || key === 'datecreated',
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return fields;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// Fall through
|
|
279
|
+
}
|
|
280
|
+
return this.DefaultFields();
|
|
281
|
+
}
|
|
282
|
+
DefaultFields() {
|
|
283
|
+
return [
|
|
284
|
+
{ Name: 'id', Label: 'Internal ID', Description: 'NetSuite internal record ID', DataType: 'string', IsRequired: false, IsUniqueKey: true, IsReadOnly: true },
|
|
285
|
+
{ Name: 'lastmodifieddate', Label: 'Last Modified', Description: 'Last modification date', DataType: 'datetime', IsRequired: false, IsUniqueKey: false, IsReadOnly: true },
|
|
286
|
+
];
|
|
287
|
+
}
|
|
288
|
+
MapNSFieldType(nsType) {
|
|
289
|
+
const lower = nsType.toLowerCase();
|
|
290
|
+
if (lower.includes('integer') || lower === 'int')
|
|
291
|
+
return 'number';
|
|
292
|
+
if (lower.includes('float') || lower.includes('double') || lower.includes('currency') || lower.includes('decimal'))
|
|
293
|
+
return 'decimal';
|
|
294
|
+
if (lower.includes('boolean'))
|
|
295
|
+
return 'boolean';
|
|
296
|
+
if (lower.includes('date') || lower.includes('time'))
|
|
297
|
+
return 'datetime';
|
|
298
|
+
return 'string';
|
|
299
|
+
}
|
|
300
|
+
InferTypeFromValue(value) {
|
|
301
|
+
if (value === null || value === undefined)
|
|
302
|
+
return 'string';
|
|
303
|
+
if (typeof value === 'number')
|
|
304
|
+
return Number.isInteger(value) ? 'number' : 'decimal';
|
|
305
|
+
if (typeof value === 'boolean')
|
|
306
|
+
return 'boolean';
|
|
307
|
+
if (typeof value === 'string') {
|
|
308
|
+
if (/^\d{4}-\d{2}-\d{2}/.test(value))
|
|
309
|
+
return 'datetime';
|
|
310
|
+
return 'string';
|
|
311
|
+
}
|
|
312
|
+
return 'string';
|
|
313
|
+
}
|
|
314
|
+
FormatDisplayName(name) {
|
|
315
|
+
// Convert camelCase/lowercase to Title Case: "salesorder" → "Sales Order"
|
|
316
|
+
return name
|
|
317
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase → camel Case
|
|
318
|
+
.replace(/([A-Z]+)/g, ' $1') // ABCDef → ABC Def
|
|
319
|
+
.replace(/[_-]/g, ' ') // snake_case → snake case
|
|
320
|
+
.trim()
|
|
321
|
+
.split(/\s+/)
|
|
322
|
+
.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
|
|
323
|
+
.join(' ');
|
|
324
|
+
}
|
|
325
|
+
// ─── Auth ──────────────────────────────────────────────────────────
|
|
326
|
+
async Authenticate(companyIntegration, contextUser) {
|
|
327
|
+
const config = await this.ParseConfig(companyIntegration, contextUser);
|
|
328
|
+
const accountLower = config.AccountID.toLowerCase().replace('_', '-');
|
|
329
|
+
const recordBaseURL = `https://${accountLower}.suitetalk.api.netsuite.com/services/rest/record/v1`;
|
|
330
|
+
const queryBaseURL = `https://${accountLower}.suitetalk.api.netsuite.com/services/rest/query/v1`;
|
|
331
|
+
return {
|
|
332
|
+
Token: '', TokenType: 'OAuth1', Config: config,
|
|
333
|
+
RecordBaseURL: recordBaseURL, QueryBaseURL: queryBaseURL,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
async ParseConfig(companyIntegration, contextUser, provider) {
|
|
337
|
+
const credentialID = companyIntegration.CredentialID;
|
|
338
|
+
if (credentialID) {
|
|
339
|
+
const md = provider ?? new Metadata();
|
|
340
|
+
const credential = await md.GetEntityObject('MJ: Credentials', contextUser);
|
|
341
|
+
const loaded = await credential.Load(credentialID);
|
|
342
|
+
if (loaded && credential.Values) {
|
|
343
|
+
const parsed = JSON.parse(credential.Values);
|
|
344
|
+
if (parsed['AccountID'] && parsed['ConsumerKey']) {
|
|
345
|
+
return {
|
|
346
|
+
AccountID: parsed['AccountID'], ConsumerKey: parsed['ConsumerKey'],
|
|
347
|
+
ConsumerSecret: parsed['ConsumerSecret'] ?? '',
|
|
348
|
+
TokenID: parsed['TokenID'] ?? '', TokenSecret: parsed['TokenSecret'] ?? '',
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const configJson = companyIntegration.Configuration;
|
|
354
|
+
if (configJson) {
|
|
355
|
+
const parsed = JSON.parse(configJson);
|
|
356
|
+
return {
|
|
357
|
+
AccountID: parsed['AccountID'] ?? '', ConsumerKey: parsed['ConsumerKey'] ?? '',
|
|
358
|
+
ConsumerSecret: parsed['ConsumerSecret'] ?? '',
|
|
359
|
+
TokenID: parsed['TokenID'] ?? '', TokenSecret: parsed['TokenSecret'] ?? '',
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
throw new Error('No NetSuite credentials found. Set AccountID, ConsumerKey, ConsumerSecret, TokenID, TokenSecret.');
|
|
363
|
+
}
|
|
364
|
+
// ─── OAuth 1.0 TBA Signature ────────────────────────────────────────
|
|
365
|
+
BuildOAuth1Header(config, method, url) {
|
|
366
|
+
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
367
|
+
const nonce = randomBytes(16).toString('hex');
|
|
368
|
+
const oauthParams = {
|
|
369
|
+
oauth_consumer_key: config.ConsumerKey, oauth_nonce: nonce,
|
|
370
|
+
oauth_signature_method: 'HMAC-SHA256', oauth_timestamp: timestamp,
|
|
371
|
+
oauth_token: config.TokenID, oauth_version: '1.0',
|
|
372
|
+
};
|
|
373
|
+
let baseURL = url;
|
|
374
|
+
const queryPart = {};
|
|
375
|
+
const qIdx = url.indexOf('?');
|
|
376
|
+
if (qIdx !== -1) {
|
|
377
|
+
baseURL = url.substring(0, qIdx);
|
|
378
|
+
new URLSearchParams(url.substring(qIdx + 1)).forEach((v, k) => { queryPart[k] = v; });
|
|
379
|
+
}
|
|
380
|
+
const allParams = { ...oauthParams, ...queryPart };
|
|
381
|
+
const normalizedParams = Object.keys(allParams).sort()
|
|
382
|
+
.map(k => `${this.PercentEncode(k)}=${this.PercentEncode(allParams[k])}`).join('&');
|
|
383
|
+
const sigBaseString = `${method.toUpperCase()}&${this.PercentEncode(baseURL)}&${this.PercentEncode(normalizedParams)}`;
|
|
384
|
+
const signingKey = `${this.PercentEncode(config.ConsumerSecret)}&${this.PercentEncode(config.TokenSecret)}`;
|
|
385
|
+
const signature = createHmac('sha256', signingKey).update(sigBaseString).digest('base64');
|
|
386
|
+
const accountRealm = config.AccountID.replace('-', '_').toUpperCase();
|
|
387
|
+
const headerParams = { ...oauthParams, oauth_signature: signature };
|
|
388
|
+
const parts = Object.entries(headerParams).map(([k, v]) => `${k}="${v}"`).join(', ');
|
|
389
|
+
return `OAuth realm="${accountRealm}", ${parts}`;
|
|
390
|
+
}
|
|
391
|
+
PercentEncode(str) {
|
|
392
|
+
return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27')
|
|
393
|
+
.replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A');
|
|
394
|
+
}
|
|
395
|
+
// ─── TestConnection ────────────────────────────────────────────────
|
|
396
|
+
async TestConnection(companyIntegration, contextUser) {
|
|
397
|
+
try {
|
|
398
|
+
const auth = await this.Authenticate(companyIntegration, contextUser);
|
|
399
|
+
const url = `${auth.RecordBaseURL}/customer?limit=1`;
|
|
400
|
+
const headers = this.BuildRequestHeaders(auth, url, 'GET');
|
|
401
|
+
const response = await this.MakeHTTPRequest(auth, url, 'GET', headers);
|
|
402
|
+
if (response.Status === 200) {
|
|
403
|
+
const body = response.Body;
|
|
404
|
+
return { Success: true, Message: `Connected to NetSuite — ${body.totalResults ?? 0} customers` };
|
|
405
|
+
}
|
|
406
|
+
return { Success: false, Message: `API returned ${response.Status}` };
|
|
407
|
+
}
|
|
408
|
+
catch (err) {
|
|
409
|
+
return { Success: false, Message: err instanceof Error ? err.message : String(err) };
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// ─── URL Building ──────────────────────────────────────────────────
|
|
413
|
+
GetBaseURL(_companyIntegration, auth) {
|
|
414
|
+
return auth.RecordBaseURL;
|
|
415
|
+
}
|
|
416
|
+
BuildPaginatedURL(basePath, _obj, _page, offset, _cursor) {
|
|
417
|
+
const sep = basePath.includes('?') ? '&' : '?';
|
|
418
|
+
return `${basePath}${sep}limit=${NS_PAGE_SIZE}&offset=${offset}`;
|
|
419
|
+
}
|
|
420
|
+
// ─── Response Parsing ──────────────────────────────────────────────
|
|
421
|
+
NormalizeResponse(rawBody, _responseDataKey) {
|
|
422
|
+
if (Array.isArray(rawBody))
|
|
423
|
+
return rawBody;
|
|
424
|
+
const body = rawBody;
|
|
425
|
+
if (Array.isArray(body['items']))
|
|
426
|
+
return body['items'];
|
|
427
|
+
if (body && Object.keys(body).length > 0)
|
|
428
|
+
return [body];
|
|
429
|
+
return [];
|
|
430
|
+
}
|
|
431
|
+
ExtractPaginationInfo(rawBody, _paginationType, _currentPage, currentOffset, _pageSize) {
|
|
432
|
+
const body = rawBody;
|
|
433
|
+
const records = this.NormalizeResponse(rawBody, null);
|
|
434
|
+
return { HasMore: body.hasMore ?? false, NextOffset: currentOffset + records.length };
|
|
435
|
+
}
|
|
436
|
+
// ─── Headers ───────────────────────────────────────────────────────
|
|
437
|
+
BuildHeaders(_auth) {
|
|
438
|
+
return { 'Accept': 'application/json', 'User-Agent': 'MemberJunction-Integration/1.0' };
|
|
439
|
+
}
|
|
440
|
+
BuildRequestHeaders(auth, url, method, hasBody = false) {
|
|
441
|
+
const headers = {
|
|
442
|
+
'Authorization': this.BuildOAuth1Header(auth.Config, method, url),
|
|
443
|
+
'Accept': 'application/json', 'User-Agent': 'MemberJunction-Integration/1.0',
|
|
444
|
+
};
|
|
445
|
+
if (hasBody)
|
|
446
|
+
headers['Content-Type'] = 'application/json';
|
|
447
|
+
return headers;
|
|
448
|
+
}
|
|
449
|
+
// ─── FetchChanges — generic for ANY record type ────────────────────
|
|
450
|
+
async FetchChanges(ctx) {
|
|
451
|
+
const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
|
|
452
|
+
const recordType = ctx.ObjectName.toLowerCase();
|
|
453
|
+
const offset = ctx.CurrentOffset ?? 0;
|
|
454
|
+
// Determine SuiteQL table: transactions use `transaction` table with type filter
|
|
455
|
+
const transType = NS_TRANSACTION_TYPES[recordType];
|
|
456
|
+
const suiteqlTable = transType ? 'transaction' : recordType;
|
|
457
|
+
const conditions = [];
|
|
458
|
+
if (transType)
|
|
459
|
+
conditions.push(`type = '${transType}'`);
|
|
460
|
+
if (ctx.WatermarkValue)
|
|
461
|
+
conditions.push(`lastmodifieddate >= '${ctx.WatermarkValue}'`);
|
|
462
|
+
const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';
|
|
463
|
+
const query = `SELECT * FROM ${suiteqlTable}${whereClause} ORDER BY lastmodifieddate`;
|
|
464
|
+
const url = `${auth.QueryBaseURL}/suiteql?limit=${NS_PAGE_SIZE}&offset=${offset}`;
|
|
465
|
+
const headers = this.BuildRequestHeaders(auth, url, 'POST', true);
|
|
466
|
+
const response = await this.MakeHTTPRequest(auth, url, 'POST', headers, { q: query });
|
|
467
|
+
if (response.Status < 200 || response.Status >= 300) {
|
|
468
|
+
throw new Error(`NetSuite SuiteQL error for ${recordType}: ${response.Status}`);
|
|
469
|
+
}
|
|
470
|
+
const body = response.Body;
|
|
471
|
+
const records = body.items ?? [];
|
|
472
|
+
const externalRecords = records.map(r => ({
|
|
473
|
+
ExternalID: String(r['id'] ?? ''), ObjectType: ctx.ObjectName, Fields: r,
|
|
474
|
+
}));
|
|
475
|
+
let newWatermark;
|
|
476
|
+
if (!body.hasMore) {
|
|
477
|
+
for (const r of records) {
|
|
478
|
+
const modified = r['lastmodifieddate'];
|
|
479
|
+
if (modified && (!newWatermark || modified > newWatermark))
|
|
480
|
+
newWatermark = modified;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
return {
|
|
484
|
+
Records: externalRecords, HasMore: body.hasMore ?? false,
|
|
485
|
+
NextOffset: offset + records.length,
|
|
486
|
+
NewWatermarkValue: !body.hasMore ? newWatermark : undefined,
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
// ─── CRUD — generic for ANY record type ────────────────────────────
|
|
490
|
+
async CreateRecord(ctx) {
|
|
491
|
+
const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
|
|
492
|
+
const endpoint = ctx.ObjectName.toLowerCase();
|
|
493
|
+
const url = `${auth.RecordBaseURL}/${endpoint}`;
|
|
494
|
+
const headers = this.BuildRequestHeaders(auth, url, 'POST', true);
|
|
495
|
+
const response = await this.MakeHTTPRequest(auth, url, 'POST', headers, ctx.Attributes);
|
|
496
|
+
if (response.Status >= 200 && response.Status < 300) {
|
|
497
|
+
const location = response.Headers?.['location'] ?? '';
|
|
498
|
+
const idMatch = location.match(/\/(\d+)$/);
|
|
499
|
+
const id = idMatch ? idMatch[1] : String(response.Body?.['id'] ?? '');
|
|
500
|
+
return { Success: true, ExternalID: id, StatusCode: response.Status };
|
|
501
|
+
}
|
|
502
|
+
return this.BuildCRUDError(response, 'CreateRecord', ctx.ObjectName);
|
|
503
|
+
}
|
|
504
|
+
async UpdateRecord(ctx) {
|
|
505
|
+
const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
|
|
506
|
+
const endpoint = ctx.ObjectName.toLowerCase();
|
|
507
|
+
const url = `${auth.RecordBaseURL}/${endpoint}/${ctx.ExternalID}`;
|
|
508
|
+
const headers = this.BuildRequestHeaders(auth, url, 'PATCH', true);
|
|
509
|
+
const response = await this.MakeHTTPRequest(auth, url, 'PATCH', headers, ctx.Attributes);
|
|
510
|
+
if (response.Status >= 200 && response.Status < 300) {
|
|
511
|
+
return { Success: true, ExternalID: ctx.ExternalID, StatusCode: response.Status };
|
|
512
|
+
}
|
|
513
|
+
return this.BuildCRUDError(response, 'UpdateRecord', ctx.ObjectName);
|
|
514
|
+
}
|
|
515
|
+
async DeleteRecord(ctx) {
|
|
516
|
+
const auth = await this.Authenticate(ctx.CompanyIntegration, ctx.ContextUser);
|
|
517
|
+
const endpoint = ctx.ObjectName.toLowerCase();
|
|
518
|
+
const url = `${auth.RecordBaseURL}/${endpoint}/${ctx.ExternalID}`;
|
|
519
|
+
const headers = this.BuildRequestHeaders(auth, url, 'DELETE');
|
|
520
|
+
const response = await this.MakeHTTPRequest(auth, url, 'DELETE', headers);
|
|
521
|
+
if (response.Status === 204 || (response.Status >= 200 && response.Status < 300)) {
|
|
522
|
+
return { Success: true, ExternalID: ctx.ExternalID, StatusCode: response.Status };
|
|
523
|
+
}
|
|
524
|
+
return this.BuildCRUDError(response, 'DeleteRecord', ctx.ObjectName);
|
|
525
|
+
}
|
|
526
|
+
BuildCRUDError(response, operation, objectName) {
|
|
527
|
+
const bodyStr = typeof response.Body === 'string' ? response.Body : JSON.stringify(response.Body);
|
|
528
|
+
return {
|
|
529
|
+
Success: false, ExternalID: '', StatusCode: response.Status,
|
|
530
|
+
ErrorMessage: `${operation} failed for ${objectName}: HTTP ${response.Status} — ${bodyStr?.substring(0, 300)}`,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
// ─── HTTP Transport ────────────────────────────────────────────────
|
|
534
|
+
async MakeHTTPRequest(_auth, url, method, headers, body) {
|
|
535
|
+
await this.Throttle();
|
|
536
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
537
|
+
const response = await this.FetchWithTimeout(url, method, headers, body);
|
|
538
|
+
this.lastRequestTime = Date.now();
|
|
539
|
+
if (response.status === 429) {
|
|
540
|
+
const delay = Math.min(1000 * Math.pow(2, attempt) + Math.random() * 500, 60_000);
|
|
541
|
+
console.warn(`[NetSuite] Rate limited (429), backing off ${Math.round(delay)}ms`);
|
|
542
|
+
await this.Sleep(delay);
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
if (response.status >= 500 && attempt < MAX_RETRIES) {
|
|
546
|
+
const delay = Math.min(2000 * Math.pow(2, attempt), 60_000);
|
|
547
|
+
console.warn(`[NetSuite] Server error ${response.status}, retrying in ${delay}ms`);
|
|
548
|
+
await this.Sleep(delay);
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
const responseBody = await this.ParseBody(response);
|
|
552
|
+
return this.ToRESTResponse(response, responseBody);
|
|
553
|
+
}
|
|
554
|
+
throw new Error(`NetSuite request failed after ${MAX_RETRIES} retries: ${url}`);
|
|
555
|
+
}
|
|
556
|
+
async FetchWithTimeout(url, method, headers, body) {
|
|
557
|
+
const controller = new AbortController();
|
|
558
|
+
const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
559
|
+
try {
|
|
560
|
+
const opts = { method, headers, signal: controller.signal };
|
|
561
|
+
if (body && (method === 'POST' || method === 'PUT' || method === 'PATCH'))
|
|
562
|
+
opts.body = JSON.stringify(body);
|
|
563
|
+
return await fetch(url, opts);
|
|
564
|
+
}
|
|
565
|
+
catch (err) {
|
|
566
|
+
if (err instanceof Error && err.name === 'AbortError')
|
|
567
|
+
throw new Error(`NetSuite request timed out: ${url}`);
|
|
568
|
+
throw err;
|
|
569
|
+
}
|
|
570
|
+
finally {
|
|
571
|
+
clearTimeout(timeoutId);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
async ParseBody(response) {
|
|
575
|
+
const ct = response.headers.get('content-type') ?? '';
|
|
576
|
+
if (ct.includes('json'))
|
|
577
|
+
return response.json();
|
|
578
|
+
return response.text();
|
|
579
|
+
}
|
|
580
|
+
ToRESTResponse(response, body) {
|
|
581
|
+
const hdrs = {};
|
|
582
|
+
response.headers.forEach((v, k) => { hdrs[k.toLowerCase()] = v; });
|
|
583
|
+
return { Status: response.status, Body: body, Headers: hdrs };
|
|
584
|
+
}
|
|
585
|
+
async Throttle() {
|
|
586
|
+
const elapsed = Date.now() - this.lastRequestTime;
|
|
587
|
+
if (elapsed < MIN_REQUEST_INTERVAL_MS)
|
|
588
|
+
await this.Sleep(MIN_REQUEST_INTERVAL_MS - elapsed);
|
|
589
|
+
}
|
|
590
|
+
Sleep(ms) {
|
|
591
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
592
|
+
}
|
|
593
|
+
// ─── Default Field Mappings ────────────────────────────────────────
|
|
594
|
+
GetDefaultFieldMappings(objectName) {
|
|
595
|
+
// Dynamic — uses discovered fields from cache or returns PK-only default
|
|
596
|
+
return [{ SourceFieldName: 'id', DestinationFieldName: 'id', IsKeyField: true }];
|
|
597
|
+
}
|
|
598
|
+
};
|
|
599
|
+
NetSuiteConnector = __decorate([
|
|
600
|
+
RegisterClass(BaseIntegrationConnector, 'NetSuiteConnector')
|
|
601
|
+
], NetSuiteConnector);
|
|
602
|
+
export { NetSuiteConnector };
|
|
603
|
+
// Tree-shaking prevention — REQUIRED
|
|
604
|
+
export function LoadNetSuiteConnector() { }
|
|
605
|
+
//# sourceMappingURL=NetSuiteConnector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NetSuiteConnector.js","sourceRoot":"","sources":["../src/NetSuiteConnector.ts"],"names":[],"mappings":"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"}
|