UNPKG

@quell/server

Version:

Quell is an open-source NPM package providing a light-weight caching layer implementation and cache invalidation for GraphQL responses on both the client- and server-side. Use Quell to prevent redundant client-side API requests and to minimize costly serv

174 lines (173 loc) • 10.8 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.initCommand = void 0; const logger_1 = require("../utils/logger"); const file_helpers_1 = require("../utils/file-helpers"); const env_template_1 = require("../templates/env.template"); const config_template_1 = require("../templates/config.template"); const server_template_1 = require("../templates/server.template"); const schema_template_1 = require("../templates/schema.template"); const gitignore_template_1 = require("../templates/gitignore.template"); const package_template_1 = require("../templates/package.template"); function initCommand(options = {}) { return __awaiter(this, void 0, void 0, function* () { try { logger_1.logger.title('\nšŸš€ Initializing Quell in your project...\n'); // Check if we're in a valid directory const currentDir = (0, file_helpers_1.getCurrentDirName)(); const packageManager = (0, file_helpers_1.detectPackageManager)(); logger_1.logger.info(`Setting up Quell in: ${currentDir}`); logger_1.logger.info(`Detected package manager: ${packageManager}`); // Create basic directory structure yield (0, file_helpers_1.createDirectories)(['src', 'src/server', 'src/server/schema']); // 1. Create .env file logger_1.logger.log('\nCreating configuration files...'); const envResult = yield (0, file_helpers_1.createFile)('.env', env_template_1.envTemplate, options.force); if (envResult.created) { logger_1.logger.success('Created .env file with Redis configuration'); } else if (envResult.existed) { logger_1.logger.warning('.env file already exists (use --force to overwrite)'); } // 2. Create Quell config file const configResult = yield (0, file_helpers_1.createFile)('quell-config.ts', config_template_1.configTemplate, options.force); if (configResult.created) { logger_1.logger.success('Created quell-config.ts'); } else if (configResult.existed) { logger_1.logger.warning('quell-config.ts already exists (use --force to overwrite)'); } // 3. Create example server file if requested if (options.example) { const serverResult = yield (0, file_helpers_1.createFile)('src/server/example-server.ts', server_template_1.serverTemplate, options.force); if (serverResult.created) { logger_1.logger.success('Created src/server/example-server.ts with example GraphQL server'); } const schemaResult = yield (0, file_helpers_1.createFile)('src/server/schema/example-schema.ts', schema_template_1.schemaTemplate, options.force); if (schemaResult.created) { logger_1.logger.success('Created src/server/schema/example-schema.ts with example schema'); } } // 4. Update .gitignore const gitignoreResult = yield (0, file_helpers_1.updateGitignore)(gitignore_template_1.gitignoreAdditions); if (gitignoreResult.created) { logger_1.logger.success('Updated .gitignore'); } else { logger_1.logger.info('.gitignore already contains Quell entries'); } // 5. Update package.json const packageResult = yield (0, file_helpers_1.updatePackageJson)(package_template_1.packageScriptsAdditions, package_template_1.packageDependencies, package_template_1.packageDevDependencies); if (packageResult.created) { if (packageResult.existed) { logger_1.logger.success('Updated package.json with Quell scripts'); } else { logger_1.logger.success('Created package.json'); } } // 6. Install dependencies automatically (unless --skip-install) if (!options.skipInstall) { logger_1.logger.log('\nInstalling dependencies...'); // Check existing package.json for missing dependencies const packageJson = yield (0, file_helpers_1.readPackageJson)(); const missingDeps = package_template_1.packageDependencies.filter(dep => { var _a, _b; return !((_a = packageJson === null || packageJson === void 0 ? void 0 : packageJson.dependencies) === null || _a === void 0 ? void 0 : _a[dep]) && !((_b = packageJson === null || packageJson === void 0 ? void 0 : packageJson.devDependencies) === null || _b === void 0 ? void 0 : _b[dep]); }); const missingDevDeps = package_template_1.packageDevDependencies.filter(dep => { var _a, _b; return !((_a = packageJson === null || packageJson === void 0 ? void 0 : packageJson.devDependencies) === null || _a === void 0 ? void 0 : _a[dep]) && !((_b = packageJson === null || packageJson === void 0 ? void 0 : packageJson.dependencies) === null || _b === void 0 ? void 0 : _b[dep]); }); if (missingDeps.length > 0 || missingDevDeps.length > 0) { const installResult = yield (0, file_helpers_1.installPackages)(missingDeps, missingDevDeps, logger_1.logger); if (installResult.success) { logger_1.logger.success('All dependencies installed successfully! šŸ“¦'); } else { logger_1.logger.error(`Failed to install dependencies: ${installResult.error}`); logger_1.logger.warning('You can install manually with:'); if (missingDeps.length > 0) { logger_1.logger.code(` ${packageManager} ${packageManager === 'npm' ? 'install' : 'add'} ${missingDeps.join(' ')}`); } if (missingDevDeps.length > 0) { const devFlag = packageManager === 'npm' ? 'install -D' : 'add -D'; logger_1.logger.code(` ${packageManager} ${devFlag} ${missingDevDeps.join(' ')}`); } } } else { logger_1.logger.info('All dependencies already installed'); } } else { logger_1.logger.info('Skipping dependency installation (--skip-install)'); } // Print success summary logger_1.logger.log('\n' + '='.repeat(60)); logger_1.logger.success('Quell initialization complete! šŸŽ‰'); logger_1.logger.log('='.repeat(60)); // Print next steps logger_1.logger.title('\nNext steps:'); logger_1.logger.log(''); // Step 1: Install dependencies (if skipped) if (options.skipInstall) { logger_1.logger.info('1. Install dependencies:'); logger_1.logger.code(` ${packageManager} ${packageManager === 'npm' ? 'install' : 'install'}`); logger_1.logger.log(''); } // Step 2: Redis setup const stepNum = options.skipInstall ? '2' : '1'; logger_1.logger.info(`${stepNum}. Set up Redis:`); logger_1.logger.log(' • Install Redis locally: https://redis.io/docs/getting-started/installation/'); logger_1.logger.log(' • Or use a cloud provider like Redis Cloud, Upstash, or Railway'); logger_1.logger.log(' • Update Redis credentials in your .env file'); logger_1.logger.log(''); // Step 3: Configuration const step3Num = options.skipInstall ? '3' : '2'; logger_1.logger.info(`${step3Num}. Configure your GraphQL schema:`); if (options.example) { logger_1.logger.log(' • Modify the example schema in src/schema.ts'); logger_1.logger.log(' • Replace sample data with your database queries'); } else { logger_1.logger.log(' • Create your GraphQL schema file'); logger_1.logger.log(' • Update quell-config.ts to use your schema'); } logger_1.logger.log(''); // Step 4: Usage const step4Num = options.skipInstall ? '4' : '3'; logger_1.logger.info(`${step4Num}. Use Quell in your GraphQL server:`); logger_1.logger.code(' import { quellCache } from \'./quell-config\';'); logger_1.logger.code(' app.use(\'/graphql\', quellCache.query);'); logger_1.logger.log(''); // Example usage if (options.example) { const step5Num = options.skipInstall ? '5' : '4'; logger_1.logger.info(`${step5Num}. Run the example server:`); logger_1.logger.code(' npm run dev'); logger_1.logger.log(' Visit http://localhost:4000/graphql for GraphiQL'); logger_1.logger.log(''); } // Additional resources logger_1.logger.info('šŸ“š Learn more:'); logger_1.logger.log(' • Documentation: https://github.com/open-source-labs/Quell'); logger_1.logger.log(' • Redis setup guide: https://redis.io/docs/getting-started/'); logger_1.logger.log(' • GraphQL best practices: https://graphql.org/learn/best-practices/'); logger_1.logger.log(''); // Redis connection test suggestion logger_1.logger.info('šŸ’” Pro tip:'); logger_1.logger.log(' Test your Redis connection with: redis-cli ping'); logger_1.logger.log(' (should return PONG if Redis is running)'); logger_1.logger.log(''); } catch (error) { logger_1.logger.error(`Failed to initialize Quell: ${error instanceof Error ? error.message : String(error)}`); process.exit(1); } }); } exports.initCommand = initCommand;