@mandujs/core 0.13.0 → 0.13.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 (155) hide show
  1. package/README.ko.md +4 -4
  2. package/README.md +653 -653
  3. package/package.json +1 -1
  4. package/src/bundler/build.ts +91 -91
  5. package/src/bundler/css.ts +302 -302
  6. package/src/client/Link.tsx +227 -227
  7. package/src/client/globals.ts +44 -44
  8. package/src/client/hooks.ts +267 -267
  9. package/src/client/index.ts +5 -5
  10. package/src/client/island.ts +8 -8
  11. package/src/client/router.ts +435 -435
  12. package/src/client/runtime.ts +23 -23
  13. package/src/client/serialize.ts +404 -404
  14. package/src/client/window-state.ts +101 -101
  15. package/src/config/mandu.ts +9 -0
  16. package/src/config/validate.ts +12 -0
  17. package/src/config/watcher.ts +311 -311
  18. package/src/constants.ts +40 -40
  19. package/src/content/content-layer.ts +314 -314
  20. package/src/content/content.test.ts +433 -433
  21. package/src/content/data-store.ts +245 -245
  22. package/src/content/digest.ts +133 -133
  23. package/src/content/index.ts +164 -164
  24. package/src/content/loader-context.ts +172 -172
  25. package/src/content/loaders/api.ts +216 -216
  26. package/src/content/loaders/file.ts +169 -169
  27. package/src/content/loaders/glob.ts +252 -252
  28. package/src/content/loaders/index.ts +34 -34
  29. package/src/content/loaders/types.ts +137 -137
  30. package/src/content/meta-store.ts +209 -209
  31. package/src/content/types.ts +282 -282
  32. package/src/content/watcher.ts +135 -135
  33. package/src/contract/client-safe.test.ts +42 -42
  34. package/src/contract/client-safe.ts +114 -114
  35. package/src/contract/client.ts +16 -16
  36. package/src/contract/define.ts +459 -459
  37. package/src/contract/handler.ts +10 -10
  38. package/src/contract/normalize.test.ts +276 -276
  39. package/src/contract/normalize.ts +404 -404
  40. package/src/contract/registry.test.ts +206 -206
  41. package/src/contract/registry.ts +568 -568
  42. package/src/contract/schema.ts +48 -48
  43. package/src/contract/types.ts +58 -58
  44. package/src/contract/validator.ts +32 -32
  45. package/src/devtools/ai/context-builder.ts +375 -375
  46. package/src/devtools/ai/index.ts +25 -25
  47. package/src/devtools/ai/mcp-connector.ts +465 -465
  48. package/src/devtools/client/catchers/error-catcher.ts +327 -327
  49. package/src/devtools/client/catchers/index.ts +18 -18
  50. package/src/devtools/client/catchers/network-proxy.ts +363 -363
  51. package/src/devtools/client/components/index.ts +39 -39
  52. package/src/devtools/client/components/kitchen-root.tsx +362 -362
  53. package/src/devtools/client/components/mandu-character.tsx +241 -241
  54. package/src/devtools/client/components/overlay.tsx +368 -368
  55. package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
  56. package/src/devtools/client/components/panel/guard-panel.tsx +244 -244
  57. package/src/devtools/client/components/panel/index.ts +32 -32
  58. package/src/devtools/client/components/panel/islands-panel.tsx +304 -304
  59. package/src/devtools/client/components/panel/network-panel.tsx +292 -292
  60. package/src/devtools/client/components/panel/panel-container.tsx +259 -259
  61. package/src/devtools/client/filters/context-filters.ts +282 -282
  62. package/src/devtools/client/filters/index.ts +16 -16
  63. package/src/devtools/client/index.ts +63 -63
  64. package/src/devtools/client/persistence.ts +335 -335
  65. package/src/devtools/client/state-manager.ts +478 -478
  66. package/src/devtools/design-tokens.ts +263 -263
  67. package/src/devtools/hook/create-hook.ts +207 -207
  68. package/src/devtools/hook/index.ts +13 -13
  69. package/src/devtools/index.ts +439 -439
  70. package/src/devtools/init.ts +266 -266
  71. package/src/devtools/protocol.ts +237 -237
  72. package/src/devtools/server/index.ts +17 -17
  73. package/src/devtools/server/source-context.ts +444 -444
  74. package/src/devtools/types.ts +319 -319
  75. package/src/devtools/worker/index.ts +25 -25
  76. package/src/devtools/worker/redaction-worker.ts +222 -222
  77. package/src/devtools/worker/worker-manager.ts +409 -409
  78. package/src/error/domains.ts +265 -265
  79. package/src/error/result.ts +46 -46
  80. package/src/error/types.ts +6 -6
  81. package/src/errors/extractor.ts +409 -409
  82. package/src/errors/index.ts +19 -19
  83. package/src/filling/auth.ts +308 -308
  84. package/src/filling/context.ts +24 -1
  85. package/src/filling/deps.ts +238 -238
  86. package/src/filling/index.ts +2 -0
  87. package/src/filling/sse.test.ts +168 -0
  88. package/src/filling/sse.ts +162 -0
  89. package/src/generator/index.ts +3 -3
  90. package/src/guard/analyzer.ts +360 -360
  91. package/src/guard/ast-analyzer.ts +806 -806
  92. package/src/guard/contract-guard.ts +9 -9
  93. package/src/guard/file-type.test.ts +24 -24
  94. package/src/guard/presets/atomic.ts +70 -70
  95. package/src/guard/presets/clean.ts +77 -77
  96. package/src/guard/presets/fsd.ts +79 -79
  97. package/src/guard/presets/hexagonal.ts +68 -68
  98. package/src/guard/presets/index.ts +291 -291
  99. package/src/guard/reporter.ts +445 -445
  100. package/src/guard/rules.ts +12 -12
  101. package/src/guard/statistics.ts +578 -578
  102. package/src/guard/suggestions.ts +358 -358
  103. package/src/guard/types.ts +348 -348
  104. package/src/guard/validator.ts +834 -834
  105. package/src/guard/watcher.ts +404 -404
  106. package/src/index.ts +6 -1
  107. package/src/intent/index.ts +310 -310
  108. package/src/island/index.ts +304 -304
  109. package/src/logging/index.ts +22 -22
  110. package/src/logging/transports.ts +365 -365
  111. package/src/plugins/index.ts +38 -38
  112. package/src/plugins/registry.ts +377 -377
  113. package/src/plugins/types.ts +363 -363
  114. package/src/report/index.ts +1 -1
  115. package/src/router/fs-patterns.ts +387 -387
  116. package/src/router/fs-scanner.ts +497 -497
  117. package/src/runtime/boundary.tsx +232 -232
  118. package/src/runtime/compose.ts +222 -222
  119. package/src/runtime/escape.ts +44 -0
  120. package/src/runtime/lifecycle.ts +381 -381
  121. package/src/runtime/logger.test.ts +345 -345
  122. package/src/runtime/logger.ts +677 -677
  123. package/src/runtime/router.test.ts +476 -476
  124. package/src/runtime/router.ts +105 -105
  125. package/src/runtime/security.ts +155 -155
  126. package/src/runtime/server.ts +257 -0
  127. package/src/runtime/session-key.ts +328 -328
  128. package/src/runtime/ssr.ts +16 -21
  129. package/src/runtime/streaming-ssr.ts +24 -33
  130. package/src/runtime/trace.ts +144 -144
  131. package/src/seo/index.ts +214 -214
  132. package/src/seo/integration/ssr.ts +307 -307
  133. package/src/seo/render/basic.ts +427 -427
  134. package/src/seo/render/index.ts +143 -143
  135. package/src/seo/render/jsonld.ts +539 -539
  136. package/src/seo/render/opengraph.ts +191 -191
  137. package/src/seo/render/robots.ts +116 -116
  138. package/src/seo/render/sitemap.ts +137 -137
  139. package/src/seo/render/twitter.ts +126 -126
  140. package/src/seo/resolve/index.ts +353 -353
  141. package/src/seo/resolve/opengraph.ts +143 -143
  142. package/src/seo/resolve/robots.ts +73 -73
  143. package/src/seo/resolve/title.ts +94 -94
  144. package/src/seo/resolve/twitter.ts +73 -73
  145. package/src/seo/resolve/url.ts +97 -97
  146. package/src/seo/routes/index.ts +290 -290
  147. package/src/seo/types.ts +575 -575
  148. package/src/slot/validator.ts +39 -39
  149. package/src/spec/index.ts +3 -3
  150. package/src/spec/load.ts +76 -76
  151. package/src/spec/lock.ts +56 -56
  152. package/src/utils/bun.ts +8 -8
  153. package/src/utils/lru-cache.ts +75 -75
  154. package/src/utils/safe-io.ts +188 -188
  155. package/src/utils/string-safe.ts +298 -298
@@ -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
  {