@mandujs/core 0.12.2 → 0.13.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.
Files changed (173) hide show
  1. package/README.ko.md +304 -304
  2. package/README.md +653 -653
  3. package/package.json +1 -1
  4. package/src/brain/architecture/analyzer.ts +28 -26
  5. package/src/brain/doctor/analyzer.ts +1 -1
  6. package/src/bundler/build.ts +91 -91
  7. package/src/bundler/css.ts +302 -302
  8. package/src/bundler/dev.ts +0 -1
  9. package/src/change/history.ts +3 -3
  10. package/src/change/snapshot.ts +10 -9
  11. package/src/change/transaction.ts +2 -2
  12. package/src/client/Link.tsx +227 -227
  13. package/src/client/globals.ts +44 -44
  14. package/src/client/hooks.ts +267 -267
  15. package/src/client/index.ts +5 -5
  16. package/src/client/island.ts +8 -8
  17. package/src/client/router.ts +435 -435
  18. package/src/client/runtime.ts +23 -23
  19. package/src/client/serialize.ts +404 -404
  20. package/src/client/window-state.ts +101 -101
  21. package/src/config/mandu.ts +94 -96
  22. package/src/config/validate.ts +213 -215
  23. package/src/config/watcher.ts +311 -311
  24. package/src/constants.ts +40 -40
  25. package/src/content/content-layer.ts +314 -314
  26. package/src/content/content.test.ts +433 -433
  27. package/src/content/data-store.ts +245 -245
  28. package/src/content/digest.ts +133 -133
  29. package/src/content/index.ts +164 -164
  30. package/src/content/loader-context.ts +172 -172
  31. package/src/content/loaders/api.ts +216 -216
  32. package/src/content/loaders/file.ts +169 -169
  33. package/src/content/loaders/glob.ts +252 -252
  34. package/src/content/loaders/index.ts +34 -34
  35. package/src/content/loaders/types.ts +137 -137
  36. package/src/content/meta-store.ts +209 -209
  37. package/src/content/types.ts +282 -282
  38. package/src/content/watcher.ts +135 -135
  39. package/src/contract/client-safe.test.ts +42 -42
  40. package/src/contract/client-safe.ts +114 -114
  41. package/src/contract/client.ts +16 -16
  42. package/src/contract/define.ts +459 -459
  43. package/src/contract/handler.ts +10 -10
  44. package/src/contract/normalize.test.ts +276 -276
  45. package/src/contract/normalize.ts +404 -404
  46. package/src/contract/registry.test.ts +206 -206
  47. package/src/contract/registry.ts +568 -568
  48. package/src/contract/schema.ts +48 -48
  49. package/src/contract/types.ts +58 -58
  50. package/src/contract/validator.ts +32 -32
  51. package/src/devtools/ai/context-builder.ts +375 -375
  52. package/src/devtools/ai/index.ts +25 -25
  53. package/src/devtools/ai/mcp-connector.ts +465 -465
  54. package/src/devtools/client/catchers/error-catcher.ts +327 -327
  55. package/src/devtools/client/catchers/index.ts +18 -18
  56. package/src/devtools/client/catchers/network-proxy.ts +363 -363
  57. package/src/devtools/client/components/index.ts +39 -39
  58. package/src/devtools/client/components/kitchen-root.tsx +362 -362
  59. package/src/devtools/client/components/mandu-character.tsx +241 -241
  60. package/src/devtools/client/components/overlay.tsx +368 -368
  61. package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
  62. package/src/devtools/client/components/panel/guard-panel.tsx +244 -244
  63. package/src/devtools/client/components/panel/index.ts +32 -32
  64. package/src/devtools/client/components/panel/islands-panel.tsx +304 -304
  65. package/src/devtools/client/components/panel/network-panel.tsx +292 -292
  66. package/src/devtools/client/components/panel/panel-container.tsx +259 -259
  67. package/src/devtools/client/filters/context-filters.ts +282 -282
  68. package/src/devtools/client/filters/index.ts +16 -16
  69. package/src/devtools/client/index.ts +63 -63
  70. package/src/devtools/client/persistence.ts +335 -335
  71. package/src/devtools/client/state-manager.ts +478 -478
  72. package/src/devtools/design-tokens.ts +263 -263
  73. package/src/devtools/hook/create-hook.ts +207 -207
  74. package/src/devtools/hook/index.ts +13 -13
  75. package/src/devtools/index.ts +439 -439
  76. package/src/devtools/init.ts +266 -266
  77. package/src/devtools/protocol.ts +237 -237
  78. package/src/devtools/server/index.ts +17 -17
  79. package/src/devtools/server/source-context.ts +444 -444
  80. package/src/devtools/types.ts +319 -319
  81. package/src/devtools/worker/index.ts +25 -25
  82. package/src/devtools/worker/redaction-worker.ts +222 -222
  83. package/src/devtools/worker/worker-manager.ts +409 -409
  84. package/src/error/classifier.ts +2 -2
  85. package/src/error/domains.ts +265 -265
  86. package/src/error/formatter.ts +32 -32
  87. package/src/error/result.ts +46 -46
  88. package/src/error/stack-analyzer.ts +5 -0
  89. package/src/error/types.ts +6 -6
  90. package/src/errors/extractor.ts +409 -409
  91. package/src/errors/index.ts +19 -19
  92. package/src/filling/auth.ts +308 -308
  93. package/src/filling/context.ts +569 -569
  94. package/src/filling/deps.ts +238 -238
  95. package/src/generator/contract-glue.ts +2 -1
  96. package/src/generator/generate.ts +12 -10
  97. package/src/generator/index.ts +3 -3
  98. package/src/generator/templates.ts +80 -79
  99. package/src/guard/analyzer.ts +360 -360
  100. package/src/guard/ast-analyzer.ts +806 -806
  101. package/src/guard/auto-correct.ts +1 -1
  102. package/src/guard/check.ts +128 -128
  103. package/src/guard/contract-guard.ts +9 -9
  104. package/src/guard/file-type.test.ts +24 -24
  105. package/src/guard/presets/atomic.ts +70 -70
  106. package/src/guard/presets/clean.ts +77 -77
  107. package/src/guard/presets/cqrs.test.ts +35 -14
  108. package/src/guard/presets/fsd.ts +79 -79
  109. package/src/guard/presets/hexagonal.ts +68 -68
  110. package/src/guard/presets/index.ts +291 -291
  111. package/src/guard/reporter.ts +445 -445
  112. package/src/guard/rules.ts +12 -12
  113. package/src/guard/statistics.ts +578 -578
  114. package/src/guard/suggestions.ts +358 -358
  115. package/src/guard/types.ts +348 -348
  116. package/src/guard/validator.ts +834 -834
  117. package/src/guard/watcher.ts +404 -404
  118. package/src/index.ts +1 -0
  119. package/src/intent/index.ts +310 -310
  120. package/src/island/index.ts +304 -304
  121. package/src/logging/index.ts +22 -22
  122. package/src/logging/transports.ts +365 -365
  123. package/src/paths.test.ts +47 -0
  124. package/src/paths.ts +47 -0
  125. package/src/plugins/index.ts +38 -38
  126. package/src/plugins/registry.ts +377 -377
  127. package/src/plugins/types.ts +363 -363
  128. package/src/report/build.ts +1 -1
  129. package/src/report/index.ts +1 -1
  130. package/src/router/fs-patterns.ts +387 -387
  131. package/src/router/fs-routes.ts +344 -401
  132. package/src/router/fs-scanner.ts +497 -497
  133. package/src/router/fs-types.ts +270 -278
  134. package/src/router/index.ts +81 -81
  135. package/src/runtime/boundary.tsx +232 -232
  136. package/src/runtime/compose.ts +222 -222
  137. package/src/runtime/lifecycle.ts +381 -381
  138. package/src/runtime/logger.test.ts +345 -345
  139. package/src/runtime/logger.ts +677 -677
  140. package/src/runtime/router.test.ts +476 -476
  141. package/src/runtime/router.ts +105 -105
  142. package/src/runtime/security.ts +155 -155
  143. package/src/runtime/server.ts +24 -24
  144. package/src/runtime/session-key.ts +328 -328
  145. package/src/runtime/ssr.ts +367 -367
  146. package/src/runtime/streaming-ssr.ts +1245 -1245
  147. package/src/runtime/trace.ts +144 -144
  148. package/src/seo/index.ts +214 -214
  149. package/src/seo/integration/ssr.ts +307 -307
  150. package/src/seo/render/basic.ts +427 -427
  151. package/src/seo/render/index.ts +143 -143
  152. package/src/seo/render/jsonld.ts +539 -539
  153. package/src/seo/render/opengraph.ts +191 -191
  154. package/src/seo/render/robots.ts +116 -116
  155. package/src/seo/render/sitemap.ts +137 -137
  156. package/src/seo/render/twitter.ts +126 -126
  157. package/src/seo/resolve/index.ts +353 -353
  158. package/src/seo/resolve/opengraph.ts +143 -143
  159. package/src/seo/resolve/robots.ts +73 -73
  160. package/src/seo/resolve/title.ts +94 -94
  161. package/src/seo/resolve/twitter.ts +73 -73
  162. package/src/seo/resolve/url.ts +97 -97
  163. package/src/seo/routes/index.ts +290 -290
  164. package/src/seo/types.ts +575 -575
  165. package/src/slot/validator.ts +39 -39
  166. package/src/spec/index.ts +3 -3
  167. package/src/spec/load.ts +76 -76
  168. package/src/spec/lock.ts +56 -56
  169. package/src/utils/bun.ts +8 -8
  170. package/src/utils/lru-cache.ts +75 -75
  171. package/src/utils/safe-io.ts +188 -188
  172. package/src/utils/string-safe.ts +298 -298
  173. package/src/watcher/rules.ts +5 -5
