@ingeno/pipedream-services 1.0.64 → 1.0.65

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.
@@ -1,8 +1,5 @@
1
- /**
2
- * Zoho CRM integration utilities for Pipedream workflows
3
- */
4
1
  export * from './zoho-crm-client.js';
5
2
  export * from './zoho-auth.js';
6
- export * from './module-processor.js';
3
+ export * from './zoho-crm-to-database-collection-converter.js';
7
4
  export * from './zoho-crm-fetcher.js';
8
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gDAAgD,CAAA;AAC9D,cAAc,uBAAuB,CAAA"}
@@ -1,8 +1,5 @@
1
- /**
2
- * Zoho CRM integration utilities for Pipedream workflows
3
- */
4
1
  export * from './zoho-crm-client.js';
5
2
  export * from './zoho-auth.js';
6
- export * from './module-processor.js';
3
+ export * from './zoho-crm-to-database-collection-converter.js';
7
4
  export * from './zoho-crm-fetcher.js';
8
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zoho-crm/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zoho-crm/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gDAAgD,CAAA;AAC9D,cAAc,uBAAuB,CAAA"}
@@ -1,6 +1,6 @@
1
- import type { PostgresAuth } from '../index.js';
1
+ import type { PostgresAuth, ZohoCredentials } from '../index.js';
2
2
  export interface ZohoCRMFetchOptions {
3
- zohoCredentials: any;
3
+ zohoCredentials: ZohoCredentials;
4
4
  postgresCredentials: PostgresAuth;
5
5
  modules: string[];
6
6
  maxResults?: number;
@@ -12,11 +12,5 @@ export interface ZohoCRMFetchResult {
12
12
  records: number;
13
13
  }>;
14
14
  }
15
- /**
16
- * Reusable function to fetch data from Zoho CRM modules and save to PostgreSQL
17
- *
18
- * @param options Configuration options for the fetch operation
19
- * @returns Summary of tables created and records processed
20
- */
21
15
  export declare function fetchZohoCRMData(options: ZohoCRMFetchOptions): Promise<ZohoCRMFetchResult>;
22
16
  //# sourceMappingURL=zoho-crm-fetcher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zoho-crm-fetcher.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,GAAG,CAAA;IACpB,mBAAmB,EAAE,YAAY,CAAA;IACjC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnD;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA8HhG"}
