Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/easy-pans-wink.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"create-express-forge": major
"@repo/lint-config": minor
"@repo/typescript-config": minor
---

### 🚀 Core CLI & Codebase Modernization
5 changes: 5 additions & 0 deletions .changeset/shy-papers-peel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"create-express-forge": major
---

### 🚀 Core CLI & Codebase Modernization- **Unified Tooling**: Migrated the entire monorepo to **Biome 2.4**, achieving sub-100ms linting and formatting.- **Generator Refactor**: Re-architected the generator logic into modular, testable components (Base, Structure, Features).- **Pro Testing Suite**: - Separated internal logic tests (`main.test.ts`) from CLI E2E tests (`smoke.integration.test.ts`). - Disabled test caching in Turborepo to ensure 100% reliable smoke runs.- **Modern Templates**: - Updated to **Express 5** (native async error handling) and **Prisma 6**. - Implemented professional **multi-stage Docker builds** (Node 20 Alpine). - Integrated **Biome** as the default linter/formatter for all generated projects.- **Production Hardening**: Added graceful shutdown handlers (SIGTERM/SIGINT) and fail-fast database connection checks on startup.- **Infrastructure**: Renamed and modernized shared monorepo configs (`@repo/lint-config`).
6 changes: 6 additions & 0 deletions .changeset/tidy-mammals-stay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@repo/lint-config": minor
"@repo/typescript-config": minor
---

