@rainfw/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +21 -0
  2. package/cli/commands/db.js +399 -0
  3. package/cli/index.js +206 -0
  4. package/cli/templates/drizzle-config.js +15 -0
  5. package/cli/templates/schema.js +16 -0
  6. package/cli/utils/process.js +23 -0
  7. package/cli/utils/sanitize.d.ts +1 -0
  8. package/cli/utils/sanitize.js +8 -0
  9. package/cli/utils/toml-parser.d.ts +10 -0
  10. package/cli/utils/toml-parser.js +58 -0
  11. package/dist/bindings.d.ts +3 -0
  12. package/dist/bindings.d.ts.map +1 -0
  13. package/dist/bindings.js +17 -0
  14. package/dist/bindings.js.map +1 -0
  15. package/dist/context.d.ts +53 -0
  16. package/dist/context.d.ts.map +1 -0
  17. package/dist/context.js +246 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/cookie.d.ts +12 -0
  20. package/dist/cookie.d.ts.map +1 -0
  21. package/dist/cookie.js +68 -0
  22. package/dist/cookie.js.map +1 -0
  23. package/dist/errors.d.ts +5 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +8 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/index.d.ts +14 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +9 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/jsx/createElement.d.ts +4 -0
  32. package/dist/jsx/createElement.d.ts.map +1 -0
  33. package/dist/jsx/createElement.js +19 -0
  34. package/dist/jsx/createElement.js.map +1 -0
  35. package/dist/jsx/escape.d.ts +2 -0
  36. package/dist/jsx/escape.d.ts.map +1 -0
  37. package/dist/jsx/escape.js +12 -0
  38. package/dist/jsx/escape.js.map +1 -0
  39. package/dist/jsx/index.d.ts +6 -0
  40. package/dist/jsx/index.d.ts.map +1 -0
  41. package/dist/jsx/index.js +5 -0
  42. package/dist/jsx/index.js.map +1 -0
  43. package/dist/jsx/jsx-namespace.d.ts +23 -0
  44. package/dist/jsx/jsx-namespace.d.ts.map +1 -0
  45. package/dist/jsx/jsx-namespace.js +2 -0
  46. package/dist/jsx/jsx-namespace.js.map +1 -0
  47. package/dist/jsx/jsx-runtime.d.ts +6 -0
  48. package/dist/jsx/jsx-runtime.d.ts.map +1 -0
  49. package/dist/jsx/jsx-runtime.js +20 -0
  50. package/dist/jsx/jsx-runtime.js.map +1 -0
  51. package/dist/jsx/render.d.ts +4 -0
  52. package/dist/jsx/render.d.ts.map +1 -0
  53. package/dist/jsx/render.js +134 -0
  54. package/dist/jsx/render.js.map +1 -0
  55. package/dist/jsx/types.d.ts +11 -0
  56. package/dist/jsx/types.d.ts.map +1 -0
  57. package/dist/jsx/types.js +2 -0
  58. package/dist/jsx/types.js.map +1 -0
  59. package/dist/jsx-runtime.d.ts +23 -0
  60. package/dist/jsx-runtime.d.ts.map +1 -0
  61. package/dist/jsx-runtime.js +2 -0
  62. package/dist/jsx-runtime.js.map +1 -0
  63. package/dist/middleware/cors.d.ts +12 -0
  64. package/dist/middleware/cors.d.ts.map +1 -0
  65. package/dist/middleware/cors.js +75 -0
  66. package/dist/middleware/cors.js.map +1 -0
  67. package/dist/middleware/session.d.ts +24 -0
  68. package/dist/middleware/session.d.ts.map +1 -0
  69. package/dist/middleware/session.js +124 -0
  70. package/dist/middleware/session.js.map +1 -0
  71. package/dist/package.json +1 -0
  72. package/dist/renderers/react.d.ts +9 -0
  73. package/dist/renderers/react.d.ts.map +1 -0
  74. package/dist/renderers/react.js +40 -0
  75. package/dist/renderers/react.js.map +1 -0
  76. package/dist/router.d.ts +36 -0
  77. package/dist/router.d.ts.map +1 -0
  78. package/dist/router.js +363 -0
  79. package/dist/router.js.map +1 -0
  80. package/dist/types.d.ts +29 -0
  81. package/dist/types.d.ts.map +1 -0
  82. package/dist/types.js +4 -0
  83. package/dist/types.js.map +1 -0
  84. package/dist/utils/regexp.d.ts +2 -0
  85. package/dist/utils/regexp.d.ts.map +1 -0
  86. package/dist/utils/regexp.js +4 -0
  87. package/dist/utils/regexp.js.map +1 -0
  88. package/dist/utils/url.d.ts +2 -0
  89. package/dist/utils/url.d.ts.map +1 -0
  90. package/dist/utils/url.js +9 -0
  91. package/dist/utils/url.js.map +1 -0
  92. package/package.json +81 -0
  93. package/scripts/dev.js +58 -0
  94. package/scripts/generate.js +660 -0
