mates-fullstack 1.0.0-beta.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 (202) hide show
  1. package/README.md +311 -0
  2. package/dist/arctic-auth.d.ts +101 -0
  3. package/dist/arctic-auth.d.ts.map +1 -0
  4. package/dist/arctic-auth.js +538 -0
  5. package/dist/arctic-auth.js.map +1 -0
  6. package/dist/asset-manifest.d.ts +14 -0
  7. package/dist/asset-manifest.d.ts.map +1 -0
  8. package/dist/asset-manifest.js +102 -0
  9. package/dist/asset-manifest.js.map +1 -0
  10. package/dist/browser.d.ts +18 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +25 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/build-esbuild.d.ts +29 -0
  15. package/dist/build-esbuild.d.ts.map +1 -0
  16. package/dist/build-esbuild.js +699 -0
  17. package/dist/build-esbuild.js.map +1 -0
  18. package/dist/build-prod.d.ts +126 -0
  19. package/dist/build-prod.d.ts.map +1 -0
  20. package/dist/build-prod.js +1014 -0
  21. package/dist/build-prod.js.map +1 -0
  22. package/dist/cli-new.d.ts +14 -0
  23. package/dist/cli-new.d.ts.map +1 -0
  24. package/dist/cli-new.js +637 -0
  25. package/dist/cli-new.js.map +1 -0
  26. package/dist/client.d.ts +43 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +130 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/cors.d.ts +16 -0
  31. package/dist/cors.d.ts.map +1 -0
  32. package/dist/cors.js +60 -0
  33. package/dist/cors.js.map +1 -0
  34. package/dist/ctx.d.ts +78 -0
  35. package/dist/ctx.d.ts.map +1 -0
  36. package/dist/ctx.js +280 -0
  37. package/dist/ctx.js.map +1 -0
  38. package/dist/dev-watcher.d.ts +23 -0
  39. package/dist/dev-watcher.d.ts.map +1 -0
  40. package/dist/dev-watcher.js +136 -0
  41. package/dist/dev-watcher.js.map +1 -0
  42. package/dist/docs-generator.d.ts +69 -0
  43. package/dist/docs-generator.d.ts.map +1 -0
  44. package/dist/docs-generator.js +557 -0
  45. package/dist/docs-generator.js.map +1 -0
  46. package/dist/docs-page.d.ts +20 -0
  47. package/dist/docs-page.d.ts.map +1 -0
  48. package/dist/docs-page.js +1152 -0
  49. package/dist/docs-page.js.map +1 -0
  50. package/dist/download.d.ts +78 -0
  51. package/dist/download.d.ts.map +1 -0
  52. package/dist/download.js +202 -0
  53. package/dist/download.js.map +1 -0
  54. package/dist/env-loader.d.ts +76 -0
  55. package/dist/env-loader.d.ts.map +1 -0
  56. package/dist/env-loader.js +213 -0
  57. package/dist/env-loader.js.map +1 -0
  58. package/dist/errors.d.ts +146 -0
  59. package/dist/errors.d.ts.map +1 -0
  60. package/dist/errors.js +386 -0
  61. package/dist/errors.js.map +1 -0
  62. package/dist/head.d.ts +31 -0
  63. package/dist/head.d.ts.map +1 -0
  64. package/dist/head.js +245 -0
  65. package/dist/head.js.map +1 -0
  66. package/dist/index.d.ts +30 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +30 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/internal-prefixes.d.ts +16 -0
  71. package/dist/internal-prefixes.d.ts.map +1 -0
  72. package/dist/internal-prefixes.js +16 -0
  73. package/dist/internal-prefixes.js.map +1 -0
  74. package/dist/internal.d.ts +25 -0
  75. package/dist/internal.d.ts.map +1 -0
  76. package/dist/internal.js +25 -0
  77. package/dist/internal.js.map +1 -0
  78. package/dist/jwt.d.ts +166 -0
  79. package/dist/jwt.d.ts.map +1 -0
  80. package/dist/jwt.js +261 -0
  81. package/dist/jwt.js.map +1 -0
  82. package/dist/log.d.ts +44 -0
  83. package/dist/log.d.ts.map +1 -0
  84. package/dist/log.js +66 -0
  85. package/dist/log.js.map +1 -0
  86. package/dist/logger.d.ts +76 -0
  87. package/dist/logger.d.ts.map +1 -0
  88. package/dist/logger.js +138 -0
  89. package/dist/logger.js.map +1 -0
  90. package/dist/main-runner.d.ts +59 -0
  91. package/dist/main-runner.d.ts.map +1 -0
  92. package/dist/main-runner.js +157 -0
  93. package/dist/main-runner.js.map +1 -0
  94. package/dist/mates-auth.d.ts +82 -0
  95. package/dist/mates-auth.d.ts.map +1 -0
  96. package/dist/mates-auth.js +323 -0
  97. package/dist/mates-auth.js.map +1 -0
  98. package/dist/middleware.d.ts +30 -0
  99. package/dist/middleware.d.ts.map +1 -0
  100. package/dist/middleware.js +67 -0
  101. package/dist/middleware.js.map +1 -0
  102. package/dist/project-resolver.d.ts +102 -0
  103. package/dist/project-resolver.d.ts.map +1 -0
  104. package/dist/project-resolver.js +271 -0
  105. package/dist/project-resolver.js.map +1 -0
  106. package/dist/rate-limit.d.ts +37 -0
  107. package/dist/rate-limit.d.ts.map +1 -0
  108. package/dist/rate-limit.js +109 -0
  109. package/dist/rate-limit.js.map +1 -0
  110. package/dist/redirect.d.ts +84 -0
  111. package/dist/redirect.d.ts.map +1 -0
  112. package/dist/redirect.js +105 -0
  113. package/dist/redirect.js.map +1 -0
  114. package/dist/renderer.d.ts +91 -0
  115. package/dist/renderer.d.ts.map +1 -0
  116. package/dist/renderer.js +630 -0
  117. package/dist/renderer.js.map +1 -0
  118. package/dist/request-logger.d.ts +12 -0
  119. package/dist/request-logger.d.ts.map +1 -0
  120. package/dist/request-logger.js +55 -0
  121. package/dist/request-logger.js.map +1 -0
  122. package/dist/rest.d.ts +25 -0
  123. package/dist/rest.d.ts.map +1 -0
  124. package/dist/rest.js +93 -0
  125. package/dist/rest.js.map +1 -0
  126. package/dist/router.d.ts +71 -0
  127. package/dist/router.d.ts.map +1 -0
  128. package/dist/router.js +222 -0
  129. package/dist/router.js.map +1 -0
  130. package/dist/rpc-registry.d.ts +84 -0
  131. package/dist/rpc-registry.d.ts.map +1 -0
  132. package/dist/rpc-registry.js +271 -0
  133. package/dist/rpc-registry.js.map +1 -0
  134. package/dist/rpc-runner.d.ts +82 -0
  135. package/dist/rpc-runner.d.ts.map +1 -0
  136. package/dist/rpc-runner.js +564 -0
  137. package/dist/rpc-runner.js.map +1 -0
  138. package/dist/sanitize.d.ts +61 -0
  139. package/dist/sanitize.d.ts.map +1 -0
  140. package/dist/sanitize.js +193 -0
  141. package/dist/sanitize.js.map +1 -0
  142. package/dist/security-headers.d.ts +114 -0
  143. package/dist/security-headers.d.ts.map +1 -0
  144. package/dist/security-headers.js +121 -0
  145. package/dist/security-headers.js.map +1 -0
  146. package/dist/server-fn.d.ts +323 -0
  147. package/dist/server-fn.d.ts.map +1 -0
  148. package/dist/server-fn.js +373 -0
  149. package/dist/server-fn.js.map +1 -0
  150. package/dist/server-public.d.ts +13 -0
  151. package/dist/server-public.d.ts.map +1 -0
  152. package/dist/server-public.js +12 -0
  153. package/dist/server-public.js.map +1 -0
  154. package/dist/server-timeout.d.ts +38 -0
  155. package/dist/server-timeout.d.ts.map +1 -0
  156. package/dist/server-timeout.js +46 -0
  157. package/dist/server-timeout.js.map +1 -0
  158. package/dist/server.d.ts +100 -0
  159. package/dist/server.d.ts.map +1 -0
  160. package/dist/server.js +1218 -0
  161. package/dist/server.js.map +1 -0
  162. package/dist/socket-router.d.ts +153 -0
  163. package/dist/socket-router.d.ts.map +1 -0
  164. package/dist/socket-router.js +612 -0
  165. package/dist/socket-router.js.map +1 -0
  166. package/dist/sso.d.ts +90 -0
  167. package/dist/sso.d.ts.map +1 -0
  168. package/dist/sso.js +261 -0
  169. package/dist/sso.js.map +1 -0
  170. package/dist/ssr-context.d.ts +49 -0
  171. package/dist/ssr-context.d.ts.map +1 -0
  172. package/dist/ssr-context.js +85 -0
  173. package/dist/ssr-context.js.map +1 -0
  174. package/dist/ssr-globals.d.ts +32 -0
  175. package/dist/ssr-globals.d.ts.map +1 -0
  176. package/dist/ssr-globals.js +1010 -0
  177. package/dist/ssr-globals.js.map +1 -0
  178. package/dist/ssr-template.d.ts +73 -0
  179. package/dist/ssr-template.d.ts.map +1 -0
  180. package/dist/ssr-template.js +507 -0
  181. package/dist/ssr-template.js.map +1 -0
  182. package/dist/stack-mapper.d.ts +25 -0
  183. package/dist/stack-mapper.d.ts.map +1 -0
  184. package/dist/stack-mapper.js +139 -0
  185. package/dist/stack-mapper.js.map +1 -0
  186. package/dist/stream.d.ts +89 -0
  187. package/dist/stream.d.ts.map +1 -0
  188. package/dist/stream.js +299 -0
  189. package/dist/stream.js.map +1 -0
  190. package/dist/upload.d.ts +69 -0
  191. package/dist/upload.d.ts.map +1 -0
  192. package/dist/upload.js +110 -0
  193. package/dist/upload.js.map +1 -0
  194. package/dist/validate.d.ts +58 -0
  195. package/dist/validate.d.ts.map +1 -0
  196. package/dist/validate.js +89 -0
  197. package/dist/validate.js.map +1 -0
  198. package/dist/verify-package.d.ts +3 -0
  199. package/dist/verify-package.d.ts.map +1 -0
  200. package/dist/verify-package.js +128 -0
  201. package/dist/verify-package.js.map +1 -0
  202. package/package.json +79 -0
