@diagramers/cli
Version:
Diagramers CLI - Command-line tools for managing Diagramers projects
389 lines (360 loc) • 12.9 kB
JavaScript
"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