@@ -0,0 +1,10 @@
1
+ interface D1Binding {
2
+ binding: string;
3
+ database_name: string;
4
+ database_id: string;
5
+ [key: string]: string;
6
+ }
7
+
8
+ export function parseD1Bindings(content: string): D1Binding[];
9
+ export function getD1Bindings(): D1Binding[];
10
+ export const WRANGLER_TOML: string;
@@ -0,0 +1,58 @@
1
+ const fs = require("node:fs");
2
+ const path = require("node:path");
3
+
4
+ const WRANGLER_TOML = path.join(process.cwd(), "wrangler.toml");
5
+
6
+ function parseD1Bindings(content) {
7
+ const results = [];
8
+ const lines = content.split("\n");
9
+ let inD1Section = false;
10
+ let current = {};
11
+
12
+ for (const line of lines) {
13
+ const trimmed = line.trim();
14
+
15
+ if (trimmed.startsWith("#")) continue;
16
+
17
+ if (trimmed === "[[d1_databases]]") {
18
+ if (inD1Section && current.binding) {
19
+ results.push({ ...current });
20
+ }
21
+ inD1Section = true;
22
+ current = {};
23
+ continue;
24
+ }
25
+
26
+ if (trimmed.startsWith("[") && inD1Section) {
27
+ if (current.binding) {
28
+ results.push({ ...current });
29
+ }
30
+ inD1Section = false;
31
+ current = {};
32
+ continue;
33
+ }
34
+
35
+ if (inD1Section) {
36
+ const match = trimmed.match(/^([\w-]+)\s*=\s*"([^"]*)"/);
37
+ if (match) {
38
+ current[match[1]] = match[2];
39
+ }
40
+ }
41
+ }
42
+
43
+ if (inD1Section && current.binding) {
44
+ results.push({ ...current });
45
+ }
46
+
47
+ return results;
48
+ }
49
+
50
+ function getD1Bindings() {
51
+ if (!fs.existsSync(WRANGLER_TOML)) {
52
+ return [];
53
+ }
54
+ const content = fs.readFileSync(WRANGLER_TOML, "utf-8");
55
+ return parseD1Bindings(content);
56
+ }
57
+
58
+ module.exports = { parseD1Bindings, getD1Bindings, WRANGLER_TOML };
@@ -0,0 +1,3 @@
1
+ export declare function runWithBindings<T>(env: unknown, fn: () => T): T;
2
+ export declare function bindings<E = Env>(): E;
3
+ //# sourceMappingURL=bindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../src/framework/bindings.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE/D;AAED,wBAAgB,QAAQ,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAYrC"}
@@ -0,0 +1,17 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ const bindingsStorage = new AsyncLocalStorage();
3
+ export function runWithBindings(env, fn) {
4
+ return bindingsStorage.run(env, fn);
5
+ }
6
+ export function bindings() {
7
+ const store = bindingsStorage.getStore();
8
+ if (store === undefined) {
9
+ throw new Error(`[Rain] bindings() was called outside of a request \
10
+ context. This function can only be used inside route \
11
+ handlers, middleware, or functions called during request \
12
+ processing. If you need bindings in a handler, use \
13
+ ctx.bindings instead.`);
14
+ }
15
+ return store;
16
+ }
17
+ //# sourceMappingURL=bindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../src/framework/bindings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,eAAe,GAAG,IAAI,iBAAiB,EAAW,CAAC;AAEzD,MAAM,UAAU,eAAe,CAAI,GAAY,EAAE,EAAW;IAC1D,OAAO,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;IACzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb;;;;sBAIgB,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,KAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { CookieOptions } from "./cookie";
2
+ import type { RainElement } from "./jsx/types";
3
+ import type { Schema, StateKey } from "./types";
4
+ export declare class Context {
5
+ readonly req: Request;
6
+ readonly params: Record<string, string>;
7
+ readonly state: Map<string, unknown>;
8
+ readonly bindings: Env;
9
+ private cachedUrl;
10
+ private executionCtx;
11
+ private cachedCookies;
12
+ private pendingCookies;
13
+ constructor(req: Request, params: Record<string, string>, env?: Env, executionCtx?: ExecutionContext);
14
+ get url(): URL;
15
+ get path(): string;
16
+ get method(): string;
17
+ get query(): URLSearchParams;
18
+ header(name: string): string | null;
19
+ cookie(name: string): string | undefined;
20
+ setCookie(name: string, value: string, options?: CookieOptions): void;
21
+ deleteCookie(name: string, options?: Pick<CookieOptions, "path" | "domain">): void;
22
+ getPendingCookies(): readonly string[];
23
+ waitUntil(promise: Promise<unknown>): void;
24
+ get<T>(key: StateKey<T>): T | undefined;
25
+ set<T>(key: StateKey<T>, value: T): void;
26
+ json(data: unknown, status?: number): Response;
27
+ html(body: RainElement | string, status?: number): Response;
28
+ text(body: string, status?: number): Response;
29
+ redirect(location: string, status?: number, options?: {
30
+ allowExternal?: boolean;
31
+ }): Response;
32
+ parseJson<T = unknown>(options?: {
33
+ maxSize?: number;
34
+ }): Promise<T>;
35
+ parseJsonWith<T>(schema: Schema<T>, options?: {
36
+ maxSize?: number;
37
+ }): Promise<T>;
38
+ parseFormDataWith<T>(schema: Schema<T>, options?: {
39
+ maxSize?: number;
40
+ }): Promise<T>;
41
+ parseFormData(options?: {
42
+ maxSize?: number;
43
+ }): Promise<FormData>;
44
+ parseText(options?: {
45
+ maxSize?: number;
46
+ }): Promise<string>;
47
+ parseArrayBuffer(options?: {
48
+ maxSize?: number;
49
+ }): Promise<ArrayBuffer>;
50
+ private assertBodySize;
51
+ private bodyTooLargeError;
52
+ }
53
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/framework/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ import { parseCookies, serializeCookie } from "./cookie";
2
+ import { HttpError } from "./errors";
3
+ import { isRainElement, renderToString } from "./jsx";
4
+ const DEFAULT_MAX_BODY_SIZE = 1_048_576;
5
+ export class Context {
6
+ req;
7
+ params;
8
+ state;
9
+ bindings;
10
+ cachedUrl;
11
+ executionCtx;
12
+ cachedCookies;
13
+ pendingCookies;
14
+ constructor(req, params, env = {}, executionCtx) {
15
+ this.req = req;
16
+ this.params = params;
17
+ this.state = new Map();
18
+ this.bindings = env;
19
+ this.executionCtx = executionCtx;
20
+ this.pendingCookies = [];
21
+ }
22
+ get url() {
23
+ this.cachedUrl ??= new URL(this.req.url);
24
+ return this.cachedUrl;
25
+ }
26
+ get path() {
27
+ return this.url.pathname;
28
+ }
29
+ get method() {
30
+ return this.req.method;
31
+ }
32
+ get query() {
33
+ return this.url.searchParams;
34
+ }
35
+ header(name) {
36
+ return this.req.headers.get(name);
37
+ }
38
+ cookie(name) {
39
+ this.cachedCookies ??= parseCookies(this.req.headers.get("cookie"));
40
+ return this.cachedCookies.get(name);
41
+ }
42
+ setCookie(name, value, options) {
43
+ this.pendingCookies.push(serializeCookie(name, value, options));
44
+ }
45
+ deleteCookie(name, options) {
46
+ this.pendingCookies.push(serializeCookie(name, "", {
47
+ ...options,
48
+ maxAge: 0,
49
+ httpOnly: true,
50
+ secure: true,
51
+ sameSite: "Lax",
52
+ }));
53
+ }
54
+ getPendingCookies() {
55
+ return this.pendingCookies;
56
+ }
57
+ waitUntil(promise) {
58
+ if (!this.executionCtx) {
59
+ throw new Error("[Rain] ctx.waitUntil() called without an ExecutionContext. " +
60
+ "This typically happens in tests. " +
61
+ "Pass an ExecutionContext when creating " +
62
+ "the Context, or mock it in your test setup.");
63
+ }
64
+ this.executionCtx.waitUntil(promise);
65
+ }
66
+ get(key) {
67
+ return this.state.get(key.id);
68
+ }
69
+ set(key, value) {
70
+ this.state.set(key.id, value);
71
+ }
72
+ json(data, status = 200) {
73
+ let body;
74
+ try {
75
+ body = JSON.stringify(data);
76
+ }
77
+ catch (cause) {
78
+ throw new Error("[Rain] ctx.json() failed to serialize data. " +
79
+ "Ensure the data is JSON-serializable " +
80
+ "(no circular references, BigInt, or functions).", { cause });
81
+ }
82
+ return new Response(body, {
83
+ status,
84
+ headers: { "content-type": "application/json; charset=UTF-8" },
85
+ });
86
+ }
87
+ html(body, status = 200) {
88
+ const htmlString = isRainElement(body)
89
+ ? renderToString(body)
90
+ : String(body);
91
+ return new Response(htmlString, {
92
+ status,
93
+ headers: { "content-type": "text/html; charset=UTF-8" },
94
+ });
95
+ }
96
+ text(body, status = 200) {
97
+ return new Response(body, {
98
+ status,
99
+ headers: { "content-type": "text/plain; charset=UTF-8" },
100
+ });
101
+ }
102
+ redirect(location, status = 302, options) {
103
+ const allowExternal = options?.allowExternal ?? false;
104
+ try {
105
+ const targetUrl = new URL(location, this.req.url);
106
+ const currentOrigin = new URL(this.req.url).origin;
107
+ if (targetUrl.origin !== currentOrigin && !allowExternal) {
108
+ throw new Error(`[Rain] ctx.redirect() attempted to redirect to external URL "${location}". ` +
109
+ `External redirects may be vulnerable to open redirect attacks. ` +
110
+ `If this is intentional, use: ctx.redirect("${location}", ${status}, { allowExternal: true })`);
111
+ }
112
+ }
113
+ catch (cause) {
114
+ if (cause instanceof Error && cause.message.startsWith("[Rain]")) {
115
+ throw cause;
116
+ }
117
+ }
118
+ return new Response(null, {
119
+ status,
120
+ headers: { location },
121
+ });
122
+ }
123
+ async parseJson(options) {
124
+ const ct = this.header("content-type");
125
+ if (!ct?.includes("application/json")) {
126
+ throw new HttpError(415, "[Rain] ctx.parseJson() expected " +
127
+ "Content-Type 'application/json' " +
128
+ `but received '${ct ?? "(none)"}'.` +
129
+ " Ensure the client sends the " +
130
+ "correct Content-Type header.");
131
+ }
132
+ const maxSize = options?.maxSize ?? DEFAULT_MAX_BODY_SIZE;
133
+ this.assertBodySize(maxSize, "parseJson");
134
+ const raw = await this.req.text();
135
+ if (raw.length > maxSize) {
136
+ throw this.bodyTooLargeError(maxSize, "parseJson");
137
+ }
138
+ try {
139
+ return JSON.parse(raw);
140
+ }
141
+ catch (cause) {
142
+ throw new HttpError(400, "[Rain] ctx.parseJson() failed to " +
143
+ "parse request body as JSON. " +
144
+ "Ensure the request body is " +
145
+ "valid JSON.", { cause });
146
+ }
147
+ }
148
+ async parseJsonWith(schema, options) {
149
+ const raw = await this.parseJson(options);
150
+ try {
151
+ return schema.parse(raw);
152
+ }
153
+ catch (cause) {
154
+ throw new HttpError(422, "[Rain] ctx.parseJsonWith() validation failed. " +
155
+ "The request body did not match the expected " +
156
+ "schema. Check the request payload against " +
157
+ "the schema definition.", { cause });
158
+ }
159
+ }
160
+ async parseFormDataWith(schema, options) {
161
+ const formData = await this.parseFormData(options);
162
+ const data = {};
163
+ for (const [key, value] of formData.entries()) {
164
+ if (typeof value === "string") {
165
+ data[key] = value;
166
+ }
167
+ else {
168
+ throw new HttpError(422, `[Rain] ctx.parseFormDataWith() received a ` +
169
+ `File for field "${key}". ` +
170
+ "parseFormDataWith() only supports string " +
171
+ "fields. Use ctx.parseFormData() directly " +
172
+ "to handle file uploads.");
173
+ }
174
+ }
175
+ try {
176
+ return schema.parse(data);
177
+ }
178
+ catch (cause) {
179
+ throw new HttpError(422, "[Rain] ctx.parseFormDataWith() validation " +
180
+ "failed. The form data did not match the " +
181
+ "expected schema. Check submitted form " +
182
+ "fields against the schema definition.", { cause });
183
+ }
184
+ }
185
+ async parseFormData(options) {
186
+ const ct = this.header("content-type");
187
+ const isUrlEncoded = ct?.includes("application/x-www-form-urlencoded") ?? false;
188
+ const isMultipart = ct?.includes("multipart/form-data") ?? false;
189
+ if (!(isUrlEncoded || isMultipart)) {
190
+ throw new HttpError(415, "[Rain] ctx.parseFormData() expected " +
191
+ "Content-Type " +
192
+ "'multipart/form-data' or " +
193
+ "'application/" +
194
+ "x-www-form-urlencoded' but " +
195
+ `received '${ct ?? "(none)"}'.` +
196
+ " Ensure the client sends the " +
197
+ "correct Content-Type header.");
198
+ }
199
+ const maxSize = options?.maxSize ?? DEFAULT_MAX_BODY_SIZE;
200
+ this.assertBodySize(maxSize, "parseFormData");
201
+ try {
202
+ return await this.req.formData();
203
+ }
204
+ catch (cause) {
205
+ throw new HttpError(400, "[Rain] ctx.parseFormData() failed " +
206
+ "to parse request body. Ensure " +
207
+ "the body matches the " +
208
+ "Content-Type header.", { cause });
209
+ }
210
+ }
211
+ async parseText(options) {
212
+ const maxSize = options?.maxSize ?? DEFAULT_MAX_BODY_SIZE;
213
+ this.assertBodySize(maxSize, "parseText");
214
+ const raw = await this.req.text();
215
+ if (raw.length > maxSize) {
216
+ throw this.bodyTooLargeError(maxSize, "parseText");
217
+ }
218
+ return raw;
219
+ }
220
+ async parseArrayBuffer(options) {
221
+ const maxSize = options?.maxSize ?? DEFAULT_MAX_BODY_SIZE;
222
+ this.assertBodySize(maxSize, "parseArrayBuffer");
223
+ const buf = await this.req.arrayBuffer();
224
+ if (buf.byteLength > maxSize) {
225
+ throw this.bodyTooLargeError(maxSize, "parseArrayBuffer");
226
+ }
227
+ return buf;
228
+ }
229
+ assertBodySize(maxSize, method) {
230
+ const cl = this.header("content-length");
231
+ if (cl === null)
232
+ return;
233
+ const size = Number.parseInt(cl, 10);
234
+ if (!Number.isNaN(size) && size > maxSize) {
235
+ throw this.bodyTooLargeError(maxSize, method);
236
+ }
237
+ }
238
+ bodyTooLargeError(maxSize, method) {
239
+ return new HttpError(413, `[Rain] ctx.${method}() request body ` +
240
+ "exceeds the maximum size of " +
241
+ `${maxSize} bytes. Increase the ` +
242
+ `limit: ctx.${method}` +
243
+ `({ maxSize: ${maxSize * 2} })`);
244
+ }
245
+ }
246
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/framework/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface CookieOptions {
2
+ maxAge?: number;
3
+ expires?: Date;
4
+ path?: string;
5
+ domain?: string;
6
+ secure?: boolean;
7
+ httpOnly?: boolean;
8
+ sameSite?: "Strict" | "Lax" | "None";
9
+ }
10
+ export declare function parseCookies(header: string | null): Map<string, string>;
11
+ export declare function serializeCookie(name: string, value: string, options?: CookieOptions): string;
12
+ //# sourceMappingURL=cookie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../src/framework/cookie.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACtC;AAWD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBvE;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,MAAM,CA0CR"}
package/dist/cookie.js ADDED
@@ -0,0 +1,68 @@
1
+ const SECURE_DEFAULTS = {
2
+ httpOnly: true,
3
+ secure: true,
4
+ sameSite: "Lax",
5
+ path: "/",
6
+ };
7
+ export function parseCookies(header) {
8
+ const cookies = new Map();
9
+ if (!header)
10
+ return cookies;
11
+ const pairs = header.split(";");
12
+ for (const pair of pairs) {
13
+ const eqIndex = pair.indexOf("=");
14
+ if (eqIndex === -1)
15
+ continue;
16
+ const name = pair.slice(0, eqIndex).trim();
17
+ const value = pair.slice(eqIndex + 1).trim();
18
+ if (name.length > 0) {
19
+ cookies.set(name, decodeURIComponent(value));
20
+ }
21
+ }
22
+ return cookies;
23
+ }
24
+ export function serializeCookie(name, value, options = {}) {
25
+ validateCookieName(name);
26
+ const merged = { ...SECURE_DEFAULTS, ...options };
27
+ const parts = [`${name}=${encodeURIComponent(value)}`];
28
+ if (merged.maxAge !== undefined) {
29
+ parts.push(`Max-Age=${merged.maxAge}`);
30
+ }
31
+ if (merged.expires) {
32
+ parts.push(`Expires=${merged.expires.toUTCString()}`);
33
+ }
34
+ if (merged.path) {
35
+ parts.push(`Path=${merged.path}`);
36
+ }
37
+ if (merged.domain) {
38
+ parts.push(`Domain=${merged.domain}`);
39
+ }
40
+ if (merged.secure) {
41
+ parts.push("Secure");
42
+ }
43
+ if (merged.httpOnly) {
44
+ parts.push("HttpOnly");
45
+ }
46
+ if (merged.sameSite) {
47
+ if (merged.sameSite === "None" && !merged.secure) {
48
+ throw new Error("[Rain] Cookie with SameSite=None must also set " +
49
+ "Secure=true. Browsers will reject cookies with " +
50
+ "SameSite=None that are not Secure.");
51
+ }
52
+ parts.push(`SameSite=${merged.sameSite}`);
53
+ }
54
+ return parts.join("; ");
55
+ }
56
+ const INVALID_NAME_CHARS = /[\s"(),/:;<=>?@[\\\]{}]/;
57
+ function validateCookieName(name) {
58
+ if (name.length === 0) {
59
+ throw new Error("[Rain] Cookie name must not be empty.");
60
+ }
61
+ if (INVALID_NAME_CHARS.test(name)) {
62
+ throw new Error(`[Rain] Cookie name "${name}" contains invalid ` +
63
+ "characters. Cookie names must not contain " +
64
+ "whitespace or special characters: " +
65
+ '"(),/:;<=>?@[\\]{}');
66
+ }
67
+ }
68
+ //# sourceMappingURL=cookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie.js","sourceRoot":"","sources":["../src/framework/cookie.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare class HttpError extends Error {
2
+ readonly status: number;
3
+ constructor(status: number, message: string, options?: ErrorOptions);
4
+ }
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/framework/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpE"}
package/dist/errors.js ADDED
@@ -0,0 +1,8 @@
1
+ export class HttpError extends Error {
2
+ status;
3
+ constructor(status, message, options) {
4
+ super(message, options);
5
+ this.status = status;
6
+ }
7
+ }
8
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/framework/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAS;IAExB,YAAY,MAAc,EAAE,OAAe,EAAE,OAAsB;QACjE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ export { bindings } from "./bindings";
2
+ export { Context } from "./context";
3
+ export type { CookieOptions } from "./cookie";
4
+ export { HttpError } from "./errors";
5
+ export type { RainChild, RainComponent, RainElement, RainNode, } from "./jsx";
6
+ export { createElement, escapeHtml, Fragment, isRainElement, renderToString, } from "./jsx";
7
+ export type { CorsOptions } from "./middleware/cors";
8
+ export { cors } from "./middleware/cors";
9
+ export type { Session, SessionOptions, } from "./middleware/session";
10
+ export { getSession, session } from "./middleware/session";
11
+ export { Rain } from "./router";
12
+ export type { ErrorHandler, Handler, LayoutHandler, Middleware, PageHandler, RainConfig, RainOptions, Schema, StateKey, } from "./types";
13
+ export { defineKey } from "./types";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/framework/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EACV,SAAS,EACT,aAAa,EACb,WAAW,EACX,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EACL,aAAa,EACb,UAAU,EACV,QAAQ,EACR,aAAa,EACb,cAAc,GACf,MAAM,OAAO,CAAC;AACf,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EACV,OAAO,EACP,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,YAAY,EACV,YAAY,EACZ,OAAO,EACP,aAAa,EACb,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,MAAM,EACN,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { bindings } from "./bindings";
2
+ export { Context } from "./context";
3
+ export { HttpError } from "./errors";
4
+ export { createElement, escapeHtml, Fragment, isRainElement, renderToString, } from "./jsx";
5
+ export { cors } from "./middleware/cors";
6
+ export { getSession, session } from "./middleware/session";
7
+ export { Rain } from "./router";
8
+ export { defineKey } from "./types";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/framework/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAOrC,OAAO,EACL,aAAa,EACb,UAAU,EACV,QAAQ,EACR,aAAa,EACb,cAAc,GACf,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAKzC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAYhC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type RainChild, type RainComponent, type RainElement } from "./types";
2
+ export declare function Fragment(props: Record<string, unknown>): RainElement;
3
+ export declare function createElement(tag: string | RainComponent, props: Record<string, unknown> | null, ...children: RainChild[]): RainElement;
4
+ //# sourceMappingURL=createElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createElement.d.ts","sourceRoot":"","sources":["../../src/framework/jsx/createElement.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,WAAW,EAEjB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAOpE;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,GAAG,aAAa,EAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACrC,GAAG,QAAQ,EAAE,SAAS,EAAE,GACvB,WAAW,CAQb"}
@@ -0,0 +1,19 @@
1
+ import { RAIN_ELEMENT, } from "./types";
2
+ export function Fragment(props) {
3
+ return {
4
+ $$typeof: RAIN_ELEMENT,
5
+ tag: Fragment,
6
+ props: {},
7
+ children: (props["children"] ?? []),
8
+ };
9
+ }
10
+ export function createElement(tag, props, ...children) {
11
+ const resolvedProps = props ?? {};
12
+ return {
13
+ $$typeof: RAIN_ELEMENT,
14
+ tag,
15
+ props: resolvedProps,
16
+ children,
17
+ };
18
+ }
19
+ //# sourceMappingURL=createElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createElement.js","sourceRoot":"","sources":["../../src/framework/jsx/createElement.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAKb,MAAM,SAAS,CAAC;AAEjB,MAAM,UAAU,QAAQ,CAAC,KAA8B;IACrD,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAe;KAClD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,GAA2B,EAC3B,KAAqC,EACrC,GAAG,QAAqB;IAExB,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE,CAAC;IAClC,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,GAAG;QACH,KAAK,EAAE,aAAa;QACpB,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function escapeHtml(value: string): string;
2
+ //# sourceMappingURL=escape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/framework/jsx/escape.ts"],"names":[],"mappings":"AAUA,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD"}
@@ -0,0 +1,12 @@
1
+ const ESCAPE_MAP = {
2
+ "&": "&amp;",
3
+ "<": "&lt;",
4
+ ">": "&gt;",
5
+ '"': "&quot;",
6
+ "'": "&#39;",
7
+ };
8
+ const ESCAPE_RE = /[&<>"']/g;
9
+ export function escapeHtml(value) {
10
+ return value.replace(ESCAPE_RE, (ch) => ESCAPE_MAP[ch]);
11
+ }
12
+ //# sourceMappingURL=escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/framework/jsx/escape.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAA2B;IACzC,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,OAAO;CACb,CAAC;AAEF,MAAM,SAAS,GAAG,UAAU,CAAC;AAE7B,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAW,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { createElement, Fragment } from "./createElement";
2
+ export { escapeHtml } from "./escape";
3
+ export { isRainElement, renderToString } from "./render";
4
+ export type { RainChild, RainComponent, RainElement, RainNode, } from "./types";
5
+ export { RAIN_ELEMENT } from "./types";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/framework/jsx/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACzD,YAAY,EACV,SAAS,EACT,aAAa,EACb,WAAW,EACX,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}