@moriajs/cli 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/cli@0.1.1 build C:\Codes\node\2026\github\moriajs\packages\cli
2
+ > @moriajs/cli@0.3.0 build C:\Codes\node\2026\github\moriajs\packages\cli
3
3
  > tsc
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,eAAO,MAAM,GAAG,mBAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,eAAO,MAAM,GAAG,mBAAe,CAAC"}
package/dist/index.js CHANGED
@@ -6,8 +6,31 @@
6
6
  */
7
7
  import { cac } from 'cac';
8
8
  import pc from 'picocolors';
9
- const VERSION = '0.0.1';
9
+ import path from 'node:path';
10
+ import { pathToFileURL } from 'node:url';
11
+ import fs from 'node:fs';
12
+ const VERSION = '0.1.1';
10
13
  export const cli = cac('moria');
14
+ /**
15
+ * Attempt to load moria.config.ts from the current working directory.
16
+ */
17
+ async function loadConfig() {
18
+ const cwd = process.cwd();
19
+ const configFiles = ['moria.config.ts', 'moria.config.js', 'moria.config.mjs'];
20
+ for (const file of configFiles) {
21
+ const configPath = path.resolve(cwd, file);
22
+ if (fs.existsSync(configPath)) {
23
+ try {
24
+ const mod = await import(pathToFileURL(configPath).href);
25
+ return mod.default ?? mod;
26
+ }
27
+ catch {
28
+ // Config load failed, continue
29
+ }
30
+ }
31
+ }
32
+ return {};
33
+ }
11
34
  // ─── dev ────────────────────────────────────────────
12
35
  cli
13
36
  .command('dev', 'Start the development server with HMR')
@@ -16,10 +39,33 @@ cli
16
39
  .action(async (options) => {
17
40
  console.log(pc.cyan('🏔️ MoriaJS') + pc.dim(` v${VERSION}`));
18
41
  console.log(pc.green('Starting dev server...'));
19
- console.log(pc.dim(` → http://${options.host}:${options.port}`));
20
42
  console.log();
21
- // TODO: Phase 3 — Start Fastify + Vite dev server
22
- console.log(pc.yellow('⚠ Dev server not yet implemented. Coming in Phase 3.'));
43
+ try {
44
+ const { createApp } = await import('@moriajs/core');
45
+ const userConfig = await loadConfig();
46
+ const app = await createApp({
47
+ config: {
48
+ ...userConfig,
49
+ mode: 'development',
50
+ rootDir: process.cwd(),
51
+ server: {
52
+ ...(userConfig.server ?? {}),
53
+ port: Number(options.port),
54
+ host: options.host,
55
+ },
56
+ },
57
+ });
58
+ const address = await app.listen();
59
+ console.log();
60
+ console.log(pc.green(' ✓ ') + pc.bold('Dev server ready'));
61
+ console.log(pc.dim(` → ${address}`));
62
+ console.log(pc.dim(' → HMR enabled via Vite'));
63
+ console.log();
64
+ }
65
+ catch (err) {
66
+ console.error(pc.red('Failed to start dev server:'), err);
67
+ process.exit(1);
68
+ }
23
69
  });
24
70
  // ─── build ──────────────────────────────────────────
25
71
  cli
@@ -28,8 +74,25 @@ cli
28
74
  console.log(pc.cyan('🏔️ MoriaJS') + pc.dim(` v${VERSION}`));
29
75
  console.log(pc.green('Building for production...'));
30
76
  console.log();
31
- // TODO: Phase 3 — Vite production build
32
- console.log(pc.yellow('⚠ Build not yet implemented. Coming in Phase 3.'));
77
+ try {
78
+ const { build } = await import('vite');
79
+ // Client build
80
+ console.log(pc.dim(' → Building client bundle...'));
81
+ await build({
82
+ root: process.cwd(),
83
+ build: {
84
+ outDir: 'dist/client',
85
+ emptyOutDir: true,
86
+ },
87
+ });
88
+ console.log(pc.green(' ✓ ') + 'Client build complete');
89
+ console.log();
90
+ console.log(pc.green(' ✓ ') + pc.bold('Build complete'));
91
+ }
92
+ catch (err) {
93
+ console.error(pc.red('Build failed:'), err);
94
+ process.exit(1);
95
+ }
33
96
  });
34
97
  // ─── start ──────────────────────────────────────────
35
98
  cli
