Skip to content

Dev#4

Merged
abhishek-nexgen-dev merged 4 commits into
masterfrom
dev
Jun 27, 2025
Merged

Dev#4
abhishek-nexgen-dev merged 4 commits into
masterfrom
dev

Conversation

@abhishek-nexgen-dev
Copy link
Copy Markdown
Member

No description provided.

… configuration

- Add README.md with detailed project documentation
- Add LICENSE.md (MIT License)
- Add CONTRIBUTING.md with contribution guidelines
- Add CHANGELOG.md for release tracking
- Update package.json with correct scoped name and metadata
- Enhance .gitignore with comprehensive exclusions
- Add .npmignore for clean package publishing
- Setup proper package configuration for npm publishing
… support

- Bump version to 1.0.1
- Add README.md with detailed usage examples and documentation
- Add LICENSE.md with MIT license
- Add CONTRIBUTING.md with contribution guidelines
- Add CHANGELOG.md for version tracking
- Update .gitignore with comprehensive exclusions
- Add .npmignore for proper package publishing
- Add .pnpmrc for pnpm configuration
- Add scripts for both npm and pnpm workflows
- Setup proper package publishing configuration
- Introduced `config.demo.ts` for demo environment variables.
- Created `config.env.create.ts` to generate `.env` files with demo content.
- Added `config.types.ts` for TypeScript type definitions related to configuration.
- Implemented `config.validation.ts` for Zod validation schemas for configuration types.
- Defined database configuration types in `db/Db.type.ts`.
- Added environment variable management in `env.manager.ts`.
- Established constants for environment variables in `constant/env.constant.ts`.
- Defined environment types in `type/env.types.ts`.
…ding

- Added EnvManager class for loading and managing environment variables.
- Created index file for FastKit configuration module to streamline exports.
- Removed outdated test suite for configuration system.
- Updated database configuration types and validation functions.
- Enhanced env.constant.ts to include additional environment variables and defaults.
- Refactored env.types.ts to expand the EnvType interface with new properties.
- Updated tsconfig.json to include all source files for compilation.
@abhishek-nexgen-dev abhishek-nexgen-dev merged commit 4ad7421 into master Jun 27, 2025
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of Changes

Hello @abhishek-nexgen-dev, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces a robust configuration system, enhances package management, provides comprehensive documentation, and sets up testing infrastructure for the FastKit project, laying a solid foundation for future development and usage.

Highlights

  • Dependencies: Added several dependencies including @babel/core, @babel/preset-env, @jest/globals, @types/jest, babel-jest, dotenv, and zod to enhance the project's capabilities.
  • Configuration: Implemented a comprehensive configuration system using .env files, Zod validation, and TypeScript types for managing environment-specific settings.
  • Package Management: Improved package management by adding .npmignore and .pnpmrc files, and updated scripts for building, testing, linting, and publishing with both npm and pnpm.
  • Documentation: Created detailed documentation including CONFIGURATION.md, CONTRIBUTING.md, LICENSE.md, PACKAGE_MANAGERS.md, and README.md to guide users and contributors.
  • Testing: Configured Jest for testing with TypeScript, including settings for ESM, coverage, and watch mode.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the initial version of FastKit, a modular TypeScript toolkit for API development. The changes include a comprehensive, type-safe configuration management system using Zod, along with the foundational project structure, documentation, and development tooling. There are critical and high-severity issues, primarily within the configuration logic, including a bug that will cause runtime errors, the potential for unintentional overwriting of environment files, and code redundancy that impacts maintainability. There are also several medium-severity issues, such as inconsistencies between the documentation and the implementation, and bugs in demo scripts. The feedback provides specific suggestions to address these points to improve the library's robustness and usability.

Comment on lines +11 to +16
private config!: FastKitConfigData;
private envFilePath: string;

