princejs 2.2.3 → 2.2.4
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/LICENSE +20 -20
- package/{Readme.md → README.md} +893 -786
- package/dist/db.d.ts +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +10 -4
- package/dist/helpers.d.ts +9 -2
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +94 -7
- package/dist/middleware.d.ts +9 -2
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +107 -84
- package/package.json +10 -11
package/dist/db.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare const db: {
|
|
|
4
4
|
get: (sql: string, params?: any[]) => unknown;
|
|
5
5
|
run: (sql: string, params?: any[]) => import("bun:sqlite").Changes;
|
|
6
6
|
prepare: (sql: string) => import("bun:sqlite").Statement<unknown, import("bun:sqlite").SQLQueryBindings[] | [null] | [string] | [number] | [bigint] | [false] | [true] | [Uint8Array<ArrayBufferLike>] | [Uint8ClampedArray<ArrayBufferLike>] | [Uint16Array<ArrayBufferLike>] | [Uint32Array<ArrayBufferLike>] | [Int8Array<ArrayBufferLike>] | [Int16Array<ArrayBufferLike>] | [Int32Array<ArrayBufferLike>] | [BigUint64Array<ArrayBufferLike>] | [BigInt64Array<ArrayBufferLike>] | [Float16Array<ArrayBufferLike>] | [Float32Array<ArrayBufferLike>] | [Float64Array<ArrayBufferLike>] | [Record<string, string | number | bigint | boolean | NodeJS.TypedArray<ArrayBufferLike> | null>]>;
|
|
7
|
+
transaction: <T>(fn: () => T) => T;
|
|
7
8
|
close: () => void;
|
|
8
9
|
};
|
|
9
10
|
};
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,EAAE;mBACE,MAAM,SAAS,MAAM;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,EAAE;mBACE,MAAM,SAAS,MAAM;qBAMnB,MAAM,WAAW,GAAG,EAAE;mBAKxB,MAAM,WAAW,GAAG,EAAE;mBAKtB,MAAM,WAAW,GAAG,EAAE;uBAKlB,MAAM;sBAIP,CAAC,MAAO,MAAM,CAAC,KAAG,CAAC;;;CAOtC,CAAC"}
|
package/dist/db.js
CHANGED
|
@@ -8,16 +8,22 @@ var db = {
|
|
|
8
8
|
db2.run(init);
|
|
9
9
|
return {
|
|
10
10
|
query: (sql, params) => {
|
|
11
|
-
|
|
11
|
+
const stmt = db2.prepare(sql);
|
|
12
|
+
return params ? stmt.all(...Array.isArray(params[0]) ? params[0] : params) : stmt.all();
|
|
12
13
|
},
|
|
13
14
|
get: (sql, params) => {
|
|
14
|
-
|
|
15
|
+
const stmt = db2.prepare(sql);
|
|
16
|
+
return params ? stmt.get(...Array.isArray(params[0]) ? params[0] : params) : stmt.get();
|
|
15
17
|
},
|
|
16
18
|
run: (sql, params) => {
|
|
17
|
-
|
|
19
|
+
const stmt = db2.prepare(sql);
|
|
20
|
+
return params ? stmt.run(...Array.isArray(params[0]) ? params[0] : params) : stmt.run();
|
|
18
21
|
},
|
|
19
22
|
prepare: (sql) => {
|
|
20
|
-
return db2.
|
|
23
|
+
return db2.prepare(sql);
|
|
24
|
+
},
|
|
25
|
+
transaction: (fn) => {
|
|
26
|
+
return db2.transaction(fn)();
|
|
21
27
|
},
|
|
22
28
|
close: () => db2.close()
|
|
23
29
|
};
|
package/dist/helpers.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import type { PrinceRequest } from "./prince";
|
|
2
2
|
export declare const cache: (ttl: number) => (handler: any) => (req: PrinceRequest) => Promise<any>;
|
|
3
|
-
export declare const email: (to: string, subject: string, html: string) => Promise<
|
|
4
|
-
export declare const upload: (
|
|
3
|
+
export declare const email: (to: string, subject: string, html: string) => Promise<unknown>;
|
|
4
|
+
export declare const upload: (options?: {
|
|
5
|
+
maxSize?: number;
|
|
6
|
+
allowedTypes?: string[];
|
|
7
|
+
}) => (req: PrinceRequest) => Promise<Response>;
|
|
5
8
|
export declare const sse: () => (req: PrinceRequest) => Response;
|
|
6
9
|
export declare const stream: (handler: (req: PrinceRequest) => AsyncGenerator<string | Uint8Array, void, unknown> | void | Promise<void>, options?: {
|
|
7
10
|
contentType?: string;
|
|
8
11
|
}) => (req: PrinceRequest) => Response;
|
|
12
|
+
export declare const sanitize: (input: string, type?: "text" | "html" | "url") => string;
|
|
13
|
+
export declare const validateEnv: (requiredVars: string[]) => Record<string, string>;
|
|
14
|
+
export declare const errorResponse: (message: string, statusCode?: number, details?: any) => Response;
|
|
15
|
+
export declare const successResponse: (data: any, statusCode?: number) => Response;
|
|
9
16
|
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAI9C,eAAO,MAAM,KAAK,GAAI,KAAK,MAAM,MAEvB,SAAS,GAAG,MAAY,KAAK,aAAa,iBAWnD,CAAC;AAIF,eAAO,MAAM,KAAK,GAAU,IAAI,MAAM,EAAE,SAAS,MAAM,EAAE,MAAM,MAAM,qBA0BpE,CAAC;AAIF,eAAO,MAAM,MAAM,GAAI,UAAU;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,MAI9D,KAAK,aAAa,sBA4DjC,CAAC;AAGF,eAAO,MAAM,GAAG,SACN,KAAK,aAAa,aA0B3B,CAAC;AAgBF,eAAO,MAAM,MAAM,GACjB,SAAS,CAAC,GAAG,EAAE,aAAa,KAAK,cAAc,CAAC,MAAM,GAAG,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC1G,UAAU;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,MAK1B,KAAK,aAAa,aAmD3B,CAAC;AAIF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,OAAM,MAAM,GAAG,MAAM,GAAG,KAAc,KAAG,MAsBhF,CAAC;AAIF,eAAO,MAAM,WAAW,GAAI,cAAc,MAAM,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBzE,CAAC;AAIF,eAAO,MAAM,aAAa,GACxB,SAAS,MAAM,EACf,aAAY,MAAY,EACxB,UAAU,GAAG,KACZ,QAYF,CAAC;AAIF,eAAO,MAAM,eAAe,GAAI,MAAM,GAAG,EAAE,aAAY,MAAY,KAAG,QAYrE,CAAC"}
|
package/dist/helpers.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
var cache = (ttl) => {
|
|
4
4
|
const store = {};
|
|
5
5
|
return (handler) => async (req) => {
|
|
6
|
-
const
|
|
6
|
+
const url = new URL(req.url);
|
|
7
|
+
const key = url.pathname;
|
|
7
8
|
const now = Date.now();
|
|
8
9
|
if (store[key]?.exp > now)
|
|
9
10
|
return store[key].data;
|
|
@@ -14,13 +15,32 @@ var cache = (ttl) => {
|
|
|
14
15
|
};
|
|
15
16
|
};
|
|
16
17
|
var email = async (to, subject, html) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
const apiKey = process.env.RESEND_KEY;
|
|
19
|
+
if (!apiKey) {
|
|
20
|
+
throw new Error("RESEND_KEY environment variable not configured");
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetch("https://api.resend.com/emails", {
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers: {
|
|
26
|
+
Authorization: `Bearer ${apiKey}`,
|
|
27
|
+
"Content-Type": "application/json"
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({ from: "no-reply@princejs.dev", to, subject, html })
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const error = await response.json();
|
|
33
|
+
throw new Error(`Email send failed: ${error.message || response.statusText}`);
|
|
34
|
+
}
|
|
35
|
+
return await response.json();
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error("Email service error:", error);
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
22
40
|
};
|
|
23
|
-
var upload = () => {
|
|
41
|
+
var upload = (options) => {
|
|
42
|
+
const maxSize = options?.maxSize ?? 5242880;
|
|
43
|
+
const allowedTypes = options?.allowedTypes ?? ["image/jpeg", "image/png", "application/pdf"];
|
|
24
44
|
return async (req) => {
|
|
25
45
|
try {
|
|
26
46
|
const contentType = req.headers.get("content-type") || "";
|
|
@@ -32,6 +52,12 @@ var upload = () => {
|
|
|
32
52
|
if (!file || !(file instanceof File)) {
|
|
33
53
|
return new Response(JSON.stringify({ error: "No file provided or invalid file" }), { status: 400, headers: { "Content-Type": "application/json" } });
|
|
34
54
|
}
|
|
55
|
+
if (file.size > maxSize) {
|
|
56
|
+
return new Response(JSON.stringify({ error: `File too large. Max size: ${maxSize / 1024 / 1024}MB` }), { status: 413, headers: { "Content-Type": "application/json" } });
|
|
57
|
+
}
|
|
58
|
+
if (!allowedTypes.includes(file.type)) {
|
|
59
|
+
return new Response(JSON.stringify({ error: `File type not allowed. Allowed types: ${allowedTypes.join(", ")}` }), { status: 415, headers: { "Content-Type": "application/json" } });
|
|
60
|
+
}
|
|
35
61
|
const fileInfo = {
|
|
36
62
|
name: file.name,
|
|
37
63
|
size: file.size,
|
|
@@ -136,10 +162,71 @@ var stream = (handler, options) => {
|
|
|
136
162
|
});
|
|
137
163
|
};
|
|
138
164
|
};
|
|
165
|
+
var sanitize = (input, type = "text") => {
|
|
166
|
+
if (type === "text") {
|
|
167
|
+
return input.replace(/[<>\"']/g, (char) => ({
|
|
168
|
+
"<": "<",
|
|
169
|
+
">": ">",
|
|
170
|
+
'"': """,
|
|
171
|
+
"'": "'"
|
|
172
|
+
})[char] || char);
|
|
173
|
+
}
|
|
174
|
+
if (type === "url") {
|
|
175
|
+
try {
|
|
176
|
+
const url = new URL(input);
|
|
177
|
+
if (!["http:", "https:"].includes(url.protocol))
|
|
178
|
+
throw new Error("Invalid protocol");
|
|
179
|
+
return url.toString();
|
|
180
|
+
} catch {
|
|
181
|
+
throw new Error("Invalid URL");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return input;
|
|
185
|
+
};
|
|
186
|
+
var validateEnv = (requiredVars) => {
|
|
187
|
+
const env = {};
|
|
188
|
+
const missing = [];
|
|
189
|
+
for (const key of requiredVars) {
|
|
190
|
+
const value = process.env[key];
|
|
191
|
+
if (!value) {
|
|
192
|
+
missing.push(key);
|
|
193
|
+
} else {
|
|
194
|
+
env[key] = value;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (missing.length > 0) {
|
|
198
|
+
throw new Error(`Missing environment variables: ${missing.join(", ")}`);
|
|
199
|
+
}
|
|
200
|
+
return env;
|
|
201
|
+
};
|
|
202
|
+
var errorResponse = (message, statusCode = 500, details) => {
|
|
203
|
+
return new Response(JSON.stringify({
|
|
204
|
+
error: message,
|
|
205
|
+
...details && { details },
|
|
206
|
+
timestamp: new Date().toISOString()
|
|
207
|
+
}), {
|
|
208
|
+
status: statusCode,
|
|
209
|
+
headers: { "Content-Type": "application/json" }
|
|
210
|
+
});
|
|
211
|
+
};
|
|
212
|
+
var successResponse = (data, statusCode = 200) => {
|
|
213
|
+
return new Response(JSON.stringify({
|
|
214
|
+
success: true,
|
|
215
|
+
data,
|
|
216
|
+
timestamp: new Date().toISOString()
|
|
217
|
+
}), {
|
|
218
|
+
status: statusCode,
|
|
219
|
+
headers: { "Content-Type": "application/json" }
|
|
220
|
+
});
|
|
221
|
+
};
|
|
139
222
|
export {
|
|
223
|
+
validateEnv,
|
|
140
224
|
upload,
|
|
225
|
+
successResponse,
|
|
141
226
|
stream,
|
|
142
227
|
sse,
|
|
228
|
+
sanitize,
|
|
229
|
+
errorResponse,
|
|
143
230
|
email,
|
|
144
231
|
cache
|
|
145
232
|
};
|
package/dist/middleware.d.ts
CHANGED
|
@@ -15,8 +15,10 @@ export interface LoggerOptions {
|
|
|
15
15
|
}
|
|
16
16
|
export declare const logger: (options?: LoggerOptions) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
|
17
17
|
export declare const cors: (origin?: string) => (req: any, next: Function) => Promise<any>;
|
|
18
|
-
export declare const signJWT: (payload: any, secret: Uint8Array, expiresIn: string) => Promise<string>;
|
|
19
|
-
export declare const jwt: (key: Uint8Array
|
|
18
|
+
export declare const signJWT: (payload: any, secret: Uint8Array, expiresIn: string, alg?: string) => Promise<string>;
|
|
19
|
+
export declare const jwt: (key: Uint8Array, options?: {
|
|
20
|
+
algorithms?: string[];
|
|
21
|
+
}) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
|
20
22
|
export declare const rateLimit: (max: number, window?: number) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
|
21
23
|
export declare const validate: (schema: z.ZodSchema) => (req: any, next: Function) => Promise<any>;
|
|
22
24
|
export declare const auth: (options?: {
|
|
@@ -58,6 +60,11 @@ export declare const jwks: (jwksUrl: string, options?: {
|
|
|
58
60
|
algorithms?: string[];
|
|
59
61
|
}) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
|
60
62
|
export declare const trimTrailingSlash: (statusCode?: 301 | 302) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
|
63
|
+
export declare const csrf: (options?: {
|
|
64
|
+
cookieName?: string;
|
|
65
|
+
headerName?: string;
|
|
66
|
+
keyLength?: number;
|
|
67
|
+
}) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
|
61
68
|
export declare const every: (...middlewares: ((req: PrinceRequest, next: Next) => any)[]) => (req: PrinceRequest, next: Next) => Promise<Response>;
|
|
62
69
|
export declare const some: (...middlewares: ((req: PrinceRequest, next: Next) => any)[]) => (req: PrinceRequest, next: Next) => Promise<any>;
|
|
63
70
|
export declare const except: (paths: string | string[], ...middlewares: ((req: PrinceRequest, next: Next) => any)[]) => (req: PrinceRequest, next: Next) => Promise<Response | undefined>;
|
package/dist/middleware.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,KAAK,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;AAGhD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QACjB,GAAG,EAAE,aAAa,CAAC;QACnB,GAAG,CAAC,EAAE,QAAQ,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,GAAG,CAAC;KACb,KAAK,IAAI,CAAC;CACZ;AAED,eAAO,MAAM,MAAM,GAAI,UAAS,aAAkB,MASlC,KAAK,aAAa,EAAE,MAAM,IAAI,kCAqD7C,CAAC;
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|