@@ -38,10 +101,29 @@ cli
38
101
  .action(async (options) => {
39
102
  console.log(pc.cyan('🏔️ MoriaJS') + pc.dim(` v${VERSION}`));
40
103
  console.log(pc.green('Starting production server...'));
41
- console.log(pc.dim(` → port ${options.port}`));
42
104
  console.log();
43
- // TODO: Phase 3 — Start Fastify production server
44
- console.log(pc.yellow('⚠ Production server not yet implemented. Coming in Phase 3.'));
105
+ try {
106
+ const { createApp } = await import('@moriajs/core');
107
+ const userConfig = await loadConfig();
108
+ const app = await createApp({
109
+ config: {
110
+ ...userConfig,
111
+ mode: 'production',
112
+ rootDir: process.cwd(),
113
+ server: {
114
+ ...(userConfig.server ?? {}),
115
+ port: Number(options.port),
116
+ },
117
+ },
118
+ });
119
+ const address = await app.listen();
120
+ console.log(pc.green(' ✓ ') + pc.bold('Production server running'));
121
+ console.log(pc.dim(` → ${address}`));
122
+ }
123
+ catch (err) {
124
+ console.error(pc.red('Failed to start server:'), err);
125
+ process.exit(1);
126
+ }
45
127
  });
46
128
  // ─── generate ───────────────────────────────────────
47
129
  cli
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;AAEhC;;GAEG;AACH,KAAK,UAAU,UAAU;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;IAE/E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;gBACzD,OAAO,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACL,+BAA+B;YACnC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC;AAED,uDAAuD;AACvD,GAAG;KACE,OAAO,CAAC,KAAK,EAAE,uCAAuC,CAAC;KACvD,MAAM,CAAC,eAAe,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KAC/D,MAAM,CAAC,eAAe,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;KACpE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,MAAM,UAAU,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YACxB,MAAM,EAAE;gBACJ,GAAG,UAAU;gBACb,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;gBACtB,MAAM,EAAE;oBACJ,GAAG,CAAC,UAAU,CAAC,MAAiC,IAAI,EAAE,CAAC;oBACvD,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;oBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;iBACrB;aACJ;SACJ,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,uDAAuD;AACvD,GAAG;KACE,OAAO,CAAC,OAAO,EAAE,sBAAsB,CAAC;KACxC,MAAM,CAAC,KAAK,IAAI,EAAE;IACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvC,eAAe;QACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC;YACR,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;YACnB,KAAK,EAAE;gBACH,MAAM,EAAE,aAAa;gBACrB,WAAW,EAAE,IAAI;aACpB;SACJ,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,uBAAuB,CAAC,CAAC;QAExD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,uDAAuD;AACvD,GAAG;KACE,OAAO,CAAC,OAAO,EAAE,6BAA6B,CAAC;KAC/C,MAAM,CAAC,eAAe,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KAC/D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,MAAM,UAAU,EAAE,CAAC;QAEtC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC;YACxB,MAAM,EAAE;gBACJ,GAAG,UAAU;gBACb,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;gBACtB,MAAM,EAAE;oBACJ,GAAG,CAAC,UAAU,CAAC,MAAiC,IAAI,EAAE,CAAC;oBACvD,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;iBAC7B;aACJ;SACJ,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,uDAAuD;AACvD,GAAG;KACE,OAAO,CAAC,wBAAwB,EAAE,uCAAuC,CAAC;KAC1E,KAAK,CAAC,GAAG,CAAC;KACV,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAY,EAAE,EAAE;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,kCAAkC;IAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC,CAAC;AAEP,uDAAuD;AACvD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACrB,GAAG,CAAC,IAAI,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moriajs/cli",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "description": "MoriaJS CLI — dev, build, and generate commands",
6
6
  "main": "./dist/index.js",
@@ -16,7 +16,9 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "cac": "^6.7.0",
19
- "picocolors": "^1.1.0"
19
+ "picocolors": "^1.1.0",
20
+ "vite": "^6.0.0",
21
+ "@moriajs/core": "0.3.0"
20
22
  },
