princejs 1.6.6 → 1.7.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.
- package/dist/helpers.d.ts +12 -3
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +25 -4
- package/dist/middleware.d.ts +2 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +1393 -10
- package/dist/prince.d.ts +2 -0
- package/dist/prince.d.ts.map +1 -1
- package/dist/prince.js +78 -8
- package/package.json +9 -2
package/dist/prince.d.ts
CHANGED
|
@@ -53,11 +53,13 @@ export declare class Prince {
|
|
|
53
53
|
delete(path: string, handler: RouteHandler): this;
|
|
54
54
|
patch(path: string, handler: RouteHandler): this;
|
|
55
55
|
private add;
|
|
56
|
+
private isWildcard;
|
|
56
57
|
private parseUrl;
|
|
57
58
|
private parseBody;
|
|
58
59
|
private buildRouter;
|
|
59
60
|
private compilePipeline;
|
|
60
61
|
handleFetch(req: Request): Promise<Response>;
|
|
62
|
+
fetch(req: Request): Promise<Response>;
|
|
61
63
|
listen(port?: number): void;
|
|
62
64
|
}
|
|
63
65
|
export declare const prince: (dev?: boolean) => Prince;
|
package/dist/prince.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prince.d.ts","sourceRoot":"","sources":["../src/prince.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"prince.d.ts","sourceRoot":"","sources":["../src/prince.ts"],"names":[],"mappings":"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"}
|
package/dist/prince.js
CHANGED
|
@@ -125,9 +125,20 @@ class Prince {
|
|
|
125
125
|
path = path.slice(0, -1);
|
|
126
126
|
const parts = path === "/" ? [""] : path.split("/").slice(1);
|
|
127
127
|
this.rawRoutes.push({ method, path, parts, handler });
|
|
128
|
+
if (method !== "OPTIONS" && !this.rawRoutes.some((r) => r.path === path && r.method === "OPTIONS")) {
|
|
129
|
+
this.rawRoutes.push({
|
|
130
|
+
method: "OPTIONS",
|
|
131
|
+
path,
|
|
132
|
+
parts,
|
|
133
|
+
handler: () => new Response(null, { status: 204 })
|
|
134
|
+
});
|
|
135
|
+
}
|
|
128
136
|
this.router = null;
|
|
129
137
|
return this;
|
|
130
138
|
}
|
|
139
|
+
isWildcard(part) {
|
|
140
|
+
return part === "*" || part === "**";
|
|
141
|
+
}
|
|
131
142
|
parseUrl(req) {
|
|
132
143
|
const url = new URL(req.url);
|
|
133
144
|
const query = {};
|
|
@@ -161,15 +172,37 @@ class Prince {
|
|
|
161
172
|
if (this.router)
|
|
162
173
|
return this.router;
|
|
163
174
|
const root = new TrieNode;
|
|
164
|
-
|
|
175
|
+
const sortedRoutes = [...this.rawRoutes].sort((a, b) => {
|
|
176
|
+
const aHasWildcard = a.parts.some((p) => this.isWildcard(p));
|
|
177
|
+
const bHasWildcard = b.parts.some((p) => this.isWildcard(p));
|
|
178
|
+
const aHasParam = a.parts.some((p) => p.startsWith(":"));
|
|
179
|
+
const bHasParam = b.parts.some((p) => p.startsWith(":"));
|
|
180
|
+
if (aHasWildcard && !bHasWildcard)
|
|
181
|
+
return 1;
|
|
182
|
+
if (!aHasWildcard && bHasWildcard)
|
|
183
|
+
return -1;
|
|
184
|
+
if (aHasParam && !bHasParam)
|
|
185
|
+
return 1;
|
|
186
|
+
if (!aHasParam && bHasParam)
|
|
187
|
+
return -1;
|
|
188
|
+
return 0;
|
|
189
|
+
});
|
|
190
|
+
for (const r of sortedRoutes) {
|
|
165
191
|
let node = root;
|
|
166
192
|
if (r.parts.length === 1 && r.parts[0] === "") {
|
|
167
193
|
node.handlers ??= {};
|
|
168
194
|
node.handlers[r.method] = r.handler;
|
|
169
195
|
continue;
|
|
170
196
|
}
|
|
171
|
-
for (
|
|
172
|
-
|
|
197
|
+
for (let i = 0;i < r.parts.length; i++) {
|
|
198
|
+
const part = r.parts[i];
|
|
199
|
+
if (part === "*") {
|
|
200
|
+
node.wildcardChild ??= new TrieNode;
|
|
201
|
+
node = node.wildcardChild;
|
|
202
|
+
} else if (part === "**") {
|
|
203
|
+
node.catchAllChild ??= { node: new TrieNode };
|
|
204
|
+
node = node.catchAllChild.node;
|
|
205
|
+
} else if (part.startsWith(":")) {
|
|
173
206
|
const name = part.slice(1);
|
|
174
207
|
node.paramChild ??= { name, node: new TrieNode };
|
|
175
208
|
node = node.paramChild.node;
|
|
@@ -199,9 +232,10 @@ class Prince {
|
|
|
199
232
|
}
|
|
200
233
|
let i = 0;
|
|
201
234
|
const next = async () => {
|
|
202
|
-
|
|
235
|
+
while (i < this.middlewares.length) {
|
|
203
236
|
const result = await this.middlewares[i++](req, next);
|
|
204
|
-
|
|
237
|
+
if (result instanceof Response)
|
|
238
|
+
return result;
|
|
205
239
|
}
|
|
206
240
|
const res = await handler(req);
|
|
207
241
|
if (res instanceof Response)
|
|
@@ -216,18 +250,41 @@ class Prince {
|
|
|
216
250
|
};
|
|
217
251
|
}
|
|
218
252
|
async handleFetch(req) {
|
|
219
|
-
const
|
|
253
|
+
const url = new URL(req.url);
|
|
220
254
|
const r = req;
|
|
255
|
+
if (req.method === "OPTIONS") {
|
|
256
|
+
return new Response(null, {
|
|
257
|
+
status: 204,
|
|
258
|
+
headers: {
|
|
259
|
+
"Access-Control-Allow-Origin": "*",
|
|
260
|
+
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
|
|
261
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization",
|
|
262
|
+
"Access-Control-Max-Age": "86400"
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
Object.defineProperty(r, "query", {
|
|
267
|
+
value: url.searchParams,
|
|
268
|
+
writable: true,
|
|
269
|
+
configurable: true
|
|
270
|
+
});
|
|
271
|
+
const pathname = url.pathname;
|
|
221
272
|
const segments = pathname === "/" ? [] : pathname.slice(1).split("/");
|
|
222
273
|
const router = this.buildRouter();
|
|
223
274
|
let node = router;
|
|
224
275
|
let params = {};
|
|
225
|
-
for (
|
|
276
|
+
for (let i = 0;i < segments.length; i++) {
|
|
277
|
+
const seg = segments[i];
|
|
226
278
|
if (node.children[seg]) {
|
|
227
279
|
node = node.children[seg];
|
|
228
280
|
} else if (node.paramChild) {
|
|
229
281
|
params[node.paramChild.name] = seg;
|
|
230
282
|
node = node.paramChild.node;
|
|
283
|
+
} else if (node.wildcardChild) {
|
|
284
|
+
node = node.wildcardChild;
|
|
285
|
+
} else if (node.catchAllChild) {
|
|
286
|
+
node = node.catchAllChild.node;
|
|
287
|
+
break;
|
|
231
288
|
} else {
|
|
232
289
|
return this.json({ error: "Not Found" }, 404);
|
|
233
290
|
}
|
|
@@ -236,7 +293,20 @@ class Prince {
|
|
|
236
293
|
if (!handler)
|
|
237
294
|
return this.json({ error: "Method Not Allowed" }, 405);
|
|
238
295
|
const pipeline = this.compilePipeline(handler);
|
|
239
|
-
return pipeline(r, params,
|
|
296
|
+
return pipeline(r, params, new URLSearchParams(url.search));
|
|
297
|
+
}
|
|
298
|
+
async fetch(req) {
|
|
299
|
+
try {
|
|
300
|
+
return await this.handleFetch(req);
|
|
301
|
+
} catch (err) {
|
|
302
|
+
if (this.errorHandler)
|
|
303
|
+
return this.errorHandler(err, req);
|
|
304
|
+
if (this.devMode) {
|
|
305
|
+
console.error("Error:", err);
|
|
306
|
+
return this.json({ error: String(err), stack: err.stack }, 500);
|
|
307
|
+
}
|
|
308
|
+
return this.json({ error: "Internal Server Error" }, 500);
|
|
309
|
+
}
|
|
240
310
|
}
|
|
241
311
|
listen(port = 3000) {
|
|
242
312
|
const self = this;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "princejs",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "An easy and fast backend framework — by a 13yo developer, for developers.",
|
|
5
5
|
"main": "dist/prince.js",
|
|
6
6
|
"types": "dist/prince.d.ts",
|
|
@@ -61,8 +61,10 @@
|
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@types/bun": "^1.3.2",
|
|
64
|
+
"@types/jsonwebtoken": "^9.0.10",
|
|
64
65
|
"bun-types": "latest",
|
|
65
66
|
"fast-jwt": "^5.0.0",
|
|
67
|
+
"jsonwebtoken": "^9.0.2",
|
|
66
68
|
"typescript": "^5.9.3",
|
|
67
69
|
"zod": "^4.1.12"
|
|
68
70
|
},
|
|
@@ -74,9 +76,14 @@
|
|
|
74
76
|
"optional": true
|
|
75
77
|
}
|
|
76
78
|
},
|
|
79
|
+
"dependencies": {
|
|
80
|
+
"jose": "^6.1.2"
|
|
81
|
+
},
|
|
77
82
|
"scripts": {
|
|
78
83
|
"build:js": "bun build src/prince.ts --outdir dist --target bun && bun build src/middleware.ts --outdir dist --target bun && bun build src/helpers.ts --outdir dist --target bun && bun build src/scheduler.ts --outdir dist --target bun && bun build bin/create.ts --outdir dist --target bun --format esm",
|
|
79
84
|
"build:types": "tsc --emitDeclarationOnly --skipLibCheck",
|
|
80
|
-
"build": "bun run build:js && bun run build:types"
|
|
85
|
+
"build": "bun run build:js && bun run build:types",
|
|
86
|
+
"test": "bun test",
|
|
87
|
+
"test:watch": "bun test --watch"
|
|
81
88
|
}
|
|
82
89
|
}
|