@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.
Files changed (3) hide show
  1. package/README.ko.md +81 -4
  2. package/README.md +81 -0
  3. 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
- ├── spec/ # Spec 스키마 로딩
29
- ├── generator/ # 코드 생성
28
+ ├── router/ # 파일 시스템 기반 라우팅
30
29
  ├── guard/ # 아키텍처 검사 및 자동 수정
31
- ├── runtime/ # 서버 라우터
32
- └── report/ # Guard 리포트 생성
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.0",
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": "MIT",
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
+ }