@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
JavaScript
;
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;