1
+ {"version":3,"file":"zoho-crm-fetcher.d.ts","sourceRoot":"","sources":["../../src/zoho-crm/zoho-crm-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEhE,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,eAAe,CAAA;IAChC,mBAAmB,EAAE,YAAY,CAAA;IACjC,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnD;AAgJD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmBhG"}
@@ -1,114 +1,125 @@
1
- import { ZohoCRMClient, ZohoAuth, collectionSummary, collectionsToTables, fillTables, processModule } from '../index.js';
2
- /**
3
- * Reusable function to fetch data from Zoho CRM modules and save to PostgreSQL
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 { ZohoCRMClient, ZohoAuth, collectionSummary, collectionsToTables, fillTables, convertZohoCRMModuleToDatabaseCollection } from '../index.js';
2
+ async function createAuthenticatedZohoCRMClient(zohoCredentials) {
11
3
  const zohoAuth = new ZohoAuth(zohoCredentials);
12
4
  const accessToken = await zohoAuth.getAccessToken();
13
- const client = new ZohoCRMClient({
5
+ return new ZohoCRMClient({
14
6
  accessToken,
15
7
  apiDomain: zohoCredentials.api_domain,
16
8
  });
17
- // Check if Deals is in modules and add DealHistory if so
18
- const enhancedModules = [...modules];
19
- const includesPipelines = modules.includes('Deals');
20
- if (includesPipelines && !enhancedModules.includes('DealHistory')) {
21
- enhancedModules.push('DealHistory');
9
+ }
10
+ function addRequiredModuleDependencies(modules) {
11
+ const modulesWithDependencies = [...modules];
12
+ const shouldIncludePipelines = modules.includes('Deals');
13
+ if (shouldIncludePipelines && !modulesWithDependencies.includes('DealHistory')) {
14
+ modulesWithDependencies.push('DealHistory');
22
15
  console.log('Added DealHistory module since Deals is included');
23
16
  }
24
- console.log(`Fetching data from modules: ${enhancedModules.join(', ')}`);
25
- console.log(`Max results per module: ${maxResults || 'all'}`);
26
- // Process each module using the generic processor
27
- const moduleCollections = await Promise.all(enhancedModules.map(async (moduleName) => {
28
- console.log(`Fetching ${moduleName}...`);
29
- return await processModule(moduleName, client, { maxRecords: maxResults || undefined });
30
- }));
31
- const collections = [...moduleCollections];
32
- // If Deals is included, also fetch and process pipelines
33
- if (includesPipelines) {
34
- console.log('Fetching Deals pipelines...');
35
- try {
36
- const pipelinesData = await client.getDealsPipelines();
37
- // Create a collection for pipelines
38
- const pipelinesCollection = {
39
- schema: {
40
- name: 'pipelines',
41
- prepareMode: 'drop',
42
- columns: [
43
- { name: 'id', type: 'id' },
44
- { name: 'pipeline_id', path: 'id' },
45
- { name: 'display_value', type: 'text' },
46
- { name: 'default', type: 'bool' },
47
- { name: 'stages_count', transform: (pipeline) => pipeline.stages?.length || 0 },
48
- { name: 'stages_data', type: 'json', path: 'stages' },
49
- ],
50
- },
51
- objects: pipelinesData.map((pipeline, index) => ({
52
- id: index + 1,
53
- ...pipeline,
54
- })),
55
- };
56
- // Create a separate collection for pipeline stages using functional programming
57
- const stagesData = pipelinesData
58
- .filter((pipeline) => pipeline.stages && Array.isArray(pipeline.stages))
59
- .flatMap((pipeline) => pipeline.stages.map((stage) => ({
60
- id: stage.id,
61
- pipeline_id: pipeline.id,
62
- pipeline_display_value: pipeline.display_value,
63
- stage_id: stage.id,
64
- stage_display_value: stage.display_value,
65
- sequence_number: stage.sequence_number,
66
- forecast_category: stage.forecast_category,
67
- forecast_type: stage.forecast_type,
68
- probability: stage.probability || 0,
69
- })));
70
- const pipelineStagesCollection = {
71
- schema: {
72
- name: 'pipeline_stages',
73
- prepareMode: 'drop',
74
- columns: [
75
- { name: 'id', type: 'id' },
76
- { name: 'pipeline_id', type: 'text' },
77
- { name: 'pipeline_display_value', type: 'text' },
78
- { name: 'stage_id', type: 'text' },
79
- { name: 'stage_display_value', type: 'text' },
80
- { name: 'sequence_number', type: 'number' },
81
- { name: 'forecast_category', type: 'text' },
82
- { name: 'forecast_type', type: 'text' },
83
- { name: 'probability', type: 'number' },
84
- ],
85
- },
86
- objects: stagesData,
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
- }
17
+ return { modulesWithDependencies, shouldIncludePipelines };
18
+ }
19
+ function buildCollectionSchema(name, columns, prepareMode = 'drop') {
20
+ return {
21
+ name,
22
+ prepareMode,
23
+ columns,
24
+ };
25
+ }
26
+ function buildPipelinesCollection(pipelinesData) {
27
+ const pipelinesSchema = buildCollectionSchema('pipelines', [
28
+ { name: 'id', type: 'id' },
29
+ { name: 'pipeline_id', path: 'id' },
30
+ { name: 'display_value', type: 'text' },
31
+ { name: 'default', type: 'bool' },
32
+ { name: 'stages_count', transform: (pipeline) => pipeline.stages?.length || 0 },
33
+ { name: 'stages_data', type: 'json', path: 'stages' },
34
+ ]);
35
+ return {
36
+ schema: pipelinesSchema,
37
+ objects: pipelinesData.map((pipeline, index) => ({
38
+ id: index + 1,
39
+ ...pipeline,
40
+ })),
41
+ };
42
+ }
43
+ function buildPipelineStagesCollection(pipelinesData) {
44
+ const flattenedStages = pipelinesData
45
+ .filter((pipeline) => pipeline.stages && Array.isArray(pipeline.stages))
46
+ .flatMap((pipeline) => pipeline.stages.map((stage) => ({
47
+ id: stage.id,
48
+ pipeline_id: pipeline.id,
49
+ pipeline_display_value: pipeline.display_value,
50
+ stage_id: stage.id,
51
+ stage_display_value: stage.display_value,
52
+ sequence_number: stage.sequence_number,
53
+ forecast_category: stage.forecast_category,
54
+ forecast_type: stage.forecast_type,
55
+ probability: stage.probability || 0,
56
+ })));
57
+ const stagesSchema = buildCollectionSchema('pipeline_stages', [
58
+ { name: 'id', type: 'id' },
59
+ { name: 'pipeline_id', type: 'text' },
60
+ { name: 'pipeline_display_value', type: 'text' },
61
+ { name: 'stage_id', type: 'text' },
62
+ { name: 'stage_display_value', type: 'text' },
63
+ { name: 'sequence_number', type: 'number' },
64
+ { name: 'forecast_category', type: 'text' },
65
+ { name: 'forecast_type', type: 'text' },
66
+ { name: 'probability', type: 'number' },
67
+ ]);
68
+ return {
69
+ schema: stagesSchema,
70
+ objects: flattenedStages,
71
+ };
72
+ }
73
+ async function fetchAndBuildPipelineCollections(client) {
74
+ console.log('Fetching Deals pipelines...');
75
+ try {
76
+ const pipelinesData = await client.getDealsPipelines();
77
+ const pipelinesCollection = buildPipelinesCollection(pipelinesData);
78
+ const pipelineStagesCollection = buildPipelineStagesCollection(pipelinesData);
79
+ console.log(`Processed ${pipelinesData.length} pipelines`);
80
+ console.log(`Processed ${pipelineStagesCollection.objects.length} pipeline stages`);
81
+ return [pipelinesCollection, pipelineStagesCollection];
82
+ }
83
+ catch (error) {
84
+ console.warn('Failed to fetch pipelines:', error.message);
85
+ return [];
96
86
  }
97
- // Log summary
87
+ }
88
+ async function saveCollectionsAndCreateSummary(collections, postgresCredentials, tablesPrefix) {
98
89
  collectionSummary(collections);
99
- // Convert to table format
100
90
  const tablesRows = collectionsToTables(collections);
101
- // Fill PostgreSQL tables
102
91
  await fillTables({
103
92
  auth: postgresCredentials,
104
93
  tablesRows,
105
94
  tablesPrefix,
106
95
  });
107
- return {
108
- summary: collections.map((c) => ({
109
- table: `${tablesPrefix}${c.schema.name}`,
110
- records: c.objects.length,
111
- })),
112
- };
96
+ return collections.map((collection) => ({
97
+ table: `${tablesPrefix}${collection.schema.name}`,
98
+ records: collection.objects.length,
99
+ }));
100
+ }
101
+ function logFetchOperationDetails(modules, maxResults) {
102
+ console.log(`Fetching data from modules: ${modules.join(', ')}`);
103
+ console.log(`Max results per module: ${maxResults || 'all'}`);
104
+ }
105
+ async function fetchAllModuleCollections(modules, client, maxResults) {
106
+ return await Promise.all(modules.map(async (moduleName) => {
107
+ console.log(`Fetching ${moduleName}...`);
108
+ return await convertZohoCRMModuleToDatabaseCollection(moduleName, client, { maxRecords: maxResults || undefined });
109
+ }));
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 moduleCollections = await fetchAllModuleCollections(modulesWithDependencies, client, maxResults);
117
+ const allCollections = [...moduleCollections];
118
+ if (shouldIncludePipelines) {
119
+ const pipelineCollections = await fetchAndBuildPipelineCollections(client);
120
+ allCollections.push(...pipelineCollections);
121
+ }
122
+ const summary = await saveCollectionsAndCreateSummary(allCollections, postgresCredentials, tablesPrefix);
123
+ return { summary };
113
124
  }
114
125
  //# 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":"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"}
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,8 @@
1
+ import type { Collection, CollectionSchema } from '../collections/types.js';
2
+ import type { ZohoCRMClient, ZohoCRMRecord } from './zoho-crm-client.js';
3
+ export interface ZohoCRMConversionOptions {
4
+ maxRecords?: number;
5
+ }
6
+ export declare function createDatabaseSchemaFromZohoCRMRecords(records: ZohoCRMRecord[], schemaName: string): CollectionSchema;
7
+ export declare function convertZohoCRMModuleToDatabaseCollection(moduleName: string, client: ZohoCRMClient, options?: ZohoCRMConversionOptions): Promise<Collection>;
8
+ //# 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":"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,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAwHD,wBAAgB,sCAAsC,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAarH;AAED,wBAAsB,wCAAwC,CAC5D,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,UAAU,CAAC,CAmBrB"}
@@ -0,0 +1,117 @@
1
+ function createEmptyDatabaseSchema(schemaName) {
2
+ return {
3
+ name: schemaName,
4
+ prepareMode: 'drop',
5
+ columns: [
6
+ { name: 'id', type: 'id' },
7
+ { name: 'raw_data', transform: (record) => JSON.stringify(record) },
8
+ ],
9
+ };
10
+ }
11
+ function extractAllFieldNamesFromRecords(records) {
12
+ const allFieldNames = records
13
+ .flatMap(record => Object.keys(record));
14
+ return [...new Set(allFieldNames)].sort();
15
+ }
16
+ function sanitizeFieldNameForDatabase(fieldName) {
17
+ return fieldName.toLowerCase().replace(/[^a-z0-9_]/g, '_');
18
+ }
19
+ function inferColumnTypeFromFieldName(fieldName) {
20
+ if (fieldName.includes('Date') || fieldName.includes('Time') || fieldName.includes('_time')) {
21
+ return fieldName.includes('Date') && !fieldName.includes('Time') ? 'date' : 'datetime';
22
+ }
23
+ if (fieldName.includes('Amount') || fieldName.includes('Revenue') || fieldName.includes('_amount')) {
24
+ return 'currency';
25
+ }
26
+ if (fieldName.includes('Probability') || fieldName.includes('Rate') || fieldName.includes('_rate') || fieldName.includes('_number')) {
27
+ return 'number';
28
+ }
29
+ if (fieldName.includes('Opt_Out') || fieldName.includes('_opt_out') || fieldName.includes('converted')) {
30
+ return 'bool';
31
+ }
32
+ return 'text';
33
+ }
34
+ function extractSampleValuesFromRecords(records, fieldName, sampleSize = 10) {
35
+ return records
36
+ .slice(0, sampleSize)
37
+ .map((record) => record[fieldName])
38
+ .filter((value) => value !== null && value !== undefined && value !== '');
39
+ }
40
+ function refineColumnTypeFromSampleValue(sampleValue, inferredType) {
41
+ if (typeof sampleValue === 'boolean') {
42
+ return 'bool';
43
+ }
44
+ if (typeof sampleValue === 'number') {
45
+ return 'number';
46
+ }
47
+ if (typeof sampleValue === 'string' && (inferredType === 'date' || inferredType === 'datetime')) {
48
+ const parsedDate = new Date(sampleValue);
49
+ return isNaN(parsedDate.getTime()) ? 'text' : inferredType;
50
+ }
51
+ return inferredType;
52
+ }
53
+ function createColumnsForNestedObject(fieldName, sanitizedColumnName, sampleValue) {
54
+ const nestedProperties = [
55
+ { key: 'name', exists: sampleValue.name },
56
+ { key: 'id', exists: sampleValue.id },
57
+ { key: 'email', exists: sampleValue.email }
58
+ ];
59
+ return nestedProperties
60
+ .filter(property => property.exists)
61
+ .map(property => ({
62
+ name: `${sanitizedColumnName}_${property.key}`,
63
+ path: `${fieldName}.${property.key}`
64
+ }));
65
+ }
66
+ function createColumnFromField(fieldName, records) {
67
+ if (fieldName === 'id') {
68
+ return [{ name: 'record_id', path: 'id' }];
69
+ }
70
+ const sanitizedColumnName = sanitizeFieldNameForDatabase(fieldName);
71
+ let columnType = inferColumnTypeFromFieldName(fieldName);
72
+ const sampleValues = extractSampleValuesFromRecords(records, fieldName);
73
+ if (sampleValues.length > 0) {
74
+ const firstSampleValue = sampleValues[0];
75
+ if (typeof firstSampleValue === 'object' && firstSampleValue !== null) {
76
+ return createColumnsForNestedObject(fieldName, sanitizedColumnName, firstSampleValue);
77
+ }
78
+ columnType = refineColumnTypeFromSampleValue(firstSampleValue, columnType);
79
+ }
80
+ return [{ name: sanitizedColumnName, path: fieldName, type: columnType }];
81
+ }
82
+ function convertFieldsToColumns(fieldNames, records) {
83
+ const baseColumns = [{ name: 'id', type: 'id' }];
84
+ const fieldColumns = fieldNames.flatMap(fieldName => createColumnFromField(fieldName, records));
85
+ const rawDataColumn = [
86
+ { name: 'raw_data', transform: (record) => JSON.stringify(record) }
87
+ ];
88
+ return [...baseColumns, ...fieldColumns, ...rawDataColumn];
89
+ }
90
+ export function createDatabaseSchemaFromZohoCRMRecords(records, schemaName) {
91
+ if (!records || records.length === 0) {
92
+ return createEmptyDatabaseSchema(schemaName);
93
+ }
94
+ const allFieldNames = extractAllFieldNamesFromRecords(records);
95
+ const databaseColumns = convertFieldsToColumns(allFieldNames, records);
96
+ return {
97
+ name: schemaName,
98
+ prepareMode: 'drop',
99
+ columns: databaseColumns,
100
+ };
101
+ }
102
+ export async function convertZohoCRMModuleToDatabaseCollection(moduleName, client, options = {}) {
103
+ const { maxRecords } = options;
104
+ console.log(`Processing module: ${moduleName}`);
105
+ const zohoCRMRecords = await client.getAllRecordsWithFields(moduleName, { maxRecords: maxRecords || undefined });
106
+ const databaseSchema = createDatabaseSchemaFromZohoCRMRecords(zohoCRMRecords, moduleName.toLowerCase());
107
+ const databaseCollection = {
108
+ schema: databaseSchema,
109
+ objects: zohoCRMRecords.map((record, index) => ({
110
+ id: index + 1,
111
+ ...record,
112
+ })),
113
+ };
114
+ console.log(`Processed ${zohoCRMRecords.length} records for module: ${moduleName}`);
115
+ return databaseCollection;
116
+ }
117
+ //# 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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ingeno/pipedream-services",
3
- "version": "1.0.64",
3
+ "version": "1.0.65",
4
4
  "description": "Service utilities for Clarity data integrations",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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"}
@@ -1,114 +0,0 @@
1
- // Helper function to dynamically generate schema from Zoho CRM records
2
- export function generateSchemaFromRecords(records, schemaName) {
3
- if (!records || records.length === 0) {
4
- return {
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
- }
13
- const allFields = new Set();
14
- // Collect all field names from all records
15
- records.forEach((record) => {
16
- Object.keys(record).forEach((key) => {
17
- allFields.add(key);
18
- });
19
- });
20
- // Convert field names to database column definitions
21
- const columns = [{ name: 'id', type: 'id' }];
22
- // Sort fields for consistent ordering
23
- const sortedFields = Array.from(allFields).sort();
24
- sortedFields.forEach((field) => {
25
- // Skip the 'id' field from Zoho as we handle it separately
26
- if (field === 'id') {
27
- columns.push({ name: 'record_id', path: 'id' });
28
- return;
29
- }
30
- const columnName = field.toLowerCase().replace(/[^a-z0-9_]/g, '_');
31
- // Determine data type based on field name patterns and sample data
32
- let type = 'text';
33
- // Check field name patterns
34
- if (field.includes('Date') || field.includes('Time') || field.includes('_time')) {
35
- type = field.includes('Date') && !field.includes('Time') ? 'date' : 'datetime';
36
- }
37
- else if (field.includes('Amount') || field.includes('Revenue') || field.includes('_amount')) {
38
- type = 'currency';
39
- }
40
- else if (field.includes('Probability') ||
41
- field.includes('Rate') ||
42
- field.includes('_rate') ||
43
- field.includes('_number')) {
44
- type = 'number';
45
- }
46
- else if (field.includes('Opt_Out') || field.includes('_opt_out') || field.includes('converted')) {
47
- type = 'bool';
48
- }
49
- // Sample the data to refine type detection
50
- const sampleValues = records
51
- .slice(0, 10)
52
- .map((record) => record[field])
53
- .filter((val) => val !== null && val !== undefined && val !== '');
54
- if (sampleValues.length > 0) {
55
- const sampleValue = sampleValues[0];
56
- if (typeof sampleValue === 'boolean') {
57
- type = 'bool';
58
- }
59
- else if (typeof sampleValue === 'number') {
60
- type = 'number';
61
- }
62
- else if (typeof sampleValue === 'object' && sampleValue !== null) {
63
- // Handle nested objects (like Owner, Account_Name, etc.)
64
- if (sampleValue.name) {
65
- columns.push({ name: `${columnName}_name`, path: `${field}.name` });
66
- }
67
- if (sampleValue.id) {
68
- columns.push({ name: `${columnName}_id`, path: `${field}.id` });
69
- }
70
- if (sampleValue.email) {
71
- columns.push({ name: `${columnName}_email`, path: `${field}.email` });
72
- }
73
- return; // Skip adding the main field since we're handling nested properties
74
- }
75
- else if (typeof sampleValue === 'string') {
76
- // Check if it's a valid date/timestamp string
77
- if (type === 'date' || type === 'datetime') {
78
- // Try to parse the date to validate it's a proper timestamp
79
- const date = new Date(sampleValue);
80
- if (isNaN(date.getTime())) {
81
- // Invalid date, treat as text
82
- type = 'text';
83
- }
84
- }
85
- }
86
- }
87
- columns.push({ name: columnName, path: field, type });
88
- });
89
- // Always add raw_data column for full JSON
90
- columns.push({ name: 'raw_data', transform: (record) => JSON.stringify(record) });
91
- return {
92
- name: schemaName,
93
- prepareMode: 'drop',
94
- columns,
95
- };
96
- }
97
- // Generic function to process any Zoho CRM module
98
- export async function processModule(moduleName, client, options = {}) {
99
- const { maxRecords } = options;
100
- console.log(`Processing module: ${moduleName}`);
101
- const records = await client.getAllRecordsWithFields(moduleName, { maxRecords: maxRecords || undefined });
102
- const schema = generateSchemaFromRecords(records, moduleName.toLowerCase());
103
- // Create collection with manually assigned IDs
104
- const collection = {
105
- schema,
106
- objects: records.map((record, index) => ({
107
- id: index + 1,
108
- ...record,
109
- })),
110
- };
111
- console.log(`Processed ${records.length} records for module: ${moduleName}`);
112
- return collection;
113
- }
114
- //# sourceMappingURL=module-processor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"module-processor.js","sourceRoot":"","sources":["../../src/zoho-crm/module-processor.ts"],"names":[],"mappings":"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"}