@jogak/cli 0.1.0-alpha.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,86 @@
1
+ # Changelog
2
+
3
+ All notable changes to Jogak packages are documented here. The repository follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/).
5
+
6
+ Version numbers apply to all packages in the workspace (synchronized release).
7
+
8
+ ## [0.1.0-alpha.0] — 2026-05-07
9
+
10
+ First public preview release. API is not yet stable.
11
+
12
+ ### Added
13
+
14
+ - **Lazy virtual modules** (`@jogak/core`)
15
+ - `virtual:jogak` index module exposes only entry metadata; no user component imports.
16
+ - `virtual:jogak/entry/<slug>` per-entry virtual module dynamically imported on demand.
17
+ - `defaultRegistry` hydration state machine: `unknown → meta → pending → hydrated`.
18
+ - New API: `registerMeta`, `hydrateEntry`, `requestEntry`, `invalidateEntry`,
19
+ `getAllMeta`, `getMetaTree`, `getEntryState`, `setEntryLoader`, `subscribe`.
20
+ - `RegistryEntryMeta` type for sidebar metadata without component identity.
21
+
22
+ - **In-place HMR** (`@jogak/core` + `@jogak/react`)
23
+ - `*.jogak.tsx` edits trigger entry virtual module self-accept → automatic
24
+ rehydration. Sidebar metadata patched via `jogak:meta-update` ws custom event.
25
+ - `useEntry(id)` subscribes to registry mutations and re-renders on hydrate.
26
+ - meta-only vs structural change classification by `(title, jogakNamesKey)` signature.
27
+
28
+ - **child_process-isolated ts-morph extractor** (`@jogak/core`)
29
+ - Props extraction runs in a separate child process via IPC.
30
+ - Idle 5 s SIGTERM → OS reclaims memory immediately; no V8 isolate growth.
31
+ - Lazy spawn on first `extract()` call; pending requests rejected on child exit.
32
+
33
+ - **Vite cache auto-invalidation** (`@jogak/core/vite`)
34
+ - On dev boot, plugin compares jogak dist mtime vs `.vite/deps/_metadata.json`.
35
+ - Stale cache is purged automatically with an info log.
36
+ - Opt-out: `JogakPluginOptions.disableCacheValidation`.
37
+
38
+ - **`@jogak/react` hooks**
39
+ - `useEntry(id): UseEntryState` — `loading | ready | error | unknown` discriminated union.
40
+ - `useRegistryMeta(): UseRegistryMetaReturn` — backed by `useSyncExternalStore`,
41
+ referential identity guaranteed.
42
+ - `useRegistry()`, `JogakProvider`, `reactAdapter` (preserved signatures).
43
+
44
+ - **`@jogak/ui` library mode**
45
+ - `JogakApp`, `Sidebar`, `Preview`, `Controls`, `Actions` published as
46
+ pre-built ESM/CJS — no `transpilePackages` needed for Next.js.
47
+ - `JogakAppProps`: `entries` (eager) | `metas` (lazy) | both unset (defaultRegistry).
48
+
49
+ - **CLI** (`@jogak/cli`)
50
+ - `jogak dev` / `jogak build` / `jogak generate` commands.
51
+ - Auto-detects `<cwd>/tsconfig.json` for ts-morph; falls back to manual
52
+ `meta.argTypes` if absent.
53
+
54
+ - **Storybook benchmark suite** (`benchmarks/`)
55
+ - `bench:scale:full` — cold-start / build / bundle vs Storybook 8 (Vite builder).
56
+ - `bench:rss` — idle dev tree RSS vs Storybook.
57
+ - `bench:hmr` — Playwright-driven HMR latency.
58
+
59
+ ### Numbers vs. Storybook 8 (Vite builder)
60
+
61
+ | Metric | size 100 | size 500 |
62
+ |---|---|---|
63
+ | dev cold start | **1.7 s** vs 3.3 s | **2.9 s** vs 3.6 s |
64
+ | build time | **2.0 s** vs 2.9 s | **4.1 s** vs 7.6 s |
65
+ | bundle (gzip) | **108 KB** vs 716 KB | **156 KB** vs 1.09 MB |
66
+ | idle RSS (dev) | **321 MB** vs 403 MB | **345 MB** vs 489 MB |
67
+ | HMR (warm median) | **153 ms** | **199 ms** |
68
+
69
+ ### Known Limitations
70
+
71
+ - HMR `jogak:meta-update` event only patches `defaultRegistry`. Custom registry
72
+ injections via `<JogakProvider registry={custom}>` fall back to full reload.
73
+ - Boot-time RSS spike (~700 MB) before settling at idle RSS — esbuild prebundle
74
+ + ts-morph child spawn. Settles within 5 s.
75
+ - `@jogak/core` install pulls ts-morph (~17 MB); only `core/build` and the Vite
76
+ plugin actually use it. Splitting into `@jogak/extractor` is planned for 0.2.0.
77
+
78
+ ### Compatibility
79
+
80
+ - Node ≥ 20.18 (`fetch` / `AbortSignal.timeout` stable)
81
+ - React ≥ 18 (peer)
82
+ - Vite ≥ 6 (peer, optional in `@jogak/core`)
83
+ - Next.js ≥ 14 (peer in `@jogak/next`)
84
+ - TypeScript ≥ 5.5 (build-time props extraction)
85
+
86
+ [0.1.0-alpha.0]: https://github.com/devclib/jogak/releases/tag/v0.1.0-alpha.0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 devclib
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF OR DEALING IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # @jogak/cli
2
+
3
+ `jogak dev` / `jogak build` / `jogak generate` — CLI for the [Jogak](https://github.com/devclib/jogak) component showcase.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add -D @jogak/cli @jogak/react
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```bash
14
+ # author *.jogak.tsx next to your components, then:
15
+
16
+ npx jogak dev # dev server (default port 5173)
17
+ npx jogak build # static build → ./jogak-static/
18
+ npx jogak generate # codegen .jogak/registry.ts for host-bundler embedding
19
+ ```
20
+
21
+ ### Common options
22
+
23
+ ```
24
+ --patterns <glob[,glob...]> *.jogak.tsx globs (default: src/**/*.jogak.{ts,tsx})
25
+ --cwd <path> user project root
26
+ --ts-config <path> tsconfig path (default: <cwd>/tsconfig.json)
27
+ --code-theme <name> prism theme (default: vsDark)
28
+ ```
29
+
30
+ ### `jogak dev` options
31
+
32
+ ```
33
+ --port <number> default 5173
34
+ --host <string> 'true'/'false'/host string
35
+ --open [path] open browser on start
36
+ --no-generate skip .jogak/registry.ts safety-net codegen
37
+ ```
38
+
39
+ ### `jogak build` options
40
+
41
+ ```
42
+ --out-dir <path> default 'jogak-static'
43
+ --base <string> public path (default './')
44
+ --minify <boolean|esbuild|terser> default 'esbuild'
45
+ --sourcemap default false
46
+ --emit-registry also emit .jogak/registry.ts during build
47
+ ```
48
+
49
+ The build output (`jogak-static/`) is `index.html` + a single JS chunk and works on GitHub Pages, Vercel, Netlify, S3, etc.
50
+
51
+ See the [main README](https://github.com/devclib/jogak#readme) for `*.jogak.tsx` conventions and Storybook benchmarks.
52
+
53
+ - Repository: https://github.com/devclib/jogak
54
+ - Issues: https://github.com/devclib/jogak/issues
55
+ - License: [MIT](./LICENSE)
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env node
2
+ import { resolve } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import { generateRegistryFile } from '@jogak/core/build';
5
+ import { runDevCommand } from './commands/dev.js';
6
+ import { runBuildCommand } from './commands/build.js';
7
+ function parseArgs(argv) {
8
+ const positional = [];
9
+ const flags = {};
10
+ for (let i = 0; i < argv.length; i++) {
11
+ const a = argv[i];
12
+ if (a === undefined)
13
+ continue;
14
+ if (a.startsWith('--')) {
15
+ const key = a.slice(2);
16
+ const next = argv[i + 1];
17
+ if (next !== undefined && !next.startsWith('--')) {
18
+ flags[key] = next;
19
+ i++;
20
+ }
21
+ else {
22
+ flags[key] = true;
23
+ }
24
+ }
25
+ else {
26
+ positional.push(a);
27
+ }
28
+ }
29
+ return { _: positional, flags };
30
+ }
31
+ function asString(v, fallback) {
32
+ return typeof v === 'string' ? v : fallback;
33
+ }
34
+ function parsePatterns(v) {
35
+ const raw = asString(v, 'src/**/*.jogak.ts,src/**/*.jogak.tsx');
36
+ return raw
37
+ .split(',')
38
+ .map((p) => p.trim())
39
+ .filter((p) => p.length > 0);
40
+ }
41
+ function resolveTsConfig(cwd, v) {
42
+ const candidate = typeof v === 'string' ? resolve(cwd, v) : resolve(cwd, 'tsconfig.json');
43
+ return existsSync(candidate) ? candidate : undefined;
44
+ }
45
+ function parseHostFlag(v) {
46
+ if (v === undefined)
47
+ return 'localhost';
48
+ if (v === true)
49
+ return true; // bare --host → enable
50
+ if (v === 'true')
51
+ return true;
52
+ if (v === 'false')
53
+ return false;
54
+ return v;
55
+ }
56
+ function parseOpenFlag(v) {
57
+ if (v === undefined)
58
+ return false;
59
+ if (v === true)
60
+ return true;
61
+ if (v === 'true')
62
+ return true;
63
+ if (v === 'false')
64
+ return false;
65
+ return v;
66
+ }
67
+ function parsePortFlag(v) {
68
+ if (typeof v !== 'string')
69
+ return 5173;
70
+ const n = Number(v);
71
+ if (!Number.isFinite(n)) {
72
+ process.stderr.write(`[jogak] invalid --port: ${v}\n`);
73
+ process.exit(1);
74
+ }
75
+ return n;
76
+ }
77
+ function parseMinifyFlag(v) {
78
+ if (v === undefined)
79
+ return 'esbuild';
80
+ if (v === true)
81
+ return true;
82
+ if (v === 'true')
83
+ return true;
84
+ if (v === 'false')
85
+ return false;
86
+ if (v === 'esbuild' || v === 'terser')
87
+ return v;
88
+ process.stderr.write(`[jogak] invalid --minify: ${v} (expected true|false|esbuild|terser)\n`);
89
+ process.exit(1);
90
+ }
91
+ function parseBoolFlag(v, fallback) {
92
+ if (v === undefined)
93
+ return fallback;
94
+ if (v === true)
95
+ return true;
96
+ if (v === 'true')
97
+ return true;
98
+ if (v === 'false')
99
+ return false;
100
+ return fallback;
101
+ }
102
+ function parseBaseFlag(v) {
103
+ const raw = asString(v, './');
104
+ if (!raw.startsWith('/') && raw !== './' && !raw.startsWith('./')) {
105
+ process.stderr.write(`[jogak] warning: --base "${raw}" does not start with '/' or './' — typo?\n`);
106
+ }
107
+ return raw;
108
+ }
109
+ function help() {
110
+ process.stdout.write(`jogak — component showcase
111
+
112
+ USAGE
113
+ jogak generate [options] (alias: gen) 사용자 프로젝트에 .jogak/registry.ts 생성
114
+ jogak dev [options] 쇼케이스 dev server 실행
115
+ jogak build [options] 쇼케이스 정적 빌드
116
+
117
+ COMMON OPTIONS
118
+ --patterns <glob[,glob...]> 쇼케이스 파일 글롭 (기본: 'src/**/*.jogak.ts,src/**/*.jogak.tsx')
119
+ --cwd <path> 사용자 프로젝트 루트 (기본: process.cwd())
120
+ --ts-config <path> tsconfig 경로 (기본: '<cwd>/tsconfig.json' 자동 감지)
121
+ --code-theme <name> prism 테마 (기본: 'vsDark')
122
+ --help 도움말 출력
123
+
124
+ generate OPTIONS
125
+ --out <path> 출력 파일 경로 (기본: '.jogak/registry.ts')
126
+
127
+ dev OPTIONS
128
+ --port <number> dev server 포트 (기본: 5173)
129
+ --host <string|true|false> bind host (기본: 'localhost', '0.0.0.0' 또는 'true'로 LAN 노출)
130
+ --open [path] 시작 시 브라우저 자동 오픈 (기본: false)
131
+ --no-generate 시작 전 generate 1회 실행 비활성화
132
+
133
+ build OPTIONS
134
+ --out-dir <path> 출력 디렉토리 (기본: 'jogak-static')
135
+ --base <string> public path (기본: './')
136
+ --minify <mode> true|false|esbuild|terser (기본: esbuild)
137
+ --sourcemap 소스맵 생성 (기본: false)
138
+ --emit-registry build 도중 .jogak/registry.ts도 생성 (기본: false)
139
+ `);
140
+ }
141
+ async function runGenerate(args) {
142
+ const cwd = resolve(asString(args.flags['cwd'], process.cwd()));
143
+ const patterns = parsePatterns(args.flags['patterns']);
144
+ const outFile = asString(args.flags['out'], '.jogak/registry.ts');
145
+ const tsConfigFilePath = resolveTsConfig(cwd, args.flags['ts-config']);
146
+ const start = Date.now();
147
+ const result = await generateRegistryFile(tsConfigFilePath !== undefined
148
+ ? { patterns, cwd, outFile, tsConfigFilePath }
149
+ : { patterns, cwd, outFile });
150
+ const elapsed = Date.now() - start;
151
+ process.stdout.write(`[jogak] generated ${result.outFile} (${result.fileCount.toString()} files, ${elapsed.toString()}ms)\n`);
152
+ }
153
+ function parseDevArgs(parsed) {
154
+ const cwd = resolve(asString(parsed.flags['cwd'], process.cwd()));
155
+ const patterns = parsePatterns(parsed.flags['patterns']);
156
+ const tsConfigFilePath = resolveTsConfig(cwd, parsed.flags['ts-config']);
157
+ return {
158
+ patterns,
159
+ port: parsePortFlag(parsed.flags['port']),
160
+ host: parseHostFlag(parsed.flags['host']),
161
+ open: parseOpenFlag(parsed.flags['open']),
162
+ cwd,
163
+ tsConfigFilePath,
164
+ codeTheme: asString(parsed.flags['code-theme'], 'vsDark'),
165
+ noGenerate: parseBoolFlag(parsed.flags['no-generate'], false),
166
+ };
167
+ }
168
+ function parseBuildArgs(parsed) {
169
+ const cwd = resolve(asString(parsed.flags['cwd'], process.cwd()));
170
+ const patterns = parsePatterns(parsed.flags['patterns']);
171
+ const tsConfigFilePath = resolveTsConfig(cwd, parsed.flags['ts-config']);
172
+ const outDirRaw = asString(parsed.flags['out-dir'], 'jogak-static');
173
+ const outDir = resolve(cwd, outDirRaw);
174
+ return {
175
+ patterns,
176
+ outDir,
177
+ base: parseBaseFlag(parsed.flags['base']),
178
+ cwd,
179
+ tsConfigFilePath,
180
+ codeTheme: asString(parsed.flags['code-theme'], 'vsDark'),
181
+ minify: parseMinifyFlag(parsed.flags['minify']),
182
+ sourcemap: parseBoolFlag(parsed.flags['sourcemap'], false),
183
+ emitRegistry: parseBoolFlag(parsed.flags['emit-registry'], false),
184
+ };
185
+ }
186
+ async function main() {
187
+ const argv = process.argv.slice(2);
188
+ if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h' || argv[0] === 'help') {
189
+ help();
190
+ return;
191
+ }
192
+ const command = argv[0];
193
+ const rest = argv.slice(1);
194
+ const parsed = parseArgs(rest);
195
+ if (command === 'generate' || command === 'gen') {
196
+ await runGenerate(parsed);
197
+ return;
198
+ }
199
+ if (command === 'dev') {
200
+ await runDevCommand(parseDevArgs(parsed));
201
+ return;
202
+ }
203
+ if (command === 'build') {
204
+ await runBuildCommand(parseBuildArgs(parsed));
205
+ return;
206
+ }
207
+ process.stderr.write(`Unknown command: ${command ?? ''}\n\n`);
208
+ help();
209
+ process.exit(1);
210
+ }
211
+ main().catch((err) => {
212
+ const message = err instanceof Error ? err.stack ?? err.message : String(err);
213
+ process.stderr.write(`${message}\n`);
214
+ process.exit(1);
215
+ });
216
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `jogak build` 명령 구현.
3
+ *
4
+ * `@jogak/ui/host`의 `runHost()`를 build 모드로 호출하고 결과 통계를 출력한다.
5
+ * 실패 시 예외는 main 핸들러로 전파되어 exit code 1을 만든다.
6
+ */
7
+ export interface BuildCliArgs {
8
+ readonly patterns: readonly string[];
9
+ readonly outDir: string;
10
+ readonly base: string;
11
+ readonly cwd: string;
12
+ readonly tsConfigFilePath: string | undefined;
13
+ readonly codeTheme: string;
14
+ readonly minify: boolean | 'esbuild' | 'terser';
15
+ readonly sourcemap: boolean;
16
+ readonly emitRegistry: boolean;
17
+ }
18
+ export declare function runBuildCommand(args: BuildCliArgs): Promise<void>;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * `jogak build` 명령 구현.
3
+ *
4
+ * `@jogak/ui/host`의 `runHost()`를 build 모드로 호출하고 결과 통계를 출력한다.
5
+ * 실패 시 예외는 main 핸들러로 전파되어 exit code 1을 만든다.
6
+ */
7
+ import { generateRegistryFile } from '@jogak/core/build';
8
+ import { runHost } from '@jogak/ui/host';
9
+ export async function runBuildCommand(args) {
10
+ if (args.emitRegistry) {
11
+ await generateRegistryFile(args.tsConfigFilePath !== undefined
12
+ ? {
13
+ patterns: args.patterns,
14
+ cwd: args.cwd,
15
+ outFile: '.jogak/registry.ts',
16
+ tsConfigFilePath: args.tsConfigFilePath,
17
+ }
18
+ : {
19
+ patterns: args.patterns,
20
+ cwd: args.cwd,
21
+ outFile: '.jogak/registry.ts',
22
+ });
23
+ }
24
+ const buildOptions = {
25
+ mode: 'build',
26
+ userRoot: args.cwd,
27
+ patterns: args.patterns,
28
+ codeTheme: args.codeTheme,
29
+ outDir: args.outDir,
30
+ base: args.base,
31
+ minify: args.minify,
32
+ sourcemap: args.sourcemap,
33
+ ...(args.tsConfigFilePath !== undefined
34
+ ? { tsConfigFilePath: args.tsConfigFilePath }
35
+ : {}),
36
+ };
37
+ const result = await runHost(buildOptions);
38
+ process.stdout.write(`[jogak] build done — ${result.outDir} (${result.assetCount.toString()} files, ${result.totalBytes.toString()} bytes, ${result.elapsedMs.toString()}ms)\n`);
39
+ }
40
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAKxD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAcxC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAkB;IACtD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,MAAM,oBAAoB,CACxB,IAAI,CAAC,gBAAgB,KAAK,SAAS;YACjC,CAAC,CAAC;gBACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,oBAAoB;gBAC7B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC;YACH,CAAC,CAAC;gBACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,oBAAoB;aAC9B,CACN,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAsB;QACtC,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,IAAI,CAAC,GAAG;QAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE;YAC7C,CAAC,CAAC,EAAE,CAAC;KACR,CAAA;IAED,MAAM,MAAM,GAAgB,MAAM,OAAO,CAAC,YAAY,CAAC,CAAA;IAEvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wBAAwB,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAC3J,CAAA;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `jogak dev` 명령 구현.
3
+ *
4
+ * `@jogak/ui/host`의 `runHost()`를 호출하는 얇은 어댑터다.
5
+ * Vite/React 의존을 직접 import하지 않고, host 모듈을 통해 dynamic import 경로
6
+ * 위에서 모두 처리되도록 위임한다.
7
+ */
8
+ export interface DevCliArgs {
9
+ readonly patterns: readonly string[];
10
+ readonly port: number;
11
+ readonly host: string | boolean;
12
+ readonly open: boolean | string;
13
+ readonly cwd: string;
14
+ readonly tsConfigFilePath: string | undefined;
15
+ readonly codeTheme: string;
16
+ readonly noGenerate: boolean;
17
+ }
18
+ /**
19
+ * dev 모드 실행.
20
+ *
21
+ * 1. `--no-generate`가 아니면 `generateRegistryFile`을 fire-and-forget으로 시작.
22
+ * 실패해도 dev 진행 (가상 모듈로 작동하므로).
23
+ * 2. `runHost`에 dev 옵션 위임.
24
+ * 3. `printUrls()` 출력 후 SIGINT/SIGTERM 핸들러 등록.
25
+ */
26
+ export declare function runDevCommand(args: DevCliArgs): Promise<void>;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * `jogak dev` 명령 구현.
3
+ *
4
+ * `@jogak/ui/host`의 `runHost()`를 호출하는 얇은 어댑터다.
5
+ * Vite/React 의존을 직접 import하지 않고, host 모듈을 통해 dynamic import 경로
6
+ * 위에서 모두 처리되도록 위임한다.
7
+ */
8
+ import { generateRegistryFile } from '@jogak/core/build';
9
+ import { runHost } from '@jogak/ui/host';
10
+ /**
11
+ * dev 모드 실행.
12
+ *
13
+ * 1. `--no-generate`가 아니면 `generateRegistryFile`을 fire-and-forget으로 시작.
14
+ * 실패해도 dev 진행 (가상 모듈로 작동하므로).
15
+ * 2. `runHost`에 dev 옵션 위임.
16
+ * 3. `printUrls()` 출력 후 SIGINT/SIGTERM 핸들러 등록.
17
+ */
18
+ export async function runDevCommand(args) {
19
+ // dev는 가상 모듈로 처리되므로 generate는 IDE 타입체크용 안전망일 뿐.
20
+ // blocking으로 두면 큰 카탈로그(500+)에서 cold start 지연 → fire-and-forget으로 둠.
21
+ if (!args.noGenerate) {
22
+ const generateStart = Date.now();
23
+ const generatePromise = generateRegistryFile(args.tsConfigFilePath !== undefined
24
+ ? {
25
+ patterns: args.patterns,
26
+ cwd: args.cwd,
27
+ outFile: '.jogak/registry.ts',
28
+ tsConfigFilePath: args.tsConfigFilePath,
29
+ }
30
+ : {
31
+ patterns: args.patterns,
32
+ cwd: args.cwd,
33
+ outFile: '.jogak/registry.ts',
34
+ });
35
+ void generatePromise.then((result) => {
36
+ const elapsedMs = Date.now() - generateStart;
37
+ process.stdout.write(`[jogak] registry regenerated (${result.fileCount.toString()} files, ${elapsedMs.toString()}ms)\n`);
38
+ }, (err) => {
39
+ // best-effort: dev에서 가상 모듈을 사용하므로 generate 실패는 치명적이지 않음.
40
+ const message = err instanceof Error ? err.message : String(err);
41
+ process.stderr.write(`[jogak] generate skipped: ${message}\n`);
42
+ });
43
+ }
44
+ const devOptions = {
45
+ mode: 'dev',
46
+ userRoot: args.cwd,
47
+ patterns: args.patterns,
48
+ codeTheme: args.codeTheme,
49
+ port: args.port,
50
+ host: args.host,
51
+ open: args.open,
52
+ ...(args.tsConfigFilePath !== undefined
53
+ ? { tsConfigFilePath: args.tsConfigFilePath }
54
+ : {}),
55
+ };
56
+ const handle = await runHost(devOptions);
57
+ handle.printUrls();
58
+ // 종료 핸들러 — close()는 멱등이지만 한 번만 호출되도록 가드.
59
+ let shuttingDown = false;
60
+ const shutdown = () => {
61
+ if (shuttingDown)
62
+ return;
63
+ shuttingDown = true;
64
+ handle
65
+ .close()
66
+ .catch((err) => {
67
+ const message = err instanceof Error ? err.message : String(err);
68
+ process.stderr.write(`[jogak] dev close error: ${message}\n`);
69
+ })
70
+ .finally(() => {
71
+ process.exit(0);
72
+ });
73
+ };
74
+ process.on('SIGINT', shutdown);
75
+ process.on('SIGTERM', shutdown);
76
+ }
77
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAKxD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAaxC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAgB;IAClD,gDAAgD;IAChD,oEAAoE;IACpE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAChC,MAAM,eAAe,GAAG,oBAAoB,CAC1C,IAAI,CAAC,gBAAgB,KAAK,SAAS;YACjC,CAAC,CAAC;gBACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,oBAAoB;gBAC7B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC;YACH,CAAC,CAAC;gBACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,oBAAoB;aAC9B,CACN,CAAA;QACD,KAAK,eAAe,CAAC,IAAI,CACvB,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAA;YAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iCAAiC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,SAAS,CAAC,QAAQ,EAAE,OAAO,CACnG,CAAA;QACH,CAAC,EACD,CAAC,GAAY,EAAE,EAAE;YACf,yDAAyD;YACzD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,OAAO,IAAI,CAAC,CAAA;QAChE,CAAC,CACF,CAAA;IACH,CAAC;IAED,MAAM,UAAU,GAAoB;QAClC,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,IAAI,CAAC,GAAG;QAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,gBAAgB,KAAK,SAAS;YACrC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE;YAC7C,CAAC,CAAC,EAAE,CAAC;KACR,CAAA;IAED,MAAM,MAAM,GAAc,MAAM,OAAO,CAAC,UAAU,CAAC,CAAA;IACnD,MAAM,CAAC,SAAS,EAAE,CAAA;IAElB,yCAAyC;IACzC,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,YAAY;YAAE,OAAM;QACxB,YAAY,GAAG,IAAI,CAAA;QACnB,MAAM;aACH,KAAK,EAAE;aACP,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,OAAO,IAAI,CAAC,CAAA;QAC/D,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC,CAAC,CAAA;IACN,CAAC,CAAA;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;AACjC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@jogak/cli",
3
+ "version": "0.1.0-alpha.0",
4
+ "description": "jogak dev / build / generate — CLI for the Jogak component showcase.",
5
+ "keywords": [
6
+ "jogak",
7
+ "storybook",
8
+ "storybook-alternative",
9
+ "showcase",
10
+ "cli",
11
+ "design-system",
12
+ "component-library"
13
+ ],
14
+ "author": {
15
+ "name": "devclib",
16
+ "url": "https://github.com/devclib"
17
+ },
18
+ "license": "MIT",
19
+ "homepage": "https://github.com/devclib/jogak#readme",
20
+ "bugs": "https://github.com/devclib/jogak/issues",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/devclib/jogak.git",
24
+ "directory": "packages/cli"
25
+ },
26
+ "type": "module",
27
+ "bin": {
28
+ "jogak": "./dist/cli.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE",
34
+ "CHANGELOG.md"
35
+ ],
36
+ "engines": {
37
+ "node": ">=20.18"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public",
41
+ "registry": "https://registry.npmjs.org/"
42
+ },
43
+ "dependencies": {
44
+ "vite": "^6.0.0",
45
+ "@vitejs/plugin-react": "^4.3.0",
46
+ "@jogak/core": "0.1.0-alpha.0",
47
+ "@jogak/ui": "0.1.0-alpha.0"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^20.14.0",
51
+ "typescript": "^5.5.0"
52
+ },
53
+ "scripts": {
54
+ "build": "tsc -p tsconfig.json",
55
+ "typecheck": "tsc --noEmit"
56
+ }
57
+ }