fix theme navigation and improve project scaffolding

This commit is contained in:
2026-07-12 16:26:06 +05:30
parent ee98026cc5
commit b21e298d85
33 changed files with 143 additions and 26 deletions
+3 -1
View File
@@ -68,11 +68,13 @@ Before bundling, it regenerates typed queries for the default and every named da
```bash
bun dist/server.js # PORT env var optional
# Generated apps also provide: npm start
# Build and start together: npm run production
```
### `wrnexus create`
Scaffolds a new app from an inline (dependency-free) template — `package.json`, config, and starter `app/` files. Run `wrnexus dev` in the new directory to start.
Scaffolds a new app from an inline (dependency-free) template — `package.json`, `.gitignore`, config, and starter `app/` files. Use `npm run dev` during development, `npm run build && npm start` for production, or `npm run production` to build and start in one command. The generated production server currently requires Bun even when npm is used to manage packages and scripts.
```bash
wrnexus create my-app
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@wrnexus/cli",
"version": "0.2.12",
"version": "0.2.13",
"type": "module",
"main": "src/index.ts",
"exports": {
+1
View File
@@ -250,6 +250,7 @@ export const POST = async (ctx) => {
\`\`\`
wrnexus dev . # dev server + HMR
wrnexus build . # production build → dist/server.js
bun dist/server.js # run the production server (or npm start)
wrnexus create <name> # scaffold a new app
wrnexus generate page <Name> # scaffold a page (aliases: g p)
wrnexus generate component <name> | api <path> | schema <name>
+47
View File
@@ -14,6 +14,51 @@ const TEMPLATE: Record<string, string> = {
// AI/agent context: teaches Claude Code / Cursor / Copilot the WrNexus conventions.
"CLAUDE.md": CLAUDE_MD,
"llms.txt": AI_GUIDE,
".gitignore": `# Dependencies
node_modules/
# WRNexusJS and production builds
dist/
.wrnexus/
**/.wrnexus/
coverage/
# Environment files and local secrets
.env
.env.*
!.env.example
# Logs and runtime files
*.log
logs/
*.pid
*.pid.lock
# Local databases
*.db
*.db-shm
*.db-wal
*.sqlite
*.sqlite3
# Generated native projects
mobile/android/
mobile/ios/
mobile/.expo/
# Editors and operating systems
.idea/
.vscode/
*.swp
*.swo
.DS_Store
Thumbs.db
# TypeScript and test caches
*.tsbuildinfo
.eslintcache
.nyc_output/
`,
"package.json": `{
"name": "APP_NAME",
"version": "0.1.0",
@@ -22,6 +67,8 @@ const TEMPLATE: Record<string, string> = {
"scripts": {
"dev": "wrnexus dev .",
"build": "wrnexus build .",
"start": "bun dist/server.js",
"production": "bun run build && bun run start",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"format": "prettier . --write",
+51
View File
@@ -0,0 +1,51 @@
import { expect, test } from "bun:test";
import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { scaffoldApp } from "../src/create.ts";
test("scaffoldApp creates a comprehensive .gitignore", () => {
const parent = mkdtempSync(join(tmpdir(), "wrnexus-create-"));
const root = join(parent, "demo-app");
try {
scaffoldApp(root, "demo-app");
const file = join(root, ".gitignore");
expect(existsSync(file)).toBe(true);
const contents = readFileSync(file, "utf8");
for (const entry of [
"node_modules/",
"dist/",
".wrnexus/",
".env.*",
"!.env.example",
"*.log",
"*.db",
"coverage/",
"mobile/android/",
".vscode/",
"*.tsbuildinfo",
]) {
expect(contents).toContain(entry);
}
} finally {
rmSync(parent, { recursive: true, force: true });
}
});
test("scaffoldApp includes production build and start scripts", () => {
const parent = mkdtempSync(join(tmpdir(), "wrnexus-create-"));
const root = join(parent, "production-app");
try {
scaffoldApp(root, "production-app");
const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
expect(pkg.scripts.build).toBe("wrnexus build .");
expect(pkg.scripts.start).toBe("bun dist/server.js");
expect(pkg.scripts.production).toBe("bun run build && bun run start");
} finally {
rmSync(parent, { recursive: true, force: true });
}
});