Internal refactor
8 changes: 7 additions & 1 deletion .eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
module.exports = {
root: true,
ignorePatterns: ["dist", "node_modules", "packages/**/*", "docs/**/*", "examples/**/*"],
ignorePatterns: [
"dist",
"node_modules",
"packages/**/*",
"docs/**/*",
"examples/**/*",
],
};
14 changes: 14 additions & 0 deletions biome.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"$schema": "https://biomejs.dev/schemas/2.4.13/schema.json",
"extends": ["./packages/lint-config/biome.base.json"],
"files": {
"includes": [
"!**/dist",
"!**/node_modules",
"!**/pnpm-lock.yaml",
"!.turbo",
"!docs/.vitepress/cache",
"!docs/.vitepress/dist"
]
}
}
31 changes: 27 additions & 4 deletions docs/.vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,31 @@ export default defineConfig({

head: [
["link", { rel: "icon", href: `${base}logo.svg` }],
["meta", { name: "keywords", content: "express, typescript, nodejs, backend, api, generator, scaffold, prisma, sequelize, architecture, mvc, modular, rest-api, server-boilerplate" }],
[
"meta",
{
name: "keywords",
content:
"express, typescript, nodejs, backend, api, generator, scaffold, prisma, sequelize, architecture, mvc, modular, rest-api, server-boilerplate",
},
],
["meta", { name: "author", content: "Yatharth Lakhate" }],
["meta", { property: "og:type", content: "website" }],
["meta", { property: "og:title", content: "Express Forge | The Ultimate Express + TypeScript Generator" }],
["meta", { property: "og:description", content: "Scaffold production-ready Express.js TypeScript backends in seconds with built-in Auth, ORM, and OpenAPI support." }],
[
"meta",
{
property: "og:title",
content: "Express Forge | The Ultimate Express + TypeScript Generator",
},
],
[
"meta",
{
property: "og:description",
content:
"Scaffold production-ready Express.js TypeScript backends in seconds with built-in Auth, ORM, and OpenAPI support.",
},
],
],

themeConfig: {
Expand All @@ -29,7 +49,10 @@ export default defineConfig({
{ text: "Guide", link: "/guide/getting-started" },
{ text: "Features", link: "/guide/features" },
{ text: "Reference", link: "/reference/cli-options" },
{ text: "⭐ Star on GitHub", link: "https://github.com/CODE-Y02/express-cli" },
{
text: "⭐ Star on GitHub",
link: "https://github.com/CODE-Y02/express-cli",
},
],

sidebar: [
Expand Down
110 changes: 63 additions & 47 deletions docs/.vitepress/theme/custom.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,127 +8,143 @@
--vp-c-brand-2: #4f46e5; /* Indigo 600 */
--vp-c-brand-3: #818cf8; /* Indigo 400 */
--vp-c-brand-next: #06b6d4; /* Cyan 500 */

--vp-c-brand-soft: rgba(99, 102, 241, 0.12);

/* Typography Visibility */
--vp-c-text-1: #1e293b; /* Slate 800 */
--vp-c-text-2: #475569; /* Slate 600 */

/* Hero Gradient */
--vp-home-hero-name-color: transparent;
--vp-home-hero-name-background: linear-gradient(135deg, #6366f1 0%, #06b6d4 100%);

--vp-home-hero-image-background-image: radial-gradient(circle, rgba(99, 102, 241, 0.2) 0%, rgba(6, 182, 212, 0.15) 100%);
--vp-home-hero-name-background: linear-gradient(
135deg,
#6366f1 0%,
#06b6d4 100%
);

--vp-home-hero-image-background-image: radial-gradient(
circle,
rgba(99, 102, 241, 0.2) 0%,
rgba(6, 182, 212, 0.15) 100%
);
--vp-home-hero-image-filter: blur(60px);
}

.dark {
--vp-c-brand-1: #818cf8;
--vp-c-brand-2: #6366f1;
--vp-c-brand-3: #a5b4fc;

--vp-c-text-1: #f8fafc; /* Slate 50 */
--vp-c-text-2: #94a3b8; /* Slate 400 */

--vp-c-bg: #0f172a; /* Slate 900 - Deep Obsidian */
--vp-c-bg-soft: #1e293b; /* Slate 800 */
--vp-c-bg-mute: #1e293b;
}

/* Hero Section Enhancements */
.VPHero {
margin-top: calc(var(--vp-nav-height) + 32px) !important;
padding: 0 32px !important;
margin-top: calc(var(--vp-nav-height) + 32px);
padding: 0 32px;
}

@media (min-width: 640px) {
.VPHero {
padding: 0 48px !important;
padding: 0 48px;
}
}

@media (min-width: 960px) {
.VPHero {
padding: 0 64px !important;
padding: 0 64px;
}
}

.name {
font-weight: 900 !important;
letter-spacing: -0.02em !important;
font-weight: 900;
letter-spacing: -0.02em;
}

/* Feature Cards */
.VPFeatures {
padding: 64px 32px !important;
padding: 64px 32px;
}

.VPFeature {
border: 1px solid var(--vp-c-divider) !important;
background-color: var(--vp-c-bg-soft) !important;
transition: all 0.4s cubic-bezier(0.2, 1, 0.2, 1) !important;
border-radius: 16px !important;
border: 1px solid var(--vp-c-divider);
background-color: var(--vp-c-bg-soft);
transition: all 0.4s cubic-bezier(0.2, 1, 0.2, 1);
border-radius: 16px;
}

.VPFeature:hover {
border-color: var(--vp-c-brand-1) !important;
border-color: var(--vp-c-brand-1);
transform: translateY(-8px) scale(1.02);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.12);
background-color: var(--vp-c-bg) !important;
background-color: var(--vp-c-bg);
}

/* Dark Mode Overrides */
.dark .VPFeature {
background-color: rgba(30, 41, 59, 0.5) !important;
background-color: rgba(30, 41, 59, 0.5);
backdrop-filter: blur(8px);
}

.dark .VPFeature:hover {
background-color: #1e293b !important;
background-color: #1e293b;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
}

/* Typography & Content Visibility */
:root {
--vp-font-family-base: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
--vp-font-family-base:
"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
}

h1, h2, h3, h4, h5, h6 {
h1,
h2,
h3,
h4,
h5,
h6 {
letter-spacing: -0.02em;
font-weight: 800 !important;
font-weight: 800;
color: var(--vp-c-text-1);
}

.VPHero .tagline {
color: var(--vp-c-text-2) !important;
font-weight: 500 !important;
font-size: 1.25rem !important;
max-width: 600px !important;
margin-left: auto !important;
margin-right: auto !important;
color: var(--vp-c-text-2);
font-weight: 500;
font-size: 1.25rem;
max-width: 600px;
margin-left: auto;
margin-right: auto;
}

/* Code Block Visibility */
.vp-doc [class*='language-'] {
border-radius: 12px !important;
border: 1px solid var(--vp-c-divider) !important;
.vp-doc [class*="language-"] {
border-radius: 12px;
border: 1px solid var(--vp-c-divider);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
}

.dark .vp-doc [class*='language-'] {
background-color: #0f172a !important;
.dark .vp-doc [class*="language-"] {
background-color: #0f172a;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}

/* Hero Buttons */
.VPHero .actions {
justify-content: center !important;
gap: 12px !important;
justify-content: center;
gap: 12px;
}

/* Overflow & Clipping Prevention */
.vp-doc p, .vp-doc li {
.vp-doc p,
.vp-doc li {
overflow-wrap: break-word;
}

Expand All @@ -138,7 +154,7 @@ h1, h2, h3, h4, h5, h6 {
}

.VPSidebarItem.level-0 > .item > .text {
font-weight: 700 !important;
font-weight: 700;
}

/* Table Responsiveness */
Expand All @@ -152,22 +168,22 @@ h1, h2, h3, h4, h5, h6 {
}

/* Code Block Wrapping */
.vp-doc [class*='language-'] pre {
white-space: pre-wrap !important;
word-break: break-all !important;
.vp-doc [class*="language-"] pre {
white-space: pre-wrap;
word-break: break-all;
}

/* Hero Section Responsiveness */
@media (max-width: 640px) {
.VPHero .name {
font-size: 2.5rem !important;
line-height: 1.1 !important;
font-size: 2.5rem;
line-height: 1.1;
}
.VPHero .text {
font-size: 1.5rem !important;
font-size: 1.5rem;
}
.VPHero .tagline {
font-size: 1rem !important;
font-size: 1rem;
padding: 0 16px;
}
}
Expand Down
2 changes: 1 addition & 1 deletion docs/.vitepress/theme/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import "./custom.css";

export default {
extends: DefaultTheme,
enhanceApp({}) {
enhanceApp() {
// register your custom global components
},
};
5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"build": "turbo run build",
"dev": "turbo run dev",
"lint": "turbo run lint",
"format": "prettier --write \"**/*.{ts,tsx,md,json}\"",
"format": "biome format --write .",
"check-types": "turbo run check-types",
"test": "turbo run test",
"changeset": "changeset",
Expand All @@ -17,10 +17,9 @@
"prepare": "husky"
},
"devDependencies": {
"@biomejs/biome": "^2.4.13",
"@changesets/cli": "^2.27.7",
"eslint": "^8.57.0",
"husky": "^9.1.7",
"prettier": "^3.3.3",
"turbo": "^2.0.9",
"typescript": "5.5.3"
},
Expand Down
10 changes: 6 additions & 4 deletions packages/create-express-forge/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
},
"files": [
"dist",
"templates",
"README.md",
"CHANGELOG.md"
],
Expand All @@ -47,22 +48,23 @@
"dev": "tsx src/index.ts",
"build": "tsup",
"check-types": "tsc --noEmit",
"lint": "eslint . --max-warnings 0",
"lint": "biome lint .",
"test": "vitest run",
"test:smoke": "vitest run tests/smoke.integration.test.ts"
},
"dependencies": {
"@inquirer/prompts": "^7.1.0",
"chalk": "^5.3.0",
"commander": "^12.1.0",
"eta": "^3.5.0",
"execa": "^9.3.0",
"fs-extra": "^11.2.0",
"ora": "^8.1.1"
"ora": "^8.1.1",
"pkg-types": "^1.2.0"
},
"devDependencies": {
"@repo/eslint-config": "workspace:*",
"@repo/lint-config": "workspace:*",
"@repo/typescript-config": "workspace:*",
"eslint": "^8.57.0",
"@types/fs-extra": "^11.0.4",
"@types/node": "^20.14.0",
"tsup": "^8.1.0",
Expand Down
Loading
Loading