constructor(envPath?: string) {
this.envFilePath = envPath || path.join(process.cwd(), '.env');
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

The config property is declared but not initialized in the constructor, which can cause runtime errors. Configuration loading should be an explicit action and not a module-level side effect. Consider loading and validating the configuration within the constructor.

Comment thread package.json
"eslint-plugin-prettier": "^5.5.1",
"globals": "^16.2.0",
"husky": "^9.1.7",
"i": "^0.3.7",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The i package is listed as a dev dependency. This package is a command-line utility for installing packages and is not meant to be a dependency in a project. Remove it to avoid confusion and unnecessary dependencies.

Comment on lines +119 to +122
// Step 3: generate variants
fs.writeFileSync(prodEnv, content, { encoding: 'utf8' });
fs.writeFileSync(testEnv, content, { encoding: 'utf8' });
console.log(`✅ Generated .env.production and .env.test`);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The setupEnvFiles function overwrites .env.production and .env.test. Check if these files exist before writing to them to prevent accidental data loss.

  // Step 3: generate variants if they don't exist
  if (!fs.existsSync(prodEnv)) {
    fs.writeFileSync(prodEnv, content, { encoding: 'utf8' });
    console.log(`✅ Generated .env.production`);
  }
  if (!fs.existsSync(testEnv)) {
    fs.writeFileSync(testEnv, content, { encoding: 'utf8' });
    console.log(`✅ Generated .env.test`);
  }

Comment on lines +1 to +108
import { config } from 'dotenv';
import { EnvType } from '../type/env.types';
import path from 'path';

config({
path: path.join(process.cwd(), '.env'),
});

const getEnvironmentType = (env?: string): 'development' | 'production' | 'test' | 'staging' => {
if (env === 'development' || env === 'production' || env === 'test' || env === 'staging') {
return env;
}
return 'development';
};

const getDatabaseType = (
type?: string,
): 'mongodb' | 'mysql' | 'postgresql' | 'sqlite' | 'redis' => {
if (
type === 'mongodb' ||
type === 'mysql' ||
type === 'postgresql' ||
type === 'sqlite' ||
type === 'redis'
) {
return type;
}
return 'mongodb';
};

const envConstants: EnvType = {
PORT: parseInt(process.env.PORT || '3000'),
HOST: process.env.HOST || 'localhost',
NODE_ENV: getEnvironmentType(process.env.NODE_ENV),
ENVIRONMENT: getEnvironmentType(process.env.ENVIRONMENT || 'development'),
SERVER_TIMEOUT: parseInt(process.env.SERVER_TIMEOUT || '30000', 10),
SERVER_KEEP_ALIVE: process.env.SERVER_KEEP_ALIVE === 'true',
SERVER_BODY_LIMIT: process.env.SERVER_BODY_LIMIT || '100mb',
SERVER_TRUST_PROXY: process.env.SERVER_TRUST_PROXY === 'true',

// ----------------------------
// Database
// ----------------------------
DATABASE_TYPE: getDatabaseType(process.env.DATABASE_TYPE),
DATABASE_URL: process.env.DATABASE_URL || 'mongodb://localhost:27017/fastkit',
DATABASE_HOST: process.env.DATABASE_HOST,
DATABASE_PORT: process.env.DATABASE_PORT ? parseInt(process.env.DATABASE_PORT, 10) : undefined,
DATABASE_USERNAME: process.env.DATABASE_USERNAME,
DATABASE_PASSWORD: process.env.DATABASE_PASSWORD,
DATABASE_NAME: process.env.DATABASE_NAME,
DATABASE_SSL: process.env.DATABASE_SSL === 'true',
DATABASE_POOL_SIZE: process.env.DATABASE_POOL_SIZE
? parseInt(process.env.DATABASE_POOL_SIZE, 10)
: 10,

// ----------------------------
// JWT
// ----------------------------
JWT_SECRET: process.env.JWT_SECRET || 'your-super-secret-jwt-key-change-this-in-production',
JWT_EXPIRES_IN: process.env.JWT_EXPIRES_IN || '24h',
JWT_ALGORITHM: (process.env.JWT_ALGORITHM as EnvType['JWT_ALGORITHM']) || 'HS256',

// ----------------------------
// CORS
// ----------------------------
CORS_ORIGIN:
process.env.CORS_ORIGIN === 'true'
? true
: process.env.CORS_ORIGIN === 'false'
? false
: process.env.CORS_ORIGIN,
CORS_METHODS: process.env.CORS_METHODS,
CORS_ALLOWED_HEADERS: process.env.CORS_ALLOWED_HEADERS,
CORS_CREDENTIALS: process.env.CORS_CREDENTIALS === 'true',

// ----------------------------
// Security
// ----------------------------
RATE_LIMIT_WINDOW_MS: process.env.RATE_LIMIT_WINDOW_MS
? parseInt(process.env.RATE_LIMIT_WINDOW_MS, 10)
: undefined,
RATE_LIMIT_MAX: process.env.RATE_LIMIT_MAX ? parseInt(process.env.RATE_LIMIT_MAX, 10) : undefined,
SECURITY_HELMET: process.env.SECURITY_HELMET === 'true',
SECURITY_COMPRESSION: process.env.SECURITY_COMPRESSION === 'true',
SECURITY_MORGAN: process.env.SECURITY_MORGAN === 'true',

// ----------------------------
// Email
// ----------------------------
EMAIL_SERVICE: process.env.EMAIL_SERVICE as EnvType['EMAIL_SERVICE'],
EMAIL_HOST: process.env.EMAIL_HOST,
EMAIL_PORT: process.env.EMAIL_PORT ? parseInt(process.env.EMAIL_PORT, 10) : undefined,
EMAIL_SECURE: process.env.EMAIL_SECURE === 'true',
EMAIL_USERNAME: process.env.EMAIL_USERNAME,
EMAIL_PASSWORD: process.env.EMAIL_PASSWORD,
EMAIL_FROM: process.env.EMAIL_FROM,

// ----------------------------
// Custom
// ----------------------------
APP_NAME: process.env.APP_NAME,
API_VERSION: process.env.API_VERSION,
MAX_FILE_SIZE: process.env.MAX_FILE_SIZE,
};

console.log('Environment Constants Loaded:', envConstants);

export const EnvConstants = Object.freeze(envConstants);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

This file duplicates the responsibility of parsing, validating, and providing defaults for environment variables. Remove this file and rely solely on the Zod-based validateEnvData function.

Comment on lines +26 to +30
try {
console.log('✅ Sample .env.example file created. Copy it to .env and modify as needed.');
} catch (error) {
console.error('❌ Failed to generate sample .env file:', error);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

When configResult.isValid is false, the script logs that it's generating a sample .env file but doesn't actually call FastKitConfig.generateSampleEnv(). Update the logic to generate the sample env file.

  try {
    FastKitConfig.generateSampleEnv();
    console.log('✅ Sample .env.example file created. Copy it to .env and modify as needed.');
  } catch (error) {
    console.error('❌ Failed to generate sample .env file:', error);
  }

Comment on lines +1 to +23
// import { z } from 'zod';

// export function validateDatabaseConfig(config: unknown): { isValid: boolean; errors: string[]; config?: DatabaseConfig } {
// try {
// const validatedConfig = databaseConfigSchema.parse(config);
// return {
// isValid: true,
// errors: [],
// config: validatedConfig
// };
// } catch (error) {
// if (error instanceof z.ZodError) {
// return {
// isValid: false,
// errors: error.errors.map(err => `${err.path.join('.')}: ${err.message}`),
// };
// }
// return {
// isValid: false,
// errors: ['Unknown validation error'],
// };
// }
// }
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This file consists entirely of commented-out code. Remove dead code from the codebase.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant