twenty-migrate-copper 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/dist/load.js ADDED
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.TwentyAPIClient = void 0;
40
+ exports.loadToTwenty = loadToTwenty;
41
+ exports.saveMigrationReport = saveMigrationReport;
42
+ const axios_1 = __importDefault(require("axios"));
43
+ const fs = __importStar(require("fs"));
44
+ class TwentyAPIClient {
45
+ constructor(baseUrl, apiKey) {
46
+ this.existingEmails = new Set();
47
+ this.existingCompanies = new Set();
48
+ this.baseUrl = baseUrl.replace(/\/$/, '');
49
+ this.apiKey = apiKey;
50
+ this.client = axios_1.default.create({
51
+ baseURL: `${this.baseUrl}`,
52
+ headers: {
53
+ 'Authorization': `Bearer ${this.apiKey}`,
54
+ 'Content-Type': 'application/json'
55
+ },
56
+ timeout: 30000
57
+ });
58
+ }
59
+ async testConnection() {
60
+ try {
61
+ const response = await this.client.get('/api/ping');
62
+ return response.status === 200;
63
+ }
64
+ catch (error) {
65
+ console.error('❌ Connection test failed:', error.response?.data || error.message);
66
+ return false;
67
+ }
68
+ }
69
+ async loadExistingData() {
70
+ console.log('🔍 Loading existing data to prevent duplicates...');
71
+ try {
72
+ // Load existing emails
73
+ const peopleResponse = await this.client.get('/api/people');
74
+ if (peopleResponse.data && Array.isArray(peopleResponse.data)) {
75
+ peopleResponse.data.forEach((person) => {
76
+ if (person.email) {
77
+ this.existingEmails.add(person.email.toLowerCase());
78
+ }
79
+ });
80
+ }
81
+ // Load existing companies
82
+ const companiesResponse = await this.client.get('/api/companies');
83
+ if (companiesResponse.data && Array.isArray(companiesResponse.data)) {
84
+ companiesResponse.data.forEach((company) => {
85
+ if (company.name) {
86
+ this.existingCompanies.add(company.name.toLowerCase());
87
+ }
88
+ });
89
+ }
90
+ console.log(`✅ Loaded ${this.existingEmails.size} existing emails and ${this.existingCompanies.size} existing companies`);
91
+ }
92
+ catch (error) {
93
+ console.warn('⚠️ Could not load existing data, proceeding without duplicate checking:', error.message);
94
+ }
95
+ }
96
+ async createRecords(objectType, records) {
97
+ try {
98
+ // Filter out duplicates
99
+ const filteredRecords = await this.filterDuplicates(objectType, records);
100
+ if (filteredRecords.length === 0) {
101
+ return { success: true, count: 0, error: 'All records were duplicates' };
102
+ }
103
+ // Transform records for Twenty CRM API
104
+ const transformedRecords = records.map(record => this.transformRecordForAPI(objectType, record));
105
+ const response = await this.client.post(`/api/${objectType}`, transformedRecords);
106
+ return {
107
+ success: true,
108
+ count: filteredRecords.length
109
+ };
110
+ }
111
+ catch (error) {
112
+ return {
113
+ success: false,
114
+ count: 0,
115
+ error: error.response?.data?.message || error.message
116
+ };
117
+ }
118
+ }
119
+ async filterDuplicates(objectType, records) {
120
+ return records.filter(record => {
121
+ switch (objectType) {
122
+ case 'people':
123
+ return record.email && !this.existingEmails.has(record.email.toLowerCase());
124
+ case 'companies':
125
+ return record.name && !this.existingCompanies.has(record.name.toLowerCase());
126
+ default:
127
+ return true; // No duplicate checking for other objects
128
+ }
129
+ });
130
+ }
131
+ transformRecordForAPI(objectType, record) {
132
+ switch (objectType) {
133
+ case 'people':
134
+ return {
135
+ name: record.name,
136
+ email: record.email,
137
+ phone: record.phone,
138
+ jobTitle: record.jobTitle,
139
+ company: record.company,
140
+ city: record.city,
141
+ country: record.country,
142
+ source: record.source,
143
+ copperId: record.copperId
144
+ };
145
+ case 'companies':
146
+ return {
147
+ name: record.name,
148
+ domainName: record.domainName,
149
+ industry: record.industry,
150
+ description: record.description,
151
+ phone: record.phone,
152
+ website: record.website,
153
+ source: record.source,
154
+ copperId: record.copperId
155
+ };
156
+ case 'opportunities':
157
+ return {
158
+ name: record.name,
159
+ amount: record.amount,
160
+ closeDate: record.closeDate,
161
+ pipeline: record.pipeline,
162
+ stage: record.stage,
163
+ source: record.source,
164
+ copperId: record.copperId,
165
+ personId: record.personId,
166
+ companyId: record.companyId
167
+ };
168
+ case 'activities':
169
+ return {
170
+ subject: record.subject,
171
+ note: record.note,
172
+ type: record.type,
173
+ source: record.source,
174
+ copperId: record.copperId,
175
+ personId: record.personId,
176
+ companyId: record.companyId,
177
+ opportunityId: record.opportunityId
178
+ };
179
+ default:
180
+ return record;
181
+ }
182
+ }
183
+ }
184
+ exports.TwentyAPIClient = TwentyAPIClient;
185
+ async function loadToTwenty(data, twentyUrl, twentyKey, batchSize, progressBar) {
186
+ const client = new TwentyAPIClient(twentyUrl, twentyKey);
187
+ const errorLog = [];
188
+ const objectResults = {
189
+ people: { success: 0, errors: 0 },
190
+ companies: { success: 0, errors: 0 },
191
+ opportunities: { success: 0, errors: 0 },
192
+ activities: { success: 0, errors: 0 }
193
+ };
194
+ // Test connection first
195
+ console.log('🔗 Testing Twenty CRM connection...');
196
+ const isConnected = await client.testConnection();
197
+ if (!isConnected) {
198
+ throw new Error('Failed to connect to Twenty CRM. Check URL and API key.');
199
+ }
200
+ console.log('✅ Connection successful');
201
+ // Load existing data for duplicate checking
202
+ await client.loadExistingData();
203
+ console.log(`📤 Loading data to Twenty CRM...`);
204
+ // Process each object type
205
+ const objectTypes = ['people', 'companies', 'opportunities', 'activities'];
206
+ for (const objectType of objectTypes) {
207
+ const records = data[objectType];
208
+ if (!records || records.length === 0) {
209
+ console.log(`⏭️ Skipping ${objectType} - no records`);
210
+ continue;
211
+ }
212
+ console.log(`\n📤 Processing ${objectType} (${records.length} records)...`);
213
+ // Process in batches
214
+ for (let i = 0; i < records.length; i += batchSize) {
215
+ const batch = records.slice(i, i + batchSize);
216
+ const batchNumber = Math.floor(i / batchSize) + 1;
217
+ const totalBatches = Math.ceil(records.length / batchSize);
218
+ try {
219
+ progressBar.update((i / records.length) * 100, {
220
+ batch: `${batchNumber}/${totalBatches}`,
221
+ records: `${i + 1}-${Math.min(i + batchSize, records.length)}`,
222
+ type: objectType
223
+ });
224
+ const batchResult = await client.createRecords(objectType, batch);
225
+ if (batchResult.success) {
226
+ objectResults[objectType].success += batchResult.count;
227
+ console.log(`✅ Batch ${batchNumber} (${objectType}): ${batchResult.count} records imported`);
228
+ }
229
+ else {
230
+ objectResults[objectType].errors += batch.length;
231
+ const errorMsg = `Batch ${batchNumber} (${objectType}): ${batchResult.error}`;
232
+ errorLog.push(errorMsg);
233
+ console.error(`❌ ${errorMsg}`);
234
+ }
235
+ }
236
+ catch (error) {
237
+ objectResults[objectType].errors += batch.length;
238
+ const errorMsg = `Batch ${batchNumber} (${objectType}): ${error.message}`;
239
+ errorLog.push(errorMsg);
240
+ console.error(`❌ ${errorMsg}`);
241
+ }
242
+ // Rate limiting - 100 requests per minute = 600ms between requests
243
+ await new Promise(resolve => setTimeout(resolve, 600));
244
+ }
245
+ }
246
+ const totalSuccess = Object.values(objectResults).reduce((sum, result) => sum + result.success, 0);
247
+ const totalErrors = Object.values(objectResults).reduce((sum, result) => sum + result.errors, 0);
248
+ return {
249
+ success: totalSuccess,
250
+ errors: totalErrors,
251
+ errorLog,
252
+ objectResults
253
+ };
254
+ }
255
+ function saveMigrationReport(result, filename) {
256
+ const report = {
257
+ timestamp: new Date().toISOString(),
258
+ summary: {
259
+ total: result.success + result.errors,
260
+ success: result.success,
261
+ errors: result.errors,
262
+ successRate: result.success + result.errors > 0 ? ((result.success / (result.success + result.errors)) * 100).toFixed(2) + '%' : '0%'
263
+ },
264
+ objectResults: result.objectResults,
265
+ errorLog: result.errorLog
266
+ };
267
+ fs.writeFileSync(filename, JSON.stringify(report, null, 2), 'utf8');
268
+ console.log(`📄 Migration report saved to ${filename}`);
269
+ }
270
+ //# sourceMappingURL=load.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../src/load.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { SingleBar } from 'cli-progress';
2
+ import { LoadResult } from './load';
3
+ export declare function showProgress(total: number): SingleBar;
4
+ export declare function generateMigrationReport(result: LoadResult, objects: string): Promise<void>;
5
+ export declare function saveErrorLog(errorLog: string[], filename: string): void;
6
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAW,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAerD;AAED,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0FhG;AA8ED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMvE"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.showProgress = showProgress;
37
+ exports.generateMigrationReport = generateMigrationReport;
38
+ exports.saveErrorLog = saveErrorLog;
39
+ const cli_progress_1 = require("cli-progress");
40
+ const fs = __importStar(require("fs"));
41
+ function showProgress(total) {
42
+ const progressBar = new cli_progress_1.SingleBar({
43
+ format: '📤 Migration |{bar}| {percentage}% | {value}/{total} | {type} | Batch: {batch}',
44
+ barCompleteChar: '\u2588',
45
+ barIncompleteChar: '\u2591',
46
+ hideCursor: true
47
+ }, cli_progress_1.Presets.shades_classic);
48
+ progressBar.start(total, 0, {
49
+ batch: '0/0',
50
+ records: '0-0',
51
+ type: 'initializing'
52
+ });
53
+ return progressBar;
54
+ }
55
+ async function generateMigrationReport(result, objects) {
56
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
57
+ const reportFilename = `migration-report-${timestamp}.json`;
58
+ const errorLogFilename = `migration-errors-${timestamp}.log`;
59
+ // Generate detailed report
60
+ const report = {
61
+ timestamp: new Date().toISOString(),
62
+ migration: {
63
+ tool: 'twenty-migrate-copper',
64
+ version: '1.0.0',
65
+ objects: objects.split(',').map(obj => obj.trim()),
66
+ dryRun: false
67
+ },
68
+ summary: {
69
+ total: result.success + result.errors,
70
+ success: result.success,
71
+ errors: result.errors,
72
+ successRate: result.success + result.errors > 0 ? ((result.success / (result.success + result.errors)) * 100).toFixed(2) + '%' : '0%'
73
+ },
74
+ objectResults: {
75
+ people: {
76
+ attempted: result.objectResults.people.success + result.objectResults.people.errors,
77
+ success: result.objectResults.people.success,
78
+ errors: result.objectResults.people.errors,
79
+ successRate: result.objectResults.people.success + result.objectResults.people.errors > 0 ?
80
+ ((result.objectResults.people.success / (result.objectResults.people.success + result.objectResults.people.errors)) * 100).toFixed(2) + '%' : '0%'
81
+ },
82
+ companies: {
83
+ attempted: result.objectResults.companies.success + result.objectResults.companies.errors,
84
+ success: result.objectResults.companies.success,
85
+ errors: result.objectResults.companies.errors,
86
+ successRate: result.objectResults.companies.success + result.objectResults.companies.errors > 0 ?
87
+ ((result.objectResults.companies.success / (result.objectResults.companies.success + result.objectResults.companies.errors)) * 100).toFixed(2) + '%' : '0%'
88
+ },
89
+ opportunities: {
90
+ attempted: result.objectResults.opportunities.success + result.objectResults.opportunities.errors,
91
+ success: result.objectResults.opportunities.success,
92
+ errors: result.objectResults.opportunities.errors,
93
+ successRate: result.objectResults.opportunities.success + result.objectResults.opportunities.errors > 0 ?
94
+ ((result.objectResults.opportunities.success / (result.objectResults.opportunities.success + result.objectResults.opportunities.errors)) * 100).toFixed(2) + '%' : '0%'
95
+ },
96
+ activities: {
97
+ attempted: result.objectResults.activities.success + result.objectResults.activities.errors,
98
+ success: result.objectResults.activities.success,
99
+ errors: result.objectResults.activities.errors,
100
+ successRate: result.objectResults.activities.success + result.objectResults.activities.errors > 0 ?
101
+ ((result.objectResults.activities.success / (result.objectResults.activities.success + result.objectResults.activities.errors)) * 100).toFixed(2) + '%' : '0%'
102
+ }
103
+ },
104
+ errors: result.errorLog,
105
+ recommendations: generateRecommendations(result)
106
+ };
107
+ // Save JSON report
108
+ fs.writeFileSync(reportFilename, JSON.stringify(report, null, 2), 'utf8');
109
+ console.log(`📄 Migration report saved to ${reportFilename}`);
110
+ // Save error log if there are errors
111
+ if (result.errorLog.length > 0) {
112
+ fs.writeFileSync(errorLogFilename, result.errorLog.join('\n'), 'utf8');
113
+ console.log(`📄 Error log saved to ${errorLogFilename}`);
114
+ }
115
+ // Display summary
116
+ console.log('\n📊 Migration Summary:');
117
+ console.log(`📈 Total Records: ${report.summary.total}`);
118
+ console.log(`✅ Successful: ${report.summary.success}`);
119
+ console.log(`❌ Errors: ${report.summary.errors}`);
120
+ console.log(`📊 Success Rate: ${report.summary.successRate}`);
121
+ console.log('\n📋 Object Breakdown:');
122
+ Object.entries(report.objectResults).forEach(([objectType, results]) => {
123
+ if (results.attempted > 0) {
124
+ console.log(`👤 ${objectType}: ${results.success}/${results.attempted} (${results.successRate})`);
125
+ }
126
+ });
127
+ if (result.errorLog.length > 0) {
128
+ console.log(`\n❌ Errors encountered: ${result.errorLog.length}`);
129
+ console.log(`📄 See ${errorLogFilename} for details`);
130
+ }
131
+ // Display recommendations
132
+ if (report.recommendations.length > 0) {
133
+ console.log('\n💡 Recommendations:');
134
+ report.recommendations.forEach((rec, index) => {
135
+ console.log(`${index + 1}. ${rec}`);
136
+ });
137
+ }
138
+ }
139
+ function generateRecommendations(result) {
140
+ const recommendations = [];
141
+ // Overall success rate recommendations
142
+ const totalSuccessRate = result.success + result.errors > 0 ?
143
+ (result.success / (result.success + result.errors)) * 100 : 0;
144
+ if (totalSuccessRate < 90) {
145
+ recommendations.push('Consider reviewing data quality and formatting before migration');
146
+ }
147
+ if (totalSuccessRate < 75) {
148
+ recommendations.push('Run migration in dry-run mode first to identify potential issues');
149
+ }
150
+ // Object-specific recommendations
151
+ Object.entries(result.objectResults).forEach(([objectType, results]) => {
152
+ const successRate = results.success + results.errors > 0 ?
153
+ (results.success / (results.success + results.errors)) * 100 : 0;
154
+ if (successRate < 80) {
155
+ recommendations.push(`Review ${objectType} data mapping - ${results.errors} records failed`);
156
+ }
157
+ if (results.errors > 0 && successRate < 50) {
158
+ recommendations.push(`Consider manual review of ${objectType} data before retrying`);
159
+ }
160
+ });
161
+ // Error pattern recommendations
162
+ const errorPatterns = analyzeErrorPatterns(result.errorLog);
163
+ if (errorPatterns.duplicateErrors > 0) {
164
+ recommendations.push('Consider running with duplicate detection disabled if duplicates are expected');
165
+ }
166
+ if (errorPatterns.rateLimitErrors > 0) {
167
+ recommendations.push('Increase rate limit delay in configuration');
168
+ }
169
+ if (errorPatterns.validationErrors > 0) {
170
+ recommendations.push('Review data validation rules and field requirements');
171
+ }
172
+ return recommendations;
173
+ }
174
+ function analyzeErrorPatterns(errorLog) {
175
+ const patterns = {
176
+ duplicateErrors: 0,
177
+ rateLimitErrors: 0,
178
+ validationErrors: 0,
179
+ otherErrors: 0
180
+ };
181
+ errorLog.forEach(error => {
182
+ const errorLower = error.toLowerCase();
183
+ if (errorLower.includes('duplicate') || errorLower.includes('already exists')) {
184
+ patterns.duplicateErrors++;
185
+ }
186
+ else if (errorLower.includes('rate limit') || errorLower.includes('too many requests')) {
187
+ patterns.rateLimitErrors++;
188
+ }
189
+ else if (errorLower.includes('validation') || errorLower.includes('required') || errorLower.includes('invalid')) {
190
+ patterns.validationErrors++;
191
+ }
192
+ else {
193
+ patterns.otherErrors++;
194
+ }
195
+ });
196
+ return patterns;
197
+ }
198
+ function saveErrorLog(errorLog, filename) {
199
+ if (errorLog.length === 0)
200
+ return;
201
+ const logContent = errorLog.join('\n');
202
+ fs.writeFileSync(filename, logContent, 'utf8');
203
+ console.log(`📄 Error log saved to ${filename}`);
204
+ }
205
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { CopperData } from './extract';
2
+ export interface TwentyPerson {
3
+ name?: {
4
+ firstName?: string;
5
+ lastName?: string;
6
+ };
7
+ email?: string;
8
+ phone?: string;
9
+ jobTitle?: string;
10
+ company?: string;
11
+ city?: string;
12
+ country?: string;
13
+ createdAt?: string;
14
+ updatedAt?: string;
15
+ source?: 'copper';
16
+ copperId?: number;
17
+ }
18
+ export interface TwentyCompany {
19
+ name?: string;
20
+ domainName?: string;
21
+ industry?: string;
22
+ description?: string;
23
+ phone?: string;
24
+ website?: string;
25
+ createdAt?: string;
26
+ updatedAt?: string;
27
+ source?: 'copper';
28
+ copperId?: number;
29
+ }
30
+ export interface TwentyOpportunity {
31
+ name?: string;
32
+ amount?: number;
33
+ closeDate?: string;
34
+ pipeline?: string;
35
+ stage?: string;
36
+ createdAt?: string;
37
+ updatedAt?: string;
38
+ source?: 'copper';
39
+ copperId?: number;
40
+ personId?: string;
41
+ companyId?: string;
42
+ }
43
+ export interface TwentyActivity {
44
+ subject?: string;
45
+ note?: string;
46
+ type?: string;
47
+ createdAt?: string;
48
+ updatedAt?: string;
49
+ source?: 'copper';
50
+ copperId?: number;
51
+ personId?: string;
52
+ companyId?: string;
53
+ opportunityId?: string;
54
+ }
55
+ export interface TransformedData {
56
+ people: TwentyPerson[];
57
+ companies: TwentyCompany[];
58
+ opportunities: TwentyOpportunity[];
59
+ activities: TwentyActivity[];
60
+ }
61
+ export declare function transformData(copperData: Partial<CopperData>): Promise<TransformedData>;
62
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkE,MAAM,WAAW,CAAC;AAEvG,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAED,wBAAsB,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAoC7F"}