@@ -5,33 +5,33 @@
5
5
 
6
6
  import type { z } from "zod";
7
7
 
8
- /** HTTP Methods supported in contracts */
9
- export type ContractMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
10
-
11
- /**
12
- * Client-safe schema options
13
- */
14
- export type ClientSafeRequestMap = Partial<Record<
15
- ContractMethod,
16
- {
17
- query?: boolean;
18
- body?: boolean;
19
- params?: boolean;
20
- headers?: boolean;
21
- }
22
- >>;
23
-
24
- export type ClientSafeResponseMap = number[] | Partial<Record<number, boolean>>;
25
-
26
- export interface ClientSafeOptions {
27
- /** Request schema exposure */
28
- request?: ClientSafeRequestMap;
29
- /** Response schema exposure */
30
- response?: ClientSafeResponseMap;
31
- /** Include standard error responses if defined */
32
- includeErrors?: boolean;
33
- }
34
-
8
+ /** HTTP Methods supported in contracts */
9
+ export type ContractMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
10
+
11
+ /**
12
+ * Client-safe schema options
13
+ */
14
+ export type ClientSafeRequestMap = Partial<Record<
15
+ ContractMethod,
16
+ {
17
+ query?: boolean;
18
+ body?: boolean;
19
+ params?: boolean;
20
+ headers?: boolean;
21
+ }
22
+ >>;
23
+
24
+ export type ClientSafeResponseMap = number[] | Partial<Record<number, boolean>>;
25
+
26
+ export interface ClientSafeOptions {
27
+ /** Request schema exposure */
28
+ request?: ClientSafeRequestMap;
29
+ /** Response schema exposure */
30
+ response?: ClientSafeResponseMap;
31
+ /** Include standard error responses if defined */
32
+ includeErrors?: boolean;
33
+ }
34
+
35
35
  /** Example data for request/response documentation */
36
36
  export interface SchemaExamples {
37
37
  /** Example name → example data */
@@ -97,19 +97,19 @@ export interface ContractResponseSchema {
97
97
  export type ContractNormalizeMode = "strip" | "strict" | "passthrough";
98
98
 
99
99
  /** Full contract schema definition */
100
- export interface ContractSchema {
101
- /** Contract name (optional) */
102
- name?: string;
103
- /** Contract version (optional) */
104
- version?: string;
105
- /** Contract metadata (optional) */
106
- meta?: Record<string, unknown>;
107
- /** Client-safe schema config (optional) */
108
- clientSafe?: ClientSafeOptions;
109
- /** API description */
110
- description?: string;
111
- /** Tags for grouping (e.g., OpenAPI tags) */
112
- tags?: string[];
100
+ export interface ContractSchema {
101
+ /** Contract name (optional) */
102
+ name?: string;
103
+ /** Contract version (optional) */
104
+ version?: string;
105
+ /** Contract metadata (optional) */
106
+ meta?: Record<string, unknown>;
107
+ /** Client-safe schema config (optional) */
108
+ clientSafe?: ClientSafeOptions;
109
+ /** API description */
110
+ description?: string;
111
+ /** Tags for grouping (e.g., OpenAPI tags) */
112
+ tags?: string[];
113
113
  /** Request schemas by method */
114
114
  request: ContractRequestSchema;
115
115
  /** Response schemas by status code */
@@ -129,14 +129,14 @@ export interface ContractSchema {
129
129
  }
130
130
 
131
131
  /** Contract definition input (what user provides) */
132
- export interface ContractDefinition {
133
- name?: string;
134
- version?: string;
135
- meta?: Record<string, unknown>;
136
- clientSafe?: ClientSafeOptions;
137
- description?: string;
138
- tags?: string[];
139
- request: ContractRequestSchema;
132
+ export interface ContractDefinition {
133
+ name?: string;
134
+ version?: string;
135
+ meta?: Record<string, unknown>;
136
+ clientSafe?: ClientSafeOptions;
137
+ description?: string;
138
+ tags?: string[];
139
+ request: ContractRequestSchema;
140
140
  response: ContractResponseSchema;
141
141
  /** Normalize mode for request data */
142
142
  normalize?: ContractNormalizeMode;
@@ -11,22 +11,22 @@ import type {
11
11
  MethodRequestSchema,
12
12
  } from "./schema";
13
13
 
14
- /**
15
- * Extract inferred type from Zod schema
16
- */
17
- type InferZod<T> = T extends z.ZodTypeAny ? z.infer<T> : never;
18
-
19
- /**
20
- * Extract inferred type from response schema (supports ResponseSchemaWithExamples)
21
- */
22
- export type InferResponseSchema<T> =
23
- T extends { schema: infer S }
24
- ? S extends z.ZodTypeAny
25
- ? z.infer<S>
26
- : never
27
- : T extends z.ZodTypeAny
28
- ? z.infer<T>
29
- : never;
14
+ /**
15
+ * Extract inferred type from Zod schema
16
+ */
17
+ type InferZod<T> = T extends z.ZodTypeAny ? z.infer<T> : never;
18
+
19
+ /**
20
+ * Extract inferred type from response schema (supports ResponseSchemaWithExamples)
21
+ */
22
+ export type InferResponseSchema<T> =
23
+ T extends { schema: infer S }
24
+ ? S extends z.ZodTypeAny
25
+ ? z.infer<S>
26
+ : never
27
+ : T extends z.ZodTypeAny
28
+ ? z.infer<T>
29
+ : never;
30
30
 
31
31
  /**
32
32
  * Infer request schema types for a single method
@@ -50,9 +50,9 @@ type InferContractRequest<T extends ContractRequestSchema> = {
50
50
  /**
51
51
  * Infer all response schemas
52
52
  */
53
- type InferContractResponse<T extends ContractResponseSchema> = {
54
- [K in keyof T]: InferResponseSchema<T[K]>;
55
- };
53
+ type InferContractResponse<T extends ContractResponseSchema> = {
54
+ [K in keyof T]: InferResponseSchema<T[K]>;
55
+ };
56
56
 
57
57
  /**
58
58
  * Infer full contract types
@@ -115,34 +115,34 @@ export type InferBody<
115
115
  /**
116
116
  * Extract params type for a specific method
117
117
  */
118
- export type InferParams<
119
- T extends ContractSchema,
120
- M extends keyof T["request"]
121
- > = T["request"][M] extends MethodRequestSchema
122
- ? T["request"][M]["params"] extends z.ZodTypeAny
123
- ? z.infer<T["request"][M]["params"]>
124
- : undefined
125
- : undefined;
126
-
127
- /**
128
- * Extract headers type for a specific method
129
- */
130
- export type InferHeaders<
131
- T extends ContractSchema,
132
- M extends keyof T["request"]
133
- > = T["request"][M] extends MethodRequestSchema
134
- ? T["request"][M]["headers"] extends z.ZodTypeAny
135
- ? z.infer<T["request"][M]["headers"]>
136
- : undefined
137
- : undefined;
118
+ export type InferParams<
119
+ T extends ContractSchema,
120
+ M extends keyof T["request"]
121
+ > = T["request"][M] extends MethodRequestSchema
122
+ ? T["request"][M]["params"] extends z.ZodTypeAny
123
+ ? z.infer<T["request"][M]["params"]>
124
+ : undefined
125
+ : undefined;
126
+
127
+ /**
128
+ * Extract headers type for a specific method
129
+ */
130
+ export type InferHeaders<
131
+ T extends ContractSchema,
132
+ M extends keyof T["request"]
133
+ > = T["request"][M] extends MethodRequestSchema
134
+ ? T["request"][M]["headers"] extends z.ZodTypeAny
135
+ ? z.infer<T["request"][M]["headers"]>
136
+ : undefined
137
+ : undefined;
138
138
 
139
139
  /**
140
140
  * Extract response type for a specific status code
141
141
  */
142
- export type InferResponse<
143
- T extends ContractSchema,
144
- S extends keyof T["response"]
145
- > = InferResponseSchema<T["response"][S]>;
142
+ export type InferResponse<
143
+ T extends ContractSchema,
144
+ S extends keyof T["response"]
145
+ > = InferResponseSchema<T["response"][S]>;
146
146
 
147
147
  /**
148
148
  * Helper type to get all defined methods in a contract
@@ -183,20 +183,20 @@ export type RequiredFields<
183
183
  /**
184
184
  * Get the success response type (200 or 201)
185
185
  */
186
- export type SuccessResponse<T extends ContractSchema> =
187
- InferResponseSchema<T["response"][200]> extends never
188
- ? InferResponseSchema<T["response"][201]>
189
- : InferResponseSchema<T["response"][200]>;
186
+ export type SuccessResponse<T extends ContractSchema> =
187
+ InferResponseSchema<T["response"][200]> extends never
188
+ ? InferResponseSchema<T["response"][201]>
189
+ : InferResponseSchema<T["response"][200]>;
190
190
 
191
191
  /**
192
192
  * Get the error response type (400, 404, 500, etc.)
193
193
  */
194
- export type ErrorResponse<T extends ContractSchema> =
195
- | InferResponseSchema<T["response"][400]>
196
- | InferResponseSchema<T["response"][401]>
197
- | InferResponseSchema<T["response"][403]>
198
- | InferResponseSchema<T["response"][404]>
199
- | InferResponseSchema<T["response"][500]>;
194
+ export type ErrorResponse<T extends ContractSchema> =
195
+ | InferResponseSchema<T["response"][400]>
196
+ | InferResponseSchema<T["response"][401]>
197
+ | InferResponseSchema<T["response"][403]>
198
+ | InferResponseSchema<T["response"][404]>
199
+ | InferResponseSchema<T["response"][500]>;
200
200
 
201
201
  /**
202
202
  * Utility type for strict contract enforcement
@@ -233,8 +233,8 @@ export type ContractFetchOptions<
233
233
  /**
234
234
  * Response type union for a contract
235
235
  */
236
- export type ContractResponseUnion<T extends ContractSchema> = {
237
- [K in keyof T["response"]]: InferResponseSchema<T["response"][K]> extends never
238
- ? never
239
- : { status: K; data: InferResponseSchema<T["response"][K]> };
240
- }[keyof T["response"]];
236
+ export type ContractResponseUnion<T extends ContractSchema> = {
237
+ [K in keyof T["response"]]: InferResponseSchema<T["response"][K]> extends never
238
+ ? never
239
+ : { status: K; data: InferResponseSchema<T["response"][K]> };
240
+ }[keyof T["response"]];
@@ -13,32 +13,32 @@
13
13
  */
14
14
 
15
15
  import type { z } from "zod";
16
- import type {
17
- ContractSchema,
18
- ContractValidationResult,
19
- ContractValidationError,
20
- ContractValidationIssue,
21
- MethodRequestSchema,
22
- ContractNormalizeMode,
23
- ResponseSchemaWithExamples,
24
- } from "./schema";
16
+ import type {
17
+ ContractSchema,
18
+ ContractValidationResult,
19
+ ContractValidationError,
20
+ ContractValidationIssue,
21
+ MethodRequestSchema,
22
+ ContractNormalizeMode,
23
+ ResponseSchemaWithExamples,
24
+ } from "./schema";
25
25
  import {
26
26
  type NormalizeMode,
27
27
  type NormalizeOptions,
28
28
  normalizeSchema,
29
29
  createCoerceSchema,
30
30
  } from "./normalize";
31
- import { ZodObject } from "zod";
32
-
33
- function isResponseSchemaWithExamples(
34
- schema: z.ZodTypeAny | ResponseSchemaWithExamples | undefined
35
- ): schema is ResponseSchemaWithExamples {
36
- return (
37
- schema !== undefined &&
38
- typeof schema === "object" &&
39
- "schema" in schema
40
- );
41
- }
31
+ import { ZodObject } from "zod";
32
+
33
+ function isResponseSchemaWithExamples(
34
+ schema: z.ZodTypeAny | ResponseSchemaWithExamples | undefined
35
+ ): schema is ResponseSchemaWithExamples {
36
+ return (
37
+ schema !== undefined &&
38
+ typeof schema === "object" &&
39
+ "schema" in schema
40
+ );
41
+ }
42
42
 
43
43
  /**
44
44
  * Validator 옵션
@@ -453,18 +453,18 @@ export class ContractValidator {
453
453
  * @param responseBody - The response body (already parsed)
454
454
  * @param statusCode - HTTP status code
455
455
  */
456
- validateResponse(responseBody: unknown, statusCode: number): ContractValidationResult {
457
- const responseSchemaOrWithExamples = this.contract.response[statusCode];
458
- if (!responseSchemaOrWithExamples) {
459
- // No schema defined for this status code, pass through
460
- return { success: true };
461
- }
462
-
463
- const responseSchema = isResponseSchemaWithExamples(responseSchemaOrWithExamples)
464
- ? responseSchemaOrWithExamples.schema
465
- : responseSchemaOrWithExamples;
466
-
467
- const result = responseSchema.safeParse(responseBody);
456
+ validateResponse(responseBody: unknown, statusCode: number): ContractValidationResult {
457
+ const responseSchemaOrWithExamples = this.contract.response[statusCode];
458
+ if (!responseSchemaOrWithExamples) {
459
+ // No schema defined for this status code, pass through
460
+ return { success: true };
461
+ }
462
+
463
+ const responseSchema = isResponseSchemaWithExamples(responseSchemaOrWithExamples)
464
+ ? responseSchemaOrWithExamples.schema
465
+ : responseSchemaOrWithExamples;
466
+
467
+ const result = responseSchema.safeParse(responseBody);
468
468
  if (!result.success) {
469
469
  const errors: ContractValidationError[] = [
470
470
  {