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,43 @@
1
+ /**
2
+ * mates-fullstack/client — browser hydration + RPC helpers.
3
+ * Browser-safe. No Node.js dependencies.
4
+ */
5
+ declare module "mates" {
6
+ function renderX(component: any, container: HTMLElement, props?: any): void;
7
+ function navigateTo(url: string): void;
8
+ function runWithGlobalInterceptors(url: string, init: RequestInit): Promise<Response>;
9
+ type Component<T extends Record<string, any> = Record<string, any>> = (propsFn: () => T) => () => any;
10
+ }
11
+ import type { Component } from "mates";
12
+ export declare class ServerFnError extends Error {
13
+ readonly status: number;
14
+ readonly code: string;
15
+ readonly data: Record<string, unknown>;
16
+ constructor(message: string, status: number, code: string, data?: Record<string, unknown>);
17
+ }
18
+ export declare function isServerFnError(err: unknown): err is ServerFnError;
19
+ export type Result<T> = {
20
+ ok: true;
21
+ data: T;
22
+ error: null;
23
+ } | {
24
+ ok: false;
25
+ data: null;
26
+ error: ServerFnError;
27
+ };
28
+ export declare function tryCatch<T>(fn: () => Promise<T>): Promise<Result<T>>;
29
+ export declare function __rpcCall(url: string, payload?: unknown): Promise<unknown>;
30
+ export interface HydrateOptions {
31
+ /** CSS selector for the SSR container. Default: '#app' */
32
+ selector?: string;
33
+ }
34
+ /**
35
+ * Mount the SPA into the SSR container.
36
+ * Clears SSR HTML first so lit-html doesn't duplicate it.
37
+ */
38
+ export declare function hydrateApp(component: Component, options?: HydrateOptions): void;
39
+ /**
40
+ * Mount the SPA with explicit props.
41
+ */
42
+ export declare function hydrateAppWithProps<T extends Record<string, any>>(component: Component<T>, props: T, options?: HydrateOptions): void;
43
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,QAAQ,OAAO,CAAC;IACrB,SAAgB,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;IACnF,SAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,SAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7F,KAAY,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,MAAM,GAAG,CAAC;CAC9G;AAGD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAGrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAQrC;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,aAAa,CAElE;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAChB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAClC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,CAAC;AAEpD,wBAAsB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAgB1E;AAID,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,OAAO,CAAC,CAwElB;AAID,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,cAAmB,GAC3B,IAAI,CAWN;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/D,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EACvB,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,cAAmB,GAC3B,IAAI,CAWN"}
package/dist/client.js ADDED
@@ -0,0 +1,130 @@
1
+ /**
2
+ * mates-fullstack/client — browser hydration + RPC helpers.
3
+ * Browser-safe. No Node.js dependencies.
4
+ */
5
+ import { renderX, navigateTo, runWithGlobalInterceptors } from "mates";
6
+ import { isMatesError, reconstructError } from "./errors.js";
7
+ import { isMatesRedirect } from "./redirect.js";
8
+ import { readSseStream } from "./stream.js";
9
+ import { triggerBrowserDownload } from "./download.js";
10
+ // ─── Error types ──────────────────────────────────────────────────────────────
11
+ export class ServerFnError extends Error {
12
+ status;
13
+ code;
14
+ data;
15
+ constructor(message, status, code, data = {}) {
16
+ super(message);
17
+ this.name = "ServerFnError";
18
+ this.status = status;
19
+ this.code = code;
20
+ this.data = data;
21
+ }
22
+ }
23
+ export function isServerFnError(err) {
24
+ return err instanceof ServerFnError;
25
+ }
26
+ export async function tryCatch(fn) {
27
+ try {
28
+ const data = await fn();
29
+ return { ok: true, data, error: null };
30
+ }
31
+ catch (err) {
32
+ if (isServerFnError(err))
33
+ return { ok: false, data: null, error: err };
34
+ return {
35
+ ok: false,
36
+ data: null,
37
+ error: new ServerFnError(err instanceof Error ? err.message : String(err), 500, "CLIENT_ERROR"),
38
+ };
39
+ }
40
+ }
41
+ // ─── RPC caller ───────────────────────────────────────────────────────────────
42
+ export async function __rpcCall(url, payload) {
43
+ const hasFile = payload instanceof FormData ||
44
+ (payload &&
45
+ typeof payload === "object" &&
46
+ Object.values(payload).some((v) => v instanceof File || v instanceof Blob));
47
+ let body;
48
+ const headers = {};
49
+ if (payload instanceof FormData) {
50
+ body = payload;
51
+ }
52
+ else if (hasFile && payload && typeof payload === "object") {
53
+ const fd = new FormData();
54
+ for (const [key, value] of Object.entries(payload)) {
55
+ if (value instanceof File || value instanceof Blob) {
56
+ fd.append(key, value);
57
+ }
58
+ else {
59
+ fd.append(key, JSON.stringify(value));
60
+ }
61
+ }
62
+ body = fd;
63
+ }
64
+ else {
65
+ headers["Content-Type"] = "application/json";
66
+ body = JSON.stringify(payload ?? {});
67
+ }
68
+ let res;
69
+ try {
70
+ res = await runWithGlobalInterceptors(url, { method: "POST", headers, body });
71
+ }
72
+ catch (networkErr) {
73
+ throw new ServerFnError(`[mates-fullstack] RPC ${url} failed: ${networkErr?.message ?? networkErr}`, 0, "NETWORK_ERROR");
74
+ }
75
+ const contentType = res.headers.get("content-type") ?? "";
76
+ const disposition = res.headers.get("content-disposition") ?? "";
77
+ if (res.status >= 300 && res.status < 400) {
78
+ const data = await res.json().catch(() => null);
79
+ if (isMatesRedirect(data)) {
80
+ if (/^(https?:)?\/\//.test(data.url))
81
+ window.location.href = data.url;
82
+ else
83
+ navigateTo(data.url);
84
+ return;
85
+ }
86
+ }
87
+ if (!res.ok) {
88
+ const data = await res.json().catch(() => null);
89
+ if (isMatesError(data))
90
+ throw reconstructError(data);
91
+ throw new ServerFnError(data?.message ?? `HTTP ${res.status}`, res.status, data?.code ?? "RPC_ERROR", data ?? {});
92
+ }
93
+ if (contentType.includes("text/event-stream"))
94
+ return readSseStream(res);
95
+ if (/attachment/i.test(disposition)) {
96
+ triggerBrowserDownload(res);
97
+ return;
98
+ }
99
+ if (res.status === 204)
100
+ return {};
101
+ return res.json();
102
+ }
103
+ /**
104
+ * Mount the SPA into the SSR container.
105
+ * Clears SSR HTML first so lit-html doesn't duplicate it.
106
+ */
107
+ export function hydrateApp(component, options = {}) {
108
+ const selector = options.selector ?? "#app";
109
+ const container = document.querySelector(selector);
110
+ if (!container) {
111
+ console.error(`[mates-fullstack] hydrateApp: container "${selector}" not found.`);
112
+ return;
113
+ }
114
+ container.innerHTML = "";
115
+ renderX(component, container);
116
+ }
117
+ /**
118
+ * Mount the SPA with explicit props.
119
+ */
120
+ export function hydrateAppWithProps(component, props, options = {}) {
121
+ const selector = options.selector ?? "#app";
122
+ const container = document.querySelector(selector);
123
+ if (!container) {
124
+ console.error(`[mates-fullstack] hydrateAppWithProps: container "${selector}" not found.`);
125
+ return;
126
+ }
127
+ container.innerHTML = "";
128
+ renderX(component, container, props);
129
+ }
130
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/cors.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * mates-fullstack — cors.ts
3
+ *
4
+ * CORS middleware. Registers via onRequest.
5
+ * Handles preflight OPTIONS requests and sets CORS headers on all responses.
6
+ */
7
+ export interface CorsOptions {
8
+ origins?: string | string[] | ((origin: string) => boolean);
9
+ methods?: string | string[];
10
+ allowedHeaders?: string | string[];
11
+ exposedHeaders?: string | string[];
12
+ credentials?: boolean;
13
+ maxAge?: number;
14
+ }
15
+ export declare function useCors(options?: CorsOptions): void;
16
+ //# sourceMappingURL=cors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,IAAI,CAiDvD"}
package/dist/cors.js ADDED
@@ -0,0 +1,60 @@
1
+ /**
2
+ * mates-fullstack — cors.ts
3
+ *
4
+ * CORS middleware. Registers via onRequest.
5
+ * Handles preflight OPTIONS requests and sets CORS headers on all responses.
6
+ */
7
+ import { onRequest } from "./middleware.js";
8
+ export function useCors(options = {}) {
9
+ // Safety guard: credentialed CORS requires an explicit origin allowlist.
10
+ // Reflecting any origin with credentials is a security vulnerability.
11
+ if (options.credentials) {
12
+ if (options.origins === undefined || options.origins === "*") {
13
+ console.error("[mates-fullstack] useCors: credentials: true requires an explicit origins allowlist.\n" +
14
+ " Pass a string, array of origins, or a predicate function:\n" +
15
+ ' useCors({ credentials: true, origins: "https://app.example.com" });\n' +
16
+ " Ignoring for now, but this will throw in a future release.");
17
+ }
18
+ }
19
+ const methods = toHeaderValue(options.methods ?? ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]);
20
+ const allowedHeaders = toHeaderValue(options.allowedHeaders ?? ["Content-Type", "Authorization"]);
21
+ const exposedHeaders = options.exposedHeaders
22
+ ? toHeaderValue(options.exposedHeaders)
23
+ : null;
24
+ const credentials = options.credentials ?? false;
25
+ const maxAge = options.maxAge ?? 86400;
26
+ const allowedOrigins = options.origins ?? "*";
27
+ onRequest((c) => {
28
+ const requestOrigin = c.req.header("origin");
29
+ if (!requestOrigin)
30
+ return;
31
+ const matched = resolveOrigin(requestOrigin, allowedOrigins);
32
+ if (!matched)
33
+ return;
34
+ const responseOrigin = credentials || matched !== "*" ? requestOrigin : "*";
35
+ c.resHeaders["access-control-allow-origin"] = responseOrigin;
36
+ if (credentials)
37
+ c.resHeaders["access-control-allow-credentials"] = "true";
38
+ if (exposedHeaders)
39
+ c.resHeaders["access-control-expose-headers"] = exposedHeaders;
40
+ c.resHeaders["vary"] = "Origin";
41
+ if (c.req.method === "OPTIONS") {
42
+ c.resHeaders["access-control-allow-methods"] = methods;
43
+ c.resHeaders["access-control-allow-headers"] = allowedHeaders;
44
+ c.resHeaders["access-control-max-age"] = String(maxAge);
45
+ return c.empty();
46
+ }
47
+ });
48
+ }
49
+ function resolveOrigin(requestOrigin, allowed) {
50
+ if (typeof allowed === "function")
51
+ return allowed(requestOrigin) ? requestOrigin : null;
52
+ if (allowed === "*")
53
+ return "*";
54
+ const list = Array.isArray(allowed) ? allowed : [allowed];
55
+ return list.includes(requestOrigin) ? requestOrigin : null;
56
+ }
57
+ function toHeaderValue(value) {
58
+ return Array.isArray(value) ? value.join(", ") : value;
59
+ }
60
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"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"}
package/dist/ctx.d.ts ADDED
@@ -0,0 +1,78 @@
1
+ /**
2
+ * mates-fullstack — ctx.ts
3
+ *
4
+ * Hono-style Context — the single per-request object.
5
+ * No Context, no two-step creation.
6
+ */
7
+ /// <reference types="node" />
8
+ import type { IncomingMessage } from "node:http";
9
+ export interface CookieOptions {
10
+ httpOnly?: boolean;
11
+ secure?: boolean;
12
+ sameSite?: "strict" | "lax" | "none";
13
+ maxAge?: number;
14
+ expires?: Date;
15
+ path?: string;
16
+ domain?: string;
17
+ }
18
+ export interface CookieHelper {
19
+ get(name: string): string | undefined;
20
+ getAll(): Record<string, string>;
21
+ set(name: string, value: string, options?: CookieOptions): void;
22
+ delete(name: string, options?: Pick<CookieOptions, "path" | "domain">): void;
23
+ }
24
+ export interface Context {
25
+ /** Request access. */
26
+ req: {
27
+ raw: Request;
28
+ method: string;
29
+ url: string;
30
+ path: string;
31
+ param(name: string): string | undefined;
32
+ query(name: string): string | undefined;
33
+ header(name: string): string | undefined;
34
+ params: Record<string, string>;
35
+ queries: Record<string, string>;
36
+ };
37
+ /** Whether the framework trusts X-Forwarded-* headers for IP and protocol detection. */
38
+ trustProxy: boolean;
39
+ status(code: number): Context;
40
+ header(name: string, value: string): Context;
41
+ json(data: unknown, status?: number): Response;
42
+ text(data: string, status?: number): Response;
43
+ html(data: string, status?: number): Response;
44
+ redirect(url: string, status?: 301 | 302 | 303 | 307 | 308): Response;
45
+ empty(status?: number): Response;
46
+ newResponse(data: BodyInit | null, status?: number, headers?: HeadersInit): Response;
47
+ isSSR: boolean;
48
+ auth: Record<string, unknown> | null;
49
+ cookie: CookieHelper;
50
+ resStatus: number;
51
+ resHeaders: Record<string, string | string[]>;
52
+ reqHeaders: Readonly<Record<string, string>>;
53
+ var: Record<string, unknown>;
54
+ set(key: string, value: unknown): void;
55
+ get(key: string): unknown;
56
+ [key: string]: unknown;
57
+ }
58
+ /**
59
+ * Create a Hono-style Context directly from a Node.js IncomingMessage.
60
+ *
61
+ * @param req The raw Node.js request.
62
+ * @param trustProxy When true, respects X-Forwarded-* headers for URL construction.
63
+ */
64
+ export declare function createContext(req: IncomingMessage, trustProxy?: boolean): Context;
65
+ /**
66
+ * Create a Context from plain headers (for tests / SSR-forwarded requests).
67
+ */
68
+ export declare function createContextFromHeaders(headers?: Record<string, string>, reqOverride?: Partial<{
69
+ method: string;
70
+ path: string;
71
+ }>): Context;
72
+ /**
73
+ * Apply ctx.resHeaders to a Node.js ServerResponse.
74
+ */
75
+ export declare function applyResHeaders(resHeaders: Record<string, string | string[]>, res: import("node:http").ServerResponse): void;
76
+ export declare function parseCookieHeader(header: string): Record<string, string>;
77
+ export declare function buildSetCookieHeader(name: string, value: string, options: CookieOptions): string;
78
+ //# sourceMappingURL=ctx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ctx.d.ts","sourceRoot":"","sources":["../src/ctx.ts"],"names":[],"mappings":"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"}
package/dist/ctx.js ADDED
@@ -0,0 +1,280 @@
1
+ /**
2
+ * mates-fullstack — ctx.ts
3
+ *
4
+ * Hono-style Context — the single per-request object.
5
+ * No Context, no two-step creation.
6
+ */
7
+ // ─── Context implementation ───────────────────────────────────────────────────
8
+ class ContextImpl {
9
+ req;
10
+ isSSR = false;
11
+ auth = null;
12
+ cookie;
13
+ resStatus = 200;
14
+ resHeaders;
15
+ reqHeaders;
16
+ trustProxy = false;
17
+ var = {};
18
+ _finalResponse = null;
19
+ constructor(rawReq, reqHeaders, cookie) {
20
+ const url = new URL(rawReq.url);
21
+ this.req = {
22
+ raw: rawReq,
23
+ method: rawReq.method,
24
+ url: rawReq.url,
25
+ path: url.pathname,
26
+ param: () => undefined,
27
+ query: (name) => url.searchParams.get(name) ?? undefined,
28
+ header: (name) => rawReq.headers.get(name) ?? undefined,
29
+ params: {},
30
+ queries: Object.fromEntries(url.searchParams.entries()),
31
+ };
32
+ this.reqHeaders = reqHeaders;
33
+ this.cookie = cookie;
34
+ this.resHeaders = {};
35
+ }
36
+ status(code) {
37
+ this.resStatus = code;
38
+ return this;
39
+ }
40
+ header(name, value) {
41
+ this.resHeaders[name] = value;
42
+ return this;
43
+ }
44
+ json(data, status) {
45
+ const body = JSON.stringify(data);
46
+ const res = new Response(body, {
47
+ status: status ?? this.resStatus,
48
+ headers: { "content-type": "application/json; charset=utf-8" },
49
+ });
50
+ this._finalResponse = res;
51
+ return res;
52
+ }
53
+ text(data, status) {
54
+ const res = new Response(data, {
55
+ status: status ?? this.resStatus,
56
+ headers: { "content-type": "text/plain; charset=utf-8" },
57
+ });
58
+ this._finalResponse = res;
59
+ return res;
60
+ }
61
+ html(data, status) {
62
+ const res = new Response(data, {
63
+ status: status ?? this.resStatus,
64
+ headers: { "content-type": "text/html; charset=utf-8" },
65
+ });
66
+ this._finalResponse = res;
67
+ return res;
68
+ }
69
+ redirect(url, status = 302) {
70
+ const res = new Response(null, { status, headers: { location: url } });
71
+ this._finalResponse = res;
72
+ return res;
73
+ }
74
+ empty(status) {
75
+ const res = new Response(null, { status: status ?? 204 });
76
+ this._finalResponse = res;
77
+ return res;
78
+ }
79
+ newResponse(data, status, headers) {
80
+ const res = new Response(data, {
81
+ status: status ?? this.resStatus,
82
+ headers,
83
+ });
84
+ this._finalResponse = res;
85
+ return res;
86
+ }
87
+ set(key, value) {
88
+ this.var[key] = value;
89
+ }
90
+ get(key) {
91
+ return this.var[key];
92
+ }
93
+ /** @internal */
94
+ _response() {
95
+ return this._finalResponse;
96
+ }
97
+ }
98
+ // ─── Factory — single entry point ─────────────────────────────────────────────
99
+ /**
100
+ * Create a Hono-style Context directly from a Node.js IncomingMessage.
101
+ *
102
+ * @param req The raw Node.js request.
103
+ * @param trustProxy When true, respects X-Forwarded-* headers for URL construction.
104
+ */
105
+ export function createContext(req, trustProxy = false) {
106
+ const reqHeaders = _normalizeHeaders(req.headers);
107
+ const resHeaders = {};
108
+ const cookie = _buildCookieHelper(reqHeaders, resHeaders);
109
+ const fetchReq = _buildFetchRequest(req, trustProxy);
110
+ const ctx = new ContextImpl(fetchReq, reqHeaders, cookie);
111
+ ctx.cookie = cookie;
112
+ ctx.resHeaders = resHeaders;
113
+ ctx.trustProxy = trustProxy;
114
+ return ctx;
115
+ }
116
+ /**
117
+ * Create a Context from plain headers (for tests / SSR-forwarded requests).
118
+ */
119
+ export function createContextFromHeaders(headers = {}, reqOverride) {
120
+ const reqHeaders = _normalizeHeaders(headers);
121
+ const resHeaders = {};
122
+ const cookie = _buildCookieHelper(reqHeaders, resHeaders);
123
+ const method = reqOverride?.method ?? "GET";
124
+ const path = reqOverride?.path ?? "/";
125
+ const fetchReq = new Request(`http://localhost${path}`, { method, headers });
126
+ const ctx = new ContextImpl(fetchReq, reqHeaders, cookie);
127
+ ctx.resHeaders = resHeaders;
128
+ return ctx;
129
+ }
130
+ // ─── Internal helpers ─────────────────────────────────────────────────────────
131
+ function _buildFetchRequest(req, trustProxy) {
132
+ const host = req.headers.host ?? "localhost";
133
+ const forwardedProto = req.headers["x-forwarded-proto"];
134
+ const proto = trustProxy && forwardedProto
135
+ ? Array.isArray(forwardedProto)
136
+ ? forwardedProto[0]
137
+ : forwardedProto.split(",")[0].trim()
138
+ : "http";
139
+ const url = new URL(req.url ?? "/", `${proto}://${host}`);
140
+ const method = (req.method ?? "GET").toUpperCase();
141
+ const headers = new Headers();
142
+ for (const [key, value] of Object.entries(req.headers)) {
143
+ if (value === undefined)
144
+ continue;
145
+ if (Array.isArray(value)) {
146
+ for (const item of value)
147
+ headers.append(key, item);
148
+ }
149
+ else {
150
+ headers.set(key, value);
151
+ }
152
+ }
153
+ const init = { method, headers };
154
+ if (method !== "GET" && method !== "HEAD") {
155
+ init.body = req;
156
+ init.duplex = "half";
157
+ }
158
+ return new Request(url, init);
159
+ }
160
+ function _buildCookieHelper(reqHeaders, resHeaders) {
161
+ let _parsed = null;
162
+ function _get() {
163
+ if (_parsed !== null)
164
+ return _parsed;
165
+ _parsed = parseCookieHeader(reqHeaders["cookie"] ?? "");
166
+ return _parsed;
167
+ }
168
+ return {
169
+ get: (name) => _get()[name],
170
+ getAll: () => ({ ..._get() }),
171
+ set(name, value, options = {}) {
172
+ _appendSetCookie(resHeaders, buildSetCookieHeader(name, value, options));
173
+ },
174
+ delete(name, options = {}) {
175
+ _appendSetCookie(resHeaders, buildSetCookieHeader(name, "", {
176
+ maxAge: 0,
177
+ expires: new Date(0),
178
+ ...options,
179
+ }));
180
+ },
181
+ };
182
+ }
183
+ /**
184
+ * Apply ctx.resHeaders to a Node.js ServerResponse.
185
+ */
186
+ export function applyResHeaders(resHeaders, res) {
187
+ for (const [key, value] of Object.entries(resHeaders)) {
188
+ if (res.headersSent)
189
+ break;
190
+ try {
191
+ if (Array.isArray(value)) {
192
+ res.setHeader(key, value);
193
+ }
194
+ else {
195
+ res.setHeader(key, value);
196
+ }
197
+ }
198
+ catch {
199
+ /* ignore */
200
+ }
201
+ }
202
+ }
203
+ // ─── Cookie parsing ───────────────────────────────────────────────────────────
204
+ export function parseCookieHeader(header) {
205
+ const cookies = {};
206
+ if (!header || typeof header !== "string")
207
+ return cookies;
208
+ const pairs = header.split(";");
209
+ for (const pair of pairs) {
210
+ const eqIndex = pair.indexOf("=");
211
+ if (eqIndex === -1)
212
+ continue;
213
+ const name = pair.slice(0, eqIndex).trim();
214
+ let value = pair.slice(eqIndex + 1).trim();
215
+ if (!name)
216
+ continue;
217
+ if (value.startsWith('"') && value.endsWith('"') && value.length >= 2) {
218
+ value = value.slice(1, -1);
219
+ }
220
+ if (!(name in cookies)) {
221
+ try {
222
+ cookies[name] = decodeURIComponent(value);
223
+ }
224
+ catch {
225
+ cookies[name] = value;
226
+ }
227
+ }
228
+ }
229
+ return cookies;
230
+ }
231
+ export function buildSetCookieHeader(name, value, options) {
232
+ const encodedValue = encodeURIComponent(value);
233
+ let header = `${name}=${encodedValue}`;
234
+ if (options.maxAge !== undefined)
235
+ header += `; Max-Age=${Math.floor(options.maxAge)}`;
236
+ if (options.expires)
237
+ header += `; Expires=${options.expires.toUTCString()}`;
238
+ const cookiePath = options.path ?? "/";
239
+ header += `; Path=${cookiePath}`;
240
+ if (options.domain)
241
+ header += `; Domain=${options.domain}`;
242
+ if (options.sameSite) {
243
+ const sameSite = options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1);
244
+ header += `; SameSite=${sameSite}`;
245
+ }
246
+ if (options.secure)
247
+ header += "; Secure";
248
+ if (options.httpOnly)
249
+ header += "; HttpOnly";
250
+ return header;
251
+ }
252
+ function _appendSetCookie(resHeaders, value) {
253
+ const existing = resHeaders["set-cookie"];
254
+ if (existing === undefined) {
255
+ resHeaders["set-cookie"] = [value];
256
+ }
257
+ else if (Array.isArray(existing)) {
258
+ existing.push(value);
259
+ }
260
+ else {
261
+ resHeaders["set-cookie"] = [existing, value];
262
+ }
263
+ }
264
+ function _normalizeHeaders(headers) {
265
+ const normalized = {};
266
+ for (const [key, value] of Object.entries(headers)) {
267
+ if (value === undefined)
268
+ continue;
269
+ const lowerKey = key.toLowerCase();
270
+ if (Array.isArray(value)) {
271
+ normalized[lowerKey] =
272
+ lowerKey === "cookie" ? value.join("; ") : value.join(", ");
273
+ }
274
+ else {
275
+ normalized[lowerKey] = value;
276
+ }
277
+ }
278
+ return normalized;
279
+ }
280
+ //# sourceMappingURL=ctx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ctx.js","sourceRoot":"","sources":["../src/ctx.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyEH,iFAAiF;AAEjF,MAAM,WAAW;IAEf,GAAG,CAAiB;IACpB,KAAK,GAAG,KAAK,CAAC;IACd,IAAI,GAAmC,IAAI,CAAC;IAC5C,MAAM,CAAe;IACrB,SAAS,GAAG,GAAG,CAAC;IAChB,UAAU,CAAoC;IAC9C,UAAU,CAAmC;IAC7C,UAAU,GAAG,KAAK,CAAC;IACnB,GAAG,GAA4B,EAAE,CAAC;IAC1B,cAAc,GAAoB,IAAI,CAAC;IAE/C,YACE,MAAe,EACf,UAA4C,EAC5C,MAAoB;QAEpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,GAAG;YACT,GAAG,EAAE,MAAM;YACX,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;YACtB,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS;YACxD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS;YACvD,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;SACxD,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,KAAa;QAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,IAAa,EAAE,MAAe;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;YAC7B,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,SAAS;YAChC,OAAO,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE;SAC/D,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,MAAe;QAChC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;YAC7B,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,SAAS;YAChC,OAAO,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE;SACzD,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,MAAe;QAChC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;YAC7B,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,SAAS;YAChC,OAAO,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE;SACxD,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,QAAQ,CAAC,GAAW,EAAE,SAAsC,GAAG;QAC7D,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,MAAe;QACnB,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,WAAW,CACT,IAAqB,EACrB,MAAe,EACf,OAAqB;QAErB,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;YAC7B,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC,SAAS;YAChC,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAc;QAC7B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,gBAAgB;IAChB,SAAS;QACP,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAoB,EACpB,UAAU,GAAG,KAAK;IAElB,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAsC,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1D,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IACpB,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;IAC5B,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAkC,EAAE,EACpC,WAAuD;IAEvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAsC,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,WAAW,EAAE,MAAM,IAAI,KAAK,CAAC;IAC5C,MAAM,IAAI,GAAG,WAAW,EAAE,IAAI,IAAI,GAAG,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,mBAAmB,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC1D,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF,SAAS,kBAAkB,CACzB,GAAoB,EACpB,UAAmB;IAEnB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IAC7C,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACxD,MAAM,KAAK,GACT,UAAU,IAAI,cAAc;QAC1B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;YAC7B,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACvC,CAAC,CAAC,MAAM,CAAC;IACb,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAsC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACpE,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,GAA0B,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,kBAAkB,CACzB,UAAkC,EAClC,UAA6C;IAE7C,IAAI,OAAO,GAAkC,IAAI,CAAC;IAElD,SAAS,IAAI;QACX,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QACrC,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO;QACL,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;QAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE;YAC3B,gBAAgB,CAAC,UAAU,EAAE,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,EAAE;YACvB,gBAAgB,CACd,UAAU,EACV,oBAAoB,CAAC,IAAI,EAAE,EAAE,EAAE;gBAC7B,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;gBACpB,GAAG,OAAO;aACX,CAAC,CACH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,UAA6C,EAC7C,GAAuC;IAEvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,GAAG,CAAC,WAAW;YAAE,MAAM;QAC3B,IAAI,CAAC;YACH,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAE1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,SAAS;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,KAAa,EACb,OAAsB;IAEtB,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,YAAY,EAAE,CAAC;IAEvC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAC9B,MAAM,IAAI,aAAa,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IACtD,IAAI,OAAO,CAAC,OAAO;QAAE,MAAM,IAAI,aAAa,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;IAC5E,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC;IACvC,MAAM,IAAI,UAAU,UAAU,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,YAAY,OAAO,CAAC,MAAM,EAAE,CAAC;IAC3D,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,IAAI,cAAc,QAAQ,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,UAAU,CAAC;IACzC,IAAI,OAAO,CAAC,QAAQ;QAAE,MAAM,IAAI,YAAY,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,UAA6C,EAC7C,KAAa;IAEb,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAsD;IAEtD,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,QAAQ,CAAC;gBAClB,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}