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/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;
@@ -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
- for (const r of this.rawRoutes) {
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 (const part of r.parts) {
172
- if (part.startsWith(":")) {
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
- if (i < this.middlewares.length) {
235
+ while (i < this.middlewares.length) {
203
236
  const result = await this.middlewares[i++](req, next);
204
- return result ?? new Response("");
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 { pathname, query } = this.parseUrl(req);
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 (const seg of segments) {
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, query);
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.6.6",
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
  }