create-moria 0.3.3 → 0.3.5
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 +142 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +158 -1
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.5';
|
|
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
|
}
|
|
@@ -189,6 +195,54 @@ export function GET(_request: FastifyRequest, _reply: FastifyReply) {
|
|
|
189
195
|
}
|
|
190
196
|
`;
|
|
191
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
|
+
}
|
|
192
246
|
function srcApiHelloJs() {
|
|
193
247
|
return `/**
|
|
194
248
|
* GET /api/hello
|
|
@@ -202,6 +256,48 @@ export function GET(_request, _reply) {
|
|
|
202
256
|
}
|
|
203
257
|
`;
|
|
204
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
|
+
}
|
|
205
301
|
function srcPageIndexTs() {
|
|
206
302
|
return `/**
|
|
207
303
|
* Home page — server-rendered Mithril.js component.
|
|
@@ -224,6 +320,8 @@ export async function getServerData() {
|
|
|
224
320
|
}
|
|
225
321
|
|
|
226
322
|
/** Page component */
|
|
323
|
+
let count = 0;
|
|
324
|
+
|
|
227
325
|
export default {
|
|
228
326
|
title: 'MoriaJS App',
|
|
229
327
|
view(vnode: m.Vnode<{ serverData?: { title: string; features: string[] } }>) {
|
|
@@ -231,12 +329,30 @@ export default {
|
|
|
231
329
|
return m('main', { style: 'max-width:640px;margin:2rem auto;font-family:system-ui;padding:0 1rem' }, [
|
|
232
330
|
m('h1', { style: 'font-size:2.5rem;margin-bottom:0.5rem' }, '🏔️ ' + (data?.title ?? 'MoriaJS')),
|
|
233
331
|
m('p', { style: 'color:#666;font-size:1.1rem' }, 'Your full-stack Mithril.js app is up and running.'),
|
|
332
|
+
|
|
333
|
+
m('div', { style: 'background:#f4f4f4;padding:1.5rem;border-radius:8px;margin:2rem 0;text-align:center' }, [
|
|
334
|
+
m('h3', { style: 'margin-top:0' }, 'Hydration Demo'),
|
|
335
|
+
m('p', 'Click the button below to verify that client-side hydration is working:'),
|
|
336
|
+
m('button', {
|
|
337
|
+
style: 'background:#007bff;color:#fff;border:none;padding:0.75rem 1.5rem;border-radius:4px;font-size:1rem;cursor:pointer',
|
|
338
|
+
onclick: () => { count++; }
|
|
339
|
+
}, \`Count is \${count}\`),
|
|
340
|
+
]),
|
|
341
|
+
|
|
234
342
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
235
343
|
m('h2', { style: 'font-size:1.3rem' }, 'Features'),
|
|
236
344
|
m('ul', { style: 'line-height:1.8' },
|
|
237
345
|
(data?.features ?? []).map((f: string) => m('li', f))
|
|
238
346
|
),
|
|
239
347
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
348
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Quick Links'),
|
|
349
|
+
m('ul', { style: 'line-height:1.8;display:flex;gap:1rem;padding:0;list-style:none' }, [
|
|
350
|
+
m('li', m('a', { href: '/api/hello', target: '_blank' }, 'Hello API')),
|
|
351
|
+
m('li', m('a', { href: '/api/health', target: '_blank' }, 'Health Check')),
|
|
352
|
+
m('li', m('a', { href: '/api/users/42', target: '_blank' }, 'User Params')),
|
|
353
|
+
m('li', m('a', { href: '/api/search?q=moria', target: '_blank' }, 'Search Query')),
|
|
354
|
+
]),
|
|
355
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
240
356
|
m('p', { style: 'color:#999;font-size:0.9rem' }, [
|
|
241
357
|
'Edit ',
|
|
242
358
|
m('code', 'src/routes/pages/index.ts'),
|
|
@@ -269,6 +385,8 @@ export async function getServerData() {
|
|
|
269
385
|
}
|
|
270
386
|
|
|
271
387
|
/** Page component */
|
|
388
|
+
let count = 0;
|
|
389
|
+
|
|
272
390
|
export default {
|
|
273
391
|
title: 'MoriaJS App',
|
|
274
392
|
view(vnode) {
|
|
@@ -276,12 +394,30 @@ export default {
|
|
|
276
394
|
return m('main', { style: 'max-width:640px;margin:2rem auto;font-family:system-ui;padding:0 1rem' }, [
|
|
277
395
|
m('h1', { style: 'font-size:2.5rem;margin-bottom:0.5rem' }, '🏔️ ' + (data?.title ?? 'MoriaJS')),
|
|
278
396
|
m('p', { style: 'color:#666;font-size:1.1rem' }, 'Your full-stack Mithril.js app is up and running.'),
|
|
397
|
+
|
|
398
|
+
m('div', { style: 'background:#f4f4f4;padding:1.5rem;border-radius:8px;margin:2rem 0;text-align:center' }, [
|
|
399
|
+
m('h3', { style: 'margin-top:0' }, 'Hydration Demo'),
|
|
400
|
+
m('p', 'Click the button below to verify that client-side hydration is working:'),
|
|
401
|
+
m('button', {
|
|
402
|
+
style: 'background:#007bff;color:#fff;border:none;padding:0.75rem 1.5rem;border-radius:4px;font-size:1rem;cursor:pointer',
|
|
403
|
+
onclick: () => { count++; }
|
|
404
|
+
}, \`Count is \${count}\`),
|
|
405
|
+
]),
|
|
406
|
+
|
|
279
407
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
280
408
|
m('h2', { style: 'font-size:1.3rem' }, 'Features'),
|
|
281
409
|
m('ul', { style: 'line-height:1.8' },
|
|
282
410
|
(data?.features ?? []).map((f) => m('li', f))
|
|
283
411
|
),
|
|
284
412
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
413
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Quick Links'),
|
|
414
|
+
m('ul', { style: 'line-height:1.8;display:flex;gap:1rem;padding:0;list-style:none' }, [
|
|
415
|
+
m('li', m('a', { href: '/api/hello', target: '_blank' }, 'Hello API')),
|
|
416
|
+
m('li', m('a', { href: '/api/health', target: '_blank' }, 'Health Check')),
|
|
417
|
+
m('li', m('a', { href: '/api/users/42', target: '_blank' }, 'User Params')),
|
|
418
|
+
m('li', m('a', { href: '/api/search?q=moria', target: '_blank' }, 'Search Query')),
|
|
419
|
+
]),
|
|
420
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
285
421
|
m('p', { style: 'color:#999;font-size:0.9rem' }, [
|
|
286
422
|
'Edit ',
|
|
287
423
|
m('code', 'src/routes/pages/index.js'),
|
|
@@ -418,7 +554,7 @@ cli
|
|
|
418
554
|
console.log();
|
|
419
555
|
// ─── Create directory structure ─────────────────────
|
|
420
556
|
if (template === 'default') {
|
|
421
|
-
mkdirs(join(dir, 'src', 'routes', 'api'), join(dir, 'src', 'routes', 'pages'));
|
|
557
|
+
mkdirs(join(dir, 'src', 'routes', 'api'), join(dir, 'src', 'routes', 'api', 'users'), join(dir, 'src', 'routes', 'pages'));
|
|
422
558
|
}
|
|
423
559
|
else {
|
|
424
560
|
mkdirs(join(dir, 'src', 'routes', 'api'));
|
|
@@ -480,6 +616,10 @@ cli
|
|
|
480
616
|
write(join(dir, `src/routes/api/hello.${ext}`), isTS ? srcApiHelloTs() : srcApiHelloJs());
|
|
481
617
|
// SSR page
|
|
482
618
|
write(join(dir, `src/routes/pages/index.${ext}`), isTS ? srcPageIndexTs() : srcPageIndexJs());
|
|
619
|
+
// Additional API routes
|
|
620
|
+
write(join(dir, `src/routes/api/health.${ext}`), isTS ? srcApiHealthTs() : srcApiHealthJs());
|
|
621
|
+
write(join(dir, `src/routes/api/users/[id].${ext}`), isTS ? srcApiUsersTs() : srcApiUsersJs());
|
|
622
|
+
write(join(dir, `src/routes/api/search.${ext}`), isTS ? srcApiSearchTs() : srcApiSearchJs());
|
|
483
623
|
}
|
|
484
624
|
else {
|
|
485
625
|
// 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.5';
|
|
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
|
}
|
|
@@ -210,6 +216,57 @@ export function GET(_request: FastifyRequest, _reply: FastifyReply) {
|
|
|
210
216
|
`;
|
|
211
217
|
}
|
|
212
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
|
+
|
|
213
270
|
function srcApiHelloJs(): string {
|
|
214
271
|
return `/**
|
|
215
272
|
* GET /api/hello
|
|
@@ -224,6 +281,51 @@ export function GET(_request, _reply) {
|
|
|
224
281
|
`;
|
|
225
282
|
}
|
|
226
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
|
+
|
|
227
329
|
function srcPageIndexTs(): string {
|
|
228
330
|
return `/**
|
|
229
331
|
* Home page — server-rendered Mithril.js component.
|
|
@@ -246,6 +348,8 @@ export async function getServerData() {
|
|
|
246
348
|
}
|
|
247
349
|
|
|
248
350
|
/** Page component */
|
|
351
|
+
let count = 0;
|
|
352
|
+
|
|
249
353
|
export default {
|
|
250
354
|
title: 'MoriaJS App',
|
|
251
355
|
view(vnode: m.Vnode<{ serverData?: { title: string; features: string[] } }>) {
|
|
@@ -253,12 +357,30 @@ export default {
|
|
|
253
357
|
return m('main', { style: 'max-width:640px;margin:2rem auto;font-family:system-ui;padding:0 1rem' }, [
|
|
254
358
|
m('h1', { style: 'font-size:2.5rem;margin-bottom:0.5rem' }, '🏔️ ' + (data?.title ?? 'MoriaJS')),
|
|
255
359
|
m('p', { style: 'color:#666;font-size:1.1rem' }, 'Your full-stack Mithril.js app is up and running.'),
|
|
360
|
+
|
|
361
|
+
m('div', { style: 'background:#f4f4f4;padding:1.5rem;border-radius:8px;margin:2rem 0;text-align:center' }, [
|
|
362
|
+
m('h3', { style: 'margin-top:0' }, 'Hydration Demo'),
|
|
363
|
+
m('p', 'Click the button below to verify that client-side hydration is working:'),
|
|
364
|
+
m('button', {
|
|
365
|
+
style: 'background:#007bff;color:#fff;border:none;padding:0.75rem 1.5rem;border-radius:4px;font-size:1rem;cursor:pointer',
|
|
366
|
+
onclick: () => { count++; }
|
|
367
|
+
}, \`Count is \${count}\`),
|
|
368
|
+
]),
|
|
369
|
+
|
|
256
370
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
257
371
|
m('h2', { style: 'font-size:1.3rem' }, 'Features'),
|
|
258
372
|
m('ul', { style: 'line-height:1.8' },
|
|
259
373
|
(data?.features ?? []).map((f: string) => m('li', f))
|
|
260
374
|
),
|
|
261
375
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
376
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Quick Links'),
|
|
377
|
+
m('ul', { style: 'line-height:1.8;display:flex;gap:1rem;padding:0;list-style:none' }, [
|
|
378
|
+
m('li', m('a', { href: '/api/hello', target: '_blank' }, 'Hello API')),
|
|
379
|
+
m('li', m('a', { href: '/api/health', target: '_blank' }, 'Health Check')),
|
|
380
|
+
m('li', m('a', { href: '/api/users/42', target: '_blank' }, 'User Params')),
|
|
381
|
+
m('li', m('a', { href: '/api/search?q=moria', target: '_blank' }, 'Search Query')),
|
|
382
|
+
]),
|
|
383
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
262
384
|
m('p', { style: 'color:#999;font-size:0.9rem' }, [
|
|
263
385
|
'Edit ',
|
|
264
386
|
m('code', 'src/routes/pages/index.ts'),
|
|
@@ -292,6 +414,8 @@ export async function getServerData() {
|
|
|
292
414
|
}
|
|
293
415
|
|
|
294
416
|
/** Page component */
|
|
417
|
+
let count = 0;
|
|
418
|
+
|
|
295
419
|
export default {
|
|
296
420
|
title: 'MoriaJS App',
|
|
297
421
|
view(vnode) {
|
|
@@ -299,12 +423,30 @@ export default {
|
|
|
299
423
|
return m('main', { style: 'max-width:640px;margin:2rem auto;font-family:system-ui;padding:0 1rem' }, [
|
|
300
424
|
m('h1', { style: 'font-size:2.5rem;margin-bottom:0.5rem' }, '🏔️ ' + (data?.title ?? 'MoriaJS')),
|
|
301
425
|
m('p', { style: 'color:#666;font-size:1.1rem' }, 'Your full-stack Mithril.js app is up and running.'),
|
|
426
|
+
|
|
427
|
+
m('div', { style: 'background:#f4f4f4;padding:1.5rem;border-radius:8px;margin:2rem 0;text-align:center' }, [
|
|
428
|
+
m('h3', { style: 'margin-top:0' }, 'Hydration Demo'),
|
|
429
|
+
m('p', 'Click the button below to verify that client-side hydration is working:'),
|
|
430
|
+
m('button', {
|
|
431
|
+
style: 'background:#007bff;color:#fff;border:none;padding:0.75rem 1.5rem;border-radius:4px;font-size:1rem;cursor:pointer',
|
|
432
|
+
onclick: () => { count++; }
|
|
433
|
+
}, \`Count is \${count}\`),
|
|
434
|
+
]),
|
|
435
|
+
|
|
302
436
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
303
437
|
m('h2', { style: 'font-size:1.3rem' }, 'Features'),
|
|
304
438
|
m('ul', { style: 'line-height:1.8' },
|
|
305
439
|
(data?.features ?? []).map((f) => m('li', f))
|
|
306
440
|
),
|
|
307
441
|
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
442
|
+
m('h2', { style: 'font-size:1.3rem' }, 'Quick Links'),
|
|
443
|
+
m('ul', { style: 'line-height:1.8;display:flex;gap:1rem;padding:0;list-style:none' }, [
|
|
444
|
+
m('li', m('a', { href: '/api/hello', target: '_blank' }, 'Hello API')),
|
|
445
|
+
m('li', m('a', { href: '/api/health', target: '_blank' }, 'Health Check')),
|
|
446
|
+
m('li', m('a', { href: '/api/users/42', target: '_blank' }, 'User Params')),
|
|
447
|
+
m('li', m('a', { href: '/api/search?q=moria', target: '_blank' }, 'Search Query')),
|
|
448
|
+
]),
|
|
449
|
+
m('hr', { style: 'border:none;border-top:1px solid #eee;margin:1.5rem 0' }),
|
|
308
450
|
m('p', { style: 'color:#999;font-size:0.9rem' }, [
|
|
309
451
|
'Edit ',
|
|
310
452
|
m('code', 'src/routes/pages/index.js'),
|
|
@@ -456,6 +598,7 @@ cli
|
|
|
456
598
|
if (template === 'default') {
|
|
457
599
|
mkdirs(
|
|
458
600
|
join(dir, 'src', 'routes', 'api'),
|
|
601
|
+
join(dir, 'src', 'routes', 'api', 'users'),
|
|
459
602
|
join(dir, 'src', 'routes', 'pages')
|
|
460
603
|
);
|
|
461
604
|
} else {
|
|
@@ -545,6 +688,20 @@ cli
|
|
|
545
688
|
join(dir, `src/routes/pages/index.${ext}`),
|
|
546
689
|
isTS ? srcPageIndexTs() : srcPageIndexJs()
|
|
547
690
|
);
|
|
691
|
+
|
|
692
|
+
// Additional API routes
|
|
693
|
+
write(
|
|
694
|
+
join(dir, `src/routes/api/health.${ext}`),
|
|
695
|
+
isTS ? srcApiHealthTs() : srcApiHealthJs()
|
|
696
|
+
);
|
|
697
|
+
write(
|
|
698
|
+
join(dir, `src/routes/api/users/[id].${ext}`),
|
|
699
|
+
isTS ? srcApiUsersTs() : srcApiUsersJs()
|
|
700
|
+
);
|
|
701
|
+
write(
|
|
702
|
+
join(dir, `src/routes/api/search.${ext}`),
|
|
703
|
+
isTS ? srcApiSearchTs() : srcApiSearchJs()
|
|
704
|
+
);
|
|
548
705
|
} else {
|
|
549
706
|
// Minimal template — just entry + one API route
|
|
550
707
|
write(join(dir, `src/index.${ext}`), isTS ? srcIndexTs() : srcIndexJs());
|