@ingeno/pipedream-services 1.0.64 → 1.0.66
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/aws/apn/index.d.ts +1 -0
- package/dist/aws/apn/index.d.ts.map +1 -1
- package/dist/aws/apn/index.js +1 -0
- package/dist/aws/apn/index.js.map +1 -1
- package/dist/aws/apn/opportunities-helper.d.ts +4 -0
- package/dist/aws/apn/opportunities-helper.d.ts.map +1 -0
- package/dist/aws/apn/opportunities-helper.js +23 -0
- package/dist/aws/apn/opportunities-helper.js.map +1 -0
- package/dist/aws/apn/partner-central-client.d.ts.map +1 -1
- package/dist/aws/apn/partner-central-client.js.map +1 -1
- package/dist/collections/collections-to-table-stream.test.d.ts +2 -0
- package/dist/collections/collections-to-table-stream.test.d.ts.map +1 -0
- package/dist/collections/collections-to-table-stream.test.js +70 -0
- package/dist/collections/collections-to-table-stream.test.js.map +1 -0
- package/dist/collections/collections-to-table.d.ts +13 -2
- package/dist/collections/collections-to-table.d.ts.map +1 -1
- package/dist/collections/collections-to-table.js +21 -17
- package/dist/collections/collections-to-table.js.map +1 -1
- package/dist/collections/collections-to-table.test.js +4 -4
- package/dist/collections/collections-to-table.test.js.map +1 -1
- package/dist/collections/index.d.ts +0 -1
- package/dist/collections/index.d.ts.map +1 -1
- package/dist/collections/index.js +0 -1
- package/dist/collections/index.js.map +1 -1
- package/dist/collections/types.d.ts +10 -0
- package/dist/collections/types.d.ts.map +1 -1
- package/dist/google-sheets/google-sheets-service.d.ts +18 -0
- package/dist/google-sheets/google-sheets-service.d.ts.map +1 -0
- package/dist/google-sheets/google-sheets-service.js +25 -0
- package/dist/google-sheets/google-sheets-service.js.map +1 -0
- package/dist/google-sheets/index.d.ts +2 -0
- package/dist/google-sheets/index.d.ts.map +1 -0
- package/dist/google-sheets/index.js +2 -0
- package/dist/google-sheets/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/postgres/postgres.d.ts +10 -1
- package/dist/postgres/postgres.d.ts.map +1 -1
- package/dist/postgres/postgres.js +167 -111
- package/dist/postgres/postgres.js.map +1 -1
- package/dist/zoho-crm/index.d.ts +1 -4
- package/dist/zoho-crm/index.d.ts.map +1 -1
- package/dist/zoho-crm/index.js +1 -4
- package/dist/zoho-crm/index.js.map +1 -1
- package/dist/zoho-crm/zoho-crm-client.d.ts +6 -1
- package/dist/zoho-crm/zoho-crm-client.d.ts.map +1 -1
- package/dist/zoho-crm/zoho-crm-client.js +92 -97
- package/dist/zoho-crm/zoho-crm-client.js.map +1 -1
- package/dist/zoho-crm/zoho-crm-fetcher.d.ts +2 -8
- package/dist/zoho-crm/zoho-crm-fetcher.d.ts.map +1 -1
- package/dist/zoho-crm/zoho-crm-fetcher.js +118 -101
- package/dist/zoho-crm/zoho-crm-fetcher.js.map +1 -1
- package/dist/zoho-crm/zoho-crm-to-database-collection-converter.d.ts +27 -0
- package/dist/zoho-crm/zoho-crm-to-database-collection-converter.d.ts.map +1 -0
- package/dist/zoho-crm/zoho-crm-to-database-collection-converter.js +219 -0
- package/dist/zoho-crm/zoho-crm-to-database-collection-converter.js.map +1 -0
- package/package.json +7 -1
- package/dist/collections/collections-summary.d.ts +0 -3
- package/dist/collections/collections-summary.d.ts.map +0 -1
- package/dist/collections/collections-summary.js +0 -7
- package/dist/collections/collections-summary.js.map +0 -1
- package/dist/zoho-crm/module-processor.d.ts +0 -8
- package/dist/zoho-crm/module-processor.d.ts.map +0 -1
- package/dist/zoho-crm/module-processor.js +0 -114
- package/dist/zoho-crm/module-processor.js.map +0 -1
|
@@ -1,114 +1,131 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*
|
|
5
|
-
* @param options Configuration options for the fetch operation
|
|
6
|
-
* @returns Summary of tables created and records processed
|
|
7
|
-
*/
|
|
8
|
-
export async function fetchZohoCRMData(options) {
|
|
9
|
-
const { zohoCredentials, postgresCredentials, modules, maxResults, tablesPrefix = 'zoho_crm_' } = options;
|
|
10
|
-
// Initialize Zoho Auth and Client
|
|
1
|
+
import { from } from 'rxjs';
|
|
2
|
+
import { ZohoCRMClient, ZohoAuth, collectionStreamsToTableRowStreams, fillTablesFromStreams, convertZohoCRMModuleToDatabaseCollectionStream } from '../index.js';
|
|
3
|
+
async function createAuthenticatedZohoCRMClient(zohoCredentials) {
|
|
11
4
|
const zohoAuth = new ZohoAuth(zohoCredentials);
|
|
12
5
|
const accessToken = await zohoAuth.getAccessToken();
|
|
13
|
-
|
|
6
|
+
return new ZohoCRMClient({
|
|
14
7
|
accessToken,
|
|
15
8
|
apiDomain: zohoCredentials.api_domain,
|
|
16
9
|
});
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
10
|
+
}
|
|
11
|
+
const addRequiredModuleDependencies = (modules) => {
|
|
12
|
+
const modulesWithDependencies = [...modules];
|
|
13
|
+
const shouldIncludePipelines = modules.includes('Deals');
|
|
14
|
+
if (shouldIncludePipelines && !modulesWithDependencies.includes('DealHistory')) {
|
|
15
|
+
modulesWithDependencies.push('DealHistory');
|
|
22
16
|
console.log('Added DealHistory module since Deals is included');
|
|
23
17
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
};
|
|
88
|
-
const pipelineCollections = [pipelinesCollection, pipelineStagesCollection];
|
|
89
|
-
collections.push(...pipelineCollections);
|
|
90
|
-
console.log(`Processed ${pipelinesData.length} pipelines`);
|
|
91
|
-
console.log(`Processed ${stagesData.length} pipeline stages`);
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
console.warn('Failed to fetch pipelines:', error.message);
|
|
95
|
-
}
|
|
18
|
+
return { modulesWithDependencies, shouldIncludePipelines };
|
|
19
|
+
};
|
|
20
|
+
const buildCollectionSchema = (name, columns, prepareMode = 'drop') => ({
|
|
21
|
+
name,
|
|
22
|
+
prepareMode,
|
|
23
|
+
columns,
|
|
24
|
+
});
|
|
25
|
+
const buildPipelinesCollection = (pipelinesData) => {
|
|
26
|
+
const pipelinesSchema = buildCollectionSchema('pipelines', [
|
|
27
|
+
{ name: 'id', type: 'id' },
|
|
28
|
+
{ name: 'pipeline_id', path: 'id' },
|
|
29
|
+
{ name: 'display_value', type: 'text' },
|
|
30
|
+
{ name: 'default', type: 'bool' },
|
|
31
|
+
{ name: 'stages_count', transform: (pipeline) => pipeline.stages?.length || 0 },
|
|
32
|
+
{ name: 'stages_data', type: 'json', path: 'stages' },
|
|
33
|
+
]);
|
|
34
|
+
return {
|
|
35
|
+
schema: pipelinesSchema,
|
|
36
|
+
objects: pipelinesData.map((pipeline, index) => ({
|
|
37
|
+
id: index + 1,
|
|
38
|
+
...pipeline,
|
|
39
|
+
})),
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
const buildPipelineStagesCollection = (pipelinesData) => {
|
|
43
|
+
const flattenedStages = pipelinesData
|
|
44
|
+
.filter((pipeline) => pipeline.stages && Array.isArray(pipeline.stages))
|
|
45
|
+
.flatMap((pipeline) => pipeline.stages.map((stage) => ({
|
|
46
|
+
id: stage.id,
|
|
47
|
+
pipeline_id: pipeline.id,
|
|
48
|
+
pipeline_display_value: pipeline.display_value,
|
|
49
|
+
stage_id: stage.id,
|
|
50
|
+
stage_display_value: stage.display_value,
|
|
51
|
+
sequence_number: stage.sequence_number,
|
|
52
|
+
forecast_category: stage.forecast_category,
|
|
53
|
+
forecast_type: stage.forecast_type,
|
|
54
|
+
probability: stage.probability || 0,
|
|
55
|
+
})));
|
|
56
|
+
const stagesSchema = buildCollectionSchema('pipeline_stages', [
|
|
57
|
+
{ name: 'id', type: 'id' },
|
|
58
|
+
{ name: 'pipeline_id', type: 'text' },
|
|
59
|
+
{ name: 'pipeline_display_value', type: 'text' },
|
|
60
|
+
{ name: 'stage_id', type: 'text' },
|
|
61
|
+
{ name: 'stage_display_value', type: 'text' },
|
|
62
|
+
{ name: 'sequence_number', type: 'number' },
|
|
63
|
+
{ name: 'forecast_category', type: 'text' },
|
|
64
|
+
{ name: 'forecast_type', type: 'text' },
|
|
65
|
+
{ name: 'probability', type: 'number' },
|
|
66
|
+
]);
|
|
67
|
+
return {
|
|
68
|
+
schema: stagesSchema,
|
|
69
|
+
objects: flattenedStages,
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
const fetchAndBuildPipelineCollections = async (client) => {
|
|
73
|
+
console.log('Fetching Deals pipelines...');
|
|
74
|
+
try {
|
|
75
|
+
const pipelinesData = await client.getDealsPipelines();
|
|
76
|
+
const pipelinesCollection = buildPipelinesCollection(pipelinesData);
|
|
77
|
+
const pipelineStagesCollection = buildPipelineStagesCollection(pipelinesData);
|
|
78
|
+
console.log(`Processed ${pipelinesData.length} pipelines`);
|
|
79
|
+
console.log(`Processed ${pipelineStagesCollection.objects.length} pipeline stages`);
|
|
80
|
+
return [pipelinesCollection, pipelineStagesCollection];
|
|
96
81
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.warn('Failed to fetch pipelines:', error.message);
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const saveCollectionStreamsAndCreateSummary = async (collectionStreams, postgresCredentials, tablesPrefix) => {
|
|
88
|
+
// Skip summary to avoid re-fetching objects for streaming efficiency
|
|
89
|
+
console.log(`Processing ${collectionStreams.length} collection streams for database insertion`);
|
|
90
|
+
const tableRowStreams = collectionStreamsToTableRowStreams(collectionStreams);
|
|
91
|
+
await fillTablesFromStreams({
|
|
103
92
|
auth: postgresCredentials,
|
|
104
|
-
|
|
93
|
+
tableRowStreams,
|
|
105
94
|
tablesPrefix,
|
|
106
95
|
});
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
};
|
|
96
|
+
// For streaming collections, we can't know the exact count without materializing
|
|
97
|
+
// This is acceptable since the primary benefit is memory efficiency during processing
|
|
98
|
+
return collectionStreams.map((collectionStream) => ({
|
|
99
|
+
table: `${tablesPrefix}${collectionStream.schema.name}`,
|
|
100
|
+
records: collectionStream.recordCount || 0, // Use known count if available
|
|
101
|
+
}));
|
|
102
|
+
};
|
|
103
|
+
const logFetchOperationDetails = (modules, maxResults) => {
|
|
104
|
+
console.log(`Fetching data from modules: ${modules.join(', ')}`);
|
|
105
|
+
console.log(`Max results per module: ${maxResults || 'all'}`);
|
|
106
|
+
};
|
|
107
|
+
const fetchAllModuleCollectionStreams = async (modules, client, maxResults) => Promise.all(modules.map(async (moduleName) => {
|
|
108
|
+
console.log(`Fetching ${moduleName}...`);
|
|
109
|
+
return await convertZohoCRMModuleToDatabaseCollectionStream(moduleName, client, { maxRecords: maxResults || undefined });
|
|
110
|
+
}));
|
|
111
|
+
export async function fetchZohoCRMData(options) {
|
|
112
|
+
const { zohoCredentials, postgresCredentials, modules, maxResults, tablesPrefix = 'zoho_crm_' } = options;
|
|
113
|
+
const client = await createAuthenticatedZohoCRMClient(zohoCredentials);
|
|
114
|
+
const { modulesWithDependencies, shouldIncludePipelines } = addRequiredModuleDependencies(modules);
|
|
115
|
+
logFetchOperationDetails(modulesWithDependencies, maxResults);
|
|
116
|
+
const moduleCollectionStreams = await fetchAllModuleCollectionStreams(modulesWithDependencies, client, maxResults);
|
|
117
|
+
const allCollectionStreams = [...moduleCollectionStreams];
|
|
118
|
+
if (shouldIncludePipelines) {
|
|
119
|
+
const pipelineCollections = await fetchAndBuildPipelineCollections(client);
|
|
120
|
+
// Convert pipeline collections to streams for consistency
|
|
121
|
+
const pipelineStreams = pipelineCollections.map(collection => ({
|
|
122
|
+
schema: collection.schema,
|
|
123
|
+
objects: from(collection.objects),
|
|
124
|
+
recordCount: collection.objects.length // Keep count for small pipeline data
|
|
125
|
+
}));
|
|
126
|
+
allCollectionStreams.push(...pipelineStreams);
|
|
127
|
+
}
|
|
128
|
+
const summary = await saveCollectionStreamsAndCreateSummary(allCollectionStreams, postgresCredentials, tablesPrefix);
|
|
129
|
+
return { summary };
|
|
113
130
|
}
|
|
114
131
|
//# sourceMappingURL=zoho-crm-fetcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoho-crm-fetcher.js","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"zoho-crm-fetcher.js","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Collection, CollectionSchema, CollectionStream } from '../collections/types.js';
|
|
2
|
+
import type { ZohoCRMClient, ZohoCRMRecord } from './zoho-crm-client.js';
|
|
3
|
+
export interface ZohoCRMConversionOptions {
|
|
4
|
+
maxRecords?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ZohoFieldMetadata {
|
|
7
|
+
api_name: string;
|
|
8
|
+
data_type: string;
|
|
9
|
+
field_label: string;
|
|
10
|
+
json_type: string;
|
|
11
|
+
length?: number;
|
|
12
|
+
decimal_place?: number;
|
|
13
|
+
pick_list_values?: Array<{
|
|
14
|
+
display_value: string;
|
|
15
|
+
actual_value: string;
|
|
16
|
+
}>;
|
|
17
|
+
lookup?: {
|
|
18
|
+
module: {
|
|
19
|
+
api_name: string;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export declare const createDatabaseSchemaFromFieldMetadata: (fieldsMetadata: ZohoFieldMetadata[], schemaName: string) => CollectionSchema;
|
|
24
|
+
export declare const createDatabaseSchemaFromZohoCRMRecords: (records: ZohoCRMRecord[], schemaName: string) => CollectionSchema;
|
|
25
|
+
export declare const convertZohoCRMModuleToDatabaseCollection: (moduleName: string, client: ZohoCRMClient, options?: ZohoCRMConversionOptions) => Promise<Collection>;
|
|
26
|
+
export declare const convertZohoCRMModuleToDatabaseCollectionStream: (moduleName: string, client: ZohoCRMClient, options?: ZohoCRMConversionOptions) => Promise<CollectionStream>;
|
|
27
|
+
//# sourceMappingURL=zoho-crm-to-database-collection-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoho-crm-to-database-collection-converter.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-to-database-collection-converter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,gBAAgB,EAAsB,MAAM,yBAAyB,CAAA;AACjH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAIxE,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,KAAK,CAAC;QACvB,aAAa,EAAE,MAAM,CAAA;QACrB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAC,CAAA;IACF,MAAM,CAAC,EAAE;QACP,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KAC7B,CAAA;CACF;AAiMD,eAAO,MAAM,qCAAqC,GAChD,gBAAgB,iBAAiB,EAAE,EACnC,YAAY,MAAM,KACjB,gBAwBF,CAAA;AAED,eAAO,MAAM,sCAAsC,GAAI,SAAS,aAAa,EAAE,EAAE,YAAY,MAAM,KAAG,gBAcrG,CAAA;AAED,eAAO,MAAM,wCAAwC,GACnD,YAAY,MAAM,EAClB,QAAQ,aAAa,EACrB,UAAS,wBAA6B,KACrC,OAAO,CAAC,UAAU,CASpB,CAAA;AAsBD,eAAO,MAAM,8CAA8C,GACzD,YAAY,MAAM,EAClB,QAAQ,aAAa,EACrB,UAAS,wBAA6B,KACrC,OAAO,CAAC,gBAAgB,CAqB1B,CAAA"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { from } from 'rxjs';
|
|
2
|
+
import { map, toArray } from 'rxjs/operators';
|
|
3
|
+
const ZOHO_FIELD_LIMIT = 50;
|
|
4
|
+
const createEmptyDatabaseSchema = (schemaName) => ({
|
|
5
|
+
name: schemaName,
|
|
6
|
+
prepareMode: 'drop',
|
|
7
|
+
columns: [
|
|
8
|
+
{ name: 'id', type: 'id' },
|
|
9
|
+
{ name: 'raw_data', transform: (record) => JSON.stringify(record) },
|
|
10
|
+
],
|
|
11
|
+
});
|
|
12
|
+
const extractAllFieldNamesFromRecords = (records) => {
|
|
13
|
+
const allFieldNames = records.flatMap(record => Object.keys(record));
|
|
14
|
+
return [...new Set(allFieldNames)].sort();
|
|
15
|
+
};
|
|
16
|
+
const sanitizeFieldNameForDatabase = (fieldName) => fieldName.toLowerCase().replace(/[^a-z0-9_]/g, '_');
|
|
17
|
+
const inferColumnTypeFromFieldName = (fieldName) => {
|
|
18
|
+
if (fieldName.includes('Date') || fieldName.includes('Time') || fieldName.includes('_time')) {
|
|
19
|
+
return fieldName.includes('Date') && !fieldName.includes('Time') ? 'date' : 'datetime';
|
|
20
|
+
}
|
|
21
|
+
if (fieldName.includes('Amount') || fieldName.includes('Revenue') || fieldName.includes('_amount')) {
|
|
22
|
+
return 'currency';
|
|
23
|
+
}
|
|
24
|
+
if (fieldName.includes('Probability') || fieldName.includes('Rate') || fieldName.includes('_rate') || fieldName.includes('_number')) {
|
|
25
|
+
return 'number';
|
|
26
|
+
}
|
|
27
|
+
if (fieldName.includes('Opt_Out') || fieldName.includes('_opt_out') || fieldName.includes('converted')) {
|
|
28
|
+
return 'bool';
|
|
29
|
+
}
|
|
30
|
+
return 'text';
|
|
31
|
+
};
|
|
32
|
+
const extractSampleValuesFromRecords = (records, fieldName, sampleSize = 10) => records
|
|
33
|
+
.slice(0, sampleSize)
|
|
34
|
+
.map((record) => record[fieldName])
|
|
35
|
+
.filter((value) => value !== null && value !== undefined && value !== '');
|
|
36
|
+
const refineColumnTypeFromSampleValue = (sampleValue, inferredType) => {
|
|
37
|
+
if (typeof sampleValue === 'boolean') {
|
|
38
|
+
return 'bool';
|
|
39
|
+
}
|
|
40
|
+
if (typeof sampleValue === 'number') {
|
|
41
|
+
return 'number';
|
|
42
|
+
}
|
|
43
|
+
if (typeof sampleValue === 'string' && (inferredType === 'date' || inferredType === 'datetime')) {
|
|
44
|
+
const parsedDate = new Date(sampleValue);
|
|
45
|
+
return isNaN(parsedDate.getTime()) ? 'text' : inferredType;
|
|
46
|
+
}
|
|
47
|
+
return inferredType;
|
|
48
|
+
};
|
|
49
|
+
const createColumnsForNestedObject = (fieldName, sanitizedColumnName, sampleValue) => {
|
|
50
|
+
const nestedProperties = [
|
|
51
|
+
{ key: 'name', exists: sampleValue.name },
|
|
52
|
+
{ key: 'id', exists: sampleValue.id },
|
|
53
|
+
{ key: 'email', exists: sampleValue.email }
|
|
54
|
+
];
|
|
55
|
+
return nestedProperties
|
|
56
|
+
.filter(property => property.exists)
|
|
57
|
+
.map(property => ({
|
|
58
|
+
name: `${sanitizedColumnName}_${property.key}`,
|
|
59
|
+
path: `${fieldName}.${property.key}`
|
|
60
|
+
}));
|
|
61
|
+
};
|
|
62
|
+
const createColumnFromField = (fieldName, records) => {
|
|
63
|
+
if (fieldName === 'id') {
|
|
64
|
+
return [{ name: 'record_id', path: 'id' }];
|
|
65
|
+
}
|
|
66
|
+
const sanitizedColumnName = sanitizeFieldNameForDatabase(fieldName);
|
|
67
|
+
let columnType = inferColumnTypeFromFieldName(fieldName);
|
|
68
|
+
const sampleValues = extractSampleValuesFromRecords(records, fieldName);
|
|
69
|
+
if (sampleValues.length > 0) {
|
|
70
|
+
const firstSampleValue = sampleValues[0];
|
|
71
|
+
if (typeof firstSampleValue === 'object' && firstSampleValue !== null) {
|
|
72
|
+
return createColumnsForNestedObject(fieldName, sanitizedColumnName, firstSampleValue);
|
|
73
|
+
}
|
|
74
|
+
columnType = refineColumnTypeFromSampleValue(firstSampleValue, columnType);
|
|
75
|
+
}
|
|
76
|
+
return [{ name: sanitizedColumnName, path: fieldName, type: columnType }];
|
|
77
|
+
};
|
|
78
|
+
const convertFieldsToColumns = (fieldNames, records) => {
|
|
79
|
+
const baseColumns = [{ name: 'id', type: 'id' }];
|
|
80
|
+
const fieldColumns = fieldNames.flatMap(fieldName => createColumnFromField(fieldName, records));
|
|
81
|
+
const rawDataColumn = [
|
|
82
|
+
{ name: 'raw_data', transform: (record) => JSON.stringify(record) }
|
|
83
|
+
];
|
|
84
|
+
return [...baseColumns, ...fieldColumns, ...rawDataColumn];
|
|
85
|
+
};
|
|
86
|
+
const mapZohoDataTypeToColumnType = (dataType) => {
|
|
87
|
+
const typeMapping = {
|
|
88
|
+
'datetime': 'datetime',
|
|
89
|
+
'date': 'date',
|
|
90
|
+
'currency': 'currency',
|
|
91
|
+
'number': 'number',
|
|
92
|
+
'decimal': 'number',
|
|
93
|
+
'integer': 'number',
|
|
94
|
+
'bigint': 'number',
|
|
95
|
+
'boolean': 'bool',
|
|
96
|
+
'picklist': 'text',
|
|
97
|
+
'multiselectpicklist': 'text',
|
|
98
|
+
'lookup': 'text',
|
|
99
|
+
'text': 'text',
|
|
100
|
+
'textarea': 'text',
|
|
101
|
+
'email': 'text',
|
|
102
|
+
'phone': 'text',
|
|
103
|
+
'url': 'text',
|
|
104
|
+
'formula': 'text',
|
|
105
|
+
'autonumber': 'text',
|
|
106
|
+
'ownerlookup': 'text',
|
|
107
|
+
'userlookup': 'text',
|
|
108
|
+
};
|
|
109
|
+
return typeMapping[dataType.toLowerCase()] || 'text';
|
|
110
|
+
};
|
|
111
|
+
const createColumnFromFieldMetadata = (field) => {
|
|
112
|
+
if (field.api_name === 'id') {
|
|
113
|
+
return [{ name: 'record_id', path: 'id' }];
|
|
114
|
+
}
|
|
115
|
+
const sanitizedColumnName = sanitizeFieldNameForDatabase(field.api_name);
|
|
116
|
+
const columnType = mapZohoDataTypeToColumnType(field.data_type);
|
|
117
|
+
if (field.lookup && field.lookup.module) {
|
|
118
|
+
return createColumnsForLookupField(field, sanitizedColumnName);
|
|
119
|
+
}
|
|
120
|
+
return [{
|
|
121
|
+
name: sanitizedColumnName,
|
|
122
|
+
path: field.api_name,
|
|
123
|
+
type: columnType
|
|
124
|
+
}];
|
|
125
|
+
};
|
|
126
|
+
const createColumnsForLookupField = (field, sanitizedColumnName) => {
|
|
127
|
+
return [
|
|
128
|
+
{
|
|
129
|
+
name: `${sanitizedColumnName}_id`,
|
|
130
|
+
path: `${field.api_name}.id`
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: `${sanitizedColumnName}_name`,
|
|
134
|
+
path: `${field.api_name}.name`
|
|
135
|
+
}
|
|
136
|
+
];
|
|
137
|
+
};
|
|
138
|
+
const deduplicateColumns = (columns, schemaName) => {
|
|
139
|
+
const seenNames = new Set();
|
|
140
|
+
const duplicates = [];
|
|
141
|
+
const deduplicatedColumns = columns.filter(column => {
|
|
142
|
+
if (seenNames.has(column.name)) {
|
|
143
|
+
duplicates.push(column.name);
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
seenNames.add(column.name);
|
|
147
|
+
return true;
|
|
148
|
+
});
|
|
149
|
+
if (duplicates.length > 0) {
|
|
150
|
+
console.warn(`Schema '${schemaName}': Removed ${duplicates.length} duplicate column(s): ${duplicates.join(', ')}`);
|
|
151
|
+
}
|
|
152
|
+
return deduplicatedColumns;
|
|
153
|
+
};
|
|
154
|
+
export const createDatabaseSchemaFromFieldMetadata = (fieldsMetadata, schemaName) => {
|
|
155
|
+
if (!fieldsMetadata || fieldsMetadata.length === 0) {
|
|
156
|
+
return createEmptyDatabaseSchema(schemaName);
|
|
157
|
+
}
|
|
158
|
+
const baseColumns = [{ name: 'id', type: 'id' }];
|
|
159
|
+
const fieldColumns = fieldsMetadata.flatMap(field => createColumnFromFieldMetadata(field));
|
|
160
|
+
const rawDataColumn = [
|
|
161
|
+
{ name: 'raw_data', transform: (record) => JSON.stringify(record) }
|
|
162
|
+
];
|
|
163
|
+
const allColumns = [...baseColumns, ...fieldColumns, ...rawDataColumn];
|
|
164
|
+
const deduplicatedColumns = deduplicateColumns(allColumns, schemaName);
|
|
165
|
+
return {
|
|
166
|
+
name: schemaName,
|
|
167
|
+
prepareMode: 'drop',
|
|
168
|
+
columns: deduplicatedColumns,
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
export const createDatabaseSchemaFromZohoCRMRecords = (records, schemaName) => {
|
|
172
|
+
if (!records || records.length === 0) {
|
|
173
|
+
return createEmptyDatabaseSchema(schemaName);
|
|
174
|
+
}
|
|
175
|
+
const allFieldNames = extractAllFieldNamesFromRecords(records);
|
|
176
|
+
const databaseColumns = convertFieldsToColumns(allFieldNames, records);
|
|
177
|
+
const deduplicatedColumns = deduplicateColumns(databaseColumns, schemaName);
|
|
178
|
+
return {
|
|
179
|
+
name: schemaName,
|
|
180
|
+
prepareMode: 'drop',
|
|
181
|
+
columns: deduplicatedColumns,
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
export const convertZohoCRMModuleToDatabaseCollection = async (moduleName, client, options = {}) => {
|
|
185
|
+
const collectionStream = await convertZohoCRMModuleToDatabaseCollectionStream(moduleName, client, options);
|
|
186
|
+
const objects = await from(collectionStream.objects).pipe(toArray()).toPromise() || [];
|
|
187
|
+
return {
|
|
188
|
+
schema: collectionStream.schema,
|
|
189
|
+
objects
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
const getAllRecordsWithFieldMetadata = async (moduleName, client, options = {}) => {
|
|
193
|
+
const fieldsMetadata = await client.getModuleFields(moduleName);
|
|
194
|
+
const fieldNames = fieldsMetadata.fields?.slice(0, ZOHO_FIELD_LIMIT).map((field) => field.api_name) || ['*'];
|
|
195
|
+
const records = await client.getAllRecords(moduleName, {
|
|
196
|
+
fields: fieldNames,
|
|
197
|
+
maxRecords: options.maxRecords
|
|
198
|
+
});
|
|
199
|
+
return {
|
|
200
|
+
records,
|
|
201
|
+
fieldsMetadata: fieldsMetadata.fields || []
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
export const convertZohoCRMModuleToDatabaseCollectionStream = async (moduleName, client, options = {}) => {
|
|
205
|
+
const { maxRecords } = options;
|
|
206
|
+
console.log(`Processing module: ${moduleName}`);
|
|
207
|
+
const { records, fieldsMetadata } = await getAllRecordsWithFieldMetadata(moduleName, client, { maxRecords });
|
|
208
|
+
const databaseSchema = createDatabaseSchemaFromFieldMetadata(fieldsMetadata, moduleName.toLowerCase());
|
|
209
|
+
const objectStream = from(records).pipe(map((record, index) => ({
|
|
210
|
+
id: index + 1,
|
|
211
|
+
...record,
|
|
212
|
+
})));
|
|
213
|
+
console.log(`Processed ${records.length} records for module: ${moduleName} using field metadata`);
|
|
214
|
+
return {
|
|
215
|
+
schema: databaseSchema,
|
|
216
|
+
objects: objectStream,
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
//# sourceMappingURL=zoho-crm-to-database-collection-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoho-crm-to-database-collection-converter.js","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-to-database-collection-converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAI7C,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAsB3B,MAAM,yBAAyB,GAAG,CAAC,UAAkB,EAAoB,EAAE,CAAC,CAAC;IAC3E,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,MAAM;IACnB,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;QAC1B,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;KACpE;CACF,CAAC,CAAA;AAEF,MAAM,+BAA+B,GAAG,CAAC,OAAwB,EAAY,EAAE;IAC7E,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACpE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AAC3C,CAAC,CAAA;AAED,MAAM,4BAA4B,GAAG,CAAC,SAAiB,EAAU,EAAE,CACjE,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;AAErD,MAAM,4BAA4B,GAAG,CAAC,SAAiB,EAAc,EAAE;IACrE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5F,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAA;IACxF,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnG,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpI,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACvG,OAAO,MAAM,CAAA;IACf,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,8BAA8B,GAAG,CAAC,OAAwB,EAAE,SAAiB,EAAE,aAAqB,EAAE,EAAS,EAAE,CACrH,OAAO;KACJ,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;KACpB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KAClC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAA;AAE7E,MAAM,+BAA+B,GAAG,CAAC,WAAgB,EAAE,YAAwB,EAAc,EAAE;IACjG,IAAI,OAAO,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,UAAU,CAAC,EAAE,CAAC;QAChG,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAA;QACxC,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAA;IAC5D,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED,MAAM,4BAA4B,GAAG,CAAC,SAAiB,EAAE,mBAA2B,EAAE,WAAgB,EAAY,EAAE;IAClH,MAAM,gBAAgB,GAAG;QACvB,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE;QACzC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE;QACrC,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE;KAC5C,CAAA;IAED,OAAO,gBAAgB;SACpB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;SACnC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,EAAE,GAAG,mBAAmB,IAAI,QAAQ,CAAC,GAAG,EAAE;QAC9C,IAAI,EAAE,GAAG,SAAS,IAAI,QAAQ,CAAC,GAAG,EAAE;KACrC,CAAC,CAAC,CAAA;AACP,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,SAAiB,EAAE,OAAwB,EAAY,EAAE;IACtF,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,mBAAmB,GAAG,4BAA4B,CAAC,SAAS,CAAC,CAAA;IACnE,IAAI,UAAU,GAAG,4BAA4B,CAAC,SAAS,CAAC,CAAA;IAExD,MAAM,YAAY,GAAG,8BAA8B,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAEvE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,gBAAgB,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;QAExC,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACtE,OAAO,4BAA4B,CAAC,SAAS,EAAE,mBAAmB,EAAE,gBAAgB,CAAC,CAAA;QACvF,CAAC;QAED,UAAU,GAAG,+BAA+B,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAA;IAC5E,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;AAC3E,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,CAAC,UAAoB,EAAE,OAAwB,EAAY,EAAE;IAC1F,MAAM,WAAW,GAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAClD,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAC1C,CAAA;IAED,MAAM,aAAa,GAAa;QAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,MAAW,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;KACzE,CAAA;IAED,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC,CAAA;AAC5D,CAAC,CAAA;AAED,MAAM,2BAA2B,GAAG,CAAC,QAAgB,EAAc,EAAE;IACnE,MAAM,WAAW,GAA+B;QAC9C,UAAU,EAAE,UAAU;QACtB,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,MAAM;QACjB,UAAU,EAAE,MAAM;QAClB,qBAAqB,EAAE,MAAM;QAC7B,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,MAAM;QAClB,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,MAAM;QACjB,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,MAAM;QACrB,YAAY,EAAE,MAAM;KACrB,CAAA;IAED,OAAO,WAAW,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,MAAM,CAAA;AACtD,CAAC,CAAA;AAED,MAAM,6BAA6B,GAAG,CAAC,KAAwB,EAAY,EAAE;IAC3E,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,mBAAmB,GAAG,4BAA4B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACxE,MAAM,UAAU,GAAG,2BAA2B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAE/D,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACxC,OAAO,2BAA2B,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;IAChE,CAAC;IAED,OAAO,CAAC;YACN,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,KAAK,CAAC,QAAQ;YACpB,IAAI,EAAE,UAAU;SACjB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,2BAA2B,GAAG,CAAC,KAAwB,EAAE,mBAA2B,EAAY,EAAE;IACtG,OAAO;QACL;YACE,IAAI,EAAE,GAAG,mBAAmB,KAAK;YACjC,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,KAAK;SAC7B;QACD;YACE,IAAI,EAAE,GAAG,mBAAmB,OAAO;YACnC,IAAI,EAAE,GAAG,KAAK,CAAC,QAAQ,OAAO;SAC/B;KACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,OAAiB,EAAE,UAAmB,EAAY,EAAE;IAC9E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,MAAM,UAAU,GAAa,EAAE,CAAA;IAE/B,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QAClD,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YAC5B,OAAO,KAAK,CAAA;QACd,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,WAAW,UAAU,cAAc,UAAU,CAAC,MAAM,yBAAyB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpH,CAAC;IAED,OAAO,mBAAmB,CAAA;AAC5B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qCAAqC,GAAG,CACnD,cAAmC,EACnC,UAAkB,EACA,EAAE;IACpB,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,yBAAyB,CAAC,UAAU,CAAC,CAAA;IAC9C,CAAC;IAGD,MAAM,WAAW,GAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAClD,6BAA6B,CAAC,KAAK,CAAC,CACrC,CAAA;IAED,MAAM,aAAa,GAAa;QAC9B,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,MAAW,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE;KACzE,CAAA;IAED,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC,CAAA;IACtE,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IAEtE,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,mBAAmB;KAC7B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,OAAwB,EAAE,UAAkB,EAAoB,EAAE;IACvH,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,yBAAyB,CAAC,UAAU,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,aAAa,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAA;IAC9D,MAAM,eAAe,GAAG,sBAAsB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IACtE,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;IAE3E,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,mBAAmB;KAC7B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wCAAwC,GAAG,KAAK,EAC3D,UAAkB,EAClB,MAAqB,EACrB,UAAoC,EAAE,EACjB,EAAE;IACvB,MAAM,gBAAgB,GAAG,MAAM,8CAA8C,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IAE1G,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAA;IAEtF,OAAO;QACL,MAAM,EAAE,gBAAgB,CAAC,MAAM;QAC/B,OAAO;KACR,CAAA;AACH,CAAC,CAAA;AAED,MAAM,8BAA8B,GAAG,KAAK,EAC1C,UAAkB,EAClB,MAAqB,EACrB,UAAmC,EAAE,EACuC,EAAE;IAC9E,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;IAE/D,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEjH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE;QACrD,MAAM,EAAE,UAAU;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAA;IAEF,OAAO;QACL,OAAO;QACP,cAAc,EAAE,cAAc,CAAC,MAAM,IAAI,EAAE;KAC5C,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,8CAA8C,GAAG,KAAK,EACjE,UAAkB,EAClB,MAAqB,EACrB,UAAoC,EAAE,EACX,EAAE;IAC7B,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAE9B,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAA;IAE/C,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,8BAA8B,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAC5G,MAAM,cAAc,GAAG,qCAAqC,CAAC,cAAc,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA;IAEtG,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACrC,GAAG,CAAC,CAAC,MAAW,EAAE,KAAa,EAAE,EAAE,CAAC,CAAC;QACnC,EAAE,EAAE,KAAK,GAAG,CAAC;QACb,GAAG,MAAM;KACV,CAAC,CAAC,CACJ,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,wBAAwB,UAAU,uBAAuB,CAAC,CAAA;IAEjG,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,YAAY;KACtB,CAAA;AACH,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ingeno/pipedream-services",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.66",
|
|
4
4
|
"description": "Service utilities for Clarity data integrations",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
"import": "./dist/date/index.js",
|
|
19
19
|
"types": "./dist/date/index.d.ts"
|
|
20
20
|
},
|
|
21
|
+
"./google-sheets": {
|
|
22
|
+
"import": "./dist/google-sheets/index.js",
|
|
23
|
+
"types": "./dist/google-sheets/index.d.ts"
|
|
24
|
+
},
|
|
21
25
|
"./zoho": {
|
|
22
26
|
"import": "./dist/zoho/index.js",
|
|
23
27
|
"types": "./dist/zoho/index.d.ts"
|
|
@@ -47,6 +51,8 @@
|
|
|
47
51
|
"@aws-sdk/client-organizations": "^3.835.0",
|
|
48
52
|
"@aws-sdk/client-partnercentral-selling": "^3.830.0",
|
|
49
53
|
"@aws-sdk/client-sts": "^3.400.0",
|
|
54
|
+
"@googleapis/sheets": "^7.0.0",
|
|
55
|
+
"googleapis": "^144.0.0",
|
|
50
56
|
"axios": "^1.10.0",
|
|
51
57
|
"dayjs": "^1.11.13",
|
|
52
58
|
"dayjs-plugin-utc": "^0.1.2",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collections-summary.d.ts","sourceRoot":"","sources":["../../src/collections/collections-summary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,eAAO,MAAM,iBAAiB,GAAI,aAAa,UAAU,EAAE,SAK1D,CAAA"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export const collectionSummary = (collections) => {
|
|
2
|
-
collections.forEach((collection) => {
|
|
3
|
-
console.log(`${collection.schema.name} - ${collection.objects.length} objects`);
|
|
4
|
-
console.log(`${collection.schema.name} - sample object: ${JSON.stringify(collection.objects[0], null, 2)}`);
|
|
5
|
-
});
|
|
6
|
-
};
|
|
7
|
-
//# sourceMappingURL=collections-summary.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collections-summary.js","sourceRoot":"","sources":["../../src/collections/collections-summary.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAyB,EAAE,EAAE;IAC7D,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAA;QAC/E,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,qBAAqB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;IAC7G,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Collection, CollectionSchema } from '../collections/types.js';
|
|
2
|
-
import type { ZohoCRMClient, ZohoCRMRecord } from './zoho-crm-client.js';
|
|
3
|
-
export interface ModuleProcessorOptions {
|
|
4
|
-
maxRecords?: number;
|
|
5
|
-
}
|
|
6
|
-
export declare function generateSchemaFromRecords(records: ZohoCRMRecord[], schemaName: string): CollectionSchema;
|
|
7
|
-
export declare function processModule(moduleName: string, client: ZohoCRMClient, options?: ModuleProcessorOptions): Promise<Collection>;
|
|
8
|
-
//# sourceMappingURL=module-processor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"module-processor.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/module-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAsB,MAAM,yBAAyB,CAAA;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAExE,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAuGxG;AAGD,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,UAAU,CAAC,CAqBrB"}
|