create-nxpress-app 1.0.7 → 1.1.2

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/index.js CHANGED
@@ -86,16 +86,22 @@ program
86
86
  }
87
87
  }
88
88
  let engine = options.engine;
89
- if (!engine || !["handlebars", "ejs", "html"].includes(engine)) {
89
+ if (!engine || !["ejs", "handlebars", "nunjucks", "liquid", "html"].includes(engine)) {
90
90
  const selectedEngine = await (0, prompts_1.select)({
91
91
  message: "Which template engine do you want to use?",
92
92
  options: [
93
+ {
94
+ value: "ejs",
95
+ label: "EJS (Eta) (Default)",
96
+ hint: "Fast EJS syntax powered by Eta engine",
97
+ },
93
98
  {
94
99
  value: "handlebars",
95
- label: "Handlebars (Recommended)",
100
+ label: "Handlebars",
96
101
  hint: "Clean syntax & partials",
97
102
  },
98
- { value: "ejs", label: "EJS", hint: "Embedded JavaScript templates" },
103
+ { value: "nunjucks", label: "Nunjucks", hint: "Jinja2-inspired template engine" },
104
+ { value: "liquid", label: "LiquidJS", hint: "Secure Shopify-style templates" },
99
105
  { value: "html", label: "HTML", hint: "Plain HTML templates" },
100
106
  ],
101
107
  });
@@ -174,11 +180,31 @@ program
174
180
  const selectedPm = await (0, prompts_1.select)({
175
181
  message: "Which package manager do you want to use?",
176
182
  options: [
177
- { value: "pnpm", label: "pnpm (Default)", hint: "Fast & disk space efficient" },
178
- { value: "npm", label: "npm", hint: "Default Node.js package manager" },
179
- { value: "yarn", label: "yarn", hint: "Classic/Berry package manager" },
180
- { value: "bun", label: "bun", hint: "Ultra-fast runtime & package manager" },
181
- { value: "deno", label: "deno", hint: "Modern JavaScript/TypeScript runtime" },
183
+ {
184
+ value: "pnpm",
185
+ label: "pnpm (Default)",
186
+ hint: "Fast & disk space efficient",
187
+ },
188
+ {
189
+ value: "npm",
190
+ label: "npm",
191
+ hint: "Default Node.js package manager",
192
+ },
193
+ {
194
+ value: "yarn",
195
+ label: "yarn",
196
+ hint: "Classic/Berry package manager",
197
+ },
198
+ {
199
+ value: "bun",
200
+ label: "bun",
201
+ hint: "Ultra-fast runtime & package manager",
202
+ },
203
+ {
204
+ value: "deno",
205
+ label: "deno",
206
+ hint: "Modern JavaScript/TypeScript runtime",
207
+ },
182
208
  ],
183
209
  initialValue: "pnpm",
184
210
  });
@@ -201,98 +227,44 @@ program
201
227
  fs_extra_1.default.ensureDirSync(appDir);
202
228
  fs_extra_1.default.ensureDirSync(componentsDir);
203
229
  fs_extra_1.default.ensureDirSync(publicDir);
204
- const ext = engine === "handlebars" ? "hbs" : engine;
205
- // Root layout
206
- const layoutContent = engine === "handlebars"
207
- ? `<!DOCTYPE html>
208
- <html lang="en">
209
- <head>
210
- <meta charset="UTF-8">
211
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
212
- <title>{{title}}</title>
213
- </head>
214
- <body class="bg-slate-900 text-white min-h-screen">
215
- {{{body}}}
216
- </body>
217
- </html>`
218
- : engine === "ejs"
219
- ? `<!DOCTYPE html>
220
- <html lang="en">
221
- <head>
222
- <meta charset="UTF-8">
223
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
224
- <title><%= title %></title>
225
- </head>
226
- <body class="bg-slate-900 text-white min-h-screen">
227
- <%- body %>
228
- </body>
229
- </html>`
230
- : `<!DOCTYPE html>
231
- <html lang="en">
232
- <head>
233
- <meta charset="UTF-8">
234
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
235
- <title>Nxpress App</title>
236
- </head>
237
- <body class="bg-slate-900 text-white min-h-screen">
238
- <!-- Content -->
239
- </body>
240
- </html>`;
241
- fs_extra_1.default.writeFileSync(path_1.default.join(appDir, `layout.${ext}`), layoutContent);
242
- // Index page
243
- const indexPageContent = engine === "handlebars"
244
- ? `<div class="max-w-4xl mx-auto px-4 py-16 text-center">
245
- <h1 class="text-5xl font-bold mb-4 bg-linear-to-r from-blue-400 to-indigo-500 bg-clip-text text-transparent">
246
- Welcome to {{title}}
247
- </h1>
248
- <p class="text-xl text-slate-400 mb-8">{{description}}</p>
249
- <div class="inline-block bg-slate-800 border border-slate-700 rounded-lg p-6 text-left">
250
- <p class="text-sm font-mono text-cyan-400">Edit <span class="text-amber-300">${appDirName}/index.${ext}</span> to get started.</p>
251
- </div>
252
- </div>`
253
- : engine === "ejs"
254
- ? `<div class="max-w-4xl mx-auto px-4 py-16 text-center">
255
- <h1 class="text-5xl font-bold mb-4 bg-linear-to-r from-blue-400 to-indigo-500 bg-clip-text text-transparent">
256
- Welcome to <%= title %>
257
- </h1>
258
- <p class="text-xl text-slate-400 mb-8"><%= description %></p>
259
- <div class="inline-block bg-slate-800 border border-slate-700 rounded-lg p-6 text-left">
260
- <p class="text-sm font-mono text-cyan-400">Edit <span class="text-amber-300">${appDirName}/index.${ext}</span> to get started.</p>
261
- </div>
262
- </div>`
263
- : `<div class="max-w-4xl mx-auto px-4 py-16 text-center">
264
- <h1 class="text-5xl font-bold mb-4 bg-linear-to-r from-blue-400 to-indigo-500 bg-clip-text text-transparent">
265
- Welcome to Nxpress
266
- </h1>
267
- <p class="text-xl text-slate-400 mb-8">Express.js with Next.js developer experience</p>
268
- </div>`;
269
- fs_extra_1.default.writeFileSync(path_1.default.join(appDir, `index.${ext}`), indexPageContent);
230
+ const templatesDir = path_1.default.resolve(__dirname, "..", "templates");
231
+ const ext = engine === "handlebars" ? "hbs" : (engine === "nunjucks" ? "njk" : engine);
232
+ // Copy public assets (e.g., logo.png)
233
+ const templatePublicDir = path_1.default.join(templatesDir, "public");
234
+ if (fs_extra_1.default.existsSync(templatePublicDir)) {
235
+ fs_extra_1.default.copySync(templatePublicDir, publicDir);
236
+ }
237
+ // Root layout from template
238
+ const layoutTemplatePath = path_1.default.join(templatesDir, "app", `layout.${ext}`);
239
+ if (fs_extra_1.default.existsSync(layoutTemplatePath)) {
240
+ fs_extra_1.default.copySync(layoutTemplatePath, path_1.default.join(appDir, `layout.${ext}`));
241
+ }
242
+ // Index page from template
243
+ const indexTemplatePath = path_1.default.join(templatesDir, "app", `index.${ext}`);
244
+ if (fs_extra_1.default.existsSync(indexTemplatePath)) {
245
+ let content = fs_extra_1.default.readFileSync(indexTemplatePath, "utf8");
246
+ content = content.replace(/app\/index\.(hbs|ejs|html|njk|liquid)/g, `${appDirName}/index.${ext}`);
247
+ fs_extra_1.default.writeFileSync(path_1.default.join(appDir, `index.${ext}`), content);
248
+ }
270
249
  // Data loader for index page
271
- const indexTsContent = `import { Request, Response } from "express";
272
-
273
- export async function props(req: Request, res: Response) {
274
- return {
275
- title: 'Nxpress App',
276
- description: 'Express.js with Next.js developer experience',
277
- };
278
- }
279
- `;
280
- fs_extra_1.default.writeFileSync(path_1.default.join(appDir, "index.ts"), indexTsContent);
250
+ const indexTsTemplatePath = path_1.default.join(templatesDir, "app", "index.ts");
251
+ if (fs_extra_1.default.existsSync(indexTsTemplatePath)) {
252
+ fs_extra_1.default.copySync(indexTsTemplatePath, path_1.default.join(appDir, "index.ts"));
253
+ }
281
254
  // App CSS for Tailwind v4
282
- fs_extra_1.default.writeFileSync(path_1.default.join(targetPath, "app.css"), `@import "tailwindcss";\n@import "tailwindcss/preflight";\n@tailwind utilities;\n`);
255
+ const appCssTemplatePath = path_1.default.join(templatesDir, "app.css");
256
+ if (fs_extra_1.default.existsSync(appCssTemplatePath)) {
257
+ fs_extra_1.default.copySync(appCssTemplatePath, path_1.default.join(targetPath, "app.css"));
258
+ }
283
259
  // Server file
284
- const serverTsContent = `import { nxpress } from '@nxpress/core';
285
-
286
- const app = nxpress({
287
- engine: '${engine === "handlebars" ? "hbs" : engine}',
288
- });
289
-
290
- const PORT = process.env.PORT || ${port};
291
- app.listen(PORT, () => {
292
- console.log(\`Nxpress server running on http://localhost:\${PORT}\`);
293
- });
294
- `;
295
- fs_extra_1.default.writeFileSync(path_1.default.join(targetPath, "server.ts"), serverTsContent);
260
+ const serverTsTemplatePath = path_1.default.join(templatesDir, "server.ts");
261
+ if (fs_extra_1.default.existsSync(serverTsTemplatePath)) {
262
+ let serverContent = fs_extra_1.default.readFileSync(serverTsTemplatePath, "utf8");
263
+ serverContent = serverContent
264
+ .replace("{{ENGINE}}", engine === "handlebars" ? "hbs" : engine)
265
+ .replace("{{PORT}}", port.toString());
266
+ fs_extra_1.default.writeFileSync(path_1.default.join(targetPath, "server.ts"), serverContent);
267
+ }
296
268
  // nxpress.config.json
297
269
  const nxConfig = {
298
270
  $schema: `https://unpkg.com/@nxpress/core@latest/schema.json`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-nxpress-app",
3
- "version": "1.0.7",
3
+ "version": "1.1.2",
4
4
  "description": "CLI tool to create Nxpress applications",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -28,6 +28,7 @@
28
28
  "fs-extra": "^11.4.0"
29
29
  },
30
30
  "devDependencies": {
31
+ "@types/express": "^5.0.6",
31
32
  "@types/fs-extra": "^11.0.4",
32
33
  "@types/node": "^26.1.1",
33
34
  "typescript": "^7.0.2"
@@ -0,0 +1,92 @@
1
+ <div class="min-h-screen flex flex-col justify-between max-w-6xl mx-auto px-6 py-8">
2
+ <header class="flex items-center justify-between py-4 border-b border-slate-800/80">
3
+ <div class="flex items-center gap-3">
4
+ <span class="font-bold text-lg text-slate-100 tracking-tight">Nxpress</span>
5
+ <span
6
+ class="text-xs font-mono px-2 py-0.5 rounded-full bg-indigo-500/10 text-indigo-400 border border-indigo-500/20 font-medium">
7
+ v<%= version %>
8
+ </span>
9
+ </div>
10
+ <% if (!E.NODE_ENV || E.NODE_ENV.toLowerCase() !=='prod' ) { %>
11
+ <div class="flex items-center gap-2">
12
+ <span
13
+ class="inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
14
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse"></span>
15
+ Dev Server Active
16
+ </span>
17
+ </div>
18
+ <% } %>
19
+ </header>
20
+
21
+ <main class="py-16 md:py-24 text-center my-auto">
22
+ <div class="flex justify-center mb-6">
23
+ <img src="/logo.png" alt="Nxpress"
24
+ class="w-16 h-16 sm:w-20 sm:h-20 object-contain drop-shadow-[0_0_25px_rgba(99,102,241,0.5)] transition-transform hover:scale-105 duration-300" />
25
+ </div>
26
+
27
+ <h1
28
+ class="text-4xl sm:text-6xl md:text-7xl font-extrabold tracking-tight text-white mb-6 max-w-4xl mx-auto leading-[1.1]">
29
+ Build fast Node apps with
30
+ <span class="bg-linear-to-r from-indigo-400 via-sky-400 to-cyan-300 bg-clip-text text-transparent">
31
+ <%= title %>
32
+ </span>
33
+ </h1>
34
+
35
+ <p class="text-lg sm:text-xl text-slate-400 max-w-2xl mx-auto mb-10 leading-relaxed">
36
+ <%= description %>
37
+ </p>
38
+
39
+ <div class="max-w-xl mx-auto mb-16">
40
+ <div
41
+ class="group relative rounded-2xl bg-linear-to-b from-slate-800/80 to-slate-900/90 border border-slate-700/80 p-5 shadow-2xl backdrop-blur-md transition-all hover:border-indigo-500/40">
42
+ <div
43
+ class="flex items-center justify-between mb-3 text-xs text-slate-400 font-mono border-b border-slate-800 pb-3">
44
+ <div class="flex items-center gap-2">
45
+ <span class="w-3 h-3 rounded-full bg-rose-500/80 inline-block"></span>
46
+ <span class="w-3 h-3 rounded-full bg-amber-500/80 inline-block"></span>
47
+ <span class="w-3 h-3 rounded-full bg-emerald-500/80 inline-block"></span>
48
+ <span class="ml-2 text-slate-500">app/index.ejs</span>
49
+ </div>
50
+ <span class="text-indigo-400 font-sans text-[11px] font-semibold tracking-wide uppercase">Quick Start</span>
51
+ </div>
52
+ <div class="text-left font-mono text-sm py-2">
53
+ <p class="text-slate-300">
54
+ <span class="text-purple-400">Edit</span>
55
+ <span
56
+ class="text-emerald-300 px-1.5 py-0.5 rounded bg-slate-800 border border-slate-700">app/index.ejs</span>
57
+ <span class="text-slate-400">to customize this page.</span>
58
+ </p>
59
+ </div>
60
+ </div>
61
+ </div>
62
+
63
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4 max-w-4xl mx-auto text-left">
64
+ <% features.forEach(function(feat) { %>
65
+ <div
66
+ class="p-6 rounded-2xl bg-slate-900/50 border border-slate-800/80 hover:border-slate-700 transition-all duration-200 group">
67
+ <div class="flex items-center justify-between mb-3">
68
+ <span
69
+ class="text-xs font-semibold px-2.5 py-1 rounded-md bg-slate-800 text-indigo-400 border border-slate-700/50">
70
+ <%= feat.tag %>
71
+ </span>
72
+ <span class="text-slate-600 group-hover:text-slate-400 transition-colors text-sm">→</span>
73
+ </div>
74
+ <h3 class="text-base font-bold text-slate-100 mb-1.5 group-hover:text-indigo-300 transition-colors">
75
+ <%= feat.title %>
76
+ </h3>
77
+ <p class="text-sm text-slate-400 leading-relaxed">
78
+ <%= feat.desc %>
79
+ </p>
80
+ </div>
81
+ <% }); %>
82
+ </div>
83
+ </main>
84
+
85
+ <footer
86
+ class="py-6 border-t border-slate-800/60 text-center text-xs text-slate-500 flex flex-col sm:flex-row items-center justify-between gap-3">
87
+ <p>Powered by <span class="text-slate-300 font-medium">Nxpress</span></p>
88
+ <p class="font-mono text-slate-600">
89
+ <%= R.base %>
90
+ </p>
91
+ </footer>
92
+ </div>
@@ -0,0 +1,113 @@
1
+ <div class="min-h-screen flex flex-col justify-between max-w-6xl mx-auto px-6 py-8">
2
+ <!-- Top Navigation -->
3
+ <header class="flex items-center justify-between py-4 border-b border-slate-800/80">
4
+ <div class="flex items-center gap-3">
5
+ <span class="font-bold text-lg text-slate-100 tracking-tight">
6
+ Nxpress
7
+ </span>
8
+ <span
9
+ class="text-xs font-mono px-2 py-0.5 rounded-full bg-indigo-500/10 text-indigo-400 border border-indigo-500/20 font-medium">
10
+ v{{version}}
11
+ </span>
12
+ </div>
13
+ {{#if (ne (lower E.NODE_ENV) 'prod')}}
14
+ <div class="flex items-center gap-2">
15
+ <span
16
+ class="inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
17
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse"></span>
18
+ Dev Server Active
19
+ </span>
20
+ </div>
21
+ {{/if}}
22
+ </header>
23
+
24
+ <!-- Hero Section -->
25
+ <main class="py-16 md:py-24 text-center my-auto">
26
+ <div class="flex justify-center mb-6">
27
+ <img src="/logo.png" alt="Nxpress"
28
+ class="w-16 h-16 sm:w-20 sm:h-20 object-contain drop-shadow-[0_0_25px_rgba(99,102,241,0.5)] transition-transform hover:scale-105 duration-300" />
29
+ </div>
30
+ <h1
31
+ class="text-4xl sm:text-6xl md:text-7xl font-extrabold tracking-tight text-white mb-6 max-w-4xl mx-auto leading-[1.1]">
32
+ Build fast Node apps with
33
+ <span class="bg-linear-to-r from-indigo-400 via-sky-400 to-cyan-300 bg-clip-text text-transparent">
34
+ {{title}}
35
+ </span>
36
+ </h1>
37
+ <p class="text-lg sm:text-xl text-slate-400 max-w-2xl mx-auto mb-10 leading-relaxed">
38
+ {{description}}
39
+ </p>
40
+
41
+ <!-- Code Snippet Card -->
42
+ <div class="max-w-xl mx-auto mb-16">
43
+ <div
44
+ class="group relative rounded-2xl bg-linear-to-b from-slate-800/80 to-slate-900/90 border border-slate-700/80 p-5 shadow-2xl backdrop-blur-md transition-all hover:border-indigo-500/40">
45
+ <div
46
+ class="flex items-center justify-between mb-3 text-xs text-slate-400 font-mono border-b border-slate-800 pb-3">
47
+ <div class="flex items-center gap-2">
48
+ <span class="w-3 h-3 rounded-full bg-rose-500/80 inline-block"></span>
49
+ <span class="w-3 h-3 rounded-full bg-amber-500/80 inline-block"></span>
50
+ <span class="w-3 h-3 rounded-full bg-emerald-500/80 inline-block"></span>
51
+ <span class="ml-2 text-slate-500">
52
+ app/index.hbs
53
+ </span>
54
+ </div>
55
+ <span class="text-indigo-400 font-sans text-[11px] font-semibold tracking-wide uppercase">
56
+ Quick Start
57
+ </span>
58
+ </div>
59
+ <div class="text-left font-mono text-sm py-2">
60
+ <p class="text-slate-300">
61
+ <span class="text-purple-400">
62
+ Edit
63
+ </span>
64
+ <span class="text-emerald-300 px-1.5 py-0.5 rounded bg-slate-800 border border-slate-700">
65
+ app/index.hbs
66
+ </span>
67
+ <span class="text-slate-400">
68
+ to customize this page.
69
+ </span>
70
+ </p>
71
+ </div>
72
+ </div>
73
+ </div>
74
+
75
+ <!-- Feature Grid -->
76
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4 max-w-4xl mx-auto text-left">
77
+ {{#each features}}
78
+ <div
79
+ class="p-6 rounded-2xl bg-slate-900/50 border border-slate-800/80 hover:border-slate-700 transition-all duration-200 group">
80
+ <div class="flex items-center justify-between mb-3">
81
+ <span
82
+ class="text-xs font-semibold px-2.5 py-1 rounded-md bg-slate-800 text-indigo-400 border border-slate-700/50">
83
+ {{this.tag}}
84
+ </span>
85
+ <span class="text-slate-600 group-hover:text-slate-400 transition-colors text-sm">
86
+
87
+ </span>
88
+ </div>
89
+ <h3 class="text-base font-bold text-slate-100 mb-1.5 group-hover:text-indigo-300 transition-colors">
90
+ {{this.title}}
91
+ </h3>
92
+ <p class="text-sm text-slate-400 leading-relaxed">
93
+ {{this.desc}}
94
+ </p>
95
+ </div>
96
+ {{/each}}
97
+ </div>
98
+ </main>
99
+
100
+ <!-- Footer -->
101
+ <footer
102
+ class="py-6 border-t border-slate-800/60 text-center text-xs text-slate-500 flex flex-col sm:flex-row items-center justify-between gap-3">
103
+ <p>
104
+ Powered by
105
+ <span class="text-slate-300 font-medium">
106
+ Nxpress
107
+ </span>
108
+ </p>
109
+ <p class="font-mono text-slate-600">
110
+ {{R.base}}
111
+ </p>
112
+ </footer>
113
+ </div>
@@ -0,0 +1,76 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="dark h-full">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="Express.js speed with Next.js developer experience.">
8
+ <title>Nxpress App</title>
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link
12
+ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
13
+ rel="stylesheet">
14
+ <link rel="stylesheet" href="/tailwind.css">
15
+ <style>
16
+ body {
17
+ font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, sans-serif;
18
+ }
19
+
20
+ code,
21
+ pre {
22
+ font-family: 'JetBrains Mono', monospace;
23
+ }
24
+ </style>
25
+ </head>
26
+
27
+ <body
28
+ class="bg-[#0b0f19] text-slate-100 min-h-full antialiased selection:bg-indigo-500 selection:text-white relative overflow-x-hidden">
29
+ <div
30
+ class="pointer-events-none absolute top-0 left-1/2 -translate-x-1/2 w-full max-w-7xl h-125 bg-radial from-indigo-500/15 via-purple-500/5 to-transparent blur-3xl -z-10">
31
+ </div>
32
+ <div class="pointer-events-none absolute top-1/3 right-10 w-96 h-96 bg-blue-500/10 rounded-full blur-3xl -z-10"></div>
33
+
34
+ <!-- Content -->
35
+ <div class="min-h-screen flex flex-col justify-between max-w-6xl mx-auto px-6 py-8">
36
+ <header class="flex items-center justify-between py-4 border-b border-slate-800/80">
37
+ <div class="flex items-center gap-3">
38
+ <span class="font-bold text-lg text-slate-100 tracking-tight">Nxpress</span>
39
+ </div>
40
+ <div class="flex items-center gap-2">
41
+ <span
42
+ class="inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
43
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse"></span>
44
+ Dev Server Active
45
+ </span>
46
+ </div>
47
+ </header>
48
+
49
+ <main class="py-16 md:py-24 text-center my-auto">
50
+ <div class="flex justify-center mb-6">
51
+ <img src="/logo.png" alt="Nxpress"
52
+ class="w-16 h-16 sm:w-20 sm:h-20 object-contain drop-shadow-[0_0_25px_rgba(99,102,241,0.5)] transition-transform hover:scale-105 duration-300" />
53
+ </div>
54
+
55
+ <h1
56
+ class="text-4xl sm:text-6xl md:text-7xl font-extrabold tracking-tight text-white mb-6 max-w-4xl mx-auto leading-[1.1]">
57
+ Welcome to
58
+ <span class="bg-linear-to-r from-indigo-400 via-sky-400 to-cyan-300 bg-clip-text text-transparent">
59
+ Nxpress
60
+ </span>
61
+ </h1>
62
+
63
+ <p class="text-lg sm:text-xl text-slate-400 max-w-2xl mx-auto mb-10 leading-relaxed">
64
+ Express.js speed with Next.js developer experience.
65
+ </p>
66
+ </main>
67
+
68
+ <footer
69
+ class="py-6 border-t border-slate-800/60 text-center text-xs text-slate-500 flex flex-col sm:flex-row items-center justify-between gap-3">
70
+ <p>Powered by <span class="text-slate-300 font-medium">Nxpress</span></p>
71
+ </footer>
72
+ </div>
73
+
74
+ </body>
75
+
76
+ </html>
@@ -0,0 +1,82 @@
1
+ <div class="min-h-screen flex flex-col justify-between max-w-6xl mx-auto px-6 py-8">
2
+ <header class="flex items-center justify-between py-4 border-b border-slate-800/80">
3
+ <div class="flex items-center gap-3">
4
+ <span class="font-bold text-lg text-slate-100 tracking-tight">Nxpress</span>
5
+ <span class="text-xs font-mono px-2 py-0.5 rounded-full bg-indigo-500/10 text-indigo-400 border border-indigo-500/20 font-medium">
6
+ v{{ version }}
7
+ </span>
8
+ </div>
9
+ {% if E.NODE_ENV != 'production' %}
10
+ <div class="flex items-center gap-2">
11
+ <span class="inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
12
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse"></span>
13
+ Dev Server Active
14
+ </span>
15
+ </div>
16
+ {% endif %}
17
+ </header>
18
+
19
+ <main class="py-16 md:py-24 text-center my-auto">
20
+ <div class="flex justify-center mb-6">
21
+ <img src="/logo.png" alt="Nxpress" class="w-16 h-16 sm:w-20 sm:h-20 object-contain drop-shadow-[0_0_25px_rgba(99,102,241,0.5)] transition-transform hover:scale-105 duration-300" />
22
+ </div>
23
+
24
+ <h1 class="text-4xl sm:text-6xl md:text-7xl font-extrabold tracking-tight text-white mb-6 max-w-4xl mx-auto leading-[1.1]">
25
+ Build fast Node apps with
26
+ <span class="bg-linear-to-r from-indigo-400 via-sky-400 to-cyan-300 bg-clip-text text-transparent">
27
+ {{ title }}
28
+ </span>
29
+ </h1>
30
+
31
+ <p class="text-lg sm:text-xl text-slate-400 max-w-2xl mx-auto mb-10 leading-relaxed">
32
+ {{ description }}
33
+ </p>
34
+
35
+ <div class="max-w-xl mx-auto mb-16">
36
+ <div class="group relative rounded-2xl bg-linear-to-b from-slate-800/80 to-slate-900/90 border border-slate-700/80 p-5 shadow-2xl backdrop-blur-md transition-all hover:border-indigo-500/40">
37
+ <div class="flex items-center justify-between mb-3 text-xs text-slate-400 font-mono border-b border-slate-800 pb-3">
38
+ <div class="flex items-center gap-2">
39
+ <span class="w-3 h-3 rounded-full bg-rose-500/80 inline-block"></span>
40
+ <span class="w-3 h-3 rounded-full bg-amber-500/80 inline-block"></span>
41
+ <span class="w-3 h-3 rounded-full bg-emerald-500/80 inline-block"></span>
42
+ <span class="ml-2 text-slate-500">app/index.liquid</span>
43
+ </div>
44
+ <span class="text-indigo-400 font-sans text-[11px] font-semibold tracking-wide uppercase">Quick Start</span>
45
+ </div>
46
+ <div class="text-left font-mono text-sm py-2">
47
+ <p class="text-slate-300">
48
+ <span class="text-purple-400">Edit</span>
49
+ <span class="text-emerald-300 px-1.5 py-0.5 rounded bg-slate-800 border border-slate-700">app/index.liquid</span>
50
+ <span class="text-slate-400">to customize this page.</span>
51
+ </p>
52
+ </div>
53
+ </div>
54
+ </div>
55
+
56
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4 max-w-4xl mx-auto text-left">
57
+ {% for feat in features %}
58
+ <div class="p-6 rounded-2xl bg-slate-900/50 border border-slate-800/80 hover:border-slate-700 transition-all duration-200 group">
59
+ <div class="flex items-center justify-between mb-3">
60
+ <span class="text-xs font-semibold px-2.5 py-1 rounded-md bg-slate-800 text-indigo-400 border border-slate-700/50">
61
+ {{ feat.tag }}
62
+ </span>
63
+ <span class="text-slate-600 group-hover:text-slate-400 transition-colors text-sm">→</span>
64
+ </div>
65
+ <h3 class="text-base font-bold text-slate-100 mb-1.5 group-hover:text-indigo-300 transition-colors">
66
+ {{ feat.title }}
67
+ </h3>
68
+ <p class="text-sm text-slate-400 leading-relaxed">
69
+ {{ feat.desc }}
70
+ </p>
71
+ </div>
72
+ {% endfor %}
73
+ </div>
74
+ </main>
75
+
76
+ <footer class="py-6 border-t border-slate-800/60 text-center text-xs text-slate-500 flex flex-col sm:flex-row items-center justify-between gap-3">
77
+ <p>Powered by <span class="text-slate-300 font-medium">Nxpress</span></p>
78
+ <p class="font-mono text-slate-600">
79
+ {{ R.base }}
80
+ </p>
81
+ </footer>
82
+ </div>
@@ -0,0 +1,82 @@
1
+ <div class="min-h-screen flex flex-col justify-between max-w-6xl mx-auto px-6 py-8">
2
+ <header class="flex items-center justify-between py-4 border-b border-slate-800/80">
3
+ <div class="flex items-center gap-3">
4
+ <span class="font-bold text-lg text-slate-100 tracking-tight">Nxpress</span>
5
+ <span class="text-xs font-mono px-2 py-0.5 rounded-full bg-indigo-500/10 text-indigo-400 border border-indigo-500/20 font-medium">
6
+ v{{ version }}
7
+ </span>
8
+ </div>
9
+ {% if not E.NODE_ENV or E.NODE_ENV != 'production' %}
10
+ <div class="flex items-center gap-2">
11
+ <span class="inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
12
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse"></span>
13
+ Dev Server Active
14
+ </span>
15
+ </div>
16
+ {% endif %}
17
+ </header>
18
+
19
+ <main class="py-16 md:py-24 text-center my-auto">
20
+ <div class="flex justify-center mb-6">
21
+ <img src="/logo.png" alt="Nxpress" class="w-16 h-16 sm:w-20 sm:h-20 object-contain drop-shadow-[0_0_25px_rgba(99,102,241,0.5)] transition-transform hover:scale-105 duration-300" />
22
+ </div>
23
+
24
+ <h1 class="text-4xl sm:text-6xl md:text-7xl font-extrabold tracking-tight text-white mb-6 max-w-4xl mx-auto leading-[1.1]">
25
+ Build fast Node apps with
26
+ <span class="bg-linear-to-r from-indigo-400 via-sky-400 to-cyan-300 bg-clip-text text-transparent">
27
+ {{ title }}
28
+ </span>
29
+ </h1>
30
+
31
+ <p class="text-lg sm:text-xl text-slate-400 max-w-2xl mx-auto mb-10 leading-relaxed">
32
+ {{ description }}
33
+ </p>
34
+
35
+ <div class="max-w-xl mx-auto mb-16">
36
+ <div class="group relative rounded-2xl bg-linear-to-b from-slate-800/80 to-slate-900/90 border border-slate-700/80 p-5 shadow-2xl backdrop-blur-md transition-all hover:border-indigo-500/40">
37
+ <div class="flex items-center justify-between mb-3 text-xs text-slate-400 font-mono border-b border-slate-800 pb-3">
38
+ <div class="flex items-center gap-2">
39
+ <span class="w-3 h-3 rounded-full bg-rose-500/80 inline-block"></span>
40
+ <span class="w-3 h-3 rounded-full bg-amber-500/80 inline-block"></span>
41
+ <span class="w-3 h-3 rounded-full bg-emerald-500/80 inline-block"></span>
42
+ <span class="ml-2 text-slate-500">app/index.njk</span>
43
+ </div>
44
+ <span class="text-indigo-400 font-sans text-[11px] font-semibold tracking-wide uppercase">Quick Start</span>
45
+ </div>
46
+ <div class="text-left font-mono text-sm py-2">
47
+ <p class="text-slate-300">
48
+ <span class="text-purple-400">Edit</span>
49
+ <span class="text-emerald-300 px-1.5 py-0.5 rounded bg-slate-800 border border-slate-700">app/index.njk</span>
50
+ <span class="text-slate-400">to customize this page.</span>
51
+ </p>
52
+ </div>
53
+ </div>
54
+ </div>
55
+
56
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4 max-w-4xl mx-auto text-left">
57
+ {% for feat in features %}
58
+ <div class="p-6 rounded-2xl bg-slate-900/50 border border-slate-800/80 hover:border-slate-700 transition-all duration-200 group">
59
+ <div class="flex items-center justify-between mb-3">
60
+ <span class="text-xs font-semibold px-2.5 py-1 rounded-md bg-slate-800 text-indigo-400 border border-slate-700/50">
61
+ {{ feat.tag }}
62
+ </span>
63
+ <span class="text-slate-600 group-hover:text-slate-400 transition-colors text-sm">→</span>
64
+ </div>
65
+ <h3 class="text-base font-bold text-slate-100 mb-1.5 group-hover:text-indigo-300 transition-colors">
66
+ {{ feat.title }}
67
+ </h3>
68
+ <p class="text-sm text-slate-400 leading-relaxed">
69
+ {{ feat.desc }}
70
+ </p>
71
+ </div>
72
+ {% endfor %}
73
+ </div>
74
+ </main>
75
+
76
+ <footer class="py-6 border-t border-slate-800/60 text-center text-xs text-slate-500 flex flex-col sm:flex-row items-center justify-between gap-3">
77
+ <p>Powered by <span class="text-slate-300 font-medium">Nxpress</span></p>
78
+ <p class="font-mono text-slate-600">
79
+ {{ R.base }}
80
+ </p>
81
+ </footer>
82
+ </div>
@@ -0,0 +1,38 @@
1
+ import type { Request, Response } from "express";
2
+
3
+ export async function props(req: Request, res: Response) {
4
+ let version = "1.0.8";
5
+ try {
6
+ const f = await fetch("https://registry.npmjs.org/@nxpress/core/latest");
7
+ version = (await f.json()).version;
8
+ } catch (err) {
9
+ console.error("Getting Nxpress version failed.", err);
10
+ }
11
+ return {
12
+ title: "Nxpress Framework",
13
+ version: version,
14
+ description: "Express.js speed with Next.js developer experience.",
15
+ features: [
16
+ {
17
+ title: "File-Based Routing",
18
+ desc: "Automatic route handling mapped to the app directory structure.",
19
+ tag: "Zero Config",
20
+ },
21
+ {
22
+ title: "Server Data Props",
23
+ desc: "Export props functions in route files for SSR data loading.",
24
+ tag: "SSR Ready",
25
+ },
26
+ {
27
+ title: "Tailwind CSS Integration",
28
+ desc: "Modern styling out of the box with zero boilerplate.",
29
+ tag: "Styling",
30
+ },
31
+ {
32
+ title: "Fast Handlebars Engine",
33
+ desc: "Dynamic server rendering with seamless layout templates.",
34
+ tag: "Templating",
35
+ },
36
+ ],
37
+ };
38
+ }
@@ -0,0 +1,39 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="dark h-full">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="<%= description %>">
8
+ <title>
9
+ <%= title %>
10
+ </title>
11
+ <link rel="preconnect" href="https://fonts.googleapis.com">
12
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
13
+ <link
14
+ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
15
+ rel="stylesheet">
16
+ <link rel="stylesheet" href="/tailwind.css">
17
+ <style>
18
+ body {
19
+ font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, sans-serif;
20
+ }
21
+
22
+ code,
23
+ pre {
24
+ font-family: 'JetBrains Mono', monospace;
25
+ }
26
+ </style>
27
+ </head>
28
+
29
+ <body
30
+ class="bg-[#0b0f19] text-slate-100 min-h-full antialiased selection:bg-indigo-500 selection:text-white relative overflow-x-hidden">
31
+ <div
32
+ class="pointer-events-none absolute top-0 left-1/2 -translate-x-1/2 w-full max-w-7xl h-125 bg-radial from-indigo-500/15 via-purple-500/5 to-transparent blur-3xl -z-10">
33
+ </div>
34
+ <div class="pointer-events-none absolute top-1/3 right-10 w-96 h-96 bg-blue-500/10 rounded-full blur-3xl -z-10"></div>
35
+
36
+ <%- body %>
37
+ </body>
38
+
39
+ </html>
@@ -0,0 +1,37 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="dark h-full">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="{{description}}">
8
+ <title>{{title}}</title>
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link
12
+ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap"
13
+ rel="stylesheet">
14
+ <link rel="stylesheet" href="/tailwind.css">
15
+ <style>
16
+ body {
17
+ font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, sans-serif;
18
+ }
19
+
20
+ code,
21
+ pre {
22
+ font-family: 'JetBrains Mono', monospace;
23
+ }
24
+ </style>
25
+ </head>
26
+
27
+ <body
28
+ class="bg-[#0b0f19] text-slate-100 min-h-full antialiased selection:bg-indigo-500 selection:text-white relative overflow-x-hidden">
29
+ <div
30
+ class="pointer-events-none absolute top-0 left-1/2 -translate-x-1/2 w-full max-w-7xl h-125 bg-radial from-indigo-500/15 via-purple-500/5 to-transparent blur-3xl -z-10">
31
+ </div>
32
+ <div class="pointer-events-none absolute top-1/3 right-10 w-96 h-96 bg-blue-500/10 rounded-full blur-3xl -z-10"></div>
33
+
34
+ {{{body}}}
35
+ </body>
36
+
37
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="dark h-full">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title>Nxpress App</title>
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
11
+ <link rel="stylesheet" href="/tailwind.css">
12
+ <style>
13
+ body { font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, sans-serif; }
14
+ code, pre { font-family: 'JetBrains Mono', monospace; }
15
+ </style>
16
+ </head>
17
+
18
+ <body class="bg-[#0b0f19] text-slate-100 min-h-full antialiased selection:bg-indigo-500 selection:text-white relative overflow-x-hidden">
19
+ <div class="pointer-events-none absolute top-0 left-1/2 -translate-x-1/2 w-full max-w-7xl h-125 bg-radial from-indigo-500/15 via-purple-500/5 to-transparent blur-3xl -z-10"></div>
20
+ <div class="pointer-events-none absolute top-1/3 right-10 w-96 h-96 bg-blue-500/10 rounded-full blur-3xl -z-10"></div>
21
+
22
+ {{{body}}}
23
+ </body>
24
+
25
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="dark h-full">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="{{ description }}">
8
+ <title>{{ title }}</title>
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
12
+ <link rel="stylesheet" href="/tailwind.css">
13
+ <style>
14
+ body { font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, sans-serif; }
15
+ code, pre { font-family: 'JetBrains Mono', monospace; }
16
+ </style>
17
+ </head>
18
+
19
+ <body class="bg-[#0b0f19] text-slate-100 min-h-full antialiased selection:bg-indigo-500 selection:text-white relative overflow-x-hidden">
20
+ <div class="pointer-events-none absolute top-0 left-1/2 -translate-x-1/2 w-full max-w-7xl h-125 bg-radial from-indigo-500/15 via-purple-500/5 to-transparent blur-3xl -z-10"></div>
21
+ <div class="pointer-events-none absolute top-1/3 right-10 w-96 h-96 bg-blue-500/10 rounded-full blur-3xl -z-10"></div>
22
+
23
+ {{ body }}
24
+ </body>
25
+
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" class="dark h-full">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <meta name="description" content="{{ description }}">
8
+ <title>{{ title }}</title>
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
12
+ <link rel="stylesheet" href="/tailwind.css">
13
+ <style>
14
+ body { font-family: 'Plus Jakarta Sans', -apple-system, BlinkMacSystemFont, sans-serif; }
15
+ code, pre { font-family: 'JetBrains Mono', monospace; }
16
+ </style>
17
+ </head>
18
+
19
+ <body class="bg-[#0b0f19] text-slate-100 min-h-full antialiased selection:bg-indigo-500 selection:text-white relative overflow-x-hidden">
20
+ <div class="pointer-events-none absolute top-0 left-1/2 -translate-x-1/2 w-full max-w-7xl h-125 bg-radial from-indigo-500/15 via-purple-500/5 to-transparent blur-3xl -z-10"></div>
21
+ <div class="pointer-events-none absolute top-1/3 right-10 w-96 h-96 bg-blue-500/10 rounded-full blur-3xl -z-10"></div>
22
+
23
+ {{ body | safe }}
24
+ </body>
25
+
26
+ </html>
@@ -0,0 +1,2 @@
1
+ @import "tailwindcss";
2
+ @tailwind utilities;
Binary file
@@ -0,0 +1,10 @@
1
+ import { nxpress } from '@nxpress/core';
2
+
3
+ const app = nxpress({
4
+ engine: '{{ENGINE}}',
5
+ });
6
+
7
+ const PORT = process.env.PORT || {{PORT}};
8
+ app.listen(PORT, () => {
9
+ console.log(`Nxpress server running on http://localhost:${PORT}`);
10
+ });