@mandujs/core 0.12.0 → 0.12.1
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/README.ko.md +81 -4
- package/README.md +81 -0
- package/package.json +9 -9
package/README.ko.md
CHANGED
|
@@ -25,11 +25,16 @@ bun add @mandujs/core
|
|
|
25
25
|
|
|
26
26
|
```
|
|
27
27
|
@mandujs/core
|
|
28
|
-
├──
|
|
29
|
-
├── generator/ # 코드 생성
|
|
28
|
+
├── router/ # 파일 시스템 기반 라우팅
|
|
30
29
|
├── guard/ # 아키텍처 검사 및 자동 수정
|
|
31
|
-
├── runtime/ #
|
|
32
|
-
|
|
30
|
+
├── runtime/ # 서버, SSR, 스트리밍
|
|
31
|
+
├── filling/ # 핸들러 체인 API
|
|
32
|
+
├── contract/ # 타입 안전 API 계약
|
|
33
|
+
├── content/ # Content Layer - 빌드 타임 콘텐츠 로딩 🆕
|
|
34
|
+
├── bundler/ # 클라이언트 번들링, HMR
|
|
35
|
+
├── client/ # Island 하이드레이션, 클라이언트 라우터
|
|
36
|
+
├── brain/ # Doctor, Watcher, 아키텍처 분석
|
|
37
|
+
└── change/ # 트랜잭션 & 히스토리
|
|
33
38
|
```
|
|
34
39
|
|
|
35
40
|
## Spec 모듈
|
|
@@ -133,6 +138,73 @@ if (!result.passed) {
|
|
|
133
138
|
| `COMPONENT_NOT_FOUND` | 컴포넌트 파일 없음 | ❌ |
|
|
134
139
|
| `SLOT_NOT_FOUND` | slot 파일 없음 | ✅ |
|
|
135
140
|
|
|
141
|
+
## Content Layer 🆕
|
|
142
|
+
|
|
143
|
+
Astro에서 영감받은 빌드 타임 콘텐츠 로딩 시스템.
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// content.config.ts
|
|
147
|
+
import { defineContentConfig, glob, file, api } from "@mandujs/core/content";
|
|
148
|
+
import { z } from "zod";
|
|
149
|
+
|
|
150
|
+
const postSchema = z.object({
|
|
151
|
+
title: z.string(),
|
|
152
|
+
date: z.coerce.date(),
|
|
153
|
+
tags: z.array(z.string()).default([]),
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
export default defineContentConfig({
|
|
157
|
+
collections: {
|
|
158
|
+
// Markdown 파일 (프론트매터 지원)
|
|
159
|
+
posts: {
|
|
160
|
+
loader: glob({ pattern: "content/posts/**/*.md" }),
|
|
161
|
+
schema: postSchema,
|
|
162
|
+
},
|
|
163
|
+
// 단일 JSON/YAML 파일
|
|
164
|
+
settings: {
|
|
165
|
+
loader: file({ path: "data/settings.json" }),
|
|
166
|
+
},
|
|
167
|
+
// 외부 API
|
|
168
|
+
products: {
|
|
169
|
+
loader: api({
|
|
170
|
+
url: "https://api.example.com/products",
|
|
171
|
+
cacheTTL: 3600,
|
|
172
|
+
}),
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 콘텐츠 조회
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
import { getCollection, getEntry } from "@mandujs/core/content";
|
|
182
|
+
|
|
183
|
+
// 전체 컬렉션 조회
|
|
184
|
+
const posts = await getCollection("posts");
|
|
185
|
+
|
|
186
|
+
// 단일 엔트리 조회
|
|
187
|
+
const post = await getEntry("posts", "hello-world");
|
|
188
|
+
console.log(post?.data.title, post?.body);
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 내장 로더
|
|
192
|
+
|
|
193
|
+
| 로더 | 설명 | 예시 |
|
|
194
|
+
|------|------|------|
|
|
195
|
+
| `file()` | 단일 파일 (JSON, YAML, TOML) | `file({ path: "data/config.json" })` |
|
|
196
|
+
| `glob()` | 패턴 매칭 (Markdown, JSON) | `glob({ pattern: "content/**/*.md" })` |
|
|
197
|
+
| `api()` | HTTP API (캐싱 지원) | `api({ url: "https://...", cacheTTL: 3600 })` |
|
|
198
|
+
|
|
199
|
+
### 주요 기능
|
|
200
|
+
|
|
201
|
+
- **Digest 기반 캐싱**: 변경된 파일만 재파싱
|
|
202
|
+
- **Zod 검증**: 스키마 기반 타입 안전 콘텐츠
|
|
203
|
+
- **프론트매터 지원**: Markdown YAML 프론트매터
|
|
204
|
+
- **Dev 모드 감시**: 콘텐츠 변경 시 자동 리로드
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
136
208
|
## Contract 모듈
|
|
137
209
|
|
|
138
210
|
Zod 기반 계약(Contract) 정의 및 타입 안전 클라이언트 생성.
|
|
@@ -209,6 +281,11 @@ import type {
|
|
|
209
281
|
GuardViolation,
|
|
210
282
|
GenerateResult,
|
|
211
283
|
AutoCorrectResult,
|
|
284
|
+
// Content Layer
|
|
285
|
+
DataEntry,
|
|
286
|
+
ContentConfig,
|
|
287
|
+
CollectionConfig,
|
|
288
|
+
Loader,
|
|
212
289
|
} from "@mandujs/core";
|
|
213
290
|
```
|
|
214
291
|
|
package/README.md
CHANGED
|
@@ -81,6 +81,8 @@ const handlers = Mandu.handler(userContract, {
|
|
|
81
81
|
├── runtime/ # Server, SSR, streaming
|
|
82
82
|
├── filling/ # Handler chain API (Mandu.filling())
|
|
83
83
|
├── contract/ # Type-safe API contracts
|
|
84
|
+
├── content/ # Content Layer - build-time content loading 🆕
|
|
85
|
+
│ └── loaders # file(), glob(), api() loaders
|
|
84
86
|
├── bundler/ # Client bundling, HMR
|
|
85
87
|
├── client/ # Island hydration, client router
|
|
86
88
|
├── brain/ # Doctor, Watcher, Architecture analyzer
|
|
@@ -453,6 +455,78 @@ function Navigation() {
|
|
|
453
455
|
|
|
454
456
|
---
|
|
455
457
|
|
|
458
|
+
## Content Layer 🆕
|
|
459
|
+
|
|
460
|
+
Astro-inspired build-time content loading system.
|
|
461
|
+
|
|
462
|
+
```typescript
|
|
463
|
+
// content.config.ts
|
|
464
|
+
import { defineContentConfig, glob, file, api } from "@mandujs/core/content";
|
|
465
|
+
import { z } from "zod";
|
|
466
|
+
|
|
467
|
+
const postSchema = z.object({
|
|
468
|
+
title: z.string(),
|
|
469
|
+
date: z.coerce.date(),
|
|
470
|
+
tags: z.array(z.string()).default([]),
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
export default defineContentConfig({
|
|
474
|
+
collections: {
|
|
475
|
+
// Markdown files with frontmatter
|
|
476
|
+
posts: {
|
|
477
|
+
loader: glob({ pattern: "content/posts/**/*.md" }),
|
|
478
|
+
schema: postSchema,
|
|
479
|
+
},
|
|
480
|
+
// Single JSON/YAML file
|
|
481
|
+
settings: {
|
|
482
|
+
loader: file({ path: "data/settings.json" }),
|
|
483
|
+
},
|
|
484
|
+
// External API
|
|
485
|
+
products: {
|
|
486
|
+
loader: api({
|
|
487
|
+
url: "https://api.example.com/products",
|
|
488
|
+
headers: () => ({ Authorization: `Bearer ${process.env.API_KEY}` }),
|
|
489
|
+
cacheTTL: 3600,
|
|
490
|
+
}),
|
|
491
|
+
},
|
|
492
|
+
},
|
|
493
|
+
});
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### Querying Content
|
|
497
|
+
|
|
498
|
+
```typescript
|
|
499
|
+
import { getCollection, getEntry } from "@mandujs/core/content";
|
|
500
|
+
|
|
501
|
+
// Get all entries
|
|
502
|
+
const posts = await getCollection("posts");
|
|
503
|
+
posts.forEach(post => {
|
|
504
|
+
console.log(post.id, post.data.title);
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
// Get single entry
|
|
508
|
+
const post = await getEntry("posts", "hello-world");
|
|
509
|
+
console.log(post?.data.title, post?.body);
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
### Built-in Loaders
|
|
513
|
+
|
|
514
|
+
| Loader | Description | Example |
|
|
515
|
+
|--------|-------------|---------|
|
|
516
|
+
| `file()` | Single file (JSON, YAML, TOML) | `file({ path: "data/config.json" })` |
|
|
517
|
+
| `glob()` | Pattern matching (Markdown, JSON) | `glob({ pattern: "content/**/*.md" })` |
|
|
518
|
+
| `api()` | HTTP API with caching | `api({ url: "https://...", cacheTTL: 3600 })` |
|
|
519
|
+
|
|
520
|
+
### Features
|
|
521
|
+
|
|
522
|
+
- **Digest-based caching**: Only re-parse changed files
|
|
523
|
+
- **Zod validation**: Type-safe content with schema validation
|
|
524
|
+
- **Frontmatter support**: YAML frontmatter in Markdown files
|
|
525
|
+
- **Dev mode watching**: Auto-reload on content changes
|
|
526
|
+
- **Incremental updates**: Efficient builds with change detection
|
|
527
|
+
|
|
528
|
+
---
|
|
529
|
+
|
|
456
530
|
## Brain (AI Assistant)
|
|
457
531
|
|
|
458
532
|
Doctor and architecture analyzer.
|
|
@@ -551,6 +625,13 @@ import type {
|
|
|
551
625
|
|
|
552
626
|
// Filling
|
|
553
627
|
ManduContext,
|
|
628
|
+
|
|
629
|
+
// Content Layer
|
|
630
|
+
DataEntry,
|
|
631
|
+
ContentConfig,
|
|
632
|
+
CollectionConfig,
|
|
633
|
+
Loader,
|
|
634
|
+
LoaderContext,
|
|
554
635
|
} from "@mandujs/core";
|
|
555
636
|
```
|
|
556
637
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mandujs/core",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.1",
|
|
4
4
|
"description": "Mandu Framework Core - Spec, Generator, Guard, Runtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.ts",
|
|
@@ -13,12 +13,6 @@
|
|
|
13
13
|
"files": [
|
|
14
14
|
"src/**/*"
|
|
15
15
|
],
|
|
16
|
-
"scripts": {
|
|
17
|
-
"test": "bun test tests/streaming-ssr && bun test tests/hydration tests/typing src",
|
|
18
|
-
"test:hydration": "bun test tests/hydration",
|
|
19
|
-
"test:streaming": "bun test tests/streaming-ssr",
|
|
20
|
-
"test:watch": "bun test --watch"
|
|
21
|
-
},
|
|
22
16
|
"devDependencies": {
|
|
23
17
|
"@happy-dom/global-registrator": "^15.0.0"
|
|
24
18
|
},
|
|
@@ -35,7 +29,7 @@
|
|
|
35
29
|
"directory": "packages/core"
|
|
36
30
|
},
|
|
37
31
|
"author": "konamgil",
|
|
38
|
-
"license": "
|
|
32
|
+
"license": "MPL-2.0",
|
|
39
33
|
"publishConfig": {
|
|
40
34
|
"access": "public"
|
|
41
35
|
},
|
|
@@ -53,5 +47,11 @@
|
|
|
53
47
|
"glob": "^13.0.0",
|
|
54
48
|
"minimatch": "^10.1.1",
|
|
55
49
|
"ollama": "^0.6.3"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"test": "bun test tests/streaming-ssr && bun test tests/hydration tests/typing src",
|
|
53
|
+
"test:hydration": "bun test tests/hydration",
|
|
54
|
+
"test:streaming": "bun test tests/streaming-ssr",
|
|
55
|
+
"test:watch": "bun test --watch"
|
|
56
56
|
}
|
|
57
|
-
}
|
|
57
|
+
}
|