twenty-migrate-close 1.0.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/.env.example +13 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +88 -0
- package/dist/cli.js.map +1 -0
- package/dist/extract.d.ts +49 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +207 -0
- package/dist/extract.js.map +1 -0
- package/dist/load.d.ts +50 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +280 -0
- package/dist/load.js.map +1 -0
- package/dist/reporter.d.ts +6 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +212 -0
- package/dist/reporter.js.map +1 -0
- package/dist/transform.d.ts +73 -0
- package/dist/transform.d.ts.map +1 -0
- package/dist/transform.js +176 -0
- package/dist/transform.js.map +1 -0
- package/package.json +49 -0
- package/src/cli.ts +119 -0
- package/src/extract.ts +286 -0
- package/src/load.ts +293 -0
- package/src/reporter.ts +203 -0
- package/src/transform.ts +284 -0
- package/tsconfig.json +39 -0
package/.env.example
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Close API Configuration
|
|
2
|
+
CLOSE_API_KEY=your_close_api_key_here
|
|
3
|
+
CLOSE_API_URL=https://api.close.com/api/v1
|
|
4
|
+
|
|
5
|
+
# Twenty CRM Configuration
|
|
6
|
+
TWENTY_URL=http://localhost:3000
|
|
7
|
+
TWENTY_API_KEY=your_twenty_api_key_here
|
|
8
|
+
|
|
9
|
+
# Migration Settings
|
|
10
|
+
BATCH_SIZE=60
|
|
11
|
+
RATE_LIMIT_DELAY=600
|
|
12
|
+
DRY_RUN=false
|
|
13
|
+
OBJECTS=leads,opportunities,notes,tasks
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const extract_1 = require("./extract");
|
|
6
|
+
const transform_1 = require("./transform");
|
|
7
|
+
const load_1 = require("./load");
|
|
8
|
+
const reporter_1 = require("./reporter");
|
|
9
|
+
const program = new commander_1.Command();
|
|
10
|
+
program
|
|
11
|
+
.name('twenty-migrate-close')
|
|
12
|
+
.description('CLI migration tool for Close to Twenty CRM')
|
|
13
|
+
.version('1.0.0');
|
|
14
|
+
program
|
|
15
|
+
.requiredOption('-k, --api-key <key>', 'Close API key')
|
|
16
|
+
.requiredOption('-u, --twenty-url <url>', 'Twenty CRM URL')
|
|
17
|
+
.requiredOption('-t, --twenty-key <key>', 'Twenty CRM API key')
|
|
18
|
+
.option('-d, --dry-run', 'Preview migration without writing data', false)
|
|
19
|
+
.option('-o, --objects <objects>', 'Objects to migrate (comma-separated)', 'leads,opportunities,notes,tasks')
|
|
20
|
+
.option('-b, --batch <number>', 'Batch size for API calls', '60')
|
|
21
|
+
.parse();
|
|
22
|
+
const options = program.opts();
|
|
23
|
+
async function main() {
|
|
24
|
+
try {
|
|
25
|
+
console.log('๐ Close to Twenty CRM Migration Tool');
|
|
26
|
+
console.log(`๐ Close API Key: ${options.apiKey ? 'โ
Configured' : 'โ Missing'}`);
|
|
27
|
+
console.log(`๐ฏ Twenty CRM: ${options.twentyUrl}`);
|
|
28
|
+
console.log(`๐ Twenty API: ${options.twentyKey ? 'โ
Configured' : 'โ Missing'}`);
|
|
29
|
+
console.log(`๐งช Dry Run: ${options.dryRun ? 'YES' : 'NO'}`);
|
|
30
|
+
console.log(`๐ฆ Objects: ${options.objects}`);
|
|
31
|
+
// Parse objects
|
|
32
|
+
const objects = options.objects.split(',').map(obj => obj.trim().toLowerCase());
|
|
33
|
+
// Validate objects
|
|
34
|
+
const validObjects = ['leads', 'opportunities', 'notes', 'tasks'];
|
|
35
|
+
const invalidObjects = objects.filter(obj => !validObjects.includes(obj));
|
|
36
|
+
if (invalidObjects.length > 0) {
|
|
37
|
+
console.error(`โ Invalid objects: ${invalidObjects.join(', ')}`);
|
|
38
|
+
console.error(`Valid objects: ${validObjects.join(', ')}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
console.log('\n๐ Starting migration...');
|
|
42
|
+
const progressBar = (0, reporter_1.showProgress)(0);
|
|
43
|
+
// Extract data from Close
|
|
44
|
+
console.log('\n๐ฅ Extracting data from Close...');
|
|
45
|
+
const closeData = await (0, extract_1.extractFromClose)(options.apiKey, objects, progressBar);
|
|
46
|
+
console.log(`โ
Extracted ${Object.keys(closeData).length} object types from Close`);
|
|
47
|
+
// Show summary for dry run
|
|
48
|
+
if (options.dryRun) {
|
|
49
|
+
console.log('\n๐ DRY RUN - Migration Summary:');
|
|
50
|
+
Object.entries(closeData).forEach(([objectType, data]) => {
|
|
51
|
+
console.log(`๐ ${objectType}: ${data.length} records`);
|
|
52
|
+
});
|
|
53
|
+
console.log('\n๐ Total records to migrate:');
|
|
54
|
+
const totalRecords = Object.values(closeData).reduce((sum, data) => sum + data.length, 0);
|
|
55
|
+
console.log(`๐ Total: ${totalRecords} records`);
|
|
56
|
+
progressBar.stop();
|
|
57
|
+
console.log('\nโ
Dry run completed. Use --dry-run=false to execute migration.');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Transform data
|
|
61
|
+
console.log('\n๐ Transforming data for Twenty CRM...');
|
|
62
|
+
const transformedData = await (0, transform_1.transformData)(closeData);
|
|
63
|
+
console.log(`โ
Transformed ${Object.keys(transformedData).length} object types`);
|
|
64
|
+
// Load data to Twenty CRM
|
|
65
|
+
console.log('\n๐ค Loading data to Twenty CRM...');
|
|
66
|
+
const batchSize = parseInt(options.batch?.toString() || '60');
|
|
67
|
+
const result = await (0, load_1.loadToTwenty)(transformedData, options.twentyUrl, options.twentyKey, batchSize, progressBar);
|
|
68
|
+
progressBar.stop();
|
|
69
|
+
// Generate report
|
|
70
|
+
await (0, reporter_1.generateMigrationReport)(result, options.objects);
|
|
71
|
+
console.log('\nโ
Migration completed!');
|
|
72
|
+
console.log(`๐ Success: ${result.success}`);
|
|
73
|
+
console.log(`โ Errors: ${result.errors}`);
|
|
74
|
+
if (result.errors > 0) {
|
|
75
|
+
console.log(`๐ Error log: migration-errors-${Date.now()}.log`);
|
|
76
|
+
console.log('\n๐ Error details:');
|
|
77
|
+
result.errorLog.forEach(error => {
|
|
78
|
+
console.log(` โ ${error}`);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error('โ Migration failed:', error.message);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
main();
|
|
88
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,uCAA6C;AAC7C,2CAA4C;AAC5C,iCAAsC;AACtC,yCAAmE;AAanE,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,sBAAsB,CAAC;KAC5B,WAAW,CAAC,4CAA4C,CAAC;KACzD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,cAAc,CAAC,qBAAqB,EAAE,eAAe,CAAC;KACtD,cAAc,CAAC,wBAAwB,EAAE,gBAAgB,CAAC;KAC1D,cAAc,CAAC,wBAAwB,EAAE,oBAAoB,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,wCAAwC,EAAE,KAAK,CAAC;KACxE,MAAM,CAAC,yBAAyB,EAAE,sCAAsC,EAAE,iCAAiC,CAAC;KAC5G,MAAM,CAAC,sBAAsB,EAAE,0BAA0B,EAAE,IAAI,CAAC;KAChE,KAAK,EAAE,CAAC;AAEX,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAa,CAAC;AAE1C,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAE9C,gBAAgB;QAChB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAEhF,mBAAmB;QACnB,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1E,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,sBAAsB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,kBAAkB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAA,uBAAY,EAAC,CAAC,CAAC,CAAC;QAEpC,0BAA0B;QAC1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,MAAM,IAAA,0BAAgB,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAE/E,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,0BAA0B,CAAC,CAAC;QAEpF,2BAA2B;QAC3B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;gBACvD,OAAO,CAAC,GAAG,CAAC,MAAM,UAAU,KAAK,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,aAAa,YAAY,UAAU,CAAC,CAAC;YAEjD,WAAW,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,MAAM,IAAA,yBAAa,EAAC,SAAS,CAAC,CAAC;QAEvD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC;QAEjF,0BAA0B;QAC1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAY,EAAC,eAAe,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAEjH,WAAW,CAAC,IAAI,EAAE,CAAC;QAEnB,kBAAkB;QAClB,MAAM,IAAA,kCAAuB,EAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAEvD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAE1C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;IAEH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { SingleBar } from 'cli-progress';
|
|
2
|
+
export interface CloseLead {
|
|
3
|
+
id: string;
|
|
4
|
+
display_name?: string;
|
|
5
|
+
first_name?: string;
|
|
6
|
+
last_name?: string;
|
|
7
|
+
email?: string;
|
|
8
|
+
phone?: string;
|
|
9
|
+
company_name?: string;
|
|
10
|
+
title?: string;
|
|
11
|
+
status_label?: string;
|
|
12
|
+
date_created?: string;
|
|
13
|
+
date_updated?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface CloseOpportunity {
|
|
16
|
+
id: string;
|
|
17
|
+
lead_id?: string;
|
|
18
|
+
status_label?: string;
|
|
19
|
+
value?: number;
|
|
20
|
+
currency?: string;
|
|
21
|
+
confidence?: number;
|
|
22
|
+
date_created?: string;
|
|
23
|
+
date_updated?: string;
|
|
24
|
+
expected_close_date?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface CloseNote {
|
|
27
|
+
id: string;
|
|
28
|
+
lead_id?: string;
|
|
29
|
+
note?: string;
|
|
30
|
+
date_created?: string;
|
|
31
|
+
date_updated?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface CloseTask {
|
|
34
|
+
id: string;
|
|
35
|
+
lead_id?: string;
|
|
36
|
+
text?: string;
|
|
37
|
+
status?: string;
|
|
38
|
+
due_date?: string;
|
|
39
|
+
date_created?: string;
|
|
40
|
+
date_updated?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface CloseData {
|
|
43
|
+
leads: CloseLead[];
|
|
44
|
+
opportunities: CloseOpportunity[];
|
|
45
|
+
notes: CloseNote[];
|
|
46
|
+
tasks: CloseTask[];
|
|
47
|
+
}
|
|
48
|
+
export declare function extractFromClose(apiKey: string, objects: string[], progressBar: SingleBar): Promise<Partial<CloseData>>;
|
|
49
|
+
//# sourceMappingURL=extract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAID,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,SAAS,GACrB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CA0C7B"}
|
package/dist/extract.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.extractFromClose = extractFromClose;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const RATE_LIMIT_DELAY = 600; // 600ms between requests (100 req/min)
|
|
9
|
+
async function extractFromClose(apiKey, objects, progressBar) {
|
|
10
|
+
const client = createCloseClient(apiKey);
|
|
11
|
+
const data = {};
|
|
12
|
+
console.log('๐ Testing Close API connection...');
|
|
13
|
+
try {
|
|
14
|
+
// Test connection
|
|
15
|
+
await testCloseConnection(client);
|
|
16
|
+
console.log('โ
Close API connection successful');
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
console.error('โ Close API connection failed:', error.message);
|
|
20
|
+
throw new Error('Failed to connect to Close API. Check API key and permissions.');
|
|
21
|
+
}
|
|
22
|
+
for (const objectType of objects) {
|
|
23
|
+
console.log(`\n๐ฅ Extracting ${objectType}...`);
|
|
24
|
+
try {
|
|
25
|
+
switch (objectType) {
|
|
26
|
+
case 'leads':
|
|
27
|
+
data.leads = await extractLeads(client, progressBar);
|
|
28
|
+
break;
|
|
29
|
+
case 'opportunities':
|
|
30
|
+
data.opportunities = await extractOpportunities(client, progressBar);
|
|
31
|
+
break;
|
|
32
|
+
case 'notes':
|
|
33
|
+
data.notes = await extractNotes(client, progressBar);
|
|
34
|
+
break;
|
|
35
|
+
case 'tasks':
|
|
36
|
+
data.tasks = await extractTasks(client, progressBar);
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
console.warn(`โ ๏ธ Unknown object type: ${objectType}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error(`โ Failed to extract ${objectType}:`, error.message);
|
|
44
|
+
data[objectType] = [];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
function createCloseClient(apiKey) {
|
|
50
|
+
return axios_1.default.create({
|
|
51
|
+
baseURL: 'https://api.close.com/api/v1',
|
|
52
|
+
headers: {
|
|
53
|
+
'Authorization': `Basic ${Buffer.from(apiKey + ':').toString('base64')}`,
|
|
54
|
+
'Content-Type': 'application/json'
|
|
55
|
+
},
|
|
56
|
+
timeout: 30000
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async function testCloseConnection(client) {
|
|
60
|
+
try {
|
|
61
|
+
await client.get('/user/me');
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new Error(`Close API test failed: ${error.message}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function extractLeads(client, progressBar) {
|
|
68
|
+
const leads = [];
|
|
69
|
+
let page = 1;
|
|
70
|
+
const pageSize = 200;
|
|
71
|
+
while (true) {
|
|
72
|
+
try {
|
|
73
|
+
const response = await client.get('/lead', {
|
|
74
|
+
params: {
|
|
75
|
+
_page: page,
|
|
76
|
+
_limit: pageSize
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
if (response.data && response.data.data && response.data.data.length > 0) {
|
|
80
|
+
leads.push(...response.data.data);
|
|
81
|
+
progressBar.update(leads.length, { leads: leads.length });
|
|
82
|
+
// Check if there are more records
|
|
83
|
+
if (response.data.data.length < pageSize) {
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
page++;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
// Rate limiting
|
|
92
|
+
await new Promise(resolve => setTimeout(resolve, RATE_LIMIT_DELAY));
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error(`โ Error fetching leads page:`, error.message);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
console.log(`โ
Extracted ${leads.length} leads`);
|
|
100
|
+
return leads;
|
|
101
|
+
}
|
|
102
|
+
async function extractOpportunities(client, progressBar) {
|
|
103
|
+
const opportunities = [];
|
|
104
|
+
let page = 1;
|
|
105
|
+
const pageSize = 200;
|
|
106
|
+
while (true) {
|
|
107
|
+
try {
|
|
108
|
+
const response = await client.get('/opportunity', {
|
|
109
|
+
params: {
|
|
110
|
+
_page: page,
|
|
111
|
+
_limit: pageSize
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
if (response.data && response.data.data && response.data.data.length > 0) {
|
|
115
|
+
opportunities.push(...response.data.data);
|
|
116
|
+
progressBar.update(opportunities.length, { opportunities: opportunities.length });
|
|
117
|
+
// Check if there are more records
|
|
118
|
+
if (response.data.data.length < pageSize) {
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
page++;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
// Rate limiting
|
|
127
|
+
await new Promise(resolve => setTimeout(resolve, RATE_LIMIT_DELAY));
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.error(`โ Error fetching opportunities page:`, error.message);
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
console.log(`โ
Extracted ${opportunities.length} opportunities`);
|
|
135
|
+
return opportunities;
|
|
136
|
+
}
|
|
137
|
+
async function extractNotes(client, progressBar) {
|
|
138
|
+
const notes = [];
|
|
139
|
+
let page = 1;
|
|
140
|
+
const pageSize = 200;
|
|
141
|
+
while (true) {
|
|
142
|
+
try {
|
|
143
|
+
const response = await client.get('/note', {
|
|
144
|
+
params: {
|
|
145
|
+
_page: page,
|
|
146
|
+
_limit: pageSize
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
if (response.data && response.data.data && response.data.data.length > 0) {
|
|
150
|
+
notes.push(...response.data.data);
|
|
151
|
+
progressBar.update(notes.length, { notes: notes.length });
|
|
152
|
+
// Check if there are more records
|
|
153
|
+
if (response.data.data.length < pageSize) {
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
page++;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
// Rate limiting
|
|
162
|
+
await new Promise(resolve => setTimeout(resolve, RATE_LIMIT_DELAY));
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
console.error(`โ Error fetching notes page:`, error.message);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
console.log(`โ
Extracted ${notes.length} notes`);
|
|
170
|
+
return notes;
|
|
171
|
+
}
|
|
172
|
+
async function extractTasks(client, progressBar) {
|
|
173
|
+
const tasks = [];
|
|
174
|
+
let page = 1;
|
|
175
|
+
const pageSize = 200;
|
|
176
|
+
while (true) {
|
|
177
|
+
try {
|
|
178
|
+
const response = await client.get('/task', {
|
|
179
|
+
params: {
|
|
180
|
+
_page: page,
|
|
181
|
+
_limit: pageSize
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
if (response.data && response.data.data && response.data.data.length > 0) {
|
|
185
|
+
tasks.push(...response.data.data);
|
|
186
|
+
progressBar.update(tasks.length, { tasks: tasks.length });
|
|
187
|
+
// Check if there are more records
|
|
188
|
+
if (response.data.data.length < pageSize) {
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
page++;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
// Rate limiting
|
|
197
|
+
await new Promise(resolve => setTimeout(resolve, RATE_LIMIT_DELAY));
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
console.error(`โ Error fetching tasks page:`, error.message);
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
console.log(`โ
Extracted ${tasks.length} tasks`);
|
|
205
|
+
return tasks;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/load.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { TransformedData } from './transform';
|
|
2
|
+
import { SingleBar } from 'cli-progress';
|
|
3
|
+
export interface LoadResult {
|
|
4
|
+
success: number;
|
|
5
|
+
errors: number;
|
|
6
|
+
errorLog: string[];
|
|
7
|
+
objectResults: {
|
|
8
|
+
people: {
|
|
9
|
+
success: number;
|
|
10
|
+
errors: number;
|
|
11
|
+
};
|
|
12
|
+
companies: {
|
|
13
|
+
success: number;
|
|
14
|
+
errors: number;
|
|
15
|
+
};
|
|
16
|
+
opportunities: {
|
|
17
|
+
success: number;
|
|
18
|
+
errors: number;
|
|
19
|
+
};
|
|
20
|
+
notes: {
|
|
21
|
+
success: number;
|
|
22
|
+
errors: number;
|
|
23
|
+
};
|
|
24
|
+
activities: {
|
|
25
|
+
success: number;
|
|
26
|
+
errors: number;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface BatchResult {
|
|
31
|
+
success: boolean;
|
|
32
|
+
count: number;
|
|
33
|
+
error?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare class TwentyAPIClient {
|
|
36
|
+
private client;
|
|
37
|
+
private baseUrl;
|
|
38
|
+
private apiKey;
|
|
39
|
+
private existingEmails;
|
|
40
|
+
private existingCompanies;
|
|
41
|
+
constructor(baseUrl: string, apiKey: string);
|
|
42
|
+
testConnection(): Promise<boolean>;
|
|
43
|
+
loadExistingData(): Promise<void>;
|
|
44
|
+
createRecords(objectType: string, records: any[]): Promise<BatchResult>;
|
|
45
|
+
private filterDuplicates;
|
|
46
|
+
private transformRecordForAPI;
|
|
47
|
+
}
|
|
48
|
+
export declare function loadToTwenty(data: TransformedData, twentyUrl: string, twentyKey: string, batchSize: number, progressBar: SingleBar): Promise<LoadResult>;
|
|
49
|
+
export declare function saveMigrationReport(result: LoadResult, filename: string): void;
|
|
50
|
+
//# sourceMappingURL=load.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAA8E,MAAM,aAAa,CAAC;AAC1H,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE;QACb,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5C,SAAS,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/C,aAAa,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QACnD,KAAK,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3C,UAAU,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KACjD,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,iBAAiB,CAA0B;gBAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAcrC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAUlC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BjC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;YA2B/D,gBAAgB;IAa9B,OAAO,CAAC,qBAAqB;CA6D9B;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,eAAe,EACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,SAAS,GACrB,OAAO,CAAC,UAAU,CAAC,CAiFrB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAe9E"}
|