create-moria 0.3.2 → 0.3.4
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/.turbo/turbo-build.log +1 -1
- package/dist/index.js +184 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +205 -9
package/.turbo/turbo-build.log
CHANGED
package/dist/index.js
CHANGED
|
@@ -17,7 +17,7 @@ import pc from 'picocolors';
|
|
|
17
17
|
import prompts from 'prompts';
|
|
18
18
|
import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
19
19
|
import { join, resolve } from 'node:path';
|
|
20
|
-
const VERSION = '0.3.
|
|
20
|
+
const VERSION = '0.3.4';
|
|
21
21
|
export const cli = cac('create-moria');
|
|
22
22
|
// ─── Template file generators ─────────────────────────
|
|
23
23
|
function tsconfigContent() {
|
|
@@ -78,6 +78,9 @@ export default defineConfig({
|
|
|
78
78
|
database: {
|
|
79
79
|
${dbConfig}
|
|
80
80
|
},
|
|
81
|
+
vite: {
|
|
82
|
+
clientEntry: '/src/entry-client.ts',
|
|
83
|
+
},
|
|
81
84
|
});
|
|
82
85
|
`;
|
|
83
86
|
}
|
|
@@ -93,6 +96,9 @@ export default {
|
|
|
93
96
|
database: {
|
|
94
97
|
${dbConfig}
|
|
95
98
|
},
|
|
99
|
+
vite: {
|
|
100
|
+
clientEntry: '/src/entry-client.js',
|
|
101
|
+
},
|
|
96
102
|
};
|
|
97
103
|
`;
|
|
98
104
|
}
|
|
@@ -140,6 +146,23 @@ import HomePage from './routes/pages/index.js';
|
|
|
140
146
|
const data = getHydrationData();
|
|
141
147
|
const root = document.getElementById('app');
|
|
142
148
|
|
|
149
|
+
if (root) {
|
|
150
|
+
hydrate(HomePage, root, data);
|
|
151
|
+
}
|
|
152
|
+
`;
|
|
153
|
+
}
|
|
154
|
+
function srcEntryClientJs() {
|
|
155
|
+
return `/**
|
|
156
|
+
* Client-side entry point.
|
|
157
|
+
* Hydrates the server-rendered page to make it interactive.
|
|
158
|
+
*/
|
|
159
|
+
|
|
160
|
+
import { hydrate, getHydrationData } from '@moriajs/renderer';
|
|
161
|
+
import HomePage from './routes/pages/index.js';
|
|
162
|
+
|
|
163
|
+
const data = getHydrationData();
|
|
164
|
+
const root = document.getElementById('app');
|
|
165
|
+
|
|
143
166
|
if (root) {
|
|
144
167
|
hydrate(HomePage, root, data);
|
|
145
168
|
}
|
|
@@ -172,6 +195,54 @@ export function GET(_request: FastifyRequest, _reply: FastifyReply) {
|
|
|
172
195
|
}
|
|
173
196
|
`;
|
|
174
197
|
}
|
|
198
|
+
function srcApiHealthTs() {
|
|
199
|
+
return `/**
|
|
200
|
+
* GET /api/health
|
|
201
|
+
*/
|
|
202
|
+
|
|
203
|
+
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
204
|
+
|
|
205
|
+
export function GET(_request: FastifyRequest, _reply: FastifyReply) {
|
|
206
|
+
return { status: 'ok', uptime: process.uptime() };
|
|
207
|
+
}
|
|
208
|
+
`;
|
|
209
|
+
}
|
|
210
|
+
function srcApiUsersTs() {
|
|
211
|
+
return `/**
|
|
212
|
+
* GET /api/users/:id
|
|
213
|
+
*/
|
|
214
|
+
|
|
215
|
+
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
216
|
+
|
|
217
|
+
export function GET(request: FastifyRequest<{ Params: { id: string } }>, _reply: FastifyReply) {
|
|
218
|
+
const { id } = request.params;
|
|
219
|
+
return {
|
|
220
|
+
id,
|
|
221
|
+
name: \`User \${id}\`,
|
|
222
|
+
email: \`user\${id}@example.com\`,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
`;
|
|
226
|
+
}
|
|
227
|
+
function srcApiSearchTs() {
|
|
228
|
+
return `/**
|
|
229
|
+
* GET /api/search?q=...
|
|
230
|
+
*/
|
|
231
|
+
|
|
232
|
+
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
233
|
+
|
|
234
|
+
export function GET(request: FastifyRequest<{ Querystring: { q?: string } }>, _reply: FastifyReply) {
|
|
235
|
+
const { q = '' } = request.query;
|
|
236
|
+
return {
|
|
237
|
+
query: q,
|
|
238
|
+
results: [
|
|
239
|
+
{ id: 1, title: \`Result for \${q} 1\` },
|
|
240
|
+
{ id: 2, title: \`Result for \${q} 2\` },
|
|
241
|
+
],
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
`;
|
|
245
|
+
}
|
|
175
246
|
function srcApiHelloJs() {
|
|
176
247
|
return `/**
|
|
177
248
|
* GET /api/hello
|
|
@@ -185,6 +256,48 @@ export function GET(_request, _reply) {
|
|
|
185
256
|
}
|
|
186
257
|
`;
|
|
187
258
|
}
|
|
259
|
+
function srcApiHealthJs() {
|
|
260
|
+
return `/**
|
|
261
|
+
* GET /api/health
|
|
262
|
+
*/
|
|
263
|
+
|
|
264
|
+
export function GET(_request, _reply) {
|
|
265
|
+
return { status: 'ok', uptime: process.uptime() };
|
|
266
|
+
}
|
|
267
|
+
`;
|
|
268
|
+
}
|
|
269
|
+
function srcApiUsersJs() {
|
|
270
|
+
return `/**
|
|
271
|
+
* GET /api/users/:id
|
|
272
|
+
*/
|
|
273
|
+
|
|
274
|
+
export function GET(request, _reply) {
|
|
275
|
+
const { id } = request.params;
|
|
276
|
+
return {
|
|
277
|
+
id,
|
|
278
|
+
name: \`User \${id}\`,
|
|
279
|
+
email: \`user\${id}@example.com\`,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
`;
|
|
283
|
+
}
|
|
284
|
+
function srcApiSearchJs() {
|
|
285
|
+
return `/**
|
|
286
|
+
* GET /api/search?q=...
|
|
287
|
+
*/
|
|
288
|
+
|
|
289
|
+
export function GET(request, _reply) {
|
|
290
|
+
const { q = '' } = request.query;
|
|
291
|
+
return {
|
|
292
|
+
query: q,
|
|
293
|
+
results: [
|
|
294
|
+
{ id: 1, title: \`Result for \${q} 1\` },
|
|
295
|
+
{ id: 2, title: \`Result for \${q} 2\` },
|
|
296
|
+
],
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
`;
|
|
300
|
+
}
|
|
188
301
|
function srcPageIndexTs() {
|
|
189
302
|
return `/**
|
|
190
303
|
* Home page — server-rendered Mithril.js component.
|
|
@@ -220,6 +333,14 @@ export default {
|
|
|
220
333
|
(data?.features ?? []).map((f: string) => m('li', f))
|
|
221
334
|
),
|
|
222
335
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
336
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Quick Links'),
|
|
337
|
+
m('ul', { style: 'line-height:1.8;display:flex;gap:1rem;padding:0;list-style:none' }, [
|
|
338
|
+
m('li', m('a', { href: '/api/hello', target: '_blank' }, 'Hello API')),
|
|
339
|
+
m('li', m('a', { href: '/api/health', target: '_blank' }, 'Health Check')),
|
|
340
|
+
m('li', m('a', { href: '/api/users/42', target: '_blank' }, 'User Params')),
|
|
341
|
+
m('li', m('a', { href: '/api/search?q=moria', target: '_blank' }, 'Search Query')),
|
|
342
|
+
]),
|
|
343
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
223
344
|
m('p', { style: 'color:#999;font-size:0.9rem' }, [
|
|
224
345
|
'Edit ',
|
|
225
346
|
m('code', 'src/routes/pages/index.ts'),
|
|
@@ -230,6 +351,59 @@ export default {
|
|
|
230
351
|
};
|
|
231
352
|
`;
|
|
232
353
|
}
|
|
354
|
+
function srcPageIndexJs() {
|
|
355
|
+
return `/**
|
|
356
|
+
* Home page — server-rendered Mithril.js component.
|
|
357
|
+
*/
|
|
358
|
+
|
|
359
|
+
import m from 'mithril';
|
|
360
|
+
|
|
361
|
+
/** Server-side data loader */
|
|
362
|
+
export async function getServerData() {
|
|
363
|
+
return {
|
|
364
|
+
title: 'Welcome to MoriaJS',
|
|
365
|
+
features: [
|
|
366
|
+
'File-based routing',
|
|
367
|
+
'SSR + client hydration',
|
|
368
|
+
'Middleware system',
|
|
369
|
+
'Database with Kysely',
|
|
370
|
+
'JWT authentication',
|
|
371
|
+
],
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/** Page component */
|
|
376
|
+
export default {
|
|
377
|
+
title: 'MoriaJS App',
|
|
378
|
+
view(vnode) {
|
|
379
|
+
const data = vnode.attrs?.serverData;
|
|
380
|
+
return m('main', { style: 'max-width:640px;margin:2rem auto;font-family:system-ui;padding:0 1rem' }, [
|
|
381
|
+
m('h1', { style: 'font-size:2.5rem;margin-bottom:0.5rem' }, '🏔️ ' + (data?.title ?? 'MoriaJS')),
|
|
382
|
+
m('p', { style: 'color:#666;font-size:1.1rem' }, 'Your full-stack Mithril.js app is up and running.'),
|
|
383
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
384
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Features'),
|
|
385
|
+
m('ul', { style: 'line-height:1.8' },
|
|
386
|
+
(data?.features ?? []).map((f) => m('li', f))
|
|
387
|
+
),
|
|
388
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
389
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Quick Links'),
|
|
390
|
+
m('ul', { style: 'line-height:1.8;display:flex;gap:1rem;padding:0;list-style:none' }, [
|
|
391
|
+
m('li', m('a', { href: '/api/hello', target: '_blank' }, 'Hello API')),
|
|
392
|
+
m('li', m('a', { href: '/api/health', target: '_blank' }, 'Health Check')),
|
|
393
|
+
m('li', m('a', { href: '/api/users/42', target: '_blank' }, 'User Params')),
|
|
394
|
+
m('li', m('a', { href: '/api/search?q=moria', target: '_blank' }, 'Search Query')),
|
|
395
|
+
]),
|
|
396
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
397
|
+
m('p', { style: 'color:#999;font-size:0.9rem' }, [
|
|
398
|
+
'Edit ',
|
|
399
|
+
m('code', 'src/routes/pages/index.js'),
|
|
400
|
+
' to get started.',
|
|
401
|
+
]),
|
|
402
|
+
]);
|
|
403
|
+
},
|
|
404
|
+
};
|
|
405
|
+
`;
|
|
406
|
+
}
|
|
233
407
|
function srcIndexJs() {
|
|
234
408
|
return `/**
|
|
235
409
|
* App entry point — starts the MoriaJS server.
|
|
@@ -339,11 +513,11 @@ cli
|
|
|
339
513
|
process.exit(1);
|
|
340
514
|
}
|
|
341
515
|
const template = options?.template || answers.template || 'default';
|
|
342
|
-
const
|
|
516
|
+
const isTS = options?.typescript || answers.language === 'ts' || (!options?.javascript && !answers.language);
|
|
517
|
+
const lang = isTS ? 'ts' : 'js';
|
|
343
518
|
const db = options?.db || answers.database || 'sqlite';
|
|
344
519
|
const dir = resolve(process.cwd(), name);
|
|
345
520
|
const ext = lang === 'ts' ? 'ts' : 'js';
|
|
346
|
-
const isTS = lang === 'ts';
|
|
347
521
|
if (existsSync(dir)) {
|
|
348
522
|
console.log(pc.red(`Error: directory "${name}" already exists.`));
|
|
349
523
|
process.exit(1);
|
|
@@ -356,7 +530,7 @@ cli
|
|
|
356
530
|
console.log();
|
|
357
531
|
// ─── Create directory structure ─────────────────────
|
|
358
532
|
if (template === 'default') {
|
|
359
|
-
mkdirs(join(dir, 'src', 'routes', 'api'), join(dir, 'src', 'routes', 'pages'));
|
|
533
|
+
mkdirs(join(dir, 'src', 'routes', 'api'), join(dir, 'src', 'routes', 'api', 'users'), join(dir, 'src', 'routes', 'pages'));
|
|
360
534
|
}
|
|
361
535
|
else {
|
|
362
536
|
mkdirs(join(dir, 'src', 'routes', 'api'));
|
|
@@ -411,17 +585,17 @@ cli
|
|
|
411
585
|
// App entry
|
|
412
586
|
write(join(dir, `src/index.${ext}`), isTS ? srcIndexTs() : srcIndexJs());
|
|
413
587
|
// Client entry
|
|
414
|
-
|
|
415
|
-
write(join(dir, 'src/entry-client.ts'), srcEntryClientTs());
|
|
416
|
-
}
|
|
588
|
+
write(join(dir, `src/entry-client.${ext}`), isTS ? srcEntryClientTs() : srcEntryClientJs());
|
|
417
589
|
// Root middleware
|
|
418
590
|
write(join(dir, `src/routes/_middleware.${ext}`), isTS ? srcMiddlewareTs() : srcMiddlewareJs());
|
|
419
591
|
// API route
|
|
420
592
|
write(join(dir, `src/routes/api/hello.${ext}`), isTS ? srcApiHelloTs() : srcApiHelloJs());
|
|
421
593
|
// SSR page
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
}
|
|
594
|
+
write(join(dir, `src/routes/pages/index.${ext}`), isTS ? srcPageIndexTs() : srcPageIndexJs());
|
|
595
|
+
// Additional API routes
|
|
596
|
+
write(join(dir, `src/routes/api/health.${ext}`), isTS ? srcApiHealthTs() : srcApiHealthJs());
|
|
597
|
+
write(join(dir, `src/routes/api/users/[id].${ext}`), isTS ? srcApiUsersTs() : srcApiUsersJs());
|
|
598
|
+
write(join(dir, `src/routes/api/search.${ext}`), isTS ? srcApiSearchTs() : srcApiSearchJs());
|
|
425
599
|
}
|
|
426
600
|
else {
|
|
427
601
|
// Minimal template — just entry + one API route
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC;AAEvC,yDAAyD;AAEzD,SAAS,eAAe;IACpB,OAAO,IAAI,CAAC,SAAS,CACjB;QACI,eAAe,EAAE;YACb,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,SAAS;YAC3B,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,IAAI;YACjB,cAAc,EAAE,IAAI;YACpB,SAAS,EAAE,IAAI;SAClB;QACD,OAAO,EAAE,CAAC,KAAK,CAAC;QAChB,OAAO,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC;KACpC,EACD,IAAI,EACJ,CAAC,CACJ,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CAAC,EAAU;IAC1B,MAAM,KAAK,GAAG;QACV,iCAAiC;QACjC,EAAE;QACF,UAAU;QACV,WAAW;QACX,EAAE;QACF,YAAY;KACf,CAAC;IACF,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC9E,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;IAC7E,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,yCAAyC,EAAE,EAAE,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,gBAAgB;IACrB,OAAO;;;;;CAKV,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,EAAU;IAC7B,MAAM,QAAQ,GACV,EAAE,KAAK,QAAQ;QACX,CAAC,CAAC,mDAAmD;QACrD,CAAC,CAAC,wDAAwD,CAAC;IACnE,OAAO;;;;;;;EAOT,QAAQ
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -19,7 +19,7 @@ import prompts from 'prompts';
|
|
|
19
19
|
import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
20
20
|
import { join, resolve } from 'node:path';
|
|
21
21
|
|
|
22
|
-
const VERSION = '0.3.
|
|
22
|
+
const VERSION = '0.3.4';
|
|
23
23
|
|
|
24
24
|
export const cli = cac('create-moria');
|
|
25
25
|
|
|
@@ -90,6 +90,9 @@ export default defineConfig({
|
|
|
90
90
|
database: {
|
|
91
91
|
${dbConfig}
|
|
92
92
|
},
|
|
93
|
+
vite: {
|
|
94
|
+
clientEntry: '/src/entry-client.ts',
|
|
95
|
+
},
|
|
93
96
|
});
|
|
94
97
|
`;
|
|
95
98
|
}
|
|
@@ -107,6 +110,9 @@ export default {
|
|
|
107
110
|
database: {
|
|
108
111
|
${dbConfig}
|
|
109
112
|
},
|
|
113
|
+
vite: {
|
|
114
|
+
clientEntry: '/src/entry-client.js',
|
|
115
|
+
},
|
|
110
116
|
};
|
|
111
117
|
`;
|
|
112
118
|
}
|
|
@@ -163,6 +169,24 @@ if (root) {
|
|
|
163
169
|
`;
|
|
164
170
|
}
|
|
165
171
|
|
|
172
|
+
function srcEntryClientJs(): string {
|
|
173
|
+
return `/**
|
|
174
|
+
* Client-side entry point.
|
|
175
|
+
* Hydrates the server-rendered page to make it interactive.
|
|
176
|
+
*/
|
|
177
|
+
|
|
178
|
+
import { hydrate, getHydrationData } from '@moriajs/renderer';
|
|
179
|
+
import HomePage from './routes/pages/index.js';
|
|
180
|
+
|
|
181
|
+
const data = getHydrationData();
|
|
182
|
+
const root = document.getElementById('app');
|
|
183
|
+
|
|
184
|
+
if (root) {
|
|
185
|
+
hydrate(HomePage, root, data);
|
|
186
|
+
}
|
|
187
|
+
`;
|
|
188
|
+
}
|
|
189
|
+
|
|
166
190
|
function srcMiddlewareTs(): string {
|
|
167
191
|
return `/**
|
|
168
192
|
* Root middleware — runs on every request.
|
|
@@ -192,6 +216,57 @@ export function GET(_request: FastifyRequest, _reply: FastifyReply) {
|
|
|
192
216
|
`;
|
|
193
217
|
}
|
|
194
218
|
|
|
219
|
+
function srcApiHealthTs(): string {
|
|
220
|
+
return `/**
|
|
221
|
+
* GET /api/health
|
|
222
|
+
*/
|
|
223
|
+
|
|
224
|
+
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
225
|
+
|
|
226
|
+
export function GET(_request: FastifyRequest, _reply: FastifyReply) {
|
|
227
|
+
return { status: 'ok', uptime: process.uptime() };
|
|
228
|
+
}
|
|
229
|
+
`;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function srcApiUsersTs(): string {
|
|
233
|
+
return `/**
|
|
234
|
+
* GET /api/users/:id
|
|
235
|
+
*/
|
|
236
|
+
|
|
237
|
+
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
238
|
+
|
|
239
|
+
export function GET(request: FastifyRequest<{ Params: { id: string } }>, _reply: FastifyReply) {
|
|
240
|
+
const { id } = request.params;
|
|
241
|
+
return {
|
|
242
|
+
id,
|
|
243
|
+
name: \`User \${id}\`,
|
|
244
|
+
email: \`user\${id}@example.com\`,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
`;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function srcApiSearchTs(): string {
|
|
251
|
+
return `/**
|
|
252
|
+
* GET /api/search?q=...
|
|
253
|
+
*/
|
|
254
|
+
|
|
255
|
+
import type { FastifyRequest, FastifyReply } from 'fastify';
|
|
256
|
+
|
|
257
|
+
export function GET(request: FastifyRequest<{ Querystring: { q?: string } }>, _reply: FastifyReply) {
|
|
258
|
+
const { q = '' } = request.query;
|
|
259
|
+
return {
|
|
260
|
+
query: q,
|
|
261
|
+
results: [
|
|
262
|
+
{ id: 1, title: \`Result for \${q} 1\` },
|
|
263
|
+
{ id: 2, title: \`Result for \${q} 2\` },
|
|
264
|
+
],
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
`;
|
|
268
|
+
}
|
|
269
|
+
|
|
195
270
|
function srcApiHelloJs(): string {
|
|
196
271
|
return `/**
|
|
197
272
|
* GET /api/hello
|
|
@@ -206,6 +281,51 @@ export function GET(_request, _reply) {
|
|
|
206
281
|
`;
|
|
207
282
|
}
|
|
208
283
|
|
|
284
|
+
function srcApiHealthJs(): string {
|
|
285
|
+
return `/**
|
|
286
|
+
* GET /api/health
|
|
287
|
+
*/
|
|
288
|
+
|
|
289
|
+
export function GET(_request, _reply) {
|
|
290
|
+
return { status: 'ok', uptime: process.uptime() };
|
|
291
|
+
}
|
|
292
|
+
`;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function srcApiUsersJs(): string {
|
|
296
|
+
return `/**
|
|
297
|
+
* GET /api/users/:id
|
|
298
|
+
*/
|
|
299
|
+
|
|
300
|
+
export function GET(request, _reply) {
|
|
301
|
+
const { id } = request.params;
|
|
302
|
+
return {
|
|
303
|
+
id,
|
|
304
|
+
name: \`User \${id}\`,
|
|
305
|
+
email: \`user\${id}@example.com\`,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
`;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function srcApiSearchJs(): string {
|
|
312
|
+
return `/**
|
|
313
|
+
* GET /api/search?q=...
|
|
314
|
+
*/
|
|
315
|
+
|
|
316
|
+
export function GET(request, _reply) {
|
|
317
|
+
const { q = '' } = request.query;
|
|
318
|
+
return {
|
|
319
|
+
query: q,
|
|
320
|
+
results: [
|
|
321
|
+
{ id: 1, title: \`Result for \${q} 1\` },
|
|
322
|
+
{ id: 2, title: \`Result for \${q} 2\` },
|
|
323
|
+
],
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
`;
|
|
327
|
+
}
|
|
328
|
+
|
|
209
329
|
function srcPageIndexTs(): string {
|
|
210
330
|
return `/**
|
|
211
331
|
* Home page — server-rendered Mithril.js component.
|
|
@@ -241,6 +361,14 @@ export default {
|
|
|
241
361
|
(data?.features ?? []).map((f: string) => m('li', f))
|
|
242
362
|
),
|
|
243
363
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
364
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Quick Links'),
|
|
365
|
+
m('ul', { style: 'line-height:1.8;display:flex;gap:1rem;padding:0;list-style:none' }, [
|
|
366
|
+
m('li', m('a', { href: '/api/hello', target: '_blank' }, 'Hello API')),
|
|
367
|
+
m('li', m('a', { href: '/api/health', target: '_blank' }, 'Health Check')),
|
|
368
|
+
m('li', m('a', { href: '/api/users/42', target: '_blank' }, 'User Params')),
|
|
369
|
+
m('li', m('a', { href: '/api/search?q=moria', target: '_blank' }, 'Search Query')),
|
|
370
|
+
]),
|
|
371
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
244
372
|
m('p', { style: 'color:#999;font-size:0.9rem' }, [
|
|
245
373
|
'Edit ',
|
|
246
374
|
m('code', 'src/routes/pages/index.ts'),
|
|
@@ -252,6 +380,60 @@ export default {
|
|
|
252
380
|
`;
|
|
253
381
|
}
|
|
254
382
|
|
|
383
|
+
function srcPageIndexJs(): string {
|
|
384
|
+
return `/**
|
|
385
|
+
* Home page — server-rendered Mithril.js component.
|
|
386
|
+
*/
|
|
387
|
+
|
|
388
|
+
import m from 'mithril';
|
|
389
|
+
|
|
390
|
+
/** Server-side data loader */
|
|
391
|
+
export async function getServerData() {
|
|
392
|
+
return {
|
|
393
|
+
title: 'Welcome to MoriaJS',
|
|
394
|
+
features: [
|
|
395
|
+
'File-based routing',
|
|
396
|
+
'SSR + client hydration',
|
|
397
|
+
'Middleware system',
|
|
398
|
+
'Database with Kysely',
|
|
399
|
+
'JWT authentication',
|
|
400
|
+
],
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/** Page component */
|
|
405
|
+
export default {
|
|
406
|
+
title: 'MoriaJS App',
|
|
407
|
+
view(vnode) {
|
|
408
|
+
const data = vnode.attrs?.serverData;
|
|
409
|
+
return m('main', { style: 'max-width:640px;margin:2rem auto;font-family:system-ui;padding:0 1rem' }, [
|
|
410
|
+
m('h1', { style: 'font-size:2.5rem;margin-bottom:0.5rem' }, '🏔️ ' + (data?.title ?? 'MoriaJS')),
|
|
411
|
+
m('p', { style: 'color:#666;font-size:1.1rem' }, 'Your full-stack Mithril.js app is up and running.'),
|
|
412
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
413
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Features'),
|
|
414
|
+
m('ul', { style: 'line-height:1.8' },
|
|
415
|
+
(data?.features ?? []).map((f) => m('li', f))
|
|
416
|
+
),
|
|
417
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
418
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Quick Links'),
|
|
419
|
+
m('ul', { style: 'line-height:1.8;display:flex;gap:1rem;padding:0;list-style:none' }, [
|
|
420
|
+
m('li', m('a', { href: '/api/hello', target: '_blank' }, 'Hello API')),
|
|
421
|
+
m('li', m('a', { href: '/api/health', target: '_blank' }, 'Health Check')),
|
|
422
|
+
m('li', m('a', { href: '/api/users/42', target: '_blank' }, 'User Params')),
|
|
423
|
+
m('li', m('a', { href: '/api/search?q=moria', target: '_blank' }, 'Search Query')),
|
|
424
|
+
]),
|
|
425
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
426
|
+
m('p', { style: 'color:#999;font-size:0.9rem' }, [
|
|
427
|
+
'Edit ',
|
|
428
|
+
m('code', 'src/routes/pages/index.js'),
|
|
429
|
+
' to get started.',
|
|
430
|
+
]),
|
|
431
|
+
]);
|
|
432
|
+
},
|
|
433
|
+
};
|
|
434
|
+
`;
|
|
435
|
+
}
|
|
436
|
+
|
|
255
437
|
function srcIndexJs(): string {
|
|
256
438
|
return `/**
|
|
257
439
|
* App entry point — starts the MoriaJS server.
|
|
@@ -370,11 +552,11 @@ cli
|
|
|
370
552
|
}
|
|
371
553
|
|
|
372
554
|
const template = (options?.template as string) || answers.template || 'default';
|
|
373
|
-
const
|
|
555
|
+
const isTS = (options?.typescript as boolean) || answers.language === 'ts' || (!options?.javascript && !answers.language);
|
|
556
|
+
const lang = isTS ? 'ts' : 'js';
|
|
374
557
|
const db = (options?.db as string) || answers.database || 'sqlite';
|
|
375
558
|
const dir = resolve(process.cwd(), name);
|
|
376
559
|
const ext = lang === 'ts' ? 'ts' : 'js';
|
|
377
|
-
const isTS = lang === 'ts';
|
|
378
560
|
|
|
379
561
|
if (existsSync(dir)) {
|
|
380
562
|
console.log(pc.red(`Error: directory "${name}" already exists.`));
|
|
@@ -392,6 +574,7 @@ cli
|
|
|
392
574
|
if (template === 'default') {
|
|
393
575
|
mkdirs(
|
|
394
576
|
join(dir, 'src', 'routes', 'api'),
|
|
577
|
+
join(dir, 'src', 'routes', 'api', 'users'),
|
|
395
578
|
join(dir, 'src', 'routes', 'pages')
|
|
396
579
|
);
|
|
397
580
|
} else {
|
|
@@ -462,9 +645,7 @@ cli
|
|
|
462
645
|
write(join(dir, `src/index.${ext}`), isTS ? srcIndexTs() : srcIndexJs());
|
|
463
646
|
|
|
464
647
|
// Client entry
|
|
465
|
-
|
|
466
|
-
write(join(dir, 'src/entry-client.ts'), srcEntryClientTs());
|
|
467
|
-
}
|
|
648
|
+
write(join(dir, `src/entry-client.${ext}`), isTS ? srcEntryClientTs() : srcEntryClientJs());
|
|
468
649
|
|
|
469
650
|
// Root middleware
|
|
470
651
|
write(
|
|
@@ -479,9 +660,24 @@ cli
|
|
|
479
660
|
);
|
|
480
661
|
|
|
481
662
|
// SSR page
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
663
|
+
write(
|
|
664
|
+
join(dir, `src/routes/pages/index.${ext}`),
|
|
665
|
+
isTS ? srcPageIndexTs() : srcPageIndexJs()
|
|
666
|
+
);
|
|
667
|
+
|
|
668
|
+
// Additional API routes
|
|
669
|
+
write(
|
|
670
|
+
join(dir, `src/routes/api/health.${ext}`),
|
|
671
|
+
isTS ? srcApiHealthTs() : srcApiHealthJs()
|
|
672
|
+
);
|
|
673
|
+
write(
|
|
674
|
+
join(dir, `src/routes/api/users/[id].${ext}`),
|
|
675
|
+
isTS ? srcApiUsersTs() : srcApiUsersJs()
|
|
676
|
+
);
|
|
677
|
+
write(
|
|
678
|
+
join(dir, `src/routes/api/search.${ext}`),
|
|
679
|
+
isTS ? srcApiSearchTs() : srcApiSearchJs()
|
|
680
|
+
);
|
|
485
681
|
} else {
|
|
486
682
|
// Minimal template — just entry + one API route
|
|
487
683
|
write(join(dir, `src/index.${ext}`), isTS ? srcIndexTs() : srcIndexJs());
|