UNPKG

novu

Version:

Novu CLI. Run Novu Studio and sync workflows with Novu Cloud

154 lines (153 loc) 5.79 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.init = init; const picocolors_1 = require("picocolors"); const path_1 = __importDefault(require("path")); const prompts_1 = __importDefault(require("prompts")); const fs_1 = __importDefault(require("fs")); const create_app_1 = require("./create-app"); const validate_pkg_1 = require("./helpers/validate-pkg"); const is_folder_empty_1 = require("./helpers/is-folder-empty"); const analytics_service_1 = require("../../services/analytics.service"); const analytics = new analytics_service_1.AnalyticService(); const programName = 'novu init'; const onPromptState = (state) => { if (state.aborted) { process.stdout.write('\x1B[?25h'); process.stdout.write('\n'); process.exit(1); } }; async function init(program, anonymousId) { var _a; if (anonymousId) { analytics.track({ identity: { anonymousId, }, data: {}, event: 'Run Novu Init Command', }); } let { projectPath } = program; if (typeof projectPath === 'string') { projectPath = projectPath.trim(); } if (!projectPath) { const res = await (0, prompts_1.default)({ onState: onPromptState, type: 'text', name: 'path', message: 'What is your project named?', initial: 'my-novu-app', validate: (name) => { const validation = (0, validate_pkg_1.validateNpmName)(path_1.default.basename(path_1.default.resolve(name))); if (validation.valid) { return true; } return `Invalid project name: ${validation.problems[0]}`; }, }); if (typeof res.path === 'string') { projectPath = res.path.trim(); } } if (!projectPath) { console.log('\nPlease specify the project directory:\n' + ` ${(0, picocolors_1.cyan)(programName)} ${(0, picocolors_1.green)('<project-directory>')}\n` + 'For example:\n' + ` ${(0, picocolors_1.cyan)(programName)} ${(0, picocolors_1.green)('my-novu-app')}\n\n` + `Run ${(0, picocolors_1.cyan)(`${programName} --help`)} to see all options.`); process.exit(1); } const resolvedProjectPath = path_1.default.resolve(projectPath); const projectName = path_1.default.basename(resolvedProjectPath); const validation = (0, validate_pkg_1.validateNpmName)(projectName); if (!validation.valid) { console.error(`Could not create a project called ${(0, picocolors_1.red)(`"${projectName}"`)} because of npm naming restrictions:`); validation.problems.forEach((problem) => console.error(` ${(0, picocolors_1.red)((0, picocolors_1.bold)('*'))} ${problem}`)); process.exit(1); } let applicationId; let userId; if (!program.secretKey) { program.secretKey = ''; } else { try { const response = await fetch(`${program.apiUrl}/v1/users/me`, { headers: { Authorization: `ApiKey ${program.secretKey}`, }, }); if (!response.ok) { throw new Error('Failed to fetch api key details'); } const user = await response.json(); userId = (_a = user.data) === null || _a === void 0 ? void 0 : _a._id; const integrationsResponse = await fetch(`${program.apiUrl}/v1/environments/me`, { headers: { Authorization: `ApiKey ${program.secretKey}`, }, }); const environment = await integrationsResponse.json(); applicationId = environment.data.identifier; analytics.alias({ previousId: anonymousId, userId, }); } catch (error) { console.error(`Failed to verify your secret key against ${program.apiUrl}. For EU instances use --api-url https://eu.api.novu.co or provide the correct secret key`); process.exit(1); } } const root = path_1.default.resolve(resolvedProjectPath); const appName = path_1.default.basename(root); const folderExists = fs_1.default.existsSync(root); if (folderExists && !(0, is_folder_empty_1.isFolderEmpty)(root, appName)) { console.error("The supplied project directory isn't empty, please provide an empty or non existing directory."); process.exit(1); } const preferences = {}; const defaults = { typescript: true, eslint: true, app: true, srcDir: false, importAlias: '@/*', customizeImportAlias: false, }; if (userId || anonymousId) { analytics.track({ identity: userId ? { userId } : { anonymousId }, data: { name: projectName, }, event: 'Creating a new project', }); } await (0, create_app_1.createApp)({ appPath: resolvedProjectPath, packageManager: 'npm', typescript: defaults.typescript, eslint: defaults.eslint, srcDir: defaults.srcDir, importAlias: defaults.importAlias, secretKey: program.secretKey, applicationId, userId, }); if (userId || anonymousId) { analytics.track({ identity: userId ? { userId } : { anonymousId }, data: { name: projectName, }, event: 'Project created', }); } }