import chalk from 'chalk'; import { getGlobalConfig, getProjectPath, loadVariables } from './cluserHelper'; import { parse, stringify } from 'yaml'; import fs from 'fs'; import fg from 'fast-glob'; import path from 'path'; import { createVariable, readVariableKey, readVariableValue, } from './variablesHelper'; import { Dictionary } from 'tsyringe/dist/typings/types'; import { IEntityInfo } from './@types/IEntityInfo'; import { IEntitySearchResult } from './@types/IEntitySearchResult'; import { findTaskAssociation } from './taskAssociationHelper'; import { v4 as uuid } from 'uuid'; import inquirer from 'inquirer'; import { normalizeName } from './profileGeneratorHelper'; import { loadCached } from './entityHelper'; import { findConnectorById } from './connectorHelper'; // pullers: // - id: "**ZaloRecentUserPuller**" // name: |- // [Zalo] Recent User Puller // description: // options: [] // beforePullSteps: [] // pullSteps: [] // afterPullSteps: [] // responseFilters: # puller responseFilter // # for PULLER, items and hasNextPage is required // items: $.*.items // hasNextPage: $.*.hasNextPage export interface IPullerTemplate { id: string; name: string; description?: string; options: string[]; beforePullSteps: string[]; pullSteps: string[]; afterPullSteps: string[]; responseFilters: Dictionary; } export async function createPuller( entityName: string, connectionId: string | null | undefined, ): Promise { const entityType = 'puller'; const entityTypeDisplayName = normalizeName(entityType); if (!entityName) { // 1. Use inquirer to prompt the user for the task name let { name } = await inquirer.prompt([ { type: 'input', name: 'name', message: `ⓘ Enter the ${entityTypeDisplayName.displayName} name:`, validate: (input) => input.trim() !== '' || chalk.red(`✗ ${entityTypeDisplayName.displayName} name is required.`), }, ]); if (!name) { console.error( chalk.red(`✗ ${entityTypeDisplayName.displayName} name is required.`), ); return null; } entityName = name; } // 2. List all connections in project using fast-glob var connections = await loadCached('connection'); var connection = connections.find( (connection) => connection.entityId === connectionId, ); let namePrefix: string = 'HexaSync'; if (!!connection?.entityName) { namePrefix = `${connection.entityName}`; } var normalizedNamePrefix = normalizeName(namePrefix); var normalizedEntityName = normalizeName(entityName); var normalizedConnectionName = normalizeName(connection?.entityName || ''); var baseNamePrefix = normalizedNamePrefix.underscoreDisplayName ? `${normalizedNamePrefix.underscoreDisplayName}__` : ''; var fileName = `${baseNamePrefix}${normalizedEntityName.underscoreDisplayName}_${entityTypeDisplayName.underscoreDisplayName}.yaml`; var targetPath = path.join( getProjectPath(), 'pullers', normalizedConnectionName.dashedSlug, ); if (!fs.existsSync(targetPath)) { fs.mkdirSync(targetPath, { recursive: true }); } var filePath = path.join(targetPath, fileName); if (fs.existsSync(filePath)) { console.error( chalk.red( `✗ ${entityTypeDisplayName.displayName} file already exists: ${chalk.white(filePath)}`, ), ); return null; } var templateIdKey = `${baseNamePrefix}${normalizedEntityName.underscoreDisplayName}_${entityTypeDisplayName.underscoreDisplayName}_Id`; var templateNameKey = `${baseNamePrefix}${normalizedEntityName.underscoreDisplayName}_${entityTypeDisplayName.underscoreDisplayName}_Name`; var templateName = `[${normalizedNamePrefix.displayName}] ${normalizedEntityName.displayName} ${entityTypeDisplayName.displayName}`; var template: IPullerTemplate = { id: createVariable(templateIdKey, uuid()), name: createVariable(templateNameKey, templateName), description: ``, options: [], beforePullSteps: [], pullSteps: [], afterPullSteps: [], responseFilters: { items: '$.*.items', hasNextPage: '$.*.hasNextPage', }, }; fs.writeFileSync( filePath, stringify( { pullers: [template] }, { keepSourceTokens: true, lineWidth: 0 }, ), ); console.log( chalk.green( `✓ Empty ${entityTypeDisplayName.displayName} file created: ${chalk.white(filePath)}`, ), ); return template; }