UNPKG

naukri-ninja

Version:

Naukri automation tool to fetch, filter , and apply for jobs automatically using gen ai.

364 lines (343 loc) 9.45 kB
const prompts = require("@inquirer/prompts"); const theme = { // prefix: { idle: "🤔", done: "✅" }, // Custom icons for idle and done // spinner: { // interval: 100, // Speed of animation (in ms) // frames: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"], // Frames of the spinner // }, }; const context = { clearPromptOnDone: true, }; const showMainMenu = async () => { return await prompts.select({ message: "Please select a option : ", choices: [ { name: "Search for new jobs", value: "search-jobs", description: "Search and apply for new jobs", }, { name: "Use previously searched jobs", value: "use-existing-jobs", description: "Use previously searched jobs", }, { name: "Send emails to recruiters", value: "send-emails", description: "Send emails to recruiters", }, { name: "View Analytics", value: "analytics", description: "View your application usage statistics", }, { name: "Configure your preferences", value: "configure", description: "Configure preferences", }, { name: "Reset your account", value: "reset", description: "This will remove all your data and start fresh", }, { name: "Check for updates", value: "check-updates", description: "Check for updates", }, { name: "Exit", value: "exit", description: "Exit the program", }, ], }, context); }; const textModelMenu = async (defaultOption = "gemini-2.0-flash-001") => await prompts.select( { name: "value", message: "Enter the text model (e.g., gemini-2.0-flash-001):", default: defaultOption, choices: [ { name: "gemini-2.0-flash-001 (Recommended)", value: "gemini-2.0-flash-001", }, { name: "gemini-1.5-flash-002", value: "gemini-1.5-flash-002" }, { name: "gemini-1.5-flash-001", value: "gemini-1.5-flash-001" }, { name: "gemini-1.5-pro-002", value: "gemini-1.5-pro-002" }, { name: "gemini-1.5-pro-001", value: "gemini-1.5-pro-001" }, { name: "gemini-1.0-pro-002", value: "gemini-1.0-pro-002" }, { name: "gemini-1.0-pro-001", value: "gemini-1.0-pro-001" }, ], theme, }, context ); const jobSearchMenu = async () => await prompts.select( { message: `Please select a option : `, choices: [ { name: "Search for new jobs", value: 1 }, { name: "Use previously searched jobs", value: 2 }, { name: "Send emails to recruiters", value: 3 }, ], theme, }, context ); const emailMenu = async () => await prompts.select( { message: "Please select an option", default: "skip", choices: [ { name: "Skip", value: "skip" }, { name: "Edit email template", value: "edit" }, { name: "View email template", value: "view" }, { name: "Reset email template", value: "reset" }, { name: "Previous menu", value: "previous" }, { name: "Exit", value: "exit" }, ], theme, }, context ); const subEmailMenu = async () => await prompts.select( { message: "Please select a option: ", choices: [ { name: "Send emails to all emails", value: "send-all" }, { name: "Send emails to selected emails", value: "send-selected" }, { name: "Export emails", value: "export" }, { name: "Clear existing emails", value: "clear" }, { name: "Previous menu", value: "previous" }, { name: "Exit", value: "exit" }, ], theme, }, context ); const jobMatchStrategyMenu = async () => await prompts.select( { message: "Select a strategy to match the jobs", choices: [ { name: "Naukri Matching", value: "naukriMatching", description: "Use Naukri Matching strategy to match the jobs", }, { name: "Keywords Matching", value: "keywords", description: "Match the jobs with keywords provided by you and title of the job", }, { name: "AI Matching", value: "ai", description: "Use Gen AI model to match the jobs", }, { name: "Manual Matching", value: "manual", description: "Manually match the jobs with your confirmation", }, ], theme, }, context ); const enableGenAiMenu = async () => await prompts.select( { message: "Would you like to enable Gen Ai based question answering ?", choices: [ { name: "Yes", value: true, description: "Use gen ai model to generate answers for questions asked in job application.", }, { name: "No", value: false, description: "Skip gen ai setup. This will skip the jobs which require question answering.", }, ], theme, }, context ); const selectGenAiModel = async () => { const res = await prompts.select( { message: "Please select gen ai model to use", choices: [ { name: "Google Gemini Model", value: "gemini" }, { name: "ChatGPT", value: "chatgpt" }, ], theme, }, context ); if (res !== "gemini") { console.log( "There is only gemini model implementation available currently, selecting gemini as default" ); res = "gemini"; } return res; }; const enableManualAnsweringMenu = async () => await prompts.select( { message: "Would you like to manually answer the questions?", choices: [ { name: "No", value: false, description: "Jobs which require question answering will be skipped.", }, { name: "Yes", value: true, description: "You will have to enter the answers manually. (Not recommended, defeats the purpose of automation :) )", }, ], description: "Selecting no will result skipping the jobs which require question answering.", theme, }, context ); const getConfirmation = async (message, defaultAnswer = true, confirm=false) => { let promptFunction = confirm ? prompts.confirm : prompts.select; return await promptFunction( { message: `${message}`, choices: [ { name: "Yes", value: true }, { name: "No", value: false }, ], default: defaultAnswer, theme, }, context ); }; const questionMenu = async (question) => await prompts.select( { message: question.questionName, choices: Object.values(question.answerOption).map((option) => ({ name: option, value: option, })), default: question.answer, theme, }, context ); const checkBoxMenu = async (question) => await prompts.checkbox( { message: question.questionName, choices: Object.values(question.answerOption).map((option) => ({ name: option, value: option, })), default: question.answer, theme, }, context ); const authTypeMenu = async () => await prompts.select( { type: "select", name: "value", message: "Select your authentication type:", choices: [ { name: "API Key (Recommended)", value: "apiKey" }, { name: "Service Account", value: "serviceAccount" }, ], default: genAiConfig.authType || "apiKey", theme, }, context ); const keyFileMenu = async (files) => await prompts.select( { type: "select", name: "value", message: "Select your Google Cloud service account key file:", choices: files.map((file) => ({ name: file, value: file })), theme, }, context ); const selectProfileMenu = async (profiles) => await prompts.select( { message: `Select a profile from the following list`, choices: profiles .map((profile, index) => ({ name: profile.id, value: index + 1 })) .concat([ new prompts.Separator(), { name: "Add New Profile", value: -1 }, { name: "About the author", value: "about" }, { name: "Exit", value: "exit" }, ]), theme, }, context ); const selectEmails = async (recipients) => await prompts.checkbox({ message: "Select the emails you want to send the email to", choices: recipients.map((recipient) => ({ name: recipient.title, value: recipient, description: `Company: ${recipient.company}\nPosition: ${recipient.title}\nEmail: ${recipient.email}`, checked: true, })), theme, }, context ); const passwordPrompt = async (message) => await prompts.password({ message, mask: "*", validate: (value) => { if (!value) return "Password is required"; return true; }, }); module.exports = { showMainMenu, textModelMenu, jobSearchMenu, emailMenu, subEmailMenu, jobMatchStrategyMenu, enableGenAiMenu, selectGenAiModel, enableManualAnsweringMenu, getConfirmation, questionMenu, checkBoxMenu, authTypeMenu, keyFileMenu, selectProfileMenu, selectEmails, passwordPrompt, };