@moriajs/core 0.1.1 → 0.3.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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @moriajs/core@0.1.1 build C:\Codes\node\2026\github\moriajs\packages\core
2
+ > @moriajs/core@0.3.0 build C:\Codes\node\2026\github\moriajs\packages\core
3
3
  > tsc
4
4
 
package/dist/app.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type FastifyInstance, type FastifyServerOptions } from 'fastify';
2
2
  import { type MoriaConfig } from './config.js';
3
3
  import { type MoriaPlugin } from './plugins.js';
4
+ import type { ViteDevServer } from 'vite';
4
5
  /**
5
6
  * Options for creating a MoriaJS application.
6
7
  */
@@ -17,6 +18,8 @@ export interface MoriaAppOptions {
17
18
  export interface MoriaApp {
18
19
  /** The underlying Fastify instance */
19
20
  server: FastifyInstance;
21
+ /** The Vite dev server (only in development mode) */
22
+ vite?: ViteDevServer;
20
23
  /** Register a MoriaJS plugin */
21
24
  use: (plugin: MoriaPlugin) => Promise<void>;
22
25
  /** Start the server */
@@ -34,7 +37,7 @@ export interface MoriaApp {
34
37
  * ```ts
35
38
  * import { createApp } from '@moriajs/core';
36
39
  *
37
- * const app = await createApp();
40
+ * const app = await createApp({ config: { mode: 'development' } });
38
41
  * await app.listen({ port: 3000 });
39
42
  * ```
40
43
  */
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAKnF,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,wCAAwC;IACxC,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACrB,sCAAsC;IACtC,MAAM,EAAE,eAAe,CAAC;IACxB,gCAAgC;IAChC,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,uBAAuB;IACvB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,sBAAsB;IACtB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,CA0DhF"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAOnF,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,wCAAwC;IACxC,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACrB,sCAAsC;IACtC,MAAM,EAAE,eAAe,CAAC;IACxB,qDAAqD;IACrD,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,gCAAgC;IAChC,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,uBAAuB;IACvB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,sBAAsB;IACtB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoFhF"}
package/dist/app.js CHANGED
@@ -3,6 +3,10 @@ import cors from '@fastify/cors';
3
3
  import cookie from '@fastify/cookie';
4
4
  import compress from '@fastify/compress';
5
5
  import helmet from '@fastify/helmet';
6
+ import path from 'node:path';
7
+ import fs from 'node:fs';
8
+ import { createViteDevMiddleware, serveProductionAssets } from './vite.js';
9
+ import { registerRoutes } from './router.js';
6
10
  /**
7
11
  * Create a new MoriaJS application.
8
12
  *
@@ -10,19 +14,21 @@ import helmet from '@fastify/helmet';
10
14
  * ```ts
11
15
  * import { createApp } from '@moriajs/core';
12
16
  *
13
- * const app = await createApp();
17
+ * const app = await createApp({ config: { mode: 'development' } });
14
18
  * await app.listen({ port: 3000 });
15
19
  * ```
16
20
  */
17
21
  export async function createApp(options = {}) {
18
22
  const config = options.config ?? {};
23
+ const mode = config.mode ?? (process.env.NODE_ENV === 'production' ? 'production' : 'development');
24
+ const rootDir = config.rootDir ?? process.cwd();
19
25
  const port = config.server?.port ?? 3000;
20
26
  const host = config.server?.host ?? '0.0.0.0';
21
27
  // Create Fastify instance with sensible defaults
22
28
  const server = Fastify({
23
29
  logger: {
24
30
  level: config.server?.logLevel ?? 'info',
25
- transport: process.env.NODE_ENV !== 'production'
31
+ transport: mode !== 'production'
26
32
  ? { target: 'pino-pretty', options: { colorize: true } }
27
33
  : undefined,
28
34
  },
@@ -37,14 +43,35 @@ export async function createApp(options = {}) {
37
43
  await server.register(compress);
38
44
  await server.register(helmet, {
39
45
  // Relax CSP in development for Vite HMR
40
- contentSecurityPolicy: process.env.NODE_ENV === 'production',
46
+ contentSecurityPolicy: mode === 'production',
41
47
  });
48
+ // ─── Global Middleware ─────────────────────────────────────
49
+ if (config.middleware && config.middleware.length > 0) {
50
+ for (const mw of config.middleware) {
51
+ server.addHook('onRequest', mw);
52
+ }
53
+ server.log.info(`Registered ${config.middleware.length} global middleware(s)`);
54
+ }
42
55
  // Health check route
43
56
  server.get('/health', async () => ({ status: 'ok', timestamp: new Date().toISOString() }));
57
+ // ─── Vite Integration ────────────────────────────────────
58
+ let vite;
59
+ if (mode === 'development') {
60
+ vite = await createViteDevMiddleware(server, { ...config, rootDir });
61
+ }
62
+ else {
63
+ await serveProductionAssets(server, { ...config, rootDir });
64
+ }
65
+ // ─── File-Based Routing ──────────────────────────────────
66
+ const routesDir = path.resolve(rootDir, config.routes?.dir ?? 'src/routes');
67
+ if (fs.existsSync(routesDir)) {
68
+ await registerRoutes(server, routesDir, { mode, config });
69
+ }
44
70
  // Plugin registry
45
71
  const plugins = [];
46
72
  const app = {
47
73
  server,
74
+ vite,
48
75
  async use(plugin) {
49
76
  plugins.push(plugin);
50
77
  await plugin.register({ server, config });
package/dist/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAA4D,MAAM,SAAS,CAAC;AACnF,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AA6BrC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAA2B,EAAE;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC;IAE9C,iDAAiD;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC;QACnB,MAAM,EAAE;YACJ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,MAAM;YACxC,SAAS,EACL,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;gBACjC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;gBACxD,CAAC,CAAC,SAAS;SACtB;QACD,GAAG,OAAO,CAAC,cAAc;KAC5B,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI;QAC3C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,IAAI,IAAI;KACxD,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;QAC1B,wCAAwC;QACxC,qBAAqB,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;KAC/D,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAE3F,kBAAkB;IAClB,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,MAAM,GAAG,GAAa;QAClB,MAAM;QAEN,KAAK,CAAC,GAAG,CAAC,MAAmB;YACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,aAAa;YACtB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;gBAC7B,IAAI,EAAE,aAAa,EAAE,IAAI,IAAI,IAAI;gBACjC,IAAI,EAAE,aAAa,EAAE,IAAI,IAAI,IAAI;aACpC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,KAAK,CAAC,KAAK;YACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;KACJ,CAAC;IAEF,OAAO,GAAG,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -3,6 +3,10 @@
3
3
  * Used in `moria.config.ts` files in user projects.
4
4
  */
5
5
  export interface MoriaConfig {
6
+ /** Application mode */
7
+ mode?: 'development' | 'production';
8
+ /** Project root directory (auto-detected if not set) */
9
+ rootDir?: string;
6
10
  /** Server configuration */
7
11
  server?: {
8
12
  /** Port to listen on (default: 3000) */
@@ -41,7 +45,16 @@ export interface MoriaConfig {
41
45
  vite?: {
42
46
  /** Path to Vite config file */
43
47
  configFile?: string;
48
+ /** Client entry point (default: '/src/entry-client.ts') */
49
+ clientEntry?: string;
44
50
  };
51
+ /** File-based routing configuration */
52
+ routes?: {
53
+ /** Routes directory relative to rootDir (default: 'src/routes') */
54
+ dir?: string;
55
+ };
56
+ /** Global middleware (runs on every request) */
57
+ middleware?: Array<import('./middleware.js').MoriaMiddleware>;
45
58
  }
46
59
  /**
47
60
  * Helper to define a type-safe MoriaJS configuration.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,2BAA2B;IAC3B,MAAM,CAAC,EAAE;QACL,wCAAwC;QACxC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,2CAA2C;QAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,kCAAkC;QAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;QAC9E,yBAAyB;QACzB,IAAI,CAAC,EAAE;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;YACrC,WAAW,CAAC,EAAE,OAAO,CAAC;SACzB,CAAC;KACL,CAAC;IAEF,6BAA6B;IAC7B,QAAQ,CAAC,EAAE;QACP,kDAAkD;QAClD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,qBAAqB;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,+CAA+C;QAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,mCAAmC;IACnC,IAAI,CAAC,EAAE;QACH,qBAAqB;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,2CAA2C;QAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gCAAgC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,yCAAyC;QACzC,aAAa,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;IAEF,iCAAiC;IACjC,IAAI,CAAC,EAAE;QACH,+BAA+B;QAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACL;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,uBAAuB;IACvB,IAAI,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IAEpC,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,2BAA2B;IAC3B,MAAM,CAAC,EAAE;QACL,wCAAwC;QACxC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,2CAA2C;QAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,kCAAkC;QAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;QAC9E,yBAAyB;QACzB,IAAI,CAAC,EAAE;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;YACrC,WAAW,CAAC,EAAE,OAAO,CAAC;SACzB,CAAC;KACL,CAAC;IAEF,6BAA6B;IAC7B,QAAQ,CAAC,EAAE;QACP,kDAAkD;QAClD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,qBAAqB;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,+CAA+C;QAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF,mCAAmC;IACnC,IAAI,CAAC,EAAE;QACH,qBAAqB;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,2CAA2C;QAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gCAAgC;QAChC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,yCAAyC;QACzC,aAAa,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;IAEF,iCAAiC;IACjC,IAAI,CAAC,EAAE;QACH,+BAA+B;QAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,2DAA2D;QAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF,uCAAuC;IACvC,MAAM,CAAC,EAAE;QACL,mEAAmE;QACnE,GAAG,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,gDAAgD;IAChD,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,iBAAiB,EAAE,eAAe,CAAC,CAAC;CACjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAiDA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC5C,OAAO,MAAM,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAkEA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC5C,OAAO,MAAM,CAAC;AAClB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,12 +2,18 @@
2
2
  * @moriajs/core
3
3
  *
4
4
  * Framework core: Fastify server factory with sensible defaults,
5
- * plugin registration, and configuration system.
5
+ * plugin registration, Vite integration, file-based routing,
6
+ * and middleware system.
6
7
  */
7
8
  export { createApp } from './app.js';
8
9
  export { defineConfig } from './config.js';
9
10
  export { defineMoriaPlugin } from './plugins.js';
11
+ export { defineMiddleware } from './middleware.js';
12
+ export { createViteDevMiddleware, serveProductionAssets, getHtmlScripts } from './vite.js';
13
+ export { scanRoutes, registerRoutes, filePathToUrlPath } from './router.js';
10
14
  export type { MoriaApp, MoriaAppOptions } from './app.js';
11
15
  export type { MoriaConfig } from './config.js';
12
16
  export type { MoriaPlugin, MoriaPluginContext } from './plugins.js';
17
+ export type { MoriaMiddleware, MiddlewareEntry } from './middleware.js';
18
+ export type { RouteEntry, RouteHandler } from './router.js';
13
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE5E,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACxE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -2,9 +2,13 @@
2
2
  * @moriajs/core
3
3
  *
4
4
  * Framework core: Fastify server factory with sensible defaults,
5
- * plugin registration, and configuration system.
5
+ * plugin registration, Vite integration, file-based routing,
6
+ * and middleware system.
6
7
  */
7
8
  export { createApp } from './app.js';
8
9
  export { defineConfig } from './config.js';
9
10
  export { defineMoriaPlugin } from './plugins.js';
11
+ export { defineMiddleware } from './middleware.js';
12
+ export { createViteDevMiddleware, serveProductionAssets, getHtmlScripts } from './vite.js';
13
+ export { scanRoutes, registerRoutes, filePathToUrlPath } from './router.js';
10
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * MoriaJS Middleware System
3
+ *
4
+ * Provides file-based middleware via `_middleware.ts` files and
5
+ * a `defineMiddleware` helper for type-safe middleware definition.
6
+ *
7
+ * Middleware files are scoped to sibling and child routes:
8
+ * src/routes/_middleware.ts → applies to ALL routes
9
+ * src/routes/api/_middleware.ts → applies to /api/* routes
10
+ * src/routes/pages/_middleware.ts → applies to page routes
11
+ *
12
+ * Middleware functions run as Fastify preHandler hooks in order:
13
+ * root → parent → child (outermost first)
14
+ */
15
+ import type { FastifyRequest, FastifyReply } from 'fastify';
16
+ /**
17
+ * A MoriaJS middleware function.
18
+ *
19
+ * - Return nothing to continue to the next middleware / handler
20
+ * - Call `reply.send()` or return a value to short-circuit
21
+ */
22
+ export type MoriaMiddleware = (request: FastifyRequest, reply: FastifyReply) => void | Promise<void>;
23
+ /**
24
+ * A resolved middleware entry from a `_middleware.ts` file.
25
+ */
26
+ export interface MiddlewareEntry {
27
+ /** Directory path relative to routes dir (e.g., '', 'api', 'api/admin') */
28
+ scope: string;
29
+ /** URL prefix this middleware applies to */
30
+ urlPrefix: string;
31
+ /** Ordered array of middleware functions */
32
+ handlers: MoriaMiddleware[];
33
+ }
34
+ /**
35
+ * Define a type-safe middleware function.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * import { defineMiddleware } from '@moriajs/core';
40
+ *
41
+ * export default defineMiddleware(async (request, reply) => {
42
+ * request.log.info('request received');
43
+ * });
44
+ * ```
45
+ */
46
+ export declare function defineMiddleware(fn: MoriaMiddleware): MoriaMiddleware;
47
+ /**
48
+ * Scan a routes directory for `_middleware.ts` files and return
49
+ * resolved middleware entries, sorted from root → deepest.
50
+ */
51
+ export declare function scanMiddleware(routesDir: string): Promise<MiddlewareEntry[]>;
52
+ /**
53
+ * Get the ordered middleware chain for a given route URL path.
54
+ *
55
+ * Returns middleware from outermost (root) to innermost (closest parent).
56
+ *
57
+ * @param routeFilePath - File path relative to routes dir (e.g., 'api/hello.ts')
58
+ * @param entries - Scanned middleware entries
59
+ */
60
+ export declare function getMiddlewareChain(routeFilePath: string, entries: MiddlewareEntry[]): MoriaMiddleware[];
61
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK5D;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG,CAC1B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,KAClB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,eAAe,GAAG,eAAe,CAErE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAgElF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAC9B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,eAAe,EAAE,GAC3B,eAAe,EAAE,CAkBnB"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * MoriaJS Middleware System
3
+ *
4
+ * Provides file-based middleware via `_middleware.ts` files and
5
+ * a `defineMiddleware` helper for type-safe middleware definition.
6
+ *
7
+ * Middleware files are scoped to sibling and child routes:
8
+ * src/routes/_middleware.ts → applies to ALL routes
9
+ * src/routes/api/_middleware.ts → applies to /api/* routes
10
+ * src/routes/pages/_middleware.ts → applies to page routes
11
+ *
12
+ * Middleware functions run as Fastify preHandler hooks in order:
13
+ * root → parent → child (outermost first)
14
+ */
15
+ import { glob } from 'glob';
16
+ import path from 'node:path';
17
+ import { pathToFileURL } from 'node:url';
18
+ /**
19
+ * Define a type-safe middleware function.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { defineMiddleware } from '@moriajs/core';
24
+ *
25
+ * export default defineMiddleware(async (request, reply) => {
26
+ * request.log.info('request received');
27
+ * });
28
+ * ```
29
+ */
30
+ export function defineMiddleware(fn) {
31
+ return fn;
32
+ }
33
+ /**
34
+ * Scan a routes directory for `_middleware.ts` files and return
35
+ * resolved middleware entries, sorted from root → deepest.
36
+ */
37
+ export async function scanMiddleware(routesDir) {
38
+ const pattern = '**/_middleware.{ts,js,mts,mjs}';
39
+ const files = await glob(pattern, {
40
+ cwd: routesDir,
41
+ posix: true,
42
+ });
43
+ const entries = [];
44
+ for (const file of files) {
45
+ const dir = path.posix.dirname(file); // e.g., '.', 'api', 'pages/admin'
46
+ const scope = dir === '.' ? '' : dir;
47
+ // Build URL prefix from scope
48
+ let urlPrefix = '/';
49
+ if (scope) {
50
+ // pages/ prefix is stripped in route URLs
51
+ let adjustedScope = scope;
52
+ if (adjustedScope.startsWith('pages')) {
53
+ adjustedScope = adjustedScope.slice(5); // remove 'pages'
54
+ }
55
+ if (adjustedScope && !adjustedScope.startsWith('/')) {
56
+ adjustedScope = '/' + adjustedScope;
57
+ }
58
+ urlPrefix = adjustedScope || '/';
59
+ }
60
+ const absolutePath = path.resolve(routesDir, file);
61
+ const fileUrl = pathToFileURL(absolutePath).href;
62
+ let mod;
63
+ try {
64
+ mod = await import(fileUrl);
65
+ }
66
+ catch (err) {
67
+ console.warn(`[moria] Failed to load middleware: ${file}`, err);
68
+ continue;
69
+ }
70
+ // Resolve handlers from default export
71
+ const exported = mod.default;
72
+ let handlers = [];
73
+ if (Array.isArray(exported)) {
74
+ handlers = exported.filter((fn) => typeof fn === 'function');
75
+ }
76
+ else if (typeof exported === 'function') {
77
+ handlers = [exported];
78
+ }
79
+ if (handlers.length === 0) {
80
+ console.warn(`[moria] Middleware file has no handlers: ${file}`);
81
+ continue;
82
+ }
83
+ entries.push({ scope, urlPrefix, handlers });
84
+ }
85
+ // Sort by scope depth (root first, deeper scopes later)
86
+ entries.sort((a, b) => {
87
+ const depthA = a.scope === '' ? 0 : a.scope.split('/').length;
88
+ const depthB = b.scope === '' ? 0 : b.scope.split('/').length;
89
+ return depthA - depthB;
90
+ });
91
+ return entries;
92
+ }
93
+ /**
94
+ * Get the ordered middleware chain for a given route URL path.
95
+ *
96
+ * Returns middleware from outermost (root) to innermost (closest parent).
97
+ *
98
+ * @param routeFilePath - File path relative to routes dir (e.g., 'api/hello.ts')
99
+ * @param entries - Scanned middleware entries
100
+ */
101
+ export function getMiddlewareChain(routeFilePath, entries) {
102
+ const routeDir = path.posix.dirname(routeFilePath);
103
+ const chain = [];
104
+ for (const entry of entries) {
105
+ // Root middleware (scope '') applies to everything
106
+ if (entry.scope === '') {
107
+ chain.push(...entry.handlers);
108
+ continue;
109
+ }
110
+ // Check if the route file is within this middleware's scope
111
+ if (routeDir === entry.scope || routeDir.startsWith(entry.scope + '/')) {
112
+ chain.push(...entry.handlers);
113
+ }
114
+ }
115
+ return chain;
116
+ }
117
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * File-based routing for MoriaJS.
3
+ *
4
+ * Scans `src/routes/` for route files and auto-registers them with Fastify.
5
+ *
6
+ * Convention:
7
+ * src/routes/api/hello.ts → GET /api/hello (API handler)
8
+ * src/routes/api/users/[id].ts → GET /api/users/:id (API handler)
9
+ * src/routes/pages/index.ts → GET / (SSR page)
10
+ * src/routes/pages/about.ts → GET /about (SSR page)
11
+ *
12
+ * API routes export named HTTP method functions:
13
+ * export function GET(request, reply) { ... }
14
+ *
15
+ * Page routes export a Mithril component + optional data loader:
16
+ * export default { view() { return m('h1', 'Hello') } }
17
+ * export async function getServerData(request) { return { user: ... } }
18
+ */
19
+ import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';
20
+ import type { MoriaConfig } from './config.js';
21
+ /** Supported HTTP methods in route files. */
22
+ declare const HTTP_METHODS: readonly ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"];
23
+ type HttpMethod = (typeof HTTP_METHODS)[number];
24
+ /** Handler function exported from a route file. */
25
+ export type RouteHandler = (request: FastifyRequest, reply: FastifyReply) => unknown | Promise<unknown>;
26
+ /** Data loader for page routes — runs on server before render. */
27
+ export type GetServerData = (request: FastifyRequest) => unknown | Promise<unknown>;
28
+ /** Discovered route entry. */
29
+ export interface RouteEntry {
30
+ /** File path relative to routes dir */
31
+ filePath: string;
32
+ /** URL path pattern (e.g., /api/users/:id) */
33
+ urlPath: string;
34
+ /** Route type: 'api' or 'page' */
35
+ type: 'api' | 'page';
36
+ /** HTTP method → handler map (API routes) */
37
+ methods: Partial<Record<Lowercase<HttpMethod>, RouteHandler>>;
38
+ /** Mithril component (page routes only) */
39
+ component?: unknown;
40
+ /** Server data loader (page routes only) */
41
+ getServerData?: GetServerData;
42
+ }
43
+ /**
44
+ * Options for route registration.
45
+ */
46
+ export interface RegisterRoutesOptions {
47
+ /** Application mode */
48
+ mode?: 'development' | 'production';
49
+ /** MoriaJS config for renderer options */
50
+ config?: Partial<MoriaConfig>;
51
+ }
52
+ /**
53
+ * Convert a file path to a URL path.
54
+ *
55
+ * - Strips file extension
56
+ * - Converts `[param]` → `:param`
57
+ * - Converts `[...slug]` → `*`
58
+ * - Converts `index` → `/`
59
+ *
60
+ * @example
61
+ * filePathToUrlPath('api/users/[id].ts') → '/api/users/:id'
62
+ * filePathToUrlPath('pages/index.ts') → '/'
63
+ * filePathToUrlPath('pages/about.ts') → '/about'
64
+ */
65
+ export declare function filePathToUrlPath(filePath: string): string;
66
+ /**
67
+ * Scan a directory for route files and return discovered routes.
68
+ *
69
+ * @param routesDir - Absolute path to the routes directory (e.g., `<project>/src/routes`)
70
+ */
71
+ export declare function scanRoutes(routesDir: string): Promise<RouteEntry[]>;
72
+ /**
73
+ * Register discovered routes with a Fastify server.
74
+ *
75
+ * Page routes with Mithril components are auto-wrapped with SSR rendering.
76
+ * API routes are registered directly as Fastify handlers.
77
+ * Middleware from `_middleware.ts` files is attached as `preHandler` hooks.
78
+ */
79
+ export declare function registerRoutes(server: FastifyInstance, routesDir: string, options?: RegisterRoutesOptions): Promise<RouteEntry[]>;
80
+ export {};
81
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,6CAA6C;AAC7C,QAAA,MAAM,YAAY,uEAAwE,CAAC;AAC3F,KAAK,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,mDAAmD;AACnD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAExG,kEAAkE;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpF,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACvB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9D,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,aAAa,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,uBAAuB;IACvB,IAAI,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IACpC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkC1D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAgGzE;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAChC,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAA0B,GACpC,OAAO,CAAC,UAAU,EAAE,CAAC,CAoEvB"}