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.
- package/README.md +311 -0
- package/dist/arctic-auth.d.ts +101 -0
- package/dist/arctic-auth.d.ts.map +1 -0
- package/dist/arctic-auth.js +538 -0
- package/dist/arctic-auth.js.map +1 -0
- package/dist/asset-manifest.d.ts +14 -0
- package/dist/asset-manifest.d.ts.map +1 -0
- package/dist/asset-manifest.js +102 -0
- package/dist/asset-manifest.js.map +1 -0
- package/dist/browser.d.ts +18 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +25 -0
- package/dist/browser.js.map +1 -0
- package/dist/build-esbuild.d.ts +29 -0
- package/dist/build-esbuild.d.ts.map +1 -0
- package/dist/build-esbuild.js +699 -0
- package/dist/build-esbuild.js.map +1 -0
- package/dist/build-prod.d.ts +126 -0
- package/dist/build-prod.d.ts.map +1 -0
- package/dist/build-prod.js +1014 -0
- package/dist/build-prod.js.map +1 -0
- package/dist/cli-new.d.ts +14 -0
- package/dist/cli-new.d.ts.map +1 -0
- package/dist/cli-new.js +637 -0
- package/dist/cli-new.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +130 -0
- package/dist/client.js.map +1 -0
- package/dist/cors.d.ts +16 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +60 -0
- package/dist/cors.js.map +1 -0
- package/dist/ctx.d.ts +78 -0
- package/dist/ctx.d.ts.map +1 -0
- package/dist/ctx.js +280 -0
- package/dist/ctx.js.map +1 -0
- package/dist/dev-watcher.d.ts +23 -0
- package/dist/dev-watcher.d.ts.map +1 -0
- package/dist/dev-watcher.js +136 -0
- package/dist/dev-watcher.js.map +1 -0
- package/dist/docs-generator.d.ts +69 -0
- package/dist/docs-generator.d.ts.map +1 -0
- package/dist/docs-generator.js +557 -0
- package/dist/docs-generator.js.map +1 -0
- package/dist/docs-page.d.ts +20 -0
- package/dist/docs-page.d.ts.map +1 -0
- package/dist/docs-page.js +1152 -0
- package/dist/docs-page.js.map +1 -0
- package/dist/download.d.ts +78 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +202 -0
- package/dist/download.js.map +1 -0
- package/dist/env-loader.d.ts +76 -0
- package/dist/env-loader.d.ts.map +1 -0
- package/dist/env-loader.js +213 -0
- package/dist/env-loader.js.map +1 -0
- package/dist/errors.d.ts +146 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +386 -0
- package/dist/errors.js.map +1 -0
- package/dist/head.d.ts +31 -0
- package/dist/head.d.ts.map +1 -0
- package/dist/head.js +245 -0
- package/dist/head.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/internal-prefixes.d.ts +16 -0
- package/dist/internal-prefixes.d.ts.map +1 -0
- package/dist/internal-prefixes.js +16 -0
- package/dist/internal-prefixes.js.map +1 -0
- package/dist/internal.d.ts +25 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +25 -0
- package/dist/internal.js.map +1 -0
- package/dist/jwt.d.ts +166 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +261 -0
- package/dist/jwt.js.map +1 -0
- package/dist/log.d.ts +44 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +66 -0
- package/dist/log.js.map +1 -0
- package/dist/logger.d.ts +76 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +138 -0
- package/dist/logger.js.map +1 -0
- package/dist/main-runner.d.ts +59 -0
- package/dist/main-runner.d.ts.map +1 -0
- package/dist/main-runner.js +157 -0
- package/dist/main-runner.js.map +1 -0
- package/dist/mates-auth.d.ts +82 -0
- package/dist/mates-auth.d.ts.map +1 -0
- package/dist/mates-auth.js +323 -0
- package/dist/mates-auth.js.map +1 -0
- package/dist/middleware.d.ts +30 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +67 -0
- package/dist/middleware.js.map +1 -0
- package/dist/project-resolver.d.ts +102 -0
- package/dist/project-resolver.d.ts.map +1 -0
- package/dist/project-resolver.js +271 -0
- package/dist/project-resolver.js.map +1 -0
- package/dist/rate-limit.d.ts +37 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +109 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/redirect.d.ts +84 -0
- package/dist/redirect.d.ts.map +1 -0
- package/dist/redirect.js +105 -0
- package/dist/redirect.js.map +1 -0
- package/dist/renderer.d.ts +91 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +630 -0
- package/dist/renderer.js.map +1 -0
- package/dist/request-logger.d.ts +12 -0
- package/dist/request-logger.d.ts.map +1 -0
- package/dist/request-logger.js +55 -0
- package/dist/request-logger.js.map +1 -0
- package/dist/rest.d.ts +25 -0
- package/dist/rest.d.ts.map +1 -0
- package/dist/rest.js +93 -0
- package/dist/rest.js.map +1 -0
- package/dist/router.d.ts +71 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +222 -0
- package/dist/router.js.map +1 -0
- package/dist/rpc-registry.d.ts +84 -0
- package/dist/rpc-registry.d.ts.map +1 -0
- package/dist/rpc-registry.js +271 -0
- package/dist/rpc-registry.js.map +1 -0
- package/dist/rpc-runner.d.ts +82 -0
- package/dist/rpc-runner.d.ts.map +1 -0
- package/dist/rpc-runner.js +564 -0
- package/dist/rpc-runner.js.map +1 -0
- package/dist/sanitize.d.ts +61 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +193 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/security-headers.d.ts +114 -0
- package/dist/security-headers.d.ts.map +1 -0
- package/dist/security-headers.js +121 -0
- package/dist/security-headers.js.map +1 -0
- package/dist/server-fn.d.ts +323 -0
- package/dist/server-fn.d.ts.map +1 -0
- package/dist/server-fn.js +373 -0
- package/dist/server-fn.js.map +1 -0
- package/dist/server-public.d.ts +13 -0
- package/dist/server-public.d.ts.map +1 -0
- package/dist/server-public.js +12 -0
- package/dist/server-public.js.map +1 -0
- package/dist/server-timeout.d.ts +38 -0
- package/dist/server-timeout.d.ts.map +1 -0
- package/dist/server-timeout.js +46 -0
- package/dist/server-timeout.js.map +1 -0
- package/dist/server.d.ts +100 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1218 -0
- package/dist/server.js.map +1 -0
- package/dist/socket-router.d.ts +153 -0
- package/dist/socket-router.d.ts.map +1 -0
- package/dist/socket-router.js +612 -0
- package/dist/socket-router.js.map +1 -0
- package/dist/sso.d.ts +90 -0
- package/dist/sso.d.ts.map +1 -0
- package/dist/sso.js +261 -0
- package/dist/sso.js.map +1 -0
- package/dist/ssr-context.d.ts +49 -0
- package/dist/ssr-context.d.ts.map +1 -0
- package/dist/ssr-context.js +85 -0
- package/dist/ssr-context.js.map +1 -0
- package/dist/ssr-globals.d.ts +32 -0
- package/dist/ssr-globals.d.ts.map +1 -0
- package/dist/ssr-globals.js +1010 -0
- package/dist/ssr-globals.js.map +1 -0
- package/dist/ssr-template.d.ts +73 -0
- package/dist/ssr-template.d.ts.map +1 -0
- package/dist/ssr-template.js +507 -0
- package/dist/ssr-template.js.map +1 -0
- package/dist/stack-mapper.d.ts +25 -0
- package/dist/stack-mapper.d.ts.map +1 -0
- package/dist/stack-mapper.js +139 -0
- package/dist/stack-mapper.js.map +1 -0
- package/dist/stream.d.ts +89 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +299 -0
- package/dist/stream.js.map +1 -0
- package/dist/upload.d.ts +69 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +110 -0
- package/dist/upload.js.map +1 -0
- package/dist/validate.d.ts +58 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +89 -0
- package/dist/validate.js.map +1 -0
- package/dist/verify-package.d.ts +3 -0
- package/dist/verify-package.d.ts.map +1 -0
- package/dist/verify-package.js +128 -0
- package/dist/verify-package.js.map +1 -0
- package/package.json +79 -0
package/dist/errors.d.ts
ADDED
|
@@ -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"}
|