@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 +86 -0
- package/LICENSE +21 -0
- package/README.md +55 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +216 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/build.d.ts +18 -0
- package/dist/commands/build.js +40 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +26 -0
- package/dist/commands/dev.js +77 -0
- package/dist/commands/dev.js.map +1 -0
- package/package.json +57 -0
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
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
|
package/dist/cli.js.map
ADDED
|
@@ -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":"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"}
|
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
|
+
}
|