21
23
  "devDependencies": {
22
24
  "typescript": "^5.7.0",
package/src/index.ts CHANGED
@@ -7,11 +7,36 @@
7
7
 
8
8
  import { cac } from 'cac';
9
9
  import pc from 'picocolors';
10
+ import path from 'node:path';
11
+ import { pathToFileURL } from 'node:url';
12
+ import fs from 'node:fs';
10
13
 
11
- const VERSION = '0.0.1';
14
+ const VERSION = '0.1.1';
12
15
 
13
16
  export const cli = cac('moria');
14
17
 
18
+ /**
19
+ * Attempt to load moria.config.ts from the current working directory.
20
+ */
21
+ async function loadConfig(): Promise<Record<string, unknown>> {
22
+ const cwd = process.cwd();
23
+ const configFiles = ['moria.config.ts', 'moria.config.js', 'moria.config.mjs'];
24
+
25
+ for (const file of configFiles) {
26
+ const configPath = path.resolve(cwd, file);
27
+ if (fs.existsSync(configPath)) {
28
+ try {
29
+ const mod = await import(pathToFileURL(configPath).href);
30
+ return mod.default ?? mod;
31
+ } catch {
32
+ // Config load failed, continue
33
+ }
34
+ }
35
+ }
36
+
37
+ return {};
38
+ }
39
+
15
40
  // ─── dev ────────────────────────────────────────────
16
41
  cli
17
42
  .command('dev', 'Start the development server with HMR')
@@ -20,11 +45,35 @@ cli
20
45
  .action(async (options) => {
21
46
  console.log(pc.cyan('🏔️ MoriaJS') + pc.dim(` v${VERSION}`));
22
47
  console.log(pc.green('Starting dev server...'));
23
- console.log(pc.dim(` → http://${options.host}:${options.port}`));
24
48
  console.log();
25
49
 
26
- // TODO: Phase 3 — Start Fastify + Vite dev server
27
- console.log(pc.yellow('⚠ Dev server not yet implemented. Coming in Phase 3.'));
50
+ try {
51
+ const { createApp } = await import('@moriajs/core');
52
+ const userConfig = await loadConfig();
53
+
54
+ const app = await createApp({
55
+ config: {
56
+ ...userConfig,
57
+ mode: 'development',
58
+ rootDir: process.cwd(),
59
+ server: {
60
+ ...(userConfig.server as Record<string, unknown> ?? {}),
61
+ port: Number(options.port),
62
+ host: options.host,
63
+ },
64
+ },
65
+ });
66
+
67
+ const address = await app.listen();
68
+ console.log();
69
+ console.log(pc.green(' ✓ ') + pc.bold('Dev server ready'));
70
+ console.log(pc.dim(` → ${address}`));
71
+ console.log(pc.dim(' → HMR enabled via Vite'));
72
+ console.log();
73
+ } catch (err) {
74
+ console.error(pc.red('Failed to start dev server:'), err);
75
+ process.exit(1);
76
+ }
28
77
  });
29
78
 
30
79
  // ─── build ──────────────────────────────────────────
@@ -35,8 +84,26 @@ cli
35
84
  console.log(pc.green('Building for production...'));
36
85
  console.log();
37
86
 
38
- // TODO: Phase 3 — Vite production build
39
- console.log(pc.yellow('⚠ Build not yet implemented. Coming in Phase 3.'));
87
+ try {
88
+ const { build } = await import('vite');
89
+
90
+ // Client build
91
+ console.log(pc.dim(' → Building client bundle...'));
92
+ await build({
93
+ root: process.cwd(),
94
+ build: {
95
+ outDir: 'dist/client',
96
+ emptyOutDir: true,
97
+ },
98
+ });
99
+ console.log(pc.green(' ✓ ') + 'Client build complete');
100
+
101
+ console.log();
102
+ console.log(pc.green(' ✓ ') + pc.bold('Build complete'));
103
+ } catch (err) {
104
+ console.error(pc.red('Build failed:'), err);
105
+ process.exit(1);
106
+ }
40
107
  });
41
108
 
42
109
  // ─── start ──────────────────────────────────────────
@@ -46,11 +113,31 @@ cli
46
113
  .action(async (options) => {
47
114
  console.log(pc.cyan('🏔️ MoriaJS') + pc.dim(` v${VERSION}`));
48
115
  console.log(pc.green('Starting production server...'));
49
- console.log(pc.dim(` → port ${options.port}`));
50
116
  console.log();
51
117
 
52
- // TODO: Phase 3 — Start Fastify production server
53
- console.log(pc.yellow('⚠ Production server not yet implemented. Coming in Phase 3.'));
118
+ try {
119
+ const { createApp } = await import('@moriajs/core');
120
+ const userConfig = await loadConfig();
121
+
122
+ const app = await createApp({
123
+ config: {
124
+ ...userConfig,
125
+ mode: 'production',
126
+ rootDir: process.cwd(),
127
+ server: {
128
+ ...(userConfig.server as Record<string, unknown> ?? {}),
129
+ port: Number(options.port),
130
+ },
131
+ },
132
+ });
133
+
134
+ const address = await app.listen();
135
+ console.log(pc.green(' ✓ ') + pc.bold('Production server running'));
136
+ console.log(pc.dim(` → ${address}`));
137
+ } catch (err) {
138
+ console.error(pc.red('Failed to start server:'), err);
139
+ process.exit(1);
140
+ }
54
141
  });
55
142
 
56
143
  // ─── generate ───────────────────────────────────────