@mandujs/core 0.12.1 → 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 (177) hide show
  1. package/README.ko.md +304 -304
  2. package/README.md +653 -653
  3. package/package.json +8 -8
  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/healing.ts +2 -0
  106. package/src/guard/index.ts +2 -0
  107. package/src/guard/negotiation.ts +430 -4
  108. package/src/guard/presets/atomic.ts +70 -70
  109. package/src/guard/presets/clean.ts +77 -77
  110. package/src/guard/presets/cqrs.test.ts +175 -0
  111. package/src/guard/presets/cqrs.ts +107 -0
  112. package/src/guard/presets/fsd.ts +79 -79
  113. package/src/guard/presets/hexagonal.ts +68 -68
  114. package/src/guard/presets/index.ts +291 -288
  115. package/src/guard/reporter.ts +445 -445
  116. package/src/guard/rules.ts +12 -12
  117. package/src/guard/statistics.ts +578 -578
  118. package/src/guard/suggestions.ts +358 -352
  119. package/src/guard/types.ts +348 -347
  120. package/src/guard/validator.ts +834 -834
  121. package/src/guard/watcher.ts +404 -404
  122. package/src/index.ts +1 -0
  123. package/src/intent/index.ts +310 -310
  124. package/src/island/index.ts +304 -304
  125. package/src/logging/index.ts +22 -22
  126. package/src/logging/transports.ts +365 -365
  127. package/src/paths.test.ts +47 -0
  128. package/src/paths.ts +47 -0
  129. package/src/plugins/index.ts +38 -38
  130. package/src/plugins/registry.ts +377 -377
  131. package/src/plugins/types.ts +363 -363
  132. package/src/report/build.ts +1 -1
  133. package/src/report/index.ts +1 -1
  134. package/src/router/fs-patterns.ts +387 -387
  135. package/src/router/fs-routes.ts +344 -401
  136. package/src/router/fs-scanner.ts +497 -497
  137. package/src/router/fs-types.ts +270 -278
  138. package/src/router/index.ts +81 -81
  139. package/src/runtime/boundary.tsx +232 -232
  140. package/src/runtime/compose.ts +222 -222
  141. package/src/runtime/lifecycle.ts +381 -381
  142. package/src/runtime/logger.test.ts +345 -345
  143. package/src/runtime/logger.ts +677 -677
  144. package/src/runtime/router.test.ts +476 -476
  145. package/src/runtime/router.ts +105 -105
  146. package/src/runtime/security.ts +155 -155
  147. package/src/runtime/server.ts +24 -24
  148. package/src/runtime/session-key.ts +328 -328
  149. package/src/runtime/ssr.ts +367 -367
  150. package/src/runtime/streaming-ssr.ts +1245 -1245
  151. package/src/runtime/trace.ts +144 -144
  152. package/src/seo/index.ts +214 -214
  153. package/src/seo/integration/ssr.ts +307 -307
  154. package/src/seo/render/basic.ts +427 -427
  155. package/src/seo/render/index.ts +143 -143
  156. package/src/seo/render/jsonld.ts +539 -539
  157. package/src/seo/render/opengraph.ts +191 -191
  158. package/src/seo/render/robots.ts +116 -116
  159. package/src/seo/render/sitemap.ts +137 -137
  160. package/src/seo/render/twitter.ts +126 -126
  161. package/src/seo/resolve/index.ts +353 -353
  162. package/src/seo/resolve/opengraph.ts +143 -143
  163. package/src/seo/resolve/robots.ts +73 -73
  164. package/src/seo/resolve/title.ts +94 -94
  165. package/src/seo/resolve/twitter.ts +73 -73
  166. package/src/seo/resolve/url.ts +97 -97
  167. package/src/seo/routes/index.ts +290 -290
  168. package/src/seo/types.ts +575 -575
  169. package/src/slot/validator.ts +39 -39
  170. package/src/spec/index.ts +3 -3
  171. package/src/spec/load.ts +76 -76
  172. package/src/spec/lock.ts +56 -56
  173. package/src/utils/bun.ts +8 -8
  174. package/src/utils/lru-cache.ts +75 -75
  175. package/src/utils/safe-io.ts +188 -188
  176. package/src/utils/string-safe.ts +298 -298
  177. 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
  {