speexjs 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +52 -2
- package/dist/cli/index.js.map +1 -1
- package/package.json +3 -2
package/dist/cli/index.js
CHANGED
|
@@ -552,11 +552,61 @@ dist/
|
|
|
552
552
|
*.log
|
|
553
553
|
`
|
|
554
554
|
}
|
|
555
|
+
},
|
|
556
|
+
spark: {
|
|
557
|
+
dirs: ["src", "src/controllers", "src/middleware", "src/config", "src/database/migrations", "src/models"],
|
|
558
|
+
files: {
|
|
559
|
+
"package.json": (name) => JSON.stringify({
|
|
560
|
+
name,
|
|
561
|
+
version: "0.1.0",
|
|
562
|
+
type: "module",
|
|
563
|
+
private: true,
|
|
564
|
+
scripts: { dev: "speexjs serve", build: "tsc", start: "node dist/index.js", lint: "biome check src/" },
|
|
565
|
+
dependencies: { speexjs: "latest" },
|
|
566
|
+
devDependencies: { "@types/node": "^26.0.1", tsx: "^4.19.0", typescript: "^5.7.0" }
|
|
567
|
+
}, null, 2),
|
|
568
|
+
"tsconfig.json": JSON.stringify({
|
|
569
|
+
compilerOptions: { target: "ES2022", module: "ESNext", moduleResolution: "bundler", strict: true, outDir: "./dist", rootDir: "./src", skipLibCheck: true },
|
|
570
|
+
include: ["src/**/*.ts"],
|
|
571
|
+
exclude: ["node_modules", "dist"]
|
|
572
|
+
}, null, 2),
|
|
573
|
+
"src/index.ts": `import { speexjs } from 'speexjs/server'
|
|
574
|
+
import { schema } from 'speexjs/schema'
|
|
575
|
+
|
|
576
|
+
const app = speexjs()
|
|
577
|
+
const PORT = Number(process.env.PORT) || 3000
|
|
578
|
+
|
|
579
|
+
app.use(app.router.cors())
|
|
580
|
+
app.use(app.router.bodyParser())
|
|
581
|
+
app.use(app.router.csrf())
|
|
582
|
+
|
|
583
|
+
app.get('/api/health', async ({ response }) => {
|
|
584
|
+
return response.json({ status: 'ok', timestamp: new Date().toISOString() })
|
|
585
|
+
})
|
|
586
|
+
|
|
587
|
+
app.listen(PORT, () => {
|
|
588
|
+
console.log(\`\u26A1 SpeexJS API running on http://localhost:\${PORT}\`)
|
|
589
|
+
})
|
|
590
|
+
`,
|
|
591
|
+
"src/config/index.ts": `export const Config = {
|
|
592
|
+
port: Number(process.env.PORT) || 3000,
|
|
593
|
+
env: process.env.NODE_ENV || 'development',
|
|
594
|
+
isProd: process.env.NODE_ENV === 'production',
|
|
595
|
+
appKey: process.env.APP_KEY || '',
|
|
596
|
+
} as const
|
|
597
|
+
`,
|
|
598
|
+
".env.example": `PORT=3000
|
|
599
|
+
NODE_ENV=development
|
|
600
|
+
APP_KEY=
|
|
601
|
+
`,
|
|
602
|
+
".gitignore": "node_modules/\ndist/\n.env\n*.log\n"
|
|
603
|
+
}
|
|
555
604
|
}
|
|
556
605
|
};
|
|
557
606
|
var TEMPLATE_ALIASES = {
|
|
558
607
|
api: "api-only",
|
|
559
|
-
full: "fullstack"
|
|
608
|
+
full: "fullstack",
|
|
609
|
+
spark: "spark"
|
|
560
610
|
};
|
|
561
611
|
function getTemplate(name) {
|
|
562
612
|
return TEMPLATE_ALIASES[name] ?? name;
|
|
@@ -575,7 +625,7 @@ async function initProject(name, options) {
|
|
|
575
625
|
if (!template) {
|
|
576
626
|
console.error(
|
|
577
627
|
colors.red(
|
|
578
|
-
`Unknown template '${options.template}'. Use: blank, fullstack, api-only`
|
|
628
|
+
`Unknown template '${options.template}'. Use: blank, fullstack, api-only, spark`
|
|
579
629
|
)
|
|
580
630
|
);
|
|
581
631
|
process.exit(1);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/native/args.ts","../../src/native/colors.ts","../../src/cli/commands/init.ts","../../src/cli/commands/make-controller.ts","../../src/cli/commands/make-middleware.ts","../../src/cli/commands/make-schema.ts","../../src/cli/commands/make-migration.ts","../../src/cli/commands/make-model.ts","../../src/cli/commands/list-routes.ts","../../src/cli/commands/serve.ts","../../src/native/logger.ts","../../src/cli/index.ts"],"sourcesContent":["export interface ParsedArgs {\n command: string\n subcommand?: string\n args: string[]\n options: Record<string, string | boolean | string[]>\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2)\n const result: ParsedArgs = {\n command: '',\n args: [],\n options: {},\n }\n\n if (args.length === 0) return result\n\n const first = args[0]!\n\n if (first.includes(':')) {\n result.command = first\n parseOptions(args.slice(1), result)\n return result\n }\n\n result.command = first\n\n if (args.length > 1) {\n const second = args[1]!\n if (!second.startsWith('-')) {\n result.subcommand = second\n result.args.push(second)\n parseOptions(args.slice(2), result)\n return result\n }\n }\n\n parseOptions(args.slice(1), result)\n return result\n}\n\nfunction parseOptions(argv: string[], result: ParsedArgs): void {\n let i = 0\n while (i < argv.length) {\n const arg = argv[i]!\n\n if (arg === '--') {\n for (let j = i + 1; j < argv.length; j++) {\n result.args.push(argv[j]!)\n }\n break\n }\n\n if (arg.startsWith('--no-')) {\n const key = arg.slice(5)\n if (key) {\n result.options[key] = false\n }\n i++\n continue\n }\n\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n if (i + 1 < argv.length && !argv[i + 1]!.startsWith('-')) {\n const val = argv[i + 1]!\n const existing = result.options[key]\n if (existing !== undefined) {\n result.options[key] = Array.isArray(existing)\n ? ([...existing, val] as string[])\n : [existing as string, val]\n } else {\n result.options[key] = val\n }\n i += 2\n } else {\n result.options[key] = true\n i++\n }\n continue\n }\n\n if (arg.startsWith('-') && arg.length === 2) {\n const key = arg.slice(1)\n if (i + 1 < argv.length && !argv[i + 1]!.startsWith('-')) {\n const val = argv[i + 1]!\n result.options[key] = val\n i += 2\n } else {\n result.options[key] = true\n i++\n }\n continue\n }\n\n result.args.push(arg)\n i++\n }\n}\n\nexport function toCommandName(argv: string[]): string {\n const args = argv.slice(2)\n if (args.length === 0) return ''\n\n const first = args[0]!\n\n if (first.includes(':')) return first\n\n if (args.length > 1 && !args[1]!.startsWith('-')) {\n return `${first}:${args[1]}`\n }\n\n return first\n}\n","const RESET = '\\x1b[0m'\n\nconst codes: Record<string, string> = {\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n}\n\nexport const colors = {\n red: (s: string): string => `${codes.red}${s}${RESET}`,\n green: (s: string): string => `${codes.green}${s}${RESET}`,\n yellow: (s: string): string => `${codes.yellow}${s}${RESET}`,\n blue: (s: string): string => `${codes.blue}${s}${RESET}`,\n magenta: (s: string): string => `${codes.magenta}${s}${RESET}`,\n cyan: (s: string): string => `${codes.cyan}${s}${RESET}`,\n gray: (s: string): string => `${codes.gray}${s}${RESET}`,\n white: (s: string): string => `${codes.white}${s}${RESET}`,\n bold: (s: string): string => `${codes.bold}${s}${RESET}`,\n dim: (s: string): string => `${codes.dim}${s}${RESET}`,\n italic: (s: string): string => `${codes.italic}${s}${RESET}`,\n underline: (s: string): string => `${codes.underline}${s}${RESET}`,\n}\n\nexport function stripColors(s: string): string {\n const ansi = String.fromCharCode(27)\n const re = new RegExp(`${ansi}\\\\[\\\\d+m`, 'g')\n return s.replace(re, '')\n}\n\nexport function isColorSupported(): boolean {\n if (typeof process === 'undefined') return false\n if (process.env.NO_COLOR) return false\n if (process.env.FORCE_COLOR) return true\n if (!process.stdout) return false\n if (!process.stdout.isTTY) return false\n return true\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\ninterface TemplateContent {\n dirs: string[]\n files: Record<string, string | ((name: string) => string)>\n}\n\nconst TEMPLATES: Record<string, TemplateContent> = {\n blank: {\n dirs: ['src', 'src/config'],\n files: {\n 'package.json': (name: string) =>\n JSON.stringify(\n {\n name,\n version: '0.1.0',\n type: 'module',\n private: true,\n scripts: {\n dev: 'speexjs serve',\n build: 'speexjs build',\n start: 'node dist/index.js',\n lint: 'tsc --noEmit',\n },\n dependencies: {\n speexjs: 'latest',\n },\n devDependencies: {\n '@types/node': '^26.0.1',\n tsx: '^4.19.0',\n typescript: '^5.7.0',\n },\n },\n null,\n 2,\n ),\n 'tsconfig.json': JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n declaration: true,\n sourceMap: true,\n esModuleInterop: true,\n isolatedModules: true,\n resolveJsonModule: true,\n outDir: './dist',\n rootDir: './src',\n skipLibCheck: true,\n },\n include: ['src/**/*.ts'],\n exclude: ['node_modules', 'dist'],\n },\n null,\n 2,\n ),\n 'src/index.ts': `import { speexjs } from 'speexjs/server'\nimport { schema } from 'speexjs/schema'\nimport { Config } from './config/index.js'\n\n// ─── Application ───────────────────────────────────────────\nconst app = speexjs()\n\n// ─── Routes ────────────────────────────────────────────────\napp.get('/', async ({ response }) => {\n return response.html(\\`\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>SpeexJS App</title>\n </head>\n <body>\n <h1>SpeexJS 🚀</h1>\n <p>Server is running on port \\${Config.port}</p>\n </body>\n </html>\n \\`)\n})\n\n// ─── Health Check ──────────────────────────────────────────\napp.get('/api/health', async ({ response }) => {\n return response.json({\n status: 'ok',\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n })\n})\n\n// ─── Start Server ─────────────────────────────────────────\napp.listen(Config.port, () => {\n console.log(\\`✓ SpeexJS running at http://localhost:\\${Config.port}\\`)\n})\n`,\n 'src/config/index.ts': `export const Config = {\n port: Number(process.env.PORT) || 3000,\n host: process.env.HOST || 'localhost',\n env: process.env.NODE_ENV || 'development',\n appKey: process.env.APP_KEY || '',\n isDev: process.env.NODE_ENV !== 'production',\n isProd: process.env.NODE_ENV === 'production',\n} as const\n`,\n '.env.example': `# Server\nPORT=3000\nNODE_ENV=development\nHOST=localhost\n\n# Auth (change in production!)\nAPP_KEY=your-base64-32-byte-key-here\nSESSION_SECRET=change-this-in-production\n`,\n '.gitignore': `node_modules/\ndist/\n.env\n*.log\n`,\n },\n },\n\n fullstack: {\n dirs: [\n 'src/server',\n 'src/server/controllers',\n 'src/server/middleware',\n 'src/client',\n 'src/client/components',\n 'src/client/pages',\n 'src/shared',\n 'public',\n ],\n files: {\n 'package.json': (name: string) =>\n JSON.stringify(\n {\n name,\n version: '0.1.0',\n type: 'module',\n private: true,\n scripts: {\n dev: 'speexjs serve',\n build: 'tsc',\n start: 'node dist/server/index.js',\n },\n dependencies: {\n speexjs: 'latest',\n },\n devDependencies: {\n '@types/node': '^26.0.1',\n tsx: '^4.19.0',\n typescript: '^5.7.0',\n },\n },\n null,\n 2,\n ),\n 'tsconfig.json': JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n declaration: true,\n sourceMap: true,\n esModuleInterop: true,\n isolatedModules: true,\n resolveJsonModule: true,\n jsx: 'react-jsx',\n jsxImportSource: '@speexjs/vdom',\n outDir: './dist',\n rootDir: './src',\n },\n include: ['src/**/*.ts', 'src/**/*.tsx'],\n exclude: ['node_modules', 'dist'],\n },\n null,\n 2,\n ),\n 'src/server/index.ts': `import { speexjs } from 'speexjs/server'\nimport { schema } from 'speexjs/schema'\nimport { UserController } from './controllers/user.controller.js'\n\nconst PORT = Number(process.env.PORT) || 3000\n\nconst app = speexjs()\n\n// ─── Controllers ───────────────────────────────────────────\napp.controller(UserController)\n\n// ─── Routes ────────────────────────────────────────────────\napp.get('/', async ({ response }) => {\n return response.html(\\`\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>SpeexJS Fullstack</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/client/index.js\"></script>\n </body>\n </html>\n \\`)\n})\n\n// ─── Start Server ─────────────────────────────────────────\napp.listen(PORT, () => {\n console.log(\\`✓ SpeexJS running on http://localhost:\\${PORT}\\`)\n})\n`,\n 'src/server/controllers/user.controller.ts': `import { Controller, get, post } from 'speexjs/server'\n\nexport class UserController extends Controller {\n @get('/users')\n async index({ response }) {\n return response.json({ data: [] })\n }\n\n @post('/users')\n async store({ request, response }) {\n const body = await request.body()\n return response.json({ data: body }, 201)\n }\n}\n`,\n 'src/client/index.ts': `import { createApp } from './app.js'\n\ndocument.addEventListener('DOMContentLoaded', () => {\n createApp().mount('#root')\n})\n`,\n 'src/client/app.ts': `export function createApp() {\n function mount(selector: string) {\n const root = document.querySelector(selector)\n if (!root) {\n console.error('Root element not found:', selector)\n return\n }\n root.innerHTML = \\`\n <div style=\"text-align:center;padding:2rem\">\n <h1>SpeexJS Fullstack</h1>\n <p>Welcome to SpeexJS!</p>\n </div>\n \\`\n }\n\n return { mount }\n}\n`,\n 'public/style.css': `* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #0f172a;\n color: #e2e8f0;\n min-height: 100vh;\n}\n\n#root {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n}\n`,\n 'src/shared/types.ts': `export interface ApiResponse<T = unknown> {\n success: boolean\n data: T\n message?: string\n}\n`,\n '.env.example': `# Server\nPORT=3000\nNODE_ENV=development\nHOST=localhost\n\n# Auth (change in production!)\nAPP_KEY=your-base64-32-byte-key-here\nSESSION_SECRET=change-this-in-production\n\n# Database (example)\nDATABASE_URL=postgresql://localhost:5432/myapp\n`,\n '.gitignore': `node_modules/\ndist/\n.env\n*.log\n`,\n },\n },\n\n 'api-only': {\n dirs: ['src', 'src/config', 'src/controllers', 'src/middleware'],\n files: {\n 'package.json': (name: string) =>\n JSON.stringify(\n {\n name,\n version: '0.1.0',\n type: 'module',\n private: true,\n scripts: {\n dev: 'speexjs serve',\n build: 'tsc',\n start: 'node dist/index.js',\n },\n dependencies: {\n speexjs: 'latest',\n },\n devDependencies: {\n '@types/node': '^26.0.1',\n tsx: '^4.19.0',\n typescript: '^5.7.0',\n },\n },\n null,\n 2,\n ),\n 'tsconfig.json': JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n declaration: true,\n sourceMap: true,\n esModuleInterop: true,\n isolatedModules: true,\n resolveJsonModule: true,\n outDir: './dist',\n rootDir: './src',\n },\n include: ['src/**/*.ts'],\n exclude: ['node_modules', 'dist'],\n },\n null,\n 2,\n ),\n 'src/index.ts': `import { speexjs } from 'speexjs/server'\nimport { schema } from 'speexjs/schema'\nimport { Config } from './config/index.js'\nimport { HealthController } from './controllers/health.controller.js'\n\n// ─── Application ───────────────────────────────────────────\nconst app = speexjs()\n\n// ─── Controllers ───────────────────────────────────────────\napp.controller(HealthController)\n\n// ─── Routes ────────────────────────────────────────────────\napp.get('/api/health', async ({ response }) => {\n return response.json({\n status: 'ok',\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n env: Config.env,\n })\n})\n\n// ─── Start Server ─────────────────────────────────────────\napp.listen(Config.port, () => {\n console.log(\\`✓ SpeexJS API running at http://localhost:\\${Config.port}\\`)\n})\n`,\n 'src/config/index.ts': `export const Config = {\n port: Number(process.env.PORT) || 3000,\n host: process.env.HOST || 'localhost',\n env: process.env.NODE_ENV || 'development',\n appKey: process.env.APP_KEY || '',\n isDev: process.env.NODE_ENV !== 'production',\n isProd: process.env.NODE_ENV === 'production',\n} as const\n`,\n 'src/controllers/health.controller.ts': `import { Controller, get } from 'speexjs/server'\nimport { schema } from 'speexjs/schema'\n\n// ─── Health Response Schema ────────────────────────────────\nconst HealthResponse = schema.object({\n status: schema.string(),\n uptime: schema.number(),\n timestamp: schema.string(),\n})\n\nexport class HealthController extends Controller {\n @get('/health')\n async check({ response }) {\n const payload = HealthResponse.parse({\n status: 'ok',\n uptime: process.uptime(),\n timestamp: new Date().toISOString(),\n })\n return response.json(payload)\n }\n}\n`,\n 'src/middleware/auth.ts': `import type { RouteContext } from 'speexjs/server/router'\n\nexport function auth() {\n return async (ctx: RouteContext, next: () => Promise<void>) => {\n const token = ctx.request.headers.get('authorization')\n\n if (!token) {\n ctx.response.status(401).json({\n error: 'Unauthorized',\n message: 'Missing authorization header',\n })\n return\n }\n\n await next()\n }\n}\n`,\n '.env.example': `# Server\nPORT=3000\nNODE_ENV=development\nHOST=localhost\n\n# Auth (change in production!)\nAPP_KEY=your-base64-32-byte-key-here\nSESSION_SECRET=change-this-in-production\n\n# Database (example)\nDATABASE_URL=postgresql://localhost:5432/myapp\n`,\n '.gitignore': `node_modules/\ndist/\n.env\n*.log\n`,\n },\n },\n}\n\nconst TEMPLATE_ALIASES: Record<string, string> = {\n api: 'api-only',\n full: 'fullstack',\n}\n\nfunction getTemplate(name: string): string {\n return TEMPLATE_ALIASES[name] ?? name\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toUpperCase())\n}\n\nexport async function initProject(\n name: string,\n options: Record<string, any>,\n): Promise<void> {\n const targetDir = resolve(process.cwd(), name)\n\n if (existsSync(targetDir)) {\n console.error(colors.red(`Directory '${name}' already exists!`))\n process.exit(1)\n }\n\n const templateName = getTemplate(String(options.template || 'blank'))\n const template = TEMPLATES[templateName]\n\n if (!template) {\n console.error(\n colors.red(\n `Unknown template '${options.template}'. Use: blank, fullstack, api-only`,\n ),\n )\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n for (const dir of template.dirs) {\n mkdirSync(resolve(targetDir, dir), { recursive: true })\n }\n\n for (const [filePath, content] of Object.entries(template.files)) {\n const fullPath = resolve(targetDir, filePath)\n mkdirSync(dirname(fullPath), { recursive: true })\n\n const resolvedContent =\n typeof content === 'function' ? content(name) : content\n\n writeFileSync(fullPath, resolvedContent, 'utf-8')\n }\n\n if (options.git !== false) {\n try {\n const { execSync } = await import('child_process')\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n } catch {\n // git not available\n }\n }\n\n if (options.install !== false) {\n const pm = String(options['package-manager'] || options.packageManager || 'npm')\n try {\n const { execSync } = await import('child_process')\n console.log(` ${colors.cyan('→')} Installing dependencies with ${pm}...`)\n execSync(`${pm} install`, { cwd: targetDir, stdio: 'inherit' })\n } catch {\n console.log(\n ` ${colors.yellow('!')} Dependency install skipped. Run '${pm} install' manually.`,\n )\n }\n }\n\n const packageManager = String(options['package-manager'] || options.packageManager || 'npm')\n\n console.log()\n console.log(`${colors.bold('╔════════════════════════════════════╗')}`)\n console.log(`${colors.bold('║')} ${colors.green('speexjs 🚀 Project Created')}${colors.bold(' ║')}`)\n console.log(`${colors.bold('╚════════════════════════════════════╝')}`)\n console.log()\n console.log(` ${colors.bold('Name:')} ${toPascalCase(name)}`)\n console.log(` ${colors.bold('Template:')} ${templateName}`)\n console.log(` ${colors.bold('Dir:')} ${targetDir}`)\n console.log()\n console.log(` ${colors.cyan('$')} cd ${name}`)\n console.log(` ${colors.cyan('$')} ${packageManager} run dev`)\n console.log()\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toUpperCase())\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n}\n\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toLowerCase())\n}\n\nexport function makeController(name: string): void {\n const className = `${toPascalCase(name)}Controller`\n const fileName = `${toKebabCase(name)}.controller.ts`\n const targetDir = resolve(process.cwd(), 'src/server/controllers')\n const fullPath = resolve(targetDir, fileName)\n const varName = toCamelCase(name)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const content = `import { Controller, get, post, put, del } from 'speexjs/server'\nimport type { RouteContext } from 'speexjs/server/router'\n\nexport class ${className} extends Controller {\n @get('/')\n async index({ response }: RouteContext) {\n return response.json({ data: [] })\n }\n\n @get('/:id')\n async show({ response, params }: RouteContext) {\n return response.json({ data: { id: params.id } })\n }\n\n @post('/')\n async store({ request, response }: RouteContext) {\n const body = await request.body()\n return response.json({ data: body }, 201)\n }\n\n @put('/:id')\n async update({ request, response, params }: RouteContext) {\n const body = await request.body()\n return response.json({ data: { id: params.id, ...body } })\n }\n\n @del('/:id')\n async destroy({ response, params }: RouteContext) {\n return response.json({ message: \\`${className} deleted \\${params.id}\\` })\n }\n}\n\nexport const ${varName}Controller = ${className}\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(\n `${colors.green('✅')} Controller ${colors.bold(className)} created at ${colors.cyan(fileName)}`,\n )\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toUpperCase())\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n}\n\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toLowerCase())\n}\n\nexport function makeMiddleware(name: string): void {\n const functionName = toCamelCase(name)\n const className = toPascalCase(name)\n const fileName = `${toKebabCase(name)}.middleware.ts`\n const targetDir = resolve(process.cwd(), 'src/server/middleware')\n const fullPath = resolve(targetDir, fileName)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const content = `import type { RouteContext } from 'speexjs/server/router'\n\nexport function ${functionName}(options?: Record<string, unknown>) {\n return async (ctx: RouteContext, next: () => Promise<void>) => {\n const start = Date.now()\n\n await next()\n\n const duration = Date.now() - start\n console.log(\\`[${className}Middleware] \\${ctx.request.method} \\${ctx.request.url} \\${duration}ms\\`)\n }\n}\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(\n `${colors.green('✅')} Middleware ${colors.bold(functionName)} created at ${colors.cyan(fileName)}`,\n )\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toUpperCase())\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n}\n\nexport function makeSchema(name: string): void {\n const schemaName = `${toPascalCase(name)}Schema`\n const typeName = toPascalCase(name)\n const fileName = `${toKebabCase(name)}.schema.ts`\n const targetDir = resolve(process.cwd(), 'src/schemas')\n const fullPath = resolve(targetDir, fileName)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const content = `import { schema, type Infer } from 'speexjs/schema'\n\nexport const ${schemaName} = schema.object({\n id: schema.string().uuid(),\n name: schema.string().min(1).max(255),\n createdAt: schema.string().datetime(),\n updatedAt: schema.string().datetime().optional(),\n})\n\nexport type ${typeName} = Infer<typeof ${schemaName}>\n\nexport const create${typeName}Schema = schema.object({\n name: schema.string().min(1).max(255),\n})\n\nexport type Create${typeName} = Infer<typeof create${typeName}Schema>\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(\n `${colors.green('✅')} Schema ${colors.bold(schemaName)} created at ${colors.cyan(fileName)}`,\n )\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '')\n}\n\nfunction toCamelCase(str: string): string {\n return str.replace(/[-_\\s]+(.)?/g, (_, c) => (c ?? '').toUpperCase()).replace(/^(.)/, (c) => c.toLowerCase())\n}\n\nexport function makeMigration(name: string): void {\n const fileName = `${Date.now()}_${toSnakeCase(name)}.ts`\n const targetDir = resolve(process.cwd(), 'src/database/migrations')\n const fullPath = resolve(targetDir, fileName)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const className = toCamelCase(name).charAt(0).toUpperCase() + toCamelCase(name).slice(1)\n\n const content = `import { SchemaBuilder } from 'speexjs/server/database'\n\nexport async function up(schema: SchemaBuilder): Promise<void> {\n schema.createTable('${toSnakeCase(name)}', (table) => {\n table.increments('id')\n table.timestamps()\n })\n}\n\nexport async function down(schema: SchemaBuilder): Promise<void> {\n schema.dropTable('${toSnakeCase(name)}')\n}\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(`${colors.green('✅')} Migration ${colors.bold(className)} created at ${colors.cyan(fileName)}`)\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toPascalCase(str: string): string {\n return str.replace(/[-_\\s]+(.)?/g, (_, c) => (c ?? '').toUpperCase()).replace(/^(.)/, (c) => c.toUpperCase())\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '')\n}\n\nfunction toPlural(str: string): string {\n if (str.endsWith('s')) return str\n if (str.endsWith('y')) return str.slice(0, -1) + 'ies'\n return str + 's'\n}\n\nexport function makeModel(name: string): void {\n const className = toPascalCase(name)\n const tableName = toPlural(toSnakeCase(name))\n const fileName = `${toSnakeCase(name)}.model.ts`\n const targetDir = resolve(process.cwd(), 'src/models')\n const fullPath = resolve(targetDir, fileName)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const content = `import { Model } from 'speexjs/server/database'\n\nexport class ${className} extends Model {\n static table = '${tableName}'\n \n // Define relationships here\n // belongsTo(RelatedModel, 'foreign_key', 'owner_key')\n // hasMany(RelatedModel, 'foreign_key', 'local_key')\n}\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(`${colors.green('✅')} Model ${colors.bold(className)} created at ${colors.cyan(fileName)}`)\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\ninterface RouteInfo {\n method: string\n path: string\n}\n\nfunction extractDecorators(content: string): RouteInfo[] {\n const pattern = /@(get|post|put|patch|del|delete)\\s*\\(\\s*'([^']+)'\\s*\\)/g\n const results: RouteInfo[] = []\n\n let match: RegExpExecArray | null = pattern.exec(content)\n while (match !== null) {\n const method =\n match[1] === 'del' ? 'DELETE' : (match[1] as string).toUpperCase()\n const path = match[2] as string\n results.push({ method, path })\n match = pattern.exec(content)\n }\n\n return results\n}\n\nexport function listRoutes(): void {\n const routesDir = resolve(process.cwd(), 'src/server/controllers')\n\n if (!existsSync(routesDir)) {\n console.log(\n ` ${colors.yellow('!')} No routes registered. Create a controller first:`,\n )\n console.log(` ${colors.cyan('speexjs make:controller <name>')}`)\n return\n }\n\n const files = readdirSync(routesDir).filter(f => f.endsWith('.ts'))\n\n if (files.length === 0) {\n console.log(\n ` ${colors.yellow('!')} No routes registered. Create a controller first:`,\n )\n console.log(` ${colors.cyan('speexjs make:controller <name>')}`)\n return\n }\n\n let total = 0\n\n console.log()\n console.log(` ${colors.bold('📋 Route List:')}`)\n console.log()\n\n for (const file of files) {\n const content = readFileSync(resolve(routesDir, file), 'utf-8')\n const routes = extractDecorators(content)\n\n if (routes.length > 0) {\n console.log(` ${colors.cyan('──')} ${colors.bold(file.replace('.controller.ts', ''))} ${colors.cyan('──')}`)\n\n for (const { method, path } of routes) {\n const coloredMethod = method === 'GET'\n ? colors.green(method.padEnd(8))\n : method === 'POST'\n ? colors.blue(method.padEnd(8))\n : method === 'PUT' || method === 'PATCH'\n ? colors.yellow(method.padEnd(8))\n : colors.red(method.padEnd(8))\n\n console.log(` ${coloredMethod} ${path}`)\n total++\n }\n\n console.log()\n }\n }\n\n console.log(` ${colors.dim(`${total} route${total !== 1 ? 's' : ''} found`)}`)\n console.log()\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { colors } from '../../native/colors.js'\nimport { logger } from '../../native/logger.js'\n\ninterface ServeOptions {\n port?: string | number\n host?: string\n dev?: string | boolean\n}\n\n/**\n * Convert filesystem path to a valid file:// URL.\n * Needed for Windows: path.resolve() returns C:\\... but ESM import() requires file:///C:/...\n */\nfunction toFileUrl(path: string): string {\n return pathToFileURL(path).href\n}\n\n/**\n * Try to register a TypeScript loader (tsx) so Node can import .ts files.\n * Falls back silently if none available — Node 22.6+ has native --experimental-strip-types.\n */\nasync function ensureTsLoader(): Promise<void> {\n // If `--experimental-strip-types` is already active or native TS is on, skip\n if (process.execArgv.some(a => a.includes('strip-types') || a.includes('tsx') || a.includes('ts-node'))) {\n return\n }\n\n // Try to register tsx if available locally or globally\n for (const mod of ['tsx', 'ts-node/esm']) {\n try {\n await import(mod)\n return\n } catch {\n continue\n }\n }\n}\n\nexport async function serve(options: Record<string, any>): Promise<void> {\n const opts: ServeOptions = {\n port: options.port || options.p || 3000,\n host: options.host || options.H || 'localhost',\n dev: options.dev !== false,\n }\n\n const port = parseInt(String(opts.port), 10)\n const host = String(opts.host)\n\n const serverEntry = resolve(process.cwd(), 'src/app.ts')\n const serverEntryAlt = resolve(process.cwd(), 'src/server/index.ts')\n const serverEntryIndex = resolve(process.cwd(), 'src/index.ts')\n\n let entryPath: string | null = null\n if (existsSync(serverEntry)) entryPath = serverEntry\n else if (existsSync(serverEntryAlt)) entryPath = serverEntryAlt\n else if (existsSync(serverEntryIndex)) entryPath = serverEntryIndex\n\n if (!entryPath) {\n console.error(\n colors.red(\n 'Entry point not found. Create src/app.ts or src/index.ts',\n ),\n )\n process.exit(1)\n }\n\n // ── Ensure TypeScript loader ─────────────────────────────────\n if (opts.dev) {\n try {\n await ensureTsLoader()\n } catch {\n // Non-fatal: user may have native TS support in Node\n }\n }\n\n // ── Convert path to file:// URL (critical for Windows) ──────\n const entryUrl = toFileUrl(entryPath)\n\n if (opts.dev) {\n logger.info(\n `Development server starting at ${colors.cyan(`http://${host}:${port}`)}`,\n )\n\n try {\n const { app } = await import(entryUrl)\n\n if (!app || typeof app.listen !== 'function') {\n console.error(\n colors.red(\n 'Entry point must export { app } with .listen() method',\n ),\n )\n process.exit(1)\n }\n\n app.listen(port, host, () => {\n console.log()\n console.log(` ${colors.bold('SpeexJS')} ${colors.green('running')}`)\n console.log(` ${colors.dim('→')} ${colors.cyan(`http://${host}:${port}`)}`)\n console.log()\n })\n } catch (err: any) {\n console.error(colors.red(`Failed to start server: ${err.message}`))\n process.exit(1)\n }\n } else {\n try {\n const { app } = await import(entryUrl)\n\n if (!app || typeof app.listen !== 'function') {\n console.error(\n colors.red(\n 'Entry point must export { app } with .listen() method',\n ),\n )\n process.exit(1)\n }\n\n app.listen(port, host, () => {\n console.log()\n console.log(` ${colors.bold('SpeexJS')} ${colors.green('running')}`)\n console.log(` ${colors.dim('→')} ${colors.cyan(`http://${host}:${port}`)}`)\n console.log()\n })\n } catch (err: any) {\n console.error(colors.red(`Failed to start server: ${err.message}`))\n process.exit(1)\n }\n }\n}\n","import { colors, isColorSupported } from './colors.js'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport interface LoggerOptions {\n level?: LogLevel\n name?: string\n colors?: boolean\n timestamps?: boolean\n timezone?: string\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\nconst TIMEZONE_OFFSETS: Record<string, number> = {\n UTC: 0,\n}\n\nfunction pad(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nexport function formatTimestamp(tz?: string): string {\n const now = new Date()\n const y = now.getUTCFullYear()\n const M = pad(now.getUTCMonth() + 1)\n const d = pad(now.getUTCDate())\n const h = pad(now.getUTCHours())\n const m = pad(now.getUTCMinutes())\n const s = pad(now.getUTCSeconds())\n\n return `${y}-${M}-${d} ${h}:${m}:${s} UTC`\n}\n\nconst LEVEL_PREFIX: Record<LogLevel, string> = {\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n}\n\nconst LEVEL_COLOR: Record<LogLevel, (s: string) => string> = {\n debug: colors.gray,\n info: colors.cyan,\n warn: colors.yellow,\n error: colors.red,\n}\n\nexport class Logger {\n private _level: LogLevel\n private _name: string\n private _useColors: boolean\n private _useTimestamps: boolean\n private _timezone: string\n\n constructor(options?: LoggerOptions) {\n this._level = options?.level ?? 'info'\n this._name = options?.name ?? ''\n this._useColors = options?.colors ?? isColorSupported()\n this._useTimestamps = options?.timestamps ?? true\n this._timezone = options?.timezone ?? 'UTC'\n }\n\n private _format(level: LogLevel, msg: string, meta?: Record<string, unknown>): string {\n const parts: string[] = []\n\n if (this._useTimestamps) {\n parts.push(formatTimestamp(this._timezone))\n }\n\n if (this._useColors) {\n parts.push(LEVEL_COLOR[level](LEVEL_PREFIX[level]))\n } else {\n parts.push(LEVEL_PREFIX[level])\n }\n\n if (this._name) {\n parts.push(this._useColors ? colors.dim(`[${this._name}]`) : `[${this._name}]`)\n }\n\n if (this._useColors) {\n parts.push(LEVEL_COLOR[level](msg))\n } else {\n parts.push(msg)\n }\n\n if (meta && Object.keys(meta).length > 0) {\n parts.push(JSON.stringify(meta))\n }\n\n return parts.join(' ')\n }\n\n debug(msg: string, meta?: Record<string, unknown>): void {\n if (LOG_LEVELS[this._level] > LOG_LEVELS.debug) return\n console.debug(this._format('debug', msg, meta))\n }\n\n info(msg: string, meta?: Record<string, unknown>): void {\n if (LOG_LEVELS[this._level] > LOG_LEVELS.info) return\n console.info(this._format('info', msg, meta))\n }\n\n warn(msg: string, meta?: Record<string, unknown>): void {\n if (LOG_LEVELS[this._level] > LOG_LEVELS.warn) return\n console.warn(this._format('warn', msg, meta))\n }\n\n error(msg: string, meta?: Record<string, unknown>): void {\n if (LOG_LEVELS[this._level] > LOG_LEVELS.error) return\n console.error(this._format('error', msg, meta))\n }\n\n child(name: string): Logger {\n const childName = this._name ? `${this._name}:${name}` : name\n return new Logger({\n level: this._level,\n name: childName,\n colors: this._useColors,\n timestamps: this._useTimestamps,\n timezone: this._timezone,\n })\n }\n\n setLevel(level: LogLevel): void {\n this._level = level\n }\n}\n\nexport const logger = new Logger()\n","#!/usr/bin/env node\nimport { parseArgs } from '../native/args.js'\nimport { colors } from '../native/colors.js'\nimport { initProject } from './commands/init.js'\nimport { makeController } from './commands/make-controller.js'\nimport { makeMiddleware } from './commands/make-middleware.js'\nimport { makeSchema } from './commands/make-schema.js'\nimport { makeMigration } from './commands/make-migration.js'\nimport { makeModel } from './commands/make-model.js'\nimport { listRoutes } from './commands/list-routes.js'\nimport { serve } from './commands/serve.js'\n\nfunction showHelp(): void {\n console.log(`${colors.bold('SpeexJS')} ${colors.cyan('v0.2.0')}`)\n console.log('Fullstack JavaScript/TypeScript Framework')\n console.log()\n console.log(`${colors.bold('Usage:')}`)\n console.log(' SpeexJS init [name] [options] Create new project')\n console.log(' SpeexJS make:controller <name> Generate controller')\n console.log(' SpeexJS make:middleware <name> Generate middleware')\n console.log(' SpeexJS make:migration <name> Generate migration')\n console.log(' SpeexJS make:model <name> Generate model')\n console.log(' SpeexJS make:schema <name> Generate schema')\n console.log(' SpeexJS migrate Run migrations')\n console.log(' SpeexJS db:seed Seed the database')\n console.log(' SpeexJS list-routes View all routes')\n console.log(' SpeexJS serve [options] Run server')\n console.log(' SpeexJS --help Show help')\n console.log()\n console.log(`${colors.bold('Aliases:')}`)\n console.log(' SpeexJS -v, --version View version')\n console.log()\n console.log(`${colors.bold('Options:')}`)\n console.log(' --template <type> blank, fullstack, api-only')\n console.log(' --frontend <fe> super, react, vue')\n console.log(' --port <number> Port server (default: 3000)')\n console.log(' --host <string> Host address (default: localhost)')\n}\n\nasync function main(): Promise<void> {\n const parsed = parseArgs(process.argv)\n const command = parsed.command\n\n switch (command) {\n case 'init': {\n await initProject(parsed.args[0] || 'my-app', parsed.options)\n break\n }\n case 'make:controller': {\n if (!parsed.args[0]) {\n console.error(colors.red('Controller name required'))\n console.log(` ${colors.cyan('SpeexJS make:controller <name>')}`)\n process.exit(1)\n }\n await makeController(parsed.args[0])\n break\n }\n case 'make:middleware': {\n if (!parsed.args[0]) {\n console.error(colors.red('Middleware name required'))\n console.log(` ${colors.cyan('SpeexJS make:middleware <name>')}`)\n process.exit(1)\n }\n await makeMiddleware(parsed.args[0])\n break\n }\n case 'make:schema': {\n if (!parsed.args[0]) {\n console.error(colors.red('Schema name required'))\n console.log(` ${colors.cyan('SpeexJS make:schema <name>')}`)\n process.exit(1)\n }\n await makeSchema(parsed.args[0])\n break\n }\n case 'make:migration': {\n if (!parsed.args[0]) {\n console.error(colors.red('Migration name required'))\n console.log(` ${colors.cyan('SpeexJS make:migration <name>')}`)\n process.exit(1)\n }\n await makeMigration(parsed.args[0])\n break\n }\n case 'make:model': {\n if (!parsed.args[0]) {\n console.error(colors.red('Model name required'))\n console.log(` ${colors.cyan('SpeexJS make:model <name>')}`)\n process.exit(1)\n }\n await makeModel(parsed.args[0])\n break\n }\n case 'migrate':\n case 'db:seed': {\n const label = command === 'migrate' ? 'Migration' : 'Database seeding'\n console.log(`${colors.yellow('⏳')} ${label} coming soon...`)\n break\n }\n case 'list-routes':\n case 'routes':\n case 'lr': {\n await listRoutes()\n break\n }\n case 'serve':\n case 'dev': {\n await serve(parsed.options)\n break\n }\n case 'help':\n case '--help':\n case '-h': {\n showHelp()\n break\n }\n case 'version':\n case '--version':\n case '-v': {\n console.log('SpeexJS v0.2.0')\n break\n }\n default: {\n if (command) {\n console.error(`${colors.red(`Unknown command '${command}'`)}`)\n console.log()\n }\n showHelp()\n if (command) process.exit(1)\n }\n }\n}\n\nmain().catch(err => {\n console.error(colors.red(`Error: ${err.message}`))\n process.exit(1)\n})\n"],"mappings":"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","names":["existsSync","mkdirSync","writeFileSync","resolve","toPascalCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","resolve","toPascalCase","toKebabCase","toCamelCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","resolve","toPascalCase","toKebabCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","resolve","toCamelCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","resolve","toPascalCase","toSnakeCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","resolve","resolve","existsSync","existsSync","resolve","resolve","existsSync"]}
|
|
1
|
+
{"version":3,"sources":["../../src/native/args.ts","../../src/native/colors.ts","../../src/cli/commands/init.ts","../../src/cli/commands/make-controller.ts","../../src/cli/commands/make-middleware.ts","../../src/cli/commands/make-schema.ts","../../src/cli/commands/make-migration.ts","../../src/cli/commands/make-model.ts","../../src/cli/commands/list-routes.ts","../../src/cli/commands/serve.ts","../../src/native/logger.ts","../../src/cli/index.ts"],"sourcesContent":["export interface ParsedArgs {\n command: string\n subcommand?: string\n args: string[]\n options: Record<string, string | boolean | string[]>\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2)\n const result: ParsedArgs = {\n command: '',\n args: [],\n options: {},\n }\n\n if (args.length === 0) return result\n\n const first = args[0]!\n\n if (first.includes(':')) {\n result.command = first\n parseOptions(args.slice(1), result)\n return result\n }\n\n result.command = first\n\n if (args.length > 1) {\n const second = args[1]!\n if (!second.startsWith('-')) {\n result.subcommand = second\n result.args.push(second)\n parseOptions(args.slice(2), result)\n return result\n }\n }\n\n parseOptions(args.slice(1), result)\n return result\n}\n\nfunction parseOptions(argv: string[], result: ParsedArgs): void {\n let i = 0\n while (i < argv.length) {\n const arg = argv[i]!\n\n if (arg === '--') {\n for (let j = i + 1; j < argv.length; j++) {\n result.args.push(argv[j]!)\n }\n break\n }\n\n if (arg.startsWith('--no-')) {\n const key = arg.slice(5)\n if (key) {\n result.options[key] = false\n }\n i++\n continue\n }\n\n if (arg.startsWith('--')) {\n const key = arg.slice(2)\n if (i + 1 < argv.length && !argv[i + 1]!.startsWith('-')) {\n const val = argv[i + 1]!\n const existing = result.options[key]\n if (existing !== undefined) {\n result.options[key] = Array.isArray(existing)\n ? ([...existing, val] as string[])\n : [existing as string, val]\n } else {\n result.options[key] = val\n }\n i += 2\n } else {\n result.options[key] = true\n i++\n }\n continue\n }\n\n if (arg.startsWith('-') && arg.length === 2) {\n const key = arg.slice(1)\n if (i + 1 < argv.length && !argv[i + 1]!.startsWith('-')) {\n const val = argv[i + 1]!\n result.options[key] = val\n i += 2\n } else {\n result.options[key] = true\n i++\n }\n continue\n }\n\n result.args.push(arg)\n i++\n }\n}\n\nexport function toCommandName(argv: string[]): string {\n const args = argv.slice(2)\n if (args.length === 0) return ''\n\n const first = args[0]!\n\n if (first.includes(':')) return first\n\n if (args.length > 1 && !args[1]!.startsWith('-')) {\n return `${first}:${args[1]}`\n }\n\n return first\n}\n","const RESET = '\\x1b[0m'\n\nconst codes: Record<string, string> = {\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n gray: '\\x1b[90m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n}\n\nexport const colors = {\n red: (s: string): string => `${codes.red}${s}${RESET}`,\n green: (s: string): string => `${codes.green}${s}${RESET}`,\n yellow: (s: string): string => `${codes.yellow}${s}${RESET}`,\n blue: (s: string): string => `${codes.blue}${s}${RESET}`,\n magenta: (s: string): string => `${codes.magenta}${s}${RESET}`,\n cyan: (s: string): string => `${codes.cyan}${s}${RESET}`,\n gray: (s: string): string => `${codes.gray}${s}${RESET}`,\n white: (s: string): string => `${codes.white}${s}${RESET}`,\n bold: (s: string): string => `${codes.bold}${s}${RESET}`,\n dim: (s: string): string => `${codes.dim}${s}${RESET}`,\n italic: (s: string): string => `${codes.italic}${s}${RESET}`,\n underline: (s: string): string => `${codes.underline}${s}${RESET}`,\n}\n\nexport function stripColors(s: string): string {\n const ansi = String.fromCharCode(27)\n const re = new RegExp(`${ansi}\\\\[\\\\d+m`, 'g')\n return s.replace(re, '')\n}\n\nexport function isColorSupported(): boolean {\n if (typeof process === 'undefined') return false\n if (process.env.NO_COLOR) return false\n if (process.env.FORCE_COLOR) return true\n if (!process.stdout) return false\n if (!process.stdout.isTTY) return false\n return true\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\ninterface TemplateContent {\n dirs: string[]\n files: Record<string, string | ((name: string) => string)>\n}\n\nconst TEMPLATES: Record<string, TemplateContent> = {\n blank: {\n dirs: ['src', 'src/config'],\n files: {\n 'package.json': (name: string) =>\n JSON.stringify(\n {\n name,\n version: '0.1.0',\n type: 'module',\n private: true,\n scripts: {\n dev: 'speexjs serve',\n build: 'speexjs build',\n start: 'node dist/index.js',\n lint: 'tsc --noEmit',\n },\n dependencies: {\n speexjs: 'latest',\n },\n devDependencies: {\n '@types/node': '^26.0.1',\n tsx: '^4.19.0',\n typescript: '^5.7.0',\n },\n },\n null,\n 2,\n ),\n 'tsconfig.json': JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n declaration: true,\n sourceMap: true,\n esModuleInterop: true,\n isolatedModules: true,\n resolveJsonModule: true,\n outDir: './dist',\n rootDir: './src',\n skipLibCheck: true,\n },\n include: ['src/**/*.ts'],\n exclude: ['node_modules', 'dist'],\n },\n null,\n 2,\n ),\n 'src/index.ts': `import { speexjs } from 'speexjs/server'\nimport { schema } from 'speexjs/schema'\nimport { Config } from './config/index.js'\n\n// ─── Application ───────────────────────────────────────────\nconst app = speexjs()\n\n// ─── Routes ────────────────────────────────────────────────\napp.get('/', async ({ response }) => {\n return response.html(\\`\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>SpeexJS App</title>\n </head>\n <body>\n <h1>SpeexJS 🚀</h1>\n <p>Server is running on port \\${Config.port}</p>\n </body>\n </html>\n \\`)\n})\n\n// ─── Health Check ──────────────────────────────────────────\napp.get('/api/health', async ({ response }) => {\n return response.json({\n status: 'ok',\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n })\n})\n\n// ─── Start Server ─────────────────────────────────────────\napp.listen(Config.port, () => {\n console.log(\\`✓ SpeexJS running at http://localhost:\\${Config.port}\\`)\n})\n`,\n 'src/config/index.ts': `export const Config = {\n port: Number(process.env.PORT) || 3000,\n host: process.env.HOST || 'localhost',\n env: process.env.NODE_ENV || 'development',\n appKey: process.env.APP_KEY || '',\n isDev: process.env.NODE_ENV !== 'production',\n isProd: process.env.NODE_ENV === 'production',\n} as const\n`,\n '.env.example': `# Server\nPORT=3000\nNODE_ENV=development\nHOST=localhost\n\n# Auth (change in production!)\nAPP_KEY=your-base64-32-byte-key-here\nSESSION_SECRET=change-this-in-production\n`,\n '.gitignore': `node_modules/\ndist/\n.env\n*.log\n`,\n },\n },\n\n fullstack: {\n dirs: [\n 'src/server',\n 'src/server/controllers',\n 'src/server/middleware',\n 'src/client',\n 'src/client/components',\n 'src/client/pages',\n 'src/shared',\n 'public',\n ],\n files: {\n 'package.json': (name: string) =>\n JSON.stringify(\n {\n name,\n version: '0.1.0',\n type: 'module',\n private: true,\n scripts: {\n dev: 'speexjs serve',\n build: 'tsc',\n start: 'node dist/server/index.js',\n },\n dependencies: {\n speexjs: 'latest',\n },\n devDependencies: {\n '@types/node': '^26.0.1',\n tsx: '^4.19.0',\n typescript: '^5.7.0',\n },\n },\n null,\n 2,\n ),\n 'tsconfig.json': JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n declaration: true,\n sourceMap: true,\n esModuleInterop: true,\n isolatedModules: true,\n resolveJsonModule: true,\n jsx: 'react-jsx',\n jsxImportSource: '@speexjs/vdom',\n outDir: './dist',\n rootDir: './src',\n },\n include: ['src/**/*.ts', 'src/**/*.tsx'],\n exclude: ['node_modules', 'dist'],\n },\n null,\n 2,\n ),\n 'src/server/index.ts': `import { speexjs } from 'speexjs/server'\nimport { schema } from 'speexjs/schema'\nimport { UserController } from './controllers/user.controller.js'\n\nconst PORT = Number(process.env.PORT) || 3000\n\nconst app = speexjs()\n\n// ─── Controllers ───────────────────────────────────────────\napp.controller(UserController)\n\n// ─── Routes ────────────────────────────────────────────────\napp.get('/', async ({ response }) => {\n return response.html(\\`\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>SpeexJS Fullstack</title>\n </head>\n <body>\n <div id=\"root\"></div>\n <script type=\"module\" src=\"/client/index.js\"></script>\n </body>\n </html>\n \\`)\n})\n\n// ─── Start Server ─────────────────────────────────────────\napp.listen(PORT, () => {\n console.log(\\`✓ SpeexJS running on http://localhost:\\${PORT}\\`)\n})\n`,\n 'src/server/controllers/user.controller.ts': `import { Controller, get, post } from 'speexjs/server'\n\nexport class UserController extends Controller {\n @get('/users')\n async index({ response }) {\n return response.json({ data: [] })\n }\n\n @post('/users')\n async store({ request, response }) {\n const body = await request.body()\n return response.json({ data: body }, 201)\n }\n}\n`,\n 'src/client/index.ts': `import { createApp } from './app.js'\n\ndocument.addEventListener('DOMContentLoaded', () => {\n createApp().mount('#root')\n})\n`,\n 'src/client/app.ts': `export function createApp() {\n function mount(selector: string) {\n const root = document.querySelector(selector)\n if (!root) {\n console.error('Root element not found:', selector)\n return\n }\n root.innerHTML = \\`\n <div style=\"text-align:center;padding:2rem\">\n <h1>SpeexJS Fullstack</h1>\n <p>Welcome to SpeexJS!</p>\n </div>\n \\`\n }\n\n return { mount }\n}\n`,\n 'public/style.css': `* {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nbody {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #0f172a;\n color: #e2e8f0;\n min-height: 100vh;\n}\n\n#root {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n}\n`,\n 'src/shared/types.ts': `export interface ApiResponse<T = unknown> {\n success: boolean\n data: T\n message?: string\n}\n`,\n '.env.example': `# Server\nPORT=3000\nNODE_ENV=development\nHOST=localhost\n\n# Auth (change in production!)\nAPP_KEY=your-base64-32-byte-key-here\nSESSION_SECRET=change-this-in-production\n\n# Database (example)\nDATABASE_URL=postgresql://localhost:5432/myapp\n`,\n '.gitignore': `node_modules/\ndist/\n.env\n*.log\n`,\n },\n },\n\n 'api-only': {\n dirs: ['src', 'src/config', 'src/controllers', 'src/middleware'],\n files: {\n 'package.json': (name: string) =>\n JSON.stringify(\n {\n name,\n version: '0.1.0',\n type: 'module',\n private: true,\n scripts: {\n dev: 'speexjs serve',\n build: 'tsc',\n start: 'node dist/index.js',\n },\n dependencies: {\n speexjs: 'latest',\n },\n devDependencies: {\n '@types/node': '^26.0.1',\n tsx: '^4.19.0',\n typescript: '^5.7.0',\n },\n },\n null,\n 2,\n ),\n 'tsconfig.json': JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n strict: true,\n declaration: true,\n sourceMap: true,\n esModuleInterop: true,\n isolatedModules: true,\n resolveJsonModule: true,\n outDir: './dist',\n rootDir: './src',\n },\n include: ['src/**/*.ts'],\n exclude: ['node_modules', 'dist'],\n },\n null,\n 2,\n ),\n 'src/index.ts': `import { speexjs } from 'speexjs/server'\nimport { schema } from 'speexjs/schema'\nimport { Config } from './config/index.js'\nimport { HealthController } from './controllers/health.controller.js'\n\n// ─── Application ───────────────────────────────────────────\nconst app = speexjs()\n\n// ─── Controllers ───────────────────────────────────────────\napp.controller(HealthController)\n\n// ─── Routes ────────────────────────────────────────────────\napp.get('/api/health', async ({ response }) => {\n return response.json({\n status: 'ok',\n timestamp: new Date().toISOString(),\n uptime: process.uptime(),\n env: Config.env,\n })\n})\n\n// ─── Start Server ─────────────────────────────────────────\napp.listen(Config.port, () => {\n console.log(\\`✓ SpeexJS API running at http://localhost:\\${Config.port}\\`)\n})\n`,\n 'src/config/index.ts': `export const Config = {\n port: Number(process.env.PORT) || 3000,\n host: process.env.HOST || 'localhost',\n env: process.env.NODE_ENV || 'development',\n appKey: process.env.APP_KEY || '',\n isDev: process.env.NODE_ENV !== 'production',\n isProd: process.env.NODE_ENV === 'production',\n} as const\n`,\n 'src/controllers/health.controller.ts': `import { Controller, get } from 'speexjs/server'\nimport { schema } from 'speexjs/schema'\n\n// ─── Health Response Schema ────────────────────────────────\nconst HealthResponse = schema.object({\n status: schema.string(),\n uptime: schema.number(),\n timestamp: schema.string(),\n})\n\nexport class HealthController extends Controller {\n @get('/health')\n async check({ response }) {\n const payload = HealthResponse.parse({\n status: 'ok',\n uptime: process.uptime(),\n timestamp: new Date().toISOString(),\n })\n return response.json(payload)\n }\n}\n`,\n 'src/middleware/auth.ts': `import type { RouteContext } from 'speexjs/server/router'\n\nexport function auth() {\n return async (ctx: RouteContext, next: () => Promise<void>) => {\n const token = ctx.request.headers.get('authorization')\n\n if (!token) {\n ctx.response.status(401).json({\n error: 'Unauthorized',\n message: 'Missing authorization header',\n })\n return\n }\n\n await next()\n }\n}\n`,\n '.env.example': `# Server\nPORT=3000\nNODE_ENV=development\nHOST=localhost\n\n# Auth (change in production!)\nAPP_KEY=your-base64-32-byte-key-here\nSESSION_SECRET=change-this-in-production\n\n# Database (example)\nDATABASE_URL=postgresql://localhost:5432/myapp\n`,\n '.gitignore': `node_modules/\ndist/\n.env\n*.log\n`,\n },\n },\n\n spark: {\n dirs: ['src', 'src/controllers', 'src/middleware', 'src/config', 'src/database/migrations', 'src/models'],\n files: {\n 'package.json': (name: string) => JSON.stringify({\n name, version: '0.1.0', type: 'module', private: true,\n scripts: { dev: 'speexjs serve', build: 'tsc', start: 'node dist/index.js', lint: 'biome check src/' },\n dependencies: { speexjs: 'latest' },\n devDependencies: { '@types/node': '^26.0.1', tsx: '^4.19.0', typescript: '^5.7.0' },\n }, null, 2),\n 'tsconfig.json': JSON.stringify({\n compilerOptions: { target: 'ES2022', module: 'ESNext', moduleResolution: 'bundler', strict: true, outDir: './dist', rootDir: './src', skipLibCheck: true },\n include: ['src/**/*.ts'], exclude: ['node_modules', 'dist'],\n }, null, 2),\n 'src/index.ts': `import { speexjs } from 'speexjs/server'\nimport { schema } from 'speexjs/schema'\n\nconst app = speexjs()\nconst PORT = Number(process.env.PORT) || 3000\n\napp.use(app.router.cors())\napp.use(app.router.bodyParser())\napp.use(app.router.csrf())\n\napp.get('/api/health', async ({ response }) => {\n return response.json({ status: 'ok', timestamp: new Date().toISOString() })\n})\n\napp.listen(PORT, () => {\n console.log(\\`⚡ SpeexJS API running on http://localhost:\\${PORT}\\`)\n})\n`,\n 'src/config/index.ts': `export const Config = {\n port: Number(process.env.PORT) || 3000,\n env: process.env.NODE_ENV || 'development',\n isProd: process.env.NODE_ENV === 'production',\n appKey: process.env.APP_KEY || '',\n} as const\n`,\n '.env.example': `PORT=3000\nNODE_ENV=development\nAPP_KEY=\n`,\n '.gitignore': 'node_modules/\\ndist/\\n.env\\n*.log\\n',\n },\n },\n}\n\nconst TEMPLATE_ALIASES: Record<string, string> = {\n api: 'api-only',\n full: 'fullstack',\n spark: 'spark',\n}\n\nfunction getTemplate(name: string): string {\n return TEMPLATE_ALIASES[name] ?? name\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toUpperCase())\n}\n\nexport async function initProject(\n name: string,\n options: Record<string, any>,\n): Promise<void> {\n const targetDir = resolve(process.cwd(), name)\n\n if (existsSync(targetDir)) {\n console.error(colors.red(`Directory '${name}' already exists!`))\n process.exit(1)\n }\n\n const templateName = getTemplate(String(options.template || 'blank'))\n const template = TEMPLATES[templateName]\n\n if (!template) {\n console.error(\n colors.red(\n `Unknown template '${options.template}'. Use: blank, fullstack, api-only, spark`,\n ),\n )\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n for (const dir of template.dirs) {\n mkdirSync(resolve(targetDir, dir), { recursive: true })\n }\n\n for (const [filePath, content] of Object.entries(template.files)) {\n const fullPath = resolve(targetDir, filePath)\n mkdirSync(dirname(fullPath), { recursive: true })\n\n const resolvedContent =\n typeof content === 'function' ? content(name) : content\n\n writeFileSync(fullPath, resolvedContent, 'utf-8')\n }\n\n if (options.git !== false) {\n try {\n const { execSync } = await import('child_process')\n execSync('git init', { cwd: targetDir, stdio: 'ignore' })\n } catch {\n // git not available\n }\n }\n\n if (options.install !== false) {\n const pm = String(options['package-manager'] || options.packageManager || 'npm')\n try {\n const { execSync } = await import('child_process')\n console.log(` ${colors.cyan('→')} Installing dependencies with ${pm}...`)\n execSync(`${pm} install`, { cwd: targetDir, stdio: 'inherit' })\n } catch {\n console.log(\n ` ${colors.yellow('!')} Dependency install skipped. Run '${pm} install' manually.`,\n )\n }\n }\n\n const packageManager = String(options['package-manager'] || options.packageManager || 'npm')\n\n console.log()\n console.log(`${colors.bold('╔════════════════════════════════════╗')}`)\n console.log(`${colors.bold('║')} ${colors.green('speexjs 🚀 Project Created')}${colors.bold(' ║')}`)\n console.log(`${colors.bold('╚════════════════════════════════════╝')}`)\n console.log()\n console.log(` ${colors.bold('Name:')} ${toPascalCase(name)}`)\n console.log(` ${colors.bold('Template:')} ${templateName}`)\n console.log(` ${colors.bold('Dir:')} ${targetDir}`)\n console.log()\n console.log(` ${colors.cyan('$')} cd ${name}`)\n console.log(` ${colors.cyan('$')} ${packageManager} run dev`)\n console.log()\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toUpperCase())\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n}\n\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toLowerCase())\n}\n\nexport function makeController(name: string): void {\n const className = `${toPascalCase(name)}Controller`\n const fileName = `${toKebabCase(name)}.controller.ts`\n const targetDir = resolve(process.cwd(), 'src/server/controllers')\n const fullPath = resolve(targetDir, fileName)\n const varName = toCamelCase(name)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const content = `import { Controller, get, post, put, del } from 'speexjs/server'\nimport type { RouteContext } from 'speexjs/server/router'\n\nexport class ${className} extends Controller {\n @get('/')\n async index({ response }: RouteContext) {\n return response.json({ data: [] })\n }\n\n @get('/:id')\n async show({ response, params }: RouteContext) {\n return response.json({ data: { id: params.id } })\n }\n\n @post('/')\n async store({ request, response }: RouteContext) {\n const body = await request.body()\n return response.json({ data: body }, 201)\n }\n\n @put('/:id')\n async update({ request, response, params }: RouteContext) {\n const body = await request.body()\n return response.json({ data: { id: params.id, ...body } })\n }\n\n @del('/:id')\n async destroy({ response, params }: RouteContext) {\n return response.json({ message: \\`${className} deleted \\${params.id}\\` })\n }\n}\n\nexport const ${varName}Controller = ${className}\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(\n `${colors.green('✅')} Controller ${colors.bold(className)} created at ${colors.cyan(fileName)}`,\n )\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toUpperCase())\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n}\n\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toLowerCase())\n}\n\nexport function makeMiddleware(name: string): void {\n const functionName = toCamelCase(name)\n const className = toPascalCase(name)\n const fileName = `${toKebabCase(name)}.middleware.ts`\n const targetDir = resolve(process.cwd(), 'src/server/middleware')\n const fullPath = resolve(targetDir, fileName)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const content = `import type { RouteContext } from 'speexjs/server/router'\n\nexport function ${functionName}(options?: Record<string, unknown>) {\n return async (ctx: RouteContext, next: () => Promise<void>) => {\n const start = Date.now()\n\n await next()\n\n const duration = Date.now() - start\n console.log(\\`[${className}Middleware] \\${ctx.request.method} \\${ctx.request.url} \\${duration}ms\\`)\n }\n}\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(\n `${colors.green('✅')} Middleware ${colors.bold(functionName)} created at ${colors.cyan(fileName)}`,\n )\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toPascalCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, c: string) => (c ?? '').toUpperCase())\n .replace(/^(.)/, (c: string) => c.toUpperCase())\n}\n\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase()\n}\n\nexport function makeSchema(name: string): void {\n const schemaName = `${toPascalCase(name)}Schema`\n const typeName = toPascalCase(name)\n const fileName = `${toKebabCase(name)}.schema.ts`\n const targetDir = resolve(process.cwd(), 'src/schemas')\n const fullPath = resolve(targetDir, fileName)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const content = `import { schema, type Infer } from 'speexjs/schema'\n\nexport const ${schemaName} = schema.object({\n id: schema.string().uuid(),\n name: schema.string().min(1).max(255),\n createdAt: schema.string().datetime(),\n updatedAt: schema.string().datetime().optional(),\n})\n\nexport type ${typeName} = Infer<typeof ${schemaName}>\n\nexport const create${typeName}Schema = schema.object({\n name: schema.string().min(1).max(255),\n})\n\nexport type Create${typeName} = Infer<typeof create${typeName}Schema>\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(\n `${colors.green('✅')} Schema ${colors.bold(schemaName)} created at ${colors.cyan(fileName)}`,\n )\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '')\n}\n\nfunction toCamelCase(str: string): string {\n return str.replace(/[-_\\s]+(.)?/g, (_, c) => (c ?? '').toUpperCase()).replace(/^(.)/, (c) => c.toLowerCase())\n}\n\nexport function makeMigration(name: string): void {\n const fileName = `${Date.now()}_${toSnakeCase(name)}.ts`\n const targetDir = resolve(process.cwd(), 'src/database/migrations')\n const fullPath = resolve(targetDir, fileName)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const className = toCamelCase(name).charAt(0).toUpperCase() + toCamelCase(name).slice(1)\n\n const content = `import { SchemaBuilder } from 'speexjs/server/database'\n\nexport async function up(schema: SchemaBuilder): Promise<void> {\n schema.createTable('${toSnakeCase(name)}', (table) => {\n table.increments('id')\n table.timestamps()\n })\n}\n\nexport async function down(schema: SchemaBuilder): Promise<void> {\n schema.dropTable('${toSnakeCase(name)}')\n}\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(`${colors.green('✅')} Migration ${colors.bold(className)} created at ${colors.cyan(fileName)}`)\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\nfunction toPascalCase(str: string): string {\n return str.replace(/[-_\\s]+(.)?/g, (_, c) => (c ?? '').toUpperCase()).replace(/^(.)/, (c) => c.toUpperCase())\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '')\n}\n\nfunction toPlural(str: string): string {\n if (str.endsWith('s')) return str\n if (str.endsWith('y')) return str.slice(0, -1) + 'ies'\n return str + 's'\n}\n\nexport function makeModel(name: string): void {\n const className = toPascalCase(name)\n const tableName = toPlural(toSnakeCase(name))\n const fileName = `${toSnakeCase(name)}.model.ts`\n const targetDir = resolve(process.cwd(), 'src/models')\n const fullPath = resolve(targetDir, fileName)\n\n if (existsSync(fullPath)) {\n console.error(colors.red(`File ${fileName} already exists!`))\n process.exit(1)\n }\n\n mkdirSync(targetDir, { recursive: true })\n\n const content = `import { Model } from 'speexjs/server/database'\n\nexport class ${className} extends Model {\n static table = '${tableName}'\n \n // Define relationships here\n // belongsTo(RelatedModel, 'foreign_key', 'owner_key')\n // hasMany(RelatedModel, 'foreign_key', 'local_key')\n}\n`\n\n writeFileSync(fullPath, content, 'utf-8')\n console.log(`${colors.green('✅')} Model ${colors.bold(className)} created at ${colors.cyan(fileName)}`)\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { colors } from '../../native/colors.js'\n\ninterface RouteInfo {\n method: string\n path: string\n}\n\nfunction extractDecorators(content: string): RouteInfo[] {\n const pattern = /@(get|post|put|patch|del|delete)\\s*\\(\\s*'([^']+)'\\s*\\)/g\n const results: RouteInfo[] = []\n\n let match: RegExpExecArray | null = pattern.exec(content)\n while (match !== null) {\n const method =\n match[1] === 'del' ? 'DELETE' : (match[1] as string).toUpperCase()\n const path = match[2] as string\n results.push({ method, path })\n match = pattern.exec(content)\n }\n\n return results\n}\n\nexport function listRoutes(): void {\n const routesDir = resolve(process.cwd(), 'src/server/controllers')\n\n if (!existsSync(routesDir)) {\n console.log(\n ` ${colors.yellow('!')} No routes registered. Create a controller first:`,\n )\n console.log(` ${colors.cyan('speexjs make:controller <name>')}`)\n return\n }\n\n const files = readdirSync(routesDir).filter(f => f.endsWith('.ts'))\n\n if (files.length === 0) {\n console.log(\n ` ${colors.yellow('!')} No routes registered. Create a controller first:`,\n )\n console.log(` ${colors.cyan('speexjs make:controller <name>')}`)\n return\n }\n\n let total = 0\n\n console.log()\n console.log(` ${colors.bold('📋 Route List:')}`)\n console.log()\n\n for (const file of files) {\n const content = readFileSync(resolve(routesDir, file), 'utf-8')\n const routes = extractDecorators(content)\n\n if (routes.length > 0) {\n console.log(` ${colors.cyan('──')} ${colors.bold(file.replace('.controller.ts', ''))} ${colors.cyan('──')}`)\n\n for (const { method, path } of routes) {\n const coloredMethod = method === 'GET'\n ? colors.green(method.padEnd(8))\n : method === 'POST'\n ? colors.blue(method.padEnd(8))\n : method === 'PUT' || method === 'PATCH'\n ? colors.yellow(method.padEnd(8))\n : colors.red(method.padEnd(8))\n\n console.log(` ${coloredMethod} ${path}`)\n total++\n }\n\n console.log()\n }\n }\n\n console.log(` ${colors.dim(`${total} route${total !== 1 ? 's' : ''} found`)}`)\n console.log()\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport { colors } from '../../native/colors.js'\nimport { logger } from '../../native/logger.js'\n\ninterface ServeOptions {\n port?: string | number\n host?: string\n dev?: string | boolean\n}\n\n/**\n * Convert filesystem path to a valid file:// URL.\n * Needed for Windows: path.resolve() returns C:\\... but ESM import() requires file:///C:/...\n */\nfunction toFileUrl(path: string): string {\n return pathToFileURL(path).href\n}\n\n/**\n * Try to register a TypeScript loader (tsx) so Node can import .ts files.\n * Falls back silently if none available — Node 22.6+ has native --experimental-strip-types.\n */\nasync function ensureTsLoader(): Promise<void> {\n // If `--experimental-strip-types` is already active or native TS is on, skip\n if (process.execArgv.some(a => a.includes('strip-types') || a.includes('tsx') || a.includes('ts-node'))) {\n return\n }\n\n // Try to register tsx if available locally or globally\n for (const mod of ['tsx', 'ts-node/esm']) {\n try {\n await import(mod)\n return\n } catch {\n continue\n }\n }\n}\n\nexport async function serve(options: Record<string, any>): Promise<void> {\n const opts: ServeOptions = {\n port: options.port || options.p || 3000,\n host: options.host || options.H || 'localhost',\n dev: options.dev !== false,\n }\n\n const port = parseInt(String(opts.port), 10)\n const host = String(opts.host)\n\n const serverEntry = resolve(process.cwd(), 'src/app.ts')\n const serverEntryAlt = resolve(process.cwd(), 'src/server/index.ts')\n const serverEntryIndex = resolve(process.cwd(), 'src/index.ts')\n\n let entryPath: string | null = null\n if (existsSync(serverEntry)) entryPath = serverEntry\n else if (existsSync(serverEntryAlt)) entryPath = serverEntryAlt\n else if (existsSync(serverEntryIndex)) entryPath = serverEntryIndex\n\n if (!entryPath) {\n console.error(\n colors.red(\n 'Entry point not found. Create src/app.ts or src/index.ts',\n ),\n )\n process.exit(1)\n }\n\n // ── Ensure TypeScript loader ─────────────────────────────────\n if (opts.dev) {\n try {\n await ensureTsLoader()\n } catch {\n // Non-fatal: user may have native TS support in Node\n }\n }\n\n // ── Convert path to file:// URL (critical for Windows) ──────\n const entryUrl = toFileUrl(entryPath)\n\n if (opts.dev) {\n logger.info(\n `Development server starting at ${colors.cyan(`http://${host}:${port}`)}`,\n )\n\n try {\n const { app } = await import(entryUrl)\n\n if (!app || typeof app.listen !== 'function') {\n console.error(\n colors.red(\n 'Entry point must export { app } with .listen() method',\n ),\n )\n process.exit(1)\n }\n\n app.listen(port, host, () => {\n console.log()\n console.log(` ${colors.bold('SpeexJS')} ${colors.green('running')}`)\n console.log(` ${colors.dim('→')} ${colors.cyan(`http://${host}:${port}`)}`)\n console.log()\n })\n } catch (err: any) {\n console.error(colors.red(`Failed to start server: ${err.message}`))\n process.exit(1)\n }\n } else {\n try {\n const { app } = await import(entryUrl)\n\n if (!app || typeof app.listen !== 'function') {\n console.error(\n colors.red(\n 'Entry point must export { app } with .listen() method',\n ),\n )\n process.exit(1)\n }\n\n app.listen(port, host, () => {\n console.log()\n console.log(` ${colors.bold('SpeexJS')} ${colors.green('running')}`)\n console.log(` ${colors.dim('→')} ${colors.cyan(`http://${host}:${port}`)}`)\n console.log()\n })\n } catch (err: any) {\n console.error(colors.red(`Failed to start server: ${err.message}`))\n process.exit(1)\n }\n }\n}\n","import { colors, isColorSupported } from './colors.js'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error'\n\nexport interface LoggerOptions {\n level?: LogLevel\n name?: string\n colors?: boolean\n timestamps?: boolean\n timezone?: string\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n}\n\nconst TIMEZONE_OFFSETS: Record<string, number> = {\n UTC: 0,\n}\n\nfunction pad(n: number): string {\n return n.toString().padStart(2, '0')\n}\n\nexport function formatTimestamp(tz?: string): string {\n const now = new Date()\n const y = now.getUTCFullYear()\n const M = pad(now.getUTCMonth() + 1)\n const d = pad(now.getUTCDate())\n const h = pad(now.getUTCHours())\n const m = pad(now.getUTCMinutes())\n const s = pad(now.getUTCSeconds())\n\n return `${y}-${M}-${d} ${h}:${m}:${s} UTC`\n}\n\nconst LEVEL_PREFIX: Record<LogLevel, string> = {\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n}\n\nconst LEVEL_COLOR: Record<LogLevel, (s: string) => string> = {\n debug: colors.gray,\n info: colors.cyan,\n warn: colors.yellow,\n error: colors.red,\n}\n\nexport class Logger {\n private _level: LogLevel\n private _name: string\n private _useColors: boolean\n private _useTimestamps: boolean\n private _timezone: string\n\n constructor(options?: LoggerOptions) {\n this._level = options?.level ?? 'info'\n this._name = options?.name ?? ''\n this._useColors = options?.colors ?? isColorSupported()\n this._useTimestamps = options?.timestamps ?? true\n this._timezone = options?.timezone ?? 'UTC'\n }\n\n private _format(level: LogLevel, msg: string, meta?: Record<string, unknown>): string {\n const parts: string[] = []\n\n if (this._useTimestamps) {\n parts.push(formatTimestamp(this._timezone))\n }\n\n if (this._useColors) {\n parts.push(LEVEL_COLOR[level](LEVEL_PREFIX[level]))\n } else {\n parts.push(LEVEL_PREFIX[level])\n }\n\n if (this._name) {\n parts.push(this._useColors ? colors.dim(`[${this._name}]`) : `[${this._name}]`)\n }\n\n if (this._useColors) {\n parts.push(LEVEL_COLOR[level](msg))\n } else {\n parts.push(msg)\n }\n\n if (meta && Object.keys(meta).length > 0) {\n parts.push(JSON.stringify(meta))\n }\n\n return parts.join(' ')\n }\n\n debug(msg: string, meta?: Record<string, unknown>): void {\n if (LOG_LEVELS[this._level] > LOG_LEVELS.debug) return\n console.debug(this._format('debug', msg, meta))\n }\n\n info(msg: string, meta?: Record<string, unknown>): void {\n if (LOG_LEVELS[this._level] > LOG_LEVELS.info) return\n console.info(this._format('info', msg, meta))\n }\n\n warn(msg: string, meta?: Record<string, unknown>): void {\n if (LOG_LEVELS[this._level] > LOG_LEVELS.warn) return\n console.warn(this._format('warn', msg, meta))\n }\n\n error(msg: string, meta?: Record<string, unknown>): void {\n if (LOG_LEVELS[this._level] > LOG_LEVELS.error) return\n console.error(this._format('error', msg, meta))\n }\n\n child(name: string): Logger {\n const childName = this._name ? `${this._name}:${name}` : name\n return new Logger({\n level: this._level,\n name: childName,\n colors: this._useColors,\n timestamps: this._useTimestamps,\n timezone: this._timezone,\n })\n }\n\n setLevel(level: LogLevel): void {\n this._level = level\n }\n}\n\nexport const logger = new Logger()\n","#!/usr/bin/env node\nimport { parseArgs } from '../native/args.js'\nimport { colors } from '../native/colors.js'\nimport { initProject } from './commands/init.js'\nimport { makeController } from './commands/make-controller.js'\nimport { makeMiddleware } from './commands/make-middleware.js'\nimport { makeSchema } from './commands/make-schema.js'\nimport { makeMigration } from './commands/make-migration.js'\nimport { makeModel } from './commands/make-model.js'\nimport { listRoutes } from './commands/list-routes.js'\nimport { serve } from './commands/serve.js'\n\nfunction showHelp(): void {\n console.log(`${colors.bold('SpeexJS')} ${colors.cyan('v0.2.0')}`)\n console.log('Fullstack JavaScript/TypeScript Framework')\n console.log()\n console.log(`${colors.bold('Usage:')}`)\n console.log(' SpeexJS init [name] [options] Create new project')\n console.log(' SpeexJS make:controller <name> Generate controller')\n console.log(' SpeexJS make:middleware <name> Generate middleware')\n console.log(' SpeexJS make:migration <name> Generate migration')\n console.log(' SpeexJS make:model <name> Generate model')\n console.log(' SpeexJS make:schema <name> Generate schema')\n console.log(' SpeexJS migrate Run migrations')\n console.log(' SpeexJS db:seed Seed the database')\n console.log(' SpeexJS list-routes View all routes')\n console.log(' SpeexJS serve [options] Run server')\n console.log(' SpeexJS --help Show help')\n console.log()\n console.log(`${colors.bold('Aliases:')}`)\n console.log(' SpeexJS -v, --version View version')\n console.log()\n console.log(`${colors.bold('Options:')}`)\n console.log(' --template <type> blank, fullstack, api-only')\n console.log(' --frontend <fe> super, react, vue')\n console.log(' --port <number> Port server (default: 3000)')\n console.log(' --host <string> Host address (default: localhost)')\n}\n\nasync function main(): Promise<void> {\n const parsed = parseArgs(process.argv)\n const command = parsed.command\n\n switch (command) {\n case 'init': {\n await initProject(parsed.args[0] || 'my-app', parsed.options)\n break\n }\n case 'make:controller': {\n if (!parsed.args[0]) {\n console.error(colors.red('Controller name required'))\n console.log(` ${colors.cyan('SpeexJS make:controller <name>')}`)\n process.exit(1)\n }\n await makeController(parsed.args[0])\n break\n }\n case 'make:middleware': {\n if (!parsed.args[0]) {\n console.error(colors.red('Middleware name required'))\n console.log(` ${colors.cyan('SpeexJS make:middleware <name>')}`)\n process.exit(1)\n }\n await makeMiddleware(parsed.args[0])\n break\n }\n case 'make:schema': {\n if (!parsed.args[0]) {\n console.error(colors.red('Schema name required'))\n console.log(` ${colors.cyan('SpeexJS make:schema <name>')}`)\n process.exit(1)\n }\n await makeSchema(parsed.args[0])\n break\n }\n case 'make:migration': {\n if (!parsed.args[0]) {\n console.error(colors.red('Migration name required'))\n console.log(` ${colors.cyan('SpeexJS make:migration <name>')}`)\n process.exit(1)\n }\n await makeMigration(parsed.args[0])\n break\n }\n case 'make:model': {\n if (!parsed.args[0]) {\n console.error(colors.red('Model name required'))\n console.log(` ${colors.cyan('SpeexJS make:model <name>')}`)\n process.exit(1)\n }\n await makeModel(parsed.args[0])\n break\n }\n case 'migrate':\n case 'db:seed': {\n const label = command === 'migrate' ? 'Migration' : 'Database seeding'\n console.log(`${colors.yellow('⏳')} ${label} coming soon...`)\n break\n }\n case 'list-routes':\n case 'routes':\n case 'lr': {\n await listRoutes()\n break\n }\n case 'serve':\n case 'dev': {\n await serve(parsed.options)\n break\n }\n case 'help':\n case '--help':\n case '-h': {\n showHelp()\n break\n }\n case 'version':\n case '--version':\n case '-v': {\n console.log('SpeexJS v0.2.0')\n break\n }\n default: {\n if (command) {\n console.error(`${colors.red(`Unknown command '${command}'`)}`)\n console.log()\n }\n showHelp()\n if (command) process.exit(1)\n }\n }\n}\n\nmain().catch(err => {\n console.error(colors.red(`Error: ${err.message}`))\n process.exit(1)\n})\n"],"mappings":"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","names":["existsSync","mkdirSync","writeFileSync","resolve","toPascalCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","resolve","toPascalCase","toKebabCase","toCamelCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","resolve","toPascalCase","toKebabCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","resolve","toCamelCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","mkdirSync","writeFileSync","resolve","toPascalCase","toSnakeCase","resolve","existsSync","mkdirSync","writeFileSync","existsSync","resolve","resolve","existsSync","existsSync","resolve","resolve","existsSync"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "speexjs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Fullstack JavaScript/TypeScript framework — Server, Client, RPC, Schema, CLI, Database, Auth, Cache, Storage. Zero dependencies.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -110,7 +110,8 @@
|
|
|
110
110
|
"tsup": "^8.3.0",
|
|
111
111
|
"typescript": "^5.7.0",
|
|
112
112
|
"vite": "^8.1.0",
|
|
113
|
-
"vitest": "^2.1.0"
|
|
113
|
+
"vitest": "^2.1.0",
|
|
114
|
+
"mitata": "^1.0.0"
|
|
114
115
|
},
|
|
115
116
|
"keywords": [
|
|
116
117
|
"fullstack",
|