UNPKG

@diagramers/cli

Version:

Diagramers CLI - Command-line tools for managing Diagramers projects

389 lines (360 loc) 12.9 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.processTemplate = processTemplate; const fs = __importStar(require("fs")); const path = __importStar(require("path")); async function processTemplate(projectName) { if (!projectName) { throw new Error('Project name is required'); } const currentDir = process.cwd(); // Check for required API project structure const requiredDirs = [ 'src/entities', 'src/schemas', 'src/services', 'src/controllers', 'src/routes' ]; const missingDirs = requiredDirs.filter(dir => !fs.existsSync(path.join(currentDir, dir))); if (missingDirs.length > 0) { throw new Error(`This command should be run from a diagramers API project. Missing directories: ${missingDirs.join(', ')}`); } // Convert project name to database-friendly format const dbName = projectName .toLowerCase() .replace(/[^a-zA-Z0-9]/g, '_') .replace(/_+/g, '_') .replace(/^_|_$/g, ''); console.log(`🗄️ Database name will be: ${dbName}`); // Process configuration files console.log('📝 Updating configuration files...'); // Update development config const devConfigPath = path.join(currentDir, 'src/config/development.ts'); if (fs.existsSync(devConfigPath)) { let devConfig = fs.readFileSync(devConfigPath, 'utf8'); devConfig = devConfig.replace(/mongodb:\/\/127\.0\.0\.1:27017\/[^,\s]+/g, `mongodb://127.0.0.1:27017/${dbName}-development`); fs.writeFileSync(devConfigPath, devConfig); console.log(' ✅ Updated development.ts'); } // Update staging config const stagingConfigPath = path.join(currentDir, 'src/config/staging.ts'); if (fs.existsSync(stagingConfigPath)) { let stagingConfig = fs.readFileSync(stagingConfigPath, 'utf8'); stagingConfig = stagingConfig.replace(/sendifier-staging/g, `${dbName}-staging`); fs.writeFileSync(stagingConfigPath, stagingConfig); console.log(' ✅ Updated staging.ts'); } // Update production config const prodConfigPath = path.join(currentDir, 'src/config/production.ts'); if (fs.existsSync(prodConfigPath)) { let prodConfig = fs.readFileSync(prodConfigPath, 'utf8'); prodConfig = prodConfig.replace(/sendifier-production/g, `${dbName}-production`); fs.writeFileSync(prodConfigPath, prodConfig); console.log(' ✅ Updated production.ts'); } // Update package.json const packageJsonPath = path.join(currentDir, 'package.json'); if (fs.existsSync(packageJsonPath)) { let packageJsonContent = fs.readFileSync(packageJsonPath, 'utf8'); packageJsonContent = packageJsonContent.replace(/"name":\s*"@diagramers\/api"/g, `"name": "${projectName}"`); packageJsonContent = packageJsonContent.replace(/"description":\s*"Diagramers API - A comprehensive Node\.js API template with TypeScript, Firebase Functions, and Socket\.io"/g, `"description": "${projectName} - API project"`); fs.writeFileSync(packageJsonPath, packageJsonContent); console.log(' ✅ Updated package.json'); } // Update README.md const readmePath = path.join(currentDir, 'README.md'); if (fs.existsSync(readmePath)) { let readmeContent = fs.readFileSync(readmePath, 'utf8'); readmeContent = readmeContent.replace(/# @diagramers\/api/g, `# ${projectName}`); readmeContent = readmeContent.replace(/A comprehensive Node\.js API template with TypeScript, Firebase Functions, and Socket\.io\./g, `${projectName} - API project.`); fs.writeFileSync(readmePath, readmeContent); console.log(' ✅ Updated README.md'); } // Create .env file template console.log('📄 Creating .env template...'); const envTemplate = generateEnvTemplate(dbName); fs.writeFileSync(path.join(currentDir, '.env.example'), envTemplate); console.log('✅ Template processing completed!'); console.log(''); console.log('📋 Summary:'); console.log(` Project Name: ${projectName}`); console.log(` Database Name: ${dbName}`); console.log(` Development DB: ${dbName}-development`); console.log(` Staging DB: ${dbName}-staging`); console.log(` Production DB: ${dbName}-production`); console.log(''); console.log('🚀 Next steps:'); console.log(' 1. Copy .env.example to .env and configure your environment variables'); console.log(' 2. Install dependencies: npm install'); console.log(' 3. Build the project: npm run build:dev'); console.log(' 4. Start the server: npm start'); } function generateEnvTemplate(dbName) { return `# Environment Configuration NODE_ENV=development # Server Configuration PORT=4000 HOST=localhost # Database Configuration MONGODB_URI=mongodb://127.0.0.1:27017/${dbName}-development # Logging Configuration LOG_LEVEL=info LOG_FORMAT=colored LOG_COLORS=true LOG_FILE_ENABLED=false LOG_FILE_PATH=./logs/app.log LOG_FILE_MAX_SIZE=10m LOG_FILE_MAX_FILES=5 LOG_DATABASE_ENABLED=false LOG_DATABASE_COLLECTION=logs LOG_EXTERNAL_ENABLED=false LOG_EXTERNAL_TYPE=serilog LOG_EXTERNAL_URL= LOG_EXTERNAL_API_KEY= LOG_EXTERNAL_APP_NAME= # Socket.IO Configuration SOCKETIO_ENABLED=true SOCKETIO_CORS_ORIGIN=* SOCKETIO_CORS_METHODS=GET,POST # Firebase Configuration FIREBASE_ENABLED=false FIREBASE_API_KEY=your-api-key FIREBASE_AUTH_DOMAIN=your-project.firebaseapp.com FIREBASE_PROJECT_ID=your-project-id FIREBASE_STORAGE_BUCKET=your-project.appspot.com FIREBASE_MESSAGING_SENDER_ID=your-sender-id FIREBASE_APP_ID=your-app-id FIREBASE_PRIVATE_KEY=your-private-key FIREBASE_CLIENT_EMAIL=your-client-email # JWT Configuration JWT_SECRET=your-jwt-secret-key JWT_EXPIRES_IN=1h REFRESH_TOKEN_EXPIRES_IN=7d JWT_ISSUER=diagramers-api JWT_AUDIENCE=diagramers-users # OAuth Configuration OAUTH_ENABLED=false GOOGLE_CLIENT_ID=your-google-client-id GOOGLE_CLIENT_SECRET=your-google-client-secret GOOGLE_CALLBACK_URL=http://localhost:4000/api/auth/google/callback FACEBOOK_CLIENT_ID=your-facebook-client-id FACEBOOK_CLIENT_SECRET=your-facebook-client-secret FACEBOOK_CALLBACK_URL=http://localhost:4000/api/auth/facebook/callback GITHUB_CLIENT_ID=your-github-client-id GITHUB_CLIENT_SECRET=your-github-client-secret GITHUB_CALLBACK_URL=http://localhost:4000/api/auth/github/callback # Twilio Configuration (for SMS) TWILIO_ENABLED=false TWILIO_ACCOUNT_SID=your-account-sid TWILIO_AUTH_TOKEN=your-auth-token TWILIO_PHONE_NUMBER=+1234567890 TWILIO_VERIFY_SERVICE_SID=your-verify-service-sid # Email Configuration EMAIL_ENABLED=false SMTP_HOST=smtp.gmail.com SMTP_PORT=587 SMTP_USER=your-email@gmail.com SMTP_PASS=your-app-password EMAIL_FROM=noreply@yourdomain.com EMAIL_TEMPLATES_PATH=./src/assets/email-templates EMAIL_VERIFICATION_ENABLED=true EMAIL_VERIFICATION_EXPIRES_IN=24h # Internal API Configuration INTERNAL_REQUEST_HEADER_VALUE=your-secret-header-value API_RATE_LIMIT_ENABLED=true API_RATE_LIMIT_WINDOW_MS=900000 API_RATE_LIMIT_MAX_REQUESTS=100 # Database Seeding DB_SEED=false DB_SEED_FORCE=false DB_SEED_TRUNCATE=false DB_SEED_RESET=false DB_SEED_PATH=./src/scripts/seeds # Security Configuration CORS_ENABLED=true CORS_ORIGIN=* CORS_CREDENTIALS=false SECURITY_ENABLED=true HELMET_ENABLED=true COMPRESSION_ENABLED=true RATE_LIMIT_ENABLED=true RATE_LIMIT_WINDOW_MS=900000 RATE_LIMIT_MAX_REQUESTS=100 BCRYPT_ROUNDS=12 PASSWORD_MIN_LENGTH=8 PASSWORD_REQUIRE_UPPERCASE=true PASSWORD_REQUIRE_LOWERCASE=true PASSWORD_REQUIRE_NUMBERS=true PASSWORD_REQUIRE_SYMBOLS=true # Session Configuration SESSION_ENABLED=true SESSION_SECRET=your-session-secret SESSION_COOKIE_NAME=diagramers-session SESSION_COOKIE_MAX_AGE=86400000 SESSION_COOKIE_SECURE=false SESSION_COOKIE_HTTP_ONLY=true SESSION_COOKIE_SAME_SITE=lax # File Upload Configuration FILE_UPLOAD_ENABLED=true FILE_UPLOAD_MAX_SIZE=10485760 FILE_UPLOAD_ALLOWED_TYPES=image/jpeg,image/png,image/gif,application/pdf FILE_UPLOAD_PATH=./uploads FILE_UPLOAD_TEMP_PATH=./uploads/temp FILE_UPLOAD_BACKUP_ENABLED=true FILE_UPLOAD_BACKUP_PATH=./uploads/backup # Cache Configuration CACHE_ENABLED=false CACHE_TYPE=memory CACHE_TTL=3600 CACHE_MAX_SIZE=1000 REDIS_ENABLED=false REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD= REDIS_DB=0 REDIS_KEY_PREFIX=diagramers: # Queue Configuration QUEUE_ENABLED=false QUEUE_TYPE=memory QUEUE_RETRY_ATTEMPTS=3 QUEUE_RETRY_DELAY=5000 BULL_REDIS_HOST=localhost BULL_REDIS_PORT=6379 BULL_REDIS_PASSWORD= BULL_REDIS_DB=1 # Monitoring Configuration MONITORING_ENABLED=false HEALTH_CHECK_ENABLED=true HEALTH_CHECK_INTERVAL=30000 METRICS_ENABLED=false METRICS_PORT=9090 APM_ENABLED=false APM_SERVICE_NAME=diagramers-api APM_SERVER_URL=http://localhost:8200 # Optional Configuration BASE_SITE_URL=http://localhost:3000 LOCAL_API_TUNNEL_URL=https://your-ngrok-url.ngrok-free.app LOCAL_UI_TUNNEL_URL=https://your-ui-ngrok-url.ngrok-free.app BACKUP_DATABASES_FOLDER_PATH=/path/to/backup/folder EXTERNAL_HTTP_REQUEST_TIMEOUT=5000 API_VERSION=v1 API_PREFIX=/api SWAGGER_ENABLED=true SWAGGER_TITLE=Diagramers API SWAGGER_DESCRIPTION=API documentation for Diagramers SWAGGER_VERSION=1.0.0 # AWS Configuration (for S3, SNS, etc.) AWS_ENABLED=false AWS_ACCESS_KEY_ID=your-access-key AWS_SECRET_ACCESS_KEY=your-secret-key AWS_REGION=us-east-1 AWS_S3_BUCKET=your-bucket-name AWS_S3_ENDPOINT= AWS_SNS_TOPIC_ARN= AWS_SES_REGION=us-east-1 AWS_SES_FROM_EMAIL=noreply@yourdomain.com # Google Cloud Configuration GOOGLE_CLOUD_ENABLED=false GOOGLE_CLOUD_PROJECT_ID=your-project-id GOOGLE_CLOUD_STORAGE_BUCKET=your-bucket-name GOOGLE_CLOUD_PUBSUB_TOPIC=your-topic-name GOOGLE_CLOUD_CREDENTIALS_PATH=./certs/google-cloud-key.json # Azure Configuration AZURE_ENABLED=false AZURE_STORAGE_ACCOUNT=your-storage-account AZURE_STORAGE_KEY=your-storage-key AZURE_STORAGE_CONTAINER=your-container-name AZURE_SERVICE_BUS_CONNECTION_STRING=your-connection-string AZURE_SERVICE_BUS_QUEUE_NAME=your-queue-name # Stripe Configuration STRIPE_ENABLED=false STRIPE_SECRET_KEY=your-stripe-secret-key STRIPE_PUBLISHABLE_KEY=your-stripe-publishable-key STRIPE_WEBHOOK_SECRET=your-webhook-secret STRIPE_CURRENCY=usd # PayPal Configuration PAYPAL_ENABLED=false PAYPAL_CLIENT_ID=your-paypal-client-id PAYPAL_CLIENT_SECRET=your-paypal-client-secret PAYPAL_MODE=sandbox PAYPAL_CURRENCY=USD # SendGrid Configuration SENDGRID_ENABLED=false SENDGRID_API_KEY=your-sendgrid-api-key SENDGRID_FROM_EMAIL=noreply@yourdomain.com SENDGRID_FROM_NAME=Your App Name # Mailgun Configuration MAILGUN_ENABLED=false MAILGUN_API_KEY=your-mailgun-api-key MAILGUN_DOMAIN=your-domain.com MAILGUN_FROM_EMAIL=noreply@yourdomain.com # Monitoring and Analytics SENTRY_DSN= SENTRY_ENVIRONMENT=development NEW_RELIC_LICENSE_KEY= NEW_RELIC_APP_NAME=diagramers-api GOOGLE_ANALYTICS_ID= MIXPANEL_TOKEN= AMPLITUDE_API_KEY= # Feature Flags FEATURE_AUTH_ENABLED=true FEATURE_EMAIL_ENABLED=true FEATURE_SOCKET_ENABLED=true FEATURE_CRON_ENABLED=true FEATURE_AUDIT_ENABLED=true FEATURE_FILE_UPLOAD_ENABLED=true FEATURE_PAYMENT_ENABLED=false FEATURE_NOTIFICATION_ENABLED=true # Development Configuration DEBUG_ENABLED=true DEBUG_NAMESPACE=diagramers:* HOT_RELOAD_ENABLED=true SOURCE_MAPS_ENABLED=true TYPE_CHECK_ENABLED=true LINT_ENABLED=true TEST_ENABLED=false COVERAGE_ENABLED=false # Production Configuration PRODUCTION_ENABLED=false PRODUCTION_HTTPS_ENABLED=true PRODUCTION_COMPRESSION_ENABLED=true PRODUCTION_CACHE_ENABLED=true PRODUCTION_LOGGING_ENABLED=true PRODUCTION_MONITORING_ENABLED=true `; } //# sourceMappingURL=template-processor.js.map