@@ -0,0 +1,146 @@
1
+ /**
2
+ * mates-fullstack — errors.ts
3
+ *
4
+ * Error class hierarchy for server functions.
5
+ * These errors are serialized over the wire and reconstructed
6
+ * on the client as the same class — instanceof checks work correctly.
7
+ *
8
+ * Throwing these from any server function, main.ts, or middleware
9
+ * results in a typed JSON error response. Plain Error throws result
10
+ * in a 500 with the message hidden in production.
11
+ *
12
+ * Wire format:
13
+ * { __type: "NotFoundError", message: "...", status: 404, ...extra }
14
+ */
15
+ /**
16
+ * Base class for all mates-fullstack server errors.
17
+ * Use AppError or one of the semantic subclasses instead of this directly.
18
+ */
19
+ export declare class ServerError extends Error {
20
+ readonly status: number;
21
+ readonly code: string;
22
+ constructor(message: string, status: number, code: string);
23
+ }
24
+ /**
25
+ * Generic application error. Use when none of the semantic subclasses fit.
26
+ *
27
+ * @example
28
+ * throw new AppError("Payment failed", { status: 402, code: "PAYMENT_FAILED" });
29
+ */
30
+ export declare class AppError extends ServerError {
31
+ constructor(message: string, options?: {
32
+ status?: number;
33
+ code?: string;
34
+ });
35
+ }
36
+ /**
37
+ * Resource not found. Sends HTTP 404.
38
+ *
39
+ * @example
40
+ * throw new NotFoundError("User not found");
41
+ */
42
+ export declare class NotFoundError extends ServerError {
43
+ constructor(message?: string);
44
+ }
45
+ /**
46
+ * Authentication required. Sends HTTP 401.
47
+ * Use when the caller is not logged in.
48
+ * Use ForbiddenError when the caller is logged in but lacks permission.
49
+ *
50
+ * @example
51
+ * if (!ctx.auth) throw new AuthError("Not logged in");
52
+ */
53
+ export declare class AuthError extends ServerError {
54
+ constructor(message?: string);
55
+ }
56
+ /**
57
+ * Access denied. Sends HTTP 403.
58
+ * Use when the caller is authenticated but lacks the required permission.
59
+ *
60
+ * @example
61
+ * if (ctx.auth.role !== "admin") throw new ForbiddenError("Admins only");
62
+ */
63
+ export declare class ForbiddenError extends ServerError {
64
+ constructor(message?: string);
65
+ }
66
+ /**
67
+ * Validation failed. Sends HTTP 400.
68
+ * Includes a fields map for per-field error messages.
69
+ *
70
+ * @example
71
+ * throw new ValidationError("Invalid input", {
72
+ * fields: {
73
+ * email: "Must be a valid email address",
74
+ * name: "Required",
75
+ * }
76
+ * });
77
+ */
78
+ export declare class ValidationError extends ServerError {
79
+ readonly fields: Record<string, string>;
80
+ constructor(message?: string, options?: {
81
+ fields?: Record<string, string>;
82
+ });
83
+ }
84
+ /**
85
+ * Rate limit exceeded. Sends HTTP 429.
86
+ * Optionally includes retryAfter (seconds) for the Retry-After header.
87
+ *
88
+ * @example
89
+ * throw new RateLimitError("Too many requests", { retryAfter: 60 });
90
+ */
91
+ export declare class RateLimitError extends ServerError {
92
+ readonly retryAfter?: number;
93
+ constructor(message?: string, options?: {
94
+ retryAfter?: number;
95
+ });
96
+ }
97
+ /**
98
+ * Register a custom error class for client-side reconstruction.
99
+ * Call this in your addon's setup code.
100
+ *
101
+ * @example
102
+ * registerErrorClass("PaymentError", PaymentError);
103
+ */
104
+ export declare function registerErrorClass(name: string, ctor: new (...args: any[]) => ServerError): void;
105
+ export interface SerializedError {
106
+ __type: string;
107
+ message: string;
108
+ status: number;
109
+ code: string;
110
+ fields?: Record<string, string>;
111
+ retryAfter?: number;
112
+ stack?: string;
113
+ }
114
+ /**
115
+ * Serialize a ServerError (or plain Error) to the wire format.
116
+ *
117
+ * Plain Error (not a ServerError) → 500 AppError.
118
+ * In production, the message is replaced with "Internal Server Error"
119
+ * and the stack is never included.
120
+ */
121
+ export declare function serializeError(err: unknown, dev: boolean): SerializedError;
122
+ /**
123
+ * Reconstruct a ServerError from its wire format.
124
+ * Used on the client side by the RPC stub.
125
+ * Unknown __type falls back to AppError.
126
+ */
127
+ export declare function reconstructError(data: SerializedError): ServerError;
128
+ /**
129
+ * Returns true if the serialized object looks like a mates error.
130
+ * Used by the Fetch client to distinguish error responses from
131
+ * regular non-ok responses.
132
+ */
133
+ export declare function isMatesError(data: unknown): data is SerializedError;
134
+ /**
135
+ * Get the HTTP status code for a throw value.
136
+ * Returns 500 for unknown throws.
137
+ */
138
+ export declare function getErrorStatus(err: unknown): number;
139
+ /**
140
+ * Browser-side ESM module served at /_mates/errors.js.
141
+ *
142
+ * Kept here, next to the canonical error hierarchy, so virtual dev/prod helper
143
+ * generation cannot silently drift from the public client decoder behavior.
144
+ */
145
+ export declare const BROWSER_ERRORS_JS: string;
146
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAQ1D;AAID;;;;;GAKG;AACH,qBAAa,QAAS,SAAQ,WAAW;gBAErC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO;CAKnD;AAED;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,WAAW;gBAChC,OAAO,SAAc;CAIlC;AAED;;;;;;;GAOG;AACH,qBAAa,SAAU,SAAQ,WAAW;gBAC5B,OAAO,SAAiB;CAIrC;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,WAAW;gBACjC,OAAO,SAAc;CAIlC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAGtC,OAAO,SAAsB,EAC7B,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAO;CAMpD;AAED;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,WAAW;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;gBAG3B,OAAO,SAAsB,EAC7B,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;CAMxC;AAkBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,WAAW,GACxC,IAAI,CAEN;AAID,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,eAAe,CA6C1E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAuCnE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,eAAe,CASnE;AAuBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGnD;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAsGjB,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,386 @@
1
+ /**
2
+ * mates-fullstack — errors.ts
3
+ *
4
+ * Error class hierarchy for server functions.
5
+ * These errors are serialized over the wire and reconstructed
6
+ * on the client as the same class — instanceof checks work correctly.
7
+ *
8
+ * Throwing these from any server function, main.ts, or middleware
9
+ * results in a typed JSON error response. Plain Error throws result
10
+ * in a 500 with the message hidden in production.
11
+ *
12
+ * Wire format:
13
+ * { __type: "NotFoundError", message: "...", status: 404, ...extra }
14
+ */
15
+ // ─── Base ─────────────────────────────────────────────────────────────────────
16
+ /**
17
+ * Base class for all mates-fullstack server errors.
18
+ * Use AppError or one of the semantic subclasses instead of this directly.
19
+ */
20
+ export class ServerError extends Error {
21
+ status;
22
+ code;
23
+ constructor(message, status, code) {
24
+ super(message);
25
+ this.name = this.constructor.name;
26
+ this.status = status;
27
+ this.code = code;
28
+ // Maintain proper prototype chain in transpiled environments
29
+ Object.setPrototypeOf(this, new.target.prototype);
30
+ }
31
+ }
32
+ // ─── Concrete error classes ───────────────────────────────────────────────────
33
+ /**
34
+ * Generic application error. Use when none of the semantic subclasses fit.
35
+ *
36
+ * @example
37
+ * throw new AppError("Payment failed", { status: 402, code: "PAYMENT_FAILED" });
38
+ */
39
+ export class AppError extends ServerError {
40
+ constructor(message, options = {}) {
41
+ super(message, options.status ?? 500, options.code ?? "APP_ERROR");
42
+ Object.setPrototypeOf(this, new.target.prototype);
43
+ }
44
+ }
45
+ /**
46
+ * Resource not found. Sends HTTP 404.
47
+ *
48
+ * @example
49
+ * throw new NotFoundError("User not found");
50
+ */
51
+ export class NotFoundError extends ServerError {
52
+ constructor(message = "Not found") {
53
+ super(message, 404, "NOT_FOUND");
54
+ Object.setPrototypeOf(this, new.target.prototype);
55
+ }
56
+ }
57
+ /**
58
+ * Authentication required. Sends HTTP 401.
59
+ * Use when the caller is not logged in.
60
+ * Use ForbiddenError when the caller is logged in but lacks permission.
61
+ *
62
+ * @example
63
+ * if (!ctx.auth) throw new AuthError("Not logged in");
64
+ */
65
+ export class AuthError extends ServerError {
66
+ constructor(message = "Unauthorized") {
67
+ super(message, 401, "UNAUTHORIZED");
68
+ Object.setPrototypeOf(this, new.target.prototype);
69
+ }
70
+ }
71
+ /**
72
+ * Access denied. Sends HTTP 403.
73
+ * Use when the caller is authenticated but lacks the required permission.
74
+ *
75
+ * @example
76
+ * if (ctx.auth.role !== "admin") throw new ForbiddenError("Admins only");
77
+ */
78
+ export class ForbiddenError extends ServerError {
79
+ constructor(message = "Forbidden") {
80
+ super(message, 403, "FORBIDDEN");
81
+ Object.setPrototypeOf(this, new.target.prototype);
82
+ }
83
+ }
84
+ /**
85
+ * Validation failed. Sends HTTP 400.
86
+ * Includes a fields map for per-field error messages.
87
+ *
88
+ * @example
89
+ * throw new ValidationError("Invalid input", {
90
+ * fields: {
91
+ * email: "Must be a valid email address",
92
+ * name: "Required",
93
+ * }
94
+ * });
95
+ */
96
+ export class ValidationError extends ServerError {
97
+ fields;
98
+ constructor(message = "Validation failed", options = {}) {
99
+ super(message, 400, "VALIDATION_ERROR");
100
+ this.fields = options.fields ?? {};
101
+ Object.setPrototypeOf(this, new.target.prototype);
102
+ }
103
+ }
104
+ /**
105
+ * Rate limit exceeded. Sends HTTP 429.
106
+ * Optionally includes retryAfter (seconds) for the Retry-After header.
107
+ *
108
+ * @example
109
+ * throw new RateLimitError("Too many requests", { retryAfter: 60 });
110
+ */
111
+ export class RateLimitError extends ServerError {
112
+ retryAfter;
113
+ constructor(message = "Too many requests", options = {}) {
114
+ super(message, 429, "RATE_LIMIT");
115
+ this.retryAfter = options.retryAfter;
116
+ Object.setPrototypeOf(this, new.target.prototype);
117
+ }
118
+ }
119
+ // ─── Error registry ───────────────────────────────────────────────────────────
120
+ /**
121
+ * Maps __type strings to error constructors for client-side reconstruction.
122
+ * Extendable by addons via registerErrorClass().
123
+ */
124
+ const _errorRegistry = new Map([
125
+ ["ServerError", ServerError],
126
+ ["AppError", AppError],
127
+ ["NotFoundError", NotFoundError],
128
+ ["AuthError", AuthError],
129
+ ["ForbiddenError", ForbiddenError],
130
+ ["ValidationError", ValidationError],
131
+ ["RateLimitError", RateLimitError],
132
+ ]);
133
+ /**
134
+ * Register a custom error class for client-side reconstruction.
135
+ * Call this in your addon's setup code.
136
+ *
137
+ * @example
138
+ * registerErrorClass("PaymentError", PaymentError);
139
+ */
140
+ export function registerErrorClass(name, ctor) {
141
+ _errorRegistry.set(name, ctor);
142
+ }
143
+ /**
144
+ * Serialize a ServerError (or plain Error) to the wire format.
145
+ *
146
+ * Plain Error (not a ServerError) → 500 AppError.
147
+ * In production, the message is replaced with "Internal Server Error"
148
+ * and the stack is never included.
149
+ */
150
+ export function serializeError(err, dev) {
151
+ // Known server error — serialize faithfully
152
+ if (err instanceof ServerError) {
153
+ const serialized = {
154
+ __type: err.constructor.name,
155
+ message: err.message,
156
+ status: err.status,
157
+ code: err.code,
158
+ };
159
+ // Include subclass-specific fields
160
+ if (err instanceof ValidationError && Object.keys(err.fields).length > 0) {
161
+ serialized.fields = err.fields;
162
+ }
163
+ if (err instanceof RateLimitError && err.retryAfter !== undefined) {
164
+ serialized.retryAfter = err.retryAfter;
165
+ }
166
+ // Stack only in development
167
+ if (dev && err.stack) {
168
+ serialized.stack = err.stack;
169
+ }
170
+ // Safety: ensure the serialized object is JSON-safe
171
+ return _safeSerialize(serialized);
172
+ }
173
+ // Plain Error or unknown throw — hide details in production
174
+ if (err instanceof Error) {
175
+ return {
176
+ __type: "AppError",
177
+ message: dev ? err.message : "Internal Server Error",
178
+ status: 500,
179
+ code: "INTERNAL_ERROR",
180
+ ...(dev && err.stack ? { stack: err.stack } : {}),
181
+ };
182
+ }
183
+ // Non-Error throw (string, number, etc.)
184
+ return {
185
+ __type: "AppError",
186
+ message: dev ? String(err) : "Internal Server Error",
187
+ status: 500,
188
+ code: "INTERNAL_ERROR",
189
+ };
190
+ }
191
+ /**
192
+ * Reconstruct a ServerError from its wire format.
193
+ * Used on the client side by the RPC stub.
194
+ * Unknown __type falls back to AppError.
195
+ */
196
+ export function reconstructError(data) {
197
+ const Ctor = _errorRegistry.get(data.__type);
198
+ if (!Ctor) {
199
+ // Unknown type — reconstruct as AppError
200
+ const err = new AppError(data.message, {
201
+ status: data.status,
202
+ code: data.code,
203
+ });
204
+ return err;
205
+ }
206
+ // Reconstruct using the registered constructor
207
+ let err;
208
+ if (Ctor === ValidationError) {
209
+ err = new ValidationError(data.message, { fields: data.fields ?? {} });
210
+ }
211
+ else if (Ctor === RateLimitError) {
212
+ err = new RateLimitError(data.message, { retryAfter: data.retryAfter });
213
+ }
214
+ else if (Ctor === AppError) {
215
+ err = new AppError(data.message, { status: data.status, code: data.code });
216
+ }
217
+ else {
218
+ // NotFoundError, AuthError, ForbiddenError, custom classes
219
+ try {
220
+ err = new Ctor(data.message);
221
+ }
222
+ catch {
223
+ err = new AppError(data.message, {
224
+ status: data.status,
225
+ code: data.code,
226
+ });
227
+ }
228
+ }
229
+ // Restore stack if present (development)
230
+ if (data.stack) {
231
+ err.stack = data.stack;
232
+ }
233
+ return err;
234
+ }
235
+ /**
236
+ * Returns true if the serialized object looks like a mates error.
237
+ * Used by the Fetch client to distinguish error responses from
238
+ * regular non-ok responses.
239
+ */
240
+ export function isMatesError(data) {
241
+ return (typeof data === "object" &&
242
+ data !== null &&
243
+ "__type" in data &&
244
+ "message" in data &&
245
+ "status" in data &&
246
+ "code" in data);
247
+ }
248
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
249
+ /**
250
+ * Ensure serialized error data is JSON-safe.
251
+ * Strips any circular references or non-serializable values.
252
+ */
253
+ function _safeSerialize(obj) {
254
+ try {
255
+ JSON.stringify(obj);
256
+ return obj;
257
+ }
258
+ catch {
259
+ // Fallback: rebuild with only safe scalar fields
260
+ return {
261
+ __type: obj.__type,
262
+ message: typeof obj.message === "string" ? obj.message : "Error",
263
+ status: typeof obj.status === "number" ? obj.status : 500,
264
+ code: typeof obj.code === "string" ? obj.code : "ERROR",
265
+ };
266
+ }
267
+ }
268
+ /**
269
+ * Get the HTTP status code for a throw value.
270
+ * Returns 500 for unknown throws.
271
+ */
272
+ export function getErrorStatus(err) {
273
+ if (err instanceof ServerError)
274
+ return err.status;
275
+ return 500;
276
+ }
277
+ /**
278
+ * Browser-side ESM module served at /_mates/errors.js.
279
+ *
280
+ * Kept here, next to the canonical error hierarchy, so virtual dev/prod helper
281
+ * generation cannot silently drift from the public client decoder behavior.
282
+ */
283
+ export const BROWSER_ERRORS_JS = /* js */ `
284
+ export class ServerError extends Error {
285
+ constructor(message, status = 500, code = "ERROR") {
286
+ super(message);
287
+ this.name = this.constructor.name;
288
+ this.status = status;
289
+ this.code = code;
290
+ Object.setPrototypeOf(this, new.target.prototype);
291
+ }
292
+ }
293
+
294
+ export class AppError extends ServerError {
295
+ constructor(message, options = {}) {
296
+ super(message, options.status ?? 500, options.code ?? "APP_ERROR");
297
+ Object.setPrototypeOf(this, new.target.prototype);
298
+ }
299
+ }
300
+
301
+ export class NotFoundError extends ServerError {
302
+ constructor(message = "Not found") {
303
+ super(message, 404, "NOT_FOUND");
304
+ Object.setPrototypeOf(this, new.target.prototype);
305
+ }
306
+ }
307
+
308
+ export class AuthError extends ServerError {
309
+ constructor(message = "Unauthorized") {
310
+ super(message, 401, "UNAUTHORIZED");
311
+ Object.setPrototypeOf(this, new.target.prototype);
312
+ }
313
+ }
314
+
315
+ export class ForbiddenError extends ServerError {
316
+ constructor(message = "Forbidden") {
317
+ super(message, 403, "FORBIDDEN");
318
+ Object.setPrototypeOf(this, new.target.prototype);
319
+ }
320
+ }
321
+
322
+ export class ValidationError extends ServerError {
323
+ constructor(message = "Validation failed", options = {}) {
324
+ super(message, 400, "VALIDATION_ERROR");
325
+ this.fields = options.fields ?? {};
326
+ Object.setPrototypeOf(this, new.target.prototype);
327
+ }
328
+ }
329
+
330
+ export class RateLimitError extends ServerError {
331
+ constructor(message = "Too many requests", options = {}) {
332
+ super(message, 429, "RATE_LIMIT");
333
+ this.retryAfter = options.retryAfter;
334
+ Object.setPrototypeOf(this, new.target.prototype);
335
+ }
336
+ }
337
+
338
+ export function isMatesError(data) {
339
+ return typeof data === "object" &&
340
+ data !== null &&
341
+ "__type" in data &&
342
+ "message" in data &&
343
+ "status" in data &&
344
+ "code" in data;
345
+ }
346
+
347
+ export function reconstructError(data) {
348
+ let err;
349
+ switch (data.__type) {
350
+ case "ValidationError":
351
+ err = new ValidationError(data.message, { fields: data.fields ?? {} });
352
+ break;
353
+ case "RateLimitError":
354
+ err = new RateLimitError(data.message, { retryAfter: data.retryAfter });
355
+ break;
356
+ case "NotFoundError":
357
+ err = new NotFoundError(data.message);
358
+ break;
359
+ case "AuthError":
360
+ err = new AuthError(data.message);
361
+ break;
362
+ case "ForbiddenError":
363
+ err = new ForbiddenError(data.message);
364
+ break;
365
+ case "AppError":
366
+ err = new AppError(data.message, { status: data.status, code: data.code });
367
+ break;
368
+ case "ServerError":
369
+ err = new ServerError(data.message, data.status, data.code);
370
+ break;
371
+ default:
372
+ err = new AppError(data.message ?? "Unknown error", {
373
+ status: data.status,
374
+ code: data.code,
375
+ });
376
+ break;
377
+ }
378
+ if (data.stack) err.stack = data.stack;
379
+ return err;
380
+ }
381
+
382
+ export function getErrorStatus(err) {
383
+ return err instanceof ServerError ? err.status : 500;
384
+ }
385
+ `.trimStart();
386
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/dist/head.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * mates-fullstack — head.ts
3
+ *
4
+ * Builds the final HTML page by reading client/index.html as a template and
5
+ * replacing three markers:
6
+ * - <!-- mates:css --> → CSS bundle link
7
+ * - <!-- mates:ssr --> → SSR-rendered app HTML
8
+ * - <!-- mates:scripts --> → dev helpers + client bundle script
9
+ */
10
+ export declare const MARKER_CSS = "<!-- mates:css -->";
11
+ export declare const MARKER_SSR = "<!-- mates:ssr -->";
12
+ export declare const MARKER_SCRIPTS = "<!-- mates:scripts -->";
13
+ export interface BuildShellOptions {
14
+ /** Project root — used to locate client/index.html. */
15
+ projectRoot: string;
16
+ /** SSR-rendered app HTML. */
17
+ bodyHtml: string;
18
+ /** When true, injects dev-only scripts. */
19
+ dev?: boolean;
20
+ /** Browser bundle URL. */
21
+ clientEntry: string;
22
+ /** CSS bundle URL. */
23
+ cssUrl?: string | null;
24
+ /** CSS-in-JS styles collected during SSR. */
25
+ ssrStyles?: string | null;
26
+ /** Dev no-bundle import map for bare package specifiers. */
27
+ importMap?: Record<string, string> | null;
28
+ }
29
+ export declare function buildShell({ projectRoot, bodyHtml, dev, clientEntry, cssUrl, ssrStyles, importMap, }: BuildShellOptions): string;
30
+ export declare function readIndexHtml(projectRoot: string): string;
31
+ //# sourceMappingURL=head.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../src/head.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,eAAO,MAAM,UAAU,uBAAuB,CAAC;AAC/C,eAAO,MAAM,UAAU,uBAAuB,CAAC;AAC/C,eAAO,MAAM,cAAc,2BAA2B,CAAC;AAkLvD,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,wBAAgB,UAAU,CAAC,EACzB,WAAW,EACX,QAAQ,EACR,GAAW,EACX,WAAW,EACX,MAAM,EACN,SAAS,EACT,SAAgB,GACjB,EAAE,iBAAiB,GAAG,MAAM,CA6C5B;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAKzD"}