@ooneex/routing 0.13.0 → 0.14.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/index.js +49 -1100
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,992 +1,35 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
//
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
// src/RouterException.ts
|
|
6
|
-
import { Exception } from "@ooneex/exception";
|
|
7
|
-
import { HttpStatus } from "@ooneex/http-status";
|
|
8
|
-
|
|
9
|
-
class RouterException extends Exception {
|
|
10
|
-
constructor(message, data = {}) {
|
|
11
|
-
super(message, {
|
|
12
|
-
status: HttpStatus.Code.InternalServerError,
|
|
13
|
-
data
|
|
14
|
-
});
|
|
15
|
-
this.name = "RouterException";
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// src/Router.ts
|
|
20
|
-
class Router {
|
|
21
|
-
routes = new Map;
|
|
22
|
-
addRoute(route) {
|
|
23
|
-
const name = route.name;
|
|
24
|
-
for (const item of this.routes[Symbol.iterator]()) {
|
|
25
|
-
const existingRoute = item[1].find((r) => r.name === name);
|
|
26
|
-
if (existingRoute) {
|
|
27
|
-
throw new RouterException(`Route with name '${name}' already exists`, route);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
const routes = this.routes.get(route.path) ?? [];
|
|
31
|
-
if (route.isSocket && routes.find((r) => r.isSocket)) {
|
|
32
|
-
throw new RouterException(`Socket route with path '${route.path}' already exists`, route);
|
|
33
|
-
}
|
|
34
|
-
if (!route.isSocket && routes.find((r) => !r.isSocket && r.method === route.method)) {
|
|
35
|
-
throw new RouterException(`Route with path '${route.path}' and method '${route.method}' already exists`, route);
|
|
36
|
-
}
|
|
37
|
-
routes.push(route);
|
|
38
|
-
this.routes.set(route.path, routes);
|
|
39
|
-
container.add(route.controller, EContainerScope.Singleton);
|
|
40
|
-
return this;
|
|
41
|
-
}
|
|
42
|
-
findRouteByPath(path) {
|
|
43
|
-
return this.routes.get(path) ?? null;
|
|
44
|
-
}
|
|
45
|
-
findRouteByName(name) {
|
|
46
|
-
for (const item of this.routes[Symbol.iterator]()) {
|
|
47
|
-
const existingRoute = item[1].find((r) => r.name === name);
|
|
48
|
-
if (existingRoute) {
|
|
49
|
-
return existingRoute;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
getRoutes() {
|
|
55
|
-
return this.routes;
|
|
56
|
-
}
|
|
57
|
-
getSocketRoutes() {
|
|
58
|
-
const socketRoutes = new Map;
|
|
59
|
-
for (const [path, routes] of this.routes) {
|
|
60
|
-
const socketRoute = routes.find((route) => route.isSocket);
|
|
61
|
-
if (socketRoute) {
|
|
62
|
-
socketRoutes.set(path, socketRoute);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return socketRoutes;
|
|
66
|
-
}
|
|
67
|
-
getHttpRoutes() {
|
|
68
|
-
const httpRoutes = new Map;
|
|
69
|
-
for (const [path, routes] of this.routes) {
|
|
70
|
-
const filteredRoutes = routes.filter((route) => !route.isSocket);
|
|
71
|
-
if (filteredRoutes.length > 0) {
|
|
72
|
-
httpRoutes.set(path, filteredRoutes);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return httpRoutes;
|
|
76
|
-
}
|
|
77
|
-
generate(name, params) {
|
|
78
|
-
const route = this.findRouteByName(name);
|
|
79
|
-
if (!route) {
|
|
80
|
-
throw new RouterException(`Route with name '${name}' not found`);
|
|
81
|
-
}
|
|
82
|
-
let path = route.path;
|
|
83
|
-
const paramMatches = path.match(/:[a-zA-Z0-9_]+/g) || [];
|
|
84
|
-
if (paramMatches.length > 0) {
|
|
85
|
-
if (!params || typeof params !== "object" || params === null) {
|
|
86
|
-
throw new RouterException(`Route '${name}' requires parameters, but none were provided`);
|
|
87
|
-
}
|
|
88
|
-
for (const match of paramMatches) {
|
|
89
|
-
const paramName = match.substring(1);
|
|
90
|
-
if (!(paramName in params)) {
|
|
91
|
-
throw new RouterException(`Missing required parameter '${paramName}' for route '${name}'`);
|
|
92
|
-
}
|
|
93
|
-
path = path.replace(match, String(params[paramName]));
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return path;
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
var router = new Router;
|
|
100
|
-
|
|
101
|
-
// src/decorators.ts
|
|
102
|
-
var createRouteDecorator = (method) => {
|
|
103
|
-
return (path, config) => {
|
|
104
|
-
return (target) => {
|
|
105
|
-
const route = {
|
|
106
|
-
...config,
|
|
107
|
-
path,
|
|
108
|
-
method,
|
|
109
|
-
isSocket: false,
|
|
110
|
-
controller: target
|
|
111
|
-
};
|
|
112
|
-
router.addRoute(route);
|
|
113
|
-
};
|
|
114
|
-
};
|
|
115
|
-
};
|
|
116
|
-
var createSocketDecorator = () => {
|
|
117
|
-
return (path, config) => {
|
|
118
|
-
return (target) => {
|
|
119
|
-
const route = {
|
|
120
|
-
...config,
|
|
121
|
-
path,
|
|
122
|
-
method: "GET",
|
|
123
|
-
isSocket: true,
|
|
124
|
-
controller: target
|
|
125
|
-
};
|
|
126
|
-
router.addRoute(route);
|
|
127
|
-
};
|
|
128
|
-
};
|
|
129
|
-
};
|
|
130
|
-
var Route = {
|
|
131
|
-
get: createRouteDecorator("GET"),
|
|
132
|
-
post: createRouteDecorator("POST"),
|
|
133
|
-
put: createRouteDecorator("PUT"),
|
|
134
|
-
delete: createRouteDecorator("DELETE"),
|
|
135
|
-
patch: createRouteDecorator("PATCH"),
|
|
136
|
-
options: createRouteDecorator("OPTIONS"),
|
|
137
|
-
head: createRouteDecorator("HEAD"),
|
|
138
|
-
socket: createSocketDecorator()
|
|
139
|
-
};
|
|
140
|
-
// src/types.ts
|
|
141
|
-
var VALID_NAMESPACES = [
|
|
142
|
-
"api",
|
|
143
|
-
"client",
|
|
144
|
-
"admin",
|
|
145
|
-
"public",
|
|
146
|
-
"auth",
|
|
147
|
-
"webhook",
|
|
148
|
-
"internal",
|
|
149
|
-
"external",
|
|
150
|
-
"system",
|
|
151
|
-
"health",
|
|
152
|
-
"metrics",
|
|
153
|
-
"docs"
|
|
154
|
-
];
|
|
155
|
-
var VALID_ACTIONS = [
|
|
156
|
-
"list",
|
|
157
|
-
"show",
|
|
158
|
-
"read",
|
|
159
|
-
"create",
|
|
160
|
-
"update",
|
|
161
|
-
"delete",
|
|
162
|
-
"store",
|
|
163
|
-
"edit",
|
|
164
|
-
"index",
|
|
165
|
-
"search",
|
|
166
|
-
"filter",
|
|
167
|
-
"sort",
|
|
168
|
-
"export",
|
|
169
|
-
"import",
|
|
170
|
-
"upload",
|
|
171
|
-
"download",
|
|
172
|
-
"duplicate",
|
|
173
|
-
"clone",
|
|
174
|
-
"archive",
|
|
175
|
-
"restore",
|
|
176
|
-
"activate",
|
|
177
|
-
"deactivate",
|
|
178
|
-
"enable",
|
|
179
|
-
"disable",
|
|
180
|
-
"publish",
|
|
181
|
-
"unpublish",
|
|
182
|
-
"approve",
|
|
183
|
-
"reject",
|
|
184
|
-
"cancel",
|
|
185
|
-
"confirm",
|
|
186
|
-
"validate",
|
|
187
|
-
"verify",
|
|
188
|
-
"reset",
|
|
189
|
-
"refresh",
|
|
190
|
-
"sync",
|
|
191
|
-
"backup",
|
|
192
|
-
"migrate",
|
|
193
|
-
"seed",
|
|
194
|
-
"truncate",
|
|
195
|
-
"count",
|
|
196
|
-
"exists",
|
|
197
|
-
"find",
|
|
198
|
-
"aggregate",
|
|
199
|
-
"bulk",
|
|
200
|
-
"batch",
|
|
201
|
-
"preview",
|
|
202
|
-
"template",
|
|
203
|
-
"history",
|
|
204
|
-
"audit",
|
|
205
|
-
"log",
|
|
206
|
-
"track",
|
|
207
|
-
"monitor",
|
|
208
|
-
"health",
|
|
209
|
-
"status",
|
|
210
|
-
"ping",
|
|
211
|
-
"test",
|
|
212
|
-
"debug",
|
|
213
|
-
"info",
|
|
214
|
-
"stats",
|
|
215
|
-
"report",
|
|
216
|
-
"analytics",
|
|
217
|
-
"metrics",
|
|
218
|
-
"summary",
|
|
219
|
-
"detail",
|
|
220
|
-
"config",
|
|
221
|
-
"settings",
|
|
222
|
-
"preferences",
|
|
223
|
-
"profile",
|
|
224
|
-
"avatar",
|
|
225
|
-
"password",
|
|
226
|
-
"login",
|
|
227
|
-
"logout",
|
|
228
|
-
"register",
|
|
229
|
-
"unregister",
|
|
230
|
-
"subscribe",
|
|
231
|
-
"unsubscribe",
|
|
232
|
-
"follow",
|
|
233
|
-
"unfollow",
|
|
234
|
-
"like",
|
|
235
|
-
"unlike",
|
|
236
|
-
"share",
|
|
237
|
-
"comment",
|
|
238
|
-
"reply",
|
|
239
|
-
"rate",
|
|
240
|
-
"review",
|
|
241
|
-
"bookmark",
|
|
242
|
-
"favorite",
|
|
243
|
-
"tag",
|
|
244
|
-
"untag",
|
|
245
|
-
"assign",
|
|
246
|
-
"unassign",
|
|
247
|
-
"invite",
|
|
248
|
-
"revoke",
|
|
249
|
-
"grant",
|
|
250
|
-
"deny",
|
|
251
|
-
"lock",
|
|
252
|
-
"unlock",
|
|
253
|
-
"move",
|
|
254
|
-
"copy",
|
|
255
|
-
"rename",
|
|
256
|
-
"reorder",
|
|
257
|
-
"merge",
|
|
258
|
-
"split",
|
|
259
|
-
"convert",
|
|
260
|
-
"transform",
|
|
261
|
-
"process",
|
|
262
|
-
"queue",
|
|
263
|
-
"retry",
|
|
264
|
-
"skip",
|
|
265
|
-
"pause",
|
|
266
|
-
"resume",
|
|
267
|
-
"stop",
|
|
268
|
-
"start",
|
|
269
|
-
"restart",
|
|
270
|
-
"reload",
|
|
271
|
-
"clear",
|
|
272
|
-
"flush",
|
|
273
|
-
"purge",
|
|
274
|
-
"cleanup",
|
|
275
|
-
"optimize",
|
|
276
|
-
"compress",
|
|
277
|
-
"decompress",
|
|
278
|
-
"manage",
|
|
279
|
-
"administer",
|
|
280
|
-
"supervise",
|
|
281
|
-
"oversee",
|
|
282
|
-
"govern",
|
|
283
|
-
"control",
|
|
284
|
-
"execute",
|
|
285
|
-
"perform",
|
|
286
|
-
"run",
|
|
287
|
-
"operate",
|
|
288
|
-
"handle",
|
|
289
|
-
"maintain",
|
|
290
|
-
"service",
|
|
291
|
-
"support",
|
|
292
|
-
"assist",
|
|
293
|
-
"help",
|
|
294
|
-
"guide",
|
|
295
|
-
"instruct",
|
|
296
|
-
"teach",
|
|
297
|
-
"train",
|
|
298
|
-
"educate",
|
|
299
|
-
"inform",
|
|
300
|
-
"notify",
|
|
301
|
-
"alert",
|
|
302
|
-
"warn",
|
|
303
|
-
"remind",
|
|
304
|
-
"schedule",
|
|
305
|
-
"plan",
|
|
306
|
-
"organize",
|
|
307
|
-
"arrange",
|
|
308
|
-
"coordinate",
|
|
309
|
-
"integrate",
|
|
310
|
-
"connect",
|
|
311
|
-
"link",
|
|
312
|
-
"bind",
|
|
313
|
-
"attach",
|
|
314
|
-
"detach",
|
|
315
|
-
"separate",
|
|
316
|
-
"isolate",
|
|
317
|
-
"quarantine",
|
|
318
|
-
"protect",
|
|
319
|
-
"secure",
|
|
320
|
-
"encrypt",
|
|
321
|
-
"decrypt",
|
|
322
|
-
"encode",
|
|
323
|
-
"decode",
|
|
324
|
-
"format",
|
|
325
|
-
"parse",
|
|
326
|
-
"serialize",
|
|
327
|
-
"deserialize",
|
|
328
|
-
"marshal",
|
|
329
|
-
"unmarshal",
|
|
330
|
-
"package",
|
|
331
|
-
"unpack",
|
|
332
|
-
"bundle",
|
|
333
|
-
"unbundle",
|
|
334
|
-
"group",
|
|
335
|
-
"ungroup",
|
|
336
|
-
"categorize",
|
|
337
|
-
"classify",
|
|
338
|
-
"order",
|
|
339
|
-
"rank",
|
|
340
|
-
"prioritize",
|
|
341
|
-
"weight",
|
|
342
|
-
"score",
|
|
343
|
-
"evaluate",
|
|
344
|
-
"assess",
|
|
345
|
-
"measure",
|
|
346
|
-
"calculate",
|
|
347
|
-
"compute",
|
|
348
|
-
"analyze",
|
|
349
|
-
"examine",
|
|
350
|
-
"inspect",
|
|
351
|
-
"check",
|
|
352
|
-
"scan",
|
|
353
|
-
"detect",
|
|
354
|
-
"discover",
|
|
355
|
-
"explore",
|
|
356
|
-
"browse",
|
|
357
|
-
"navigate",
|
|
358
|
-
"travel",
|
|
359
|
-
"visit",
|
|
360
|
-
"access",
|
|
361
|
-
"enter",
|
|
362
|
-
"exit",
|
|
363
|
-
"leave",
|
|
364
|
-
"join",
|
|
365
|
-
"disconnect",
|
|
366
|
-
"reconnect",
|
|
367
|
-
"establish",
|
|
368
|
-
"initialize",
|
|
369
|
-
"setup",
|
|
370
|
-
"configure",
|
|
371
|
-
"customize",
|
|
372
|
-
"personalize",
|
|
373
|
-
"adapt",
|
|
374
|
-
"adjust",
|
|
375
|
-
"modify",
|
|
376
|
-
"change",
|
|
377
|
-
"alter",
|
|
378
|
-
"revise",
|
|
379
|
-
"amend",
|
|
380
|
-
"correct",
|
|
381
|
-
"fix",
|
|
382
|
-
"repair",
|
|
383
|
-
"recover",
|
|
384
|
-
"retrieve",
|
|
385
|
-
"fetch",
|
|
386
|
-
"get",
|
|
387
|
-
"obtain",
|
|
388
|
-
"acquire",
|
|
389
|
-
"receive",
|
|
390
|
-
"accept",
|
|
391
|
-
"take",
|
|
392
|
-
"capture",
|
|
393
|
-
"record",
|
|
394
|
-
"save",
|
|
395
|
-
"preserve",
|
|
396
|
-
"keep",
|
|
397
|
-
"retain",
|
|
398
|
-
"hold",
|
|
399
|
-
"sustain",
|
|
400
|
-
"continue",
|
|
401
|
-
"proceed",
|
|
402
|
-
"advance",
|
|
403
|
-
"progress",
|
|
404
|
-
"develop",
|
|
405
|
-
"evolve",
|
|
406
|
-
"grow",
|
|
407
|
-
"expand",
|
|
408
|
-
"extend",
|
|
409
|
-
"stretch",
|
|
410
|
-
"scale",
|
|
411
|
-
"resize",
|
|
412
|
-
"tune",
|
|
413
|
-
"calibrate",
|
|
414
|
-
"balance",
|
|
415
|
-
"stabilize",
|
|
416
|
-
"normalize",
|
|
417
|
-
"standardize",
|
|
418
|
-
"regulate",
|
|
419
|
-
"moderate",
|
|
420
|
-
"mediate",
|
|
421
|
-
"negotiate",
|
|
422
|
-
"compromise",
|
|
423
|
-
"resolve",
|
|
424
|
-
"solve",
|
|
425
|
-
"address",
|
|
426
|
-
"tackle",
|
|
427
|
-
"approach",
|
|
428
|
-
"deal",
|
|
429
|
-
"cope",
|
|
430
|
-
"direct",
|
|
431
|
-
"lead",
|
|
432
|
-
"command",
|
|
433
|
-
"instruct",
|
|
434
|
-
"order",
|
|
435
|
-
"request",
|
|
436
|
-
"ask",
|
|
437
|
-
"query",
|
|
438
|
-
"question",
|
|
439
|
-
"inquire",
|
|
440
|
-
"investigate",
|
|
441
|
-
"research",
|
|
442
|
-
"study",
|
|
443
|
-
"learn",
|
|
444
|
-
"understand",
|
|
445
|
-
"comprehend",
|
|
446
|
-
"grasp",
|
|
447
|
-
"realize",
|
|
448
|
-
"recognize",
|
|
449
|
-
"identify",
|
|
450
|
-
"determine",
|
|
451
|
-
"decide",
|
|
452
|
-
"choose",
|
|
453
|
-
"select",
|
|
454
|
-
"pick",
|
|
455
|
-
"opt",
|
|
456
|
-
"prefer",
|
|
457
|
-
"favor",
|
|
458
|
-
"recommend",
|
|
459
|
-
"suggest",
|
|
460
|
-
"propose",
|
|
461
|
-
"offer",
|
|
462
|
-
"provide",
|
|
463
|
-
"supply",
|
|
464
|
-
"deliver",
|
|
465
|
-
"send",
|
|
466
|
-
"transmit",
|
|
467
|
-
"transfer",
|
|
468
|
-
"forward",
|
|
469
|
-
"relay",
|
|
470
|
-
"redirect",
|
|
471
|
-
"route",
|
|
472
|
-
"dispatch",
|
|
473
|
-
"distribute",
|
|
474
|
-
"allocate",
|
|
475
|
-
"designate",
|
|
476
|
-
"appoint",
|
|
477
|
-
"nominate",
|
|
478
|
-
"elect",
|
|
479
|
-
"vote",
|
|
480
|
-
"poll",
|
|
481
|
-
"survey",
|
|
482
|
-
"interview",
|
|
483
|
-
"examine",
|
|
484
|
-
"trial",
|
|
485
|
-
"experiment",
|
|
486
|
-
"try",
|
|
487
|
-
"attempt",
|
|
488
|
-
"endeavor",
|
|
489
|
-
"strive",
|
|
490
|
-
"effort",
|
|
491
|
-
"work",
|
|
492
|
-
"labor",
|
|
493
|
-
"toil",
|
|
494
|
-
"struggle",
|
|
495
|
-
"fight",
|
|
496
|
-
"battle",
|
|
497
|
-
"compete",
|
|
498
|
-
"contest",
|
|
499
|
-
"challenge",
|
|
500
|
-
"oppose",
|
|
501
|
-
"resist",
|
|
502
|
-
"defend",
|
|
503
|
-
"guard",
|
|
504
|
-
"shield",
|
|
505
|
-
"cover",
|
|
506
|
-
"hide",
|
|
507
|
-
"conceal",
|
|
508
|
-
"mask",
|
|
509
|
-
"disguise",
|
|
510
|
-
"camouflage",
|
|
511
|
-
"cloak",
|
|
512
|
-
"wrap",
|
|
513
|
-
"enclose",
|
|
514
|
-
"contain",
|
|
515
|
-
"include",
|
|
516
|
-
"encompass",
|
|
517
|
-
"comprise",
|
|
518
|
-
"consist",
|
|
519
|
-
"compose",
|
|
520
|
-
"constitute",
|
|
521
|
-
"form",
|
|
522
|
-
"shape",
|
|
523
|
-
"mold",
|
|
524
|
-
"craft",
|
|
525
|
-
"build",
|
|
526
|
-
"construct",
|
|
527
|
-
"assemble",
|
|
528
|
-
"compile",
|
|
529
|
-
"gather",
|
|
530
|
-
"collect",
|
|
531
|
-
"accumulate",
|
|
532
|
-
"amass",
|
|
533
|
-
"pile",
|
|
534
|
-
"stack",
|
|
535
|
-
"heap",
|
|
536
|
-
"load",
|
|
537
|
-
"fill",
|
|
538
|
-
"populate",
|
|
539
|
-
"occupy",
|
|
540
|
-
"inhabit",
|
|
541
|
-
"reside",
|
|
542
|
-
"dwell",
|
|
543
|
-
"live",
|
|
544
|
-
"exist",
|
|
545
|
-
"become",
|
|
546
|
-
"turn",
|
|
547
|
-
"metamorphose",
|
|
548
|
-
"mutate",
|
|
549
|
-
"accommodate",
|
|
550
|
-
"conform",
|
|
551
|
-
"comply",
|
|
552
|
-
"obey",
|
|
553
|
-
"follow",
|
|
554
|
-
"adhere",
|
|
555
|
-
"stick",
|
|
556
|
-
"fasten",
|
|
557
|
-
"tie",
|
|
558
|
-
"unite",
|
|
559
|
-
"combine",
|
|
560
|
-
"mix",
|
|
561
|
-
"blend",
|
|
562
|
-
"fuse",
|
|
563
|
-
"incorporate",
|
|
564
|
-
"embed",
|
|
565
|
-
"insert",
|
|
566
|
-
"inject",
|
|
567
|
-
"introduce",
|
|
568
|
-
"bring",
|
|
569
|
-
"carry",
|
|
570
|
-
"transport",
|
|
571
|
-
"convey",
|
|
572
|
-
"spread",
|
|
573
|
-
"scatter",
|
|
574
|
-
"disperse",
|
|
575
|
-
"disseminate",
|
|
576
|
-
"broadcast",
|
|
577
|
-
"announce",
|
|
578
|
-
"declare",
|
|
579
|
-
"proclaim",
|
|
580
|
-
"state",
|
|
581
|
-
"express",
|
|
582
|
-
"voice",
|
|
583
|
-
"speak",
|
|
584
|
-
"say",
|
|
585
|
-
"tell",
|
|
586
|
-
"communicate",
|
|
587
|
-
"shift",
|
|
588
|
-
"relocate",
|
|
589
|
-
"journey",
|
|
590
|
-
"voyage",
|
|
591
|
-
"trip",
|
|
592
|
-
"tour",
|
|
593
|
-
"locate",
|
|
594
|
-
"position",
|
|
595
|
-
"place",
|
|
596
|
-
"put",
|
|
597
|
-
"set",
|
|
598
|
-
"lay",
|
|
599
|
-
"rest",
|
|
600
|
-
"sit",
|
|
601
|
-
"stand",
|
|
602
|
-
"rise",
|
|
603
|
-
"lift",
|
|
604
|
-
"raise",
|
|
605
|
-
"elevate",
|
|
606
|
-
"boost",
|
|
607
|
-
"enhance",
|
|
608
|
-
"improve",
|
|
609
|
-
"upgrade",
|
|
610
|
-
"renew",
|
|
611
|
-
"revive",
|
|
612
|
-
"mend",
|
|
613
|
-
"heal",
|
|
614
|
-
"cure",
|
|
615
|
-
"treat",
|
|
616
|
-
"remedy",
|
|
617
|
-
"settle",
|
|
618
|
-
"conclude",
|
|
619
|
-
"finish",
|
|
620
|
-
"complete",
|
|
621
|
-
"end",
|
|
622
|
-
"terminate",
|
|
623
|
-
"halt",
|
|
624
|
-
"break",
|
|
625
|
-
"interrupt",
|
|
626
|
-
"suspend",
|
|
627
|
-
"delay",
|
|
628
|
-
"postpone",
|
|
629
|
-
"defer",
|
|
630
|
-
"wait",
|
|
631
|
-
"uphold",
|
|
632
|
-
"safeguard",
|
|
633
|
-
"ensure",
|
|
634
|
-
"guarantee",
|
|
635
|
-
"warrant",
|
|
636
|
-
"promise",
|
|
637
|
-
"pledge",
|
|
638
|
-
"commit",
|
|
639
|
-
"dedicate",
|
|
640
|
-
"devote",
|
|
641
|
-
"consecrate",
|
|
642
|
-
"sacrifice",
|
|
643
|
-
"give",
|
|
644
|
-
"donate",
|
|
645
|
-
"contribute",
|
|
646
|
-
"furnish",
|
|
647
|
-
"equip",
|
|
648
|
-
"outfit",
|
|
649
|
-
"prepare",
|
|
650
|
-
"ready",
|
|
651
|
-
"design",
|
|
652
|
-
"make",
|
|
653
|
-
"produce",
|
|
654
|
-
"manufacture",
|
|
655
|
-
"fabricate",
|
|
656
|
-
"erect",
|
|
657
|
-
"found",
|
|
658
|
-
"institute",
|
|
659
|
-
"inaugurate",
|
|
660
|
-
"launch",
|
|
661
|
-
"begin",
|
|
662
|
-
"commence",
|
|
663
|
-
"initiate",
|
|
664
|
-
"trigger",
|
|
665
|
-
"turn-on",
|
|
666
|
-
"switch-on",
|
|
667
|
-
"power-on",
|
|
668
|
-
"boot",
|
|
669
|
-
"startup",
|
|
670
|
-
"function",
|
|
671
|
-
"act",
|
|
672
|
-
"behave",
|
|
673
|
-
"conduct",
|
|
674
|
-
"steer",
|
|
675
|
-
"pilot",
|
|
676
|
-
"drive",
|
|
677
|
-
"rule",
|
|
678
|
-
"manipulate",
|
|
679
|
-
"use",
|
|
680
|
-
"utilize",
|
|
681
|
-
"employ",
|
|
682
|
-
"apply",
|
|
683
|
-
"implement",
|
|
684
|
-
"deploy",
|
|
685
|
-
"install",
|
|
686
|
-
"refine",
|
|
687
|
-
"polish",
|
|
688
|
-
"perfect",
|
|
689
|
-
"finalize",
|
|
690
|
-
"close",
|
|
691
|
-
"shut",
|
|
692
|
-
"seal",
|
|
693
|
-
"watch",
|
|
694
|
-
"observe"
|
|
695
|
-
];
|
|
696
|
-
// src/utils.ts
|
|
697
|
-
import { toPascalCase } from "@ooneex/utils";
|
|
698
|
-
import { jsonSchemaToTypeString } from "@ooneex/validation";
|
|
699
|
-
var isValidRoutePath = (path) => {
|
|
700
|
-
if (!path.startsWith("/"))
|
|
701
|
-
return false;
|
|
702
|
-
if (path.includes("//"))
|
|
703
|
-
return false;
|
|
704
|
-
if (path.includes("::"))
|
|
705
|
-
return false;
|
|
706
|
-
if (path.endsWith(":"))
|
|
707
|
-
return false;
|
|
708
|
-
if (path.includes("/:")) {
|
|
709
|
-
const segments = path.split("/");
|
|
710
|
-
for (const segment of segments) {
|
|
711
|
-
if (segment.startsWith(":") && segment.length === 1)
|
|
712
|
-
return false;
|
|
713
|
-
if (segment.includes(":") && !segment.startsWith(":"))
|
|
714
|
-
return false;
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
return true;
|
|
718
|
-
};
|
|
719
|
-
var extractParameterNames = (path) => {
|
|
720
|
-
const matches = path.match(/:([^/]+)/g);
|
|
721
|
-
return matches ? matches.map((match) => match.slice(1)) : [];
|
|
722
|
-
};
|
|
723
|
-
var routeConfigToTypeString = (config) => {
|
|
724
|
-
if (!config.response && !config.params && !config.payload && !config.queries) {
|
|
725
|
-
return "never";
|
|
726
|
-
}
|
|
727
|
-
const typeProperties = [];
|
|
728
|
-
if (config.response) {
|
|
729
|
-
try {
|
|
730
|
-
const constraint = "getConstraint" in config.response ? config.response.getConstraint() : config.response;
|
|
731
|
-
const schema = constraint.toJsonSchema();
|
|
732
|
-
let typeStr = jsonSchemaToTypeString(schema);
|
|
733
|
-
if (typeStr === "unknown" || typeStr === "{ }" || typeStr === "Record<string, unknown>") {
|
|
734
|
-
typeStr = "never";
|
|
735
|
-
}
|
|
736
|
-
typeProperties.push(`response: ${typeStr}`);
|
|
737
|
-
} catch {
|
|
738
|
-
typeProperties.push("response: never");
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
if (config.params) {
|
|
742
|
-
const paramProps = [];
|
|
743
|
-
for (const [key, assert] of Object.entries(config.params)) {
|
|
744
|
-
try {
|
|
745
|
-
const constraint = "getConstraint" in assert ? assert.getConstraint() : assert;
|
|
746
|
-
const schema = constraint.toJsonSchema();
|
|
747
|
-
let typeStr = jsonSchemaToTypeString(schema);
|
|
748
|
-
if (typeStr === "unknown" || typeStr === "{ }" || typeStr === "Record<string, unknown>") {
|
|
749
|
-
typeStr = "never";
|
|
750
|
-
}
|
|
751
|
-
paramProps.push(`${key}: ${typeStr}`);
|
|
752
|
-
} catch {
|
|
753
|
-
paramProps.push(`${key}: never`);
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
if (paramProps.length > 0) {
|
|
757
|
-
const paramsType = `{ ${paramProps.join("; ")} }`;
|
|
758
|
-
typeProperties.push(`params: ${paramsType}`);
|
|
759
|
-
} else {
|
|
760
|
-
typeProperties.push("params: never");
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
if (config.payload) {
|
|
764
|
-
try {
|
|
765
|
-
const constraint = "getConstraint" in config.payload ? config.payload.getConstraint() : config.payload;
|
|
766
|
-
const schema = constraint.toJsonSchema();
|
|
767
|
-
let typeStr = jsonSchemaToTypeString(schema);
|
|
768
|
-
if (typeStr === "unknown" || typeStr === "{ }" || typeStr === "Record<string, unknown>") {
|
|
769
|
-
typeStr = "never";
|
|
770
|
-
}
|
|
771
|
-
typeProperties.push(`payload: ${typeStr}`);
|
|
772
|
-
} catch {
|
|
773
|
-
typeProperties.push("payload: never");
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
if (config.queries) {
|
|
777
|
-
try {
|
|
778
|
-
const constraint = "getConstraint" in config.queries ? config.queries.getConstraint() : config.queries;
|
|
779
|
-
const schema = constraint.toJsonSchema();
|
|
780
|
-
let typeStr = jsonSchemaToTypeString(schema);
|
|
781
|
-
if (typeStr === "unknown" || typeStr === "{ }" || typeStr === "Record<string, unknown>") {
|
|
782
|
-
typeStr = "never";
|
|
783
|
-
}
|
|
784
|
-
typeProperties.push(`queries: ${typeStr}`);
|
|
785
|
-
} catch {
|
|
786
|
-
typeProperties.push("queries: never");
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
return `{
|
|
790
|
-
${typeProperties.join(`;
|
|
2
|
+
import{container as s,EContainerScope as f}from"@ooneex/container";import{Exception as p}from"@ooneex/exception";import{HttpStatus as n}from"@ooneex/http-status";class T extends p{constructor(t,w={}){super(t,{status:n.Code.InternalServerError,data:w});this.name="RouterException"}}class j{routes=new Map;addRoute(t){let w=t.name;for(let x of this.routes[Symbol.iterator]())if(x[1].find((M)=>M.name===w))throw new T(`Route with name '${w}' already exists`,t);let u=this.routes.get(t.path)??[];if(t.isSocket&&u.find((x)=>x.isSocket))throw new T(`Socket route with path '${t.path}' already exists`,t);if(!t.isSocket&&u.find((x)=>!x.isSocket&&x.method===t.method))throw new T(`Route with path '${t.path}' and method '${t.method}' already exists`,t);return u.push(t),this.routes.set(t.path,u),s.add(t.controller,f.Singleton),this}findRouteByPath(t){return this.routes.get(t)??null}findRouteByName(t){for(let w of this.routes[Symbol.iterator]()){let u=w[1].find((x)=>x.name===t);if(u)return u}return null}getRoutes(){return this.routes}getSocketRoutes(){let t=new Map;for(let[w,u]of this.routes){let x=u.find((R)=>R.isSocket);if(x)t.set(w,x)}return t}getHttpRoutes(){let t=new Map;for(let[w,u]of this.routes){let x=u.filter((R)=>!R.isSocket);if(x.length>0)t.set(w,x)}return t}generate(t,w){let u=this.findRouteByName(t);if(!u)throw new T(`Route with name '${t}' not found`);let x=u.path,R=x.match(/:[a-zA-Z0-9_]+/g)||[];if(R.length>0){if(!w||typeof w!=="object"||w===null)throw new T(`Route '${t}' requires parameters, but none were provided`);for(let M of R){let C=M.substring(1);if(!(C in w))throw new T(`Missing required parameter '${C}' for route '${t}'`);x=x.replace(M,String(w[C]))}}return x}}var _=new j;var k=(t)=>{return(w,u)=>{return(x)=>{let R={...u,path:w,method:t,isSocket:!1,controller:x};_.addRoute(R)}}},a=()=>{return(t,w)=>{return(u)=>{let x={...w,path:t,method:"GET",isSocket:!0,controller:u};_.addRoute(x)}}},g={get:k("GET"),post:k("POST"),put:k("PUT"),delete:k("DELETE"),patch:k("PATCH"),options:k("OPTIONS"),head:k("HEAD"),socket:a()};var dt=["api","client","admin","public","auth","webhook","internal","external","system","health","metrics","docs"],It=["list","show","read","create","update","delete","store","edit","index","search","filter","sort","export","import","upload","download","duplicate","clone","archive","restore","activate","deactivate","enable","disable","publish","unpublish","approve","reject","cancel","confirm","validate","verify","reset","refresh","sync","backup","migrate","seed","truncate","count","exists","find","aggregate","bulk","batch","preview","template","history","audit","log","track","monitor","health","status","ping","test","debug","info","stats","report","analytics","metrics","summary","detail","config","settings","preferences","profile","avatar","password","login","logout","register","unregister","subscribe","unsubscribe","follow","unfollow","like","unlike","share","comment","reply","rate","review","bookmark","favorite","tag","untag","assign","unassign","invite","revoke","grant","deny","lock","unlock","move","copy","rename","reorder","merge","split","convert","transform","process","queue","retry","skip","pause","resume","stop","start","restart","reload","clear","flush","purge","cleanup","optimize","compress","decompress","manage","administer","supervise","oversee","govern","control","execute","perform","run","operate","handle","maintain","service","support","assist","help","guide","instruct","teach","train","educate","inform","notify","alert","warn","remind","schedule","plan","organize","arrange","coordinate","integrate","connect","link","bind","attach","detach","separate","isolate","quarantine","protect","secure","encrypt","decrypt","encode","decode","format","parse","serialize","deserialize","marshal","unmarshal","package","unpack","bundle","unbundle","group","ungroup","categorize","classify","order","rank","prioritize","weight","score","evaluate","assess","measure","calculate","compute","analyze","examine","inspect","check","scan","detect","discover","explore","browse","navigate","travel","visit","access","enter","exit","leave","join","disconnect","reconnect","establish","initialize","setup","configure","customize","personalize","adapt","adjust","modify","change","alter","revise","amend","correct","fix","repair","recover","retrieve","fetch","get","obtain","acquire","receive","accept","take","capture","record","save","preserve","keep","retain","hold","sustain","continue","proceed","advance","progress","develop","evolve","grow","expand","extend","stretch","scale","resize","tune","calibrate","balance","stabilize","normalize","standardize","regulate","moderate","mediate","negotiate","compromise","resolve","solve","address","tackle","approach","deal","cope","direct","lead","command","instruct","order","request","ask","query","question","inquire","investigate","research","study","learn","understand","comprehend","grasp","realize","recognize","identify","determine","decide","choose","select","pick","opt","prefer","favor","recommend","suggest","propose","offer","provide","supply","deliver","send","transmit","transfer","forward","relay","redirect","route","dispatch","distribute","allocate","designate","appoint","nominate","elect","vote","poll","survey","interview","examine","trial","experiment","try","attempt","endeavor","strive","effort","work","labor","toil","struggle","fight","battle","compete","contest","challenge","oppose","resist","defend","guard","shield","cover","hide","conceal","mask","disguise","camouflage","cloak","wrap","enclose","contain","include","encompass","comprise","consist","compose","constitute","form","shape","mold","craft","build","construct","assemble","compile","gather","collect","accumulate","amass","pile","stack","heap","load","fill","populate","occupy","inhabit","reside","dwell","live","exist","become","turn","metamorphose","mutate","accommodate","conform","comply","obey","follow","adhere","stick","fasten","tie","unite","combine","mix","blend","fuse","incorporate","embed","insert","inject","introduce","bring","carry","transport","convey","spread","scatter","disperse","disseminate","broadcast","announce","declare","proclaim","state","express","voice","speak","say","tell","communicate","shift","relocate","journey","voyage","trip","tour","locate","position","place","put","set","lay","rest","sit","stand","rise","lift","raise","elevate","boost","enhance","improve","upgrade","renew","revive","mend","heal","cure","treat","remedy","settle","conclude","finish","complete","end","terminate","halt","break","interrupt","suspend","delay","postpone","defer","wait","uphold","safeguard","ensure","guarantee","warrant","promise","pledge","commit","dedicate","devote","consecrate","sacrifice","give","donate","contribute","furnish","equip","outfit","prepare","ready","design","make","produce","manufacture","fabricate","erect","found","institute","inaugurate","launch","begin","commence","initiate","trigger","turn-on","switch-on","power-on","boot","startup","function","act","behave","conduct","steer","pilot","drive","rule","manipulate","use","utilize","employ","apply","implement","deploy","install","refine","polish","perfect","finalize","close","shut","seal","watch","observe"];import{toPascalCase as W}from"@ooneex/utils";import{jsonSchemaToTypeString as v}from"@ooneex/validation";var Tt=(t)=>{if(!t.startsWith("/"))return!1;if(t.includes("//"))return!1;if(t.includes("::"))return!1;if(t.endsWith(":"))return!1;if(t.includes("/:")){let w=t.split("/");for(let u of w){if(u.startsWith(":")&&u.length===1)return!1;if(u.includes(":")&&!u.startsWith(":"))return!1}}return!0},c=(t)=>{let w=t.match(/:([^/]+)/g);return w?w.map((u)=>u.slice(1)):[]},K=(t)=>{if(!t.response&&!t.params&&!t.payload&&!t.queries)return"never";let w=[];if(t.response)try{let x=("getConstraint"in t.response?t.response.getConstraint():t.response).toJsonSchema(),R=v(x);if(R==="unknown"||R==="{ }"||R==="Record<string, unknown>")R="never";w.push(`response: ${R}`)}catch{w.push("response: never")}if(t.params){let u=[];for(let[x,R]of Object.entries(t.params))try{let C=("getConstraint"in R?R.getConstraint():R).toJsonSchema(),E=v(C);if(E==="unknown"||E==="{ }"||E==="Record<string, unknown>")E="never";u.push(`${x}: ${E}`)}catch{u.push(`${x}: never`)}if(u.length>0){let x=`{ ${u.join("; ")} }`;w.push(`params: ${x}`)}else w.push("params: never")}if(t.payload)try{let x=("getConstraint"in t.payload?t.payload.getConstraint():t.payload).toJsonSchema(),R=v(x);if(R==="unknown"||R==="{ }"||R==="Record<string, unknown>")R="never";w.push(`payload: ${R}`)}catch{w.push("payload: never")}if(t.queries)try{let x=("getConstraint"in t.queries?t.queries.getConstraint():t.queries).toJsonSchema(),R=v(x);if(R==="unknown"||R==="{ }"||R==="Record<string, unknown>")R="never";w.push(`queries: ${R}`)}catch{w.push("queries: never")}return`{
|
|
3
|
+
${w.join(`;
|
|
791
4
|
`)};
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
var assertToJsonSchema = (assert) => {
|
|
795
|
-
try {
|
|
796
|
-
const constraint = assert && typeof assert === "object" && "getConstraint" in assert ? assert.getConstraint() : assert;
|
|
797
|
-
return constraint.toJsonSchema();
|
|
798
|
-
} catch {
|
|
799
|
-
return { type: "unknown" };
|
|
800
|
-
}
|
|
801
|
-
};
|
|
802
|
-
var routeConfigToJsonDoc = (config) => {
|
|
803
|
-
const doc = {
|
|
804
|
-
name: config.name,
|
|
805
|
-
path: config.path,
|
|
806
|
-
method: config.method,
|
|
807
|
-
description: config.description,
|
|
808
|
-
controller: config.controller.name,
|
|
809
|
-
isSocket: config.isSocket,
|
|
810
|
-
parameters: extractParameterNames(config.path)
|
|
811
|
-
};
|
|
812
|
-
const schemas = {};
|
|
813
|
-
if (config.params) {
|
|
814
|
-
const paramsSchema = {
|
|
815
|
-
type: "object",
|
|
816
|
-
properties: {}
|
|
817
|
-
};
|
|
818
|
-
for (const [key, assert] of Object.entries(config.params)) {
|
|
819
|
-
const schema = assertToJsonSchema(assert);
|
|
820
|
-
delete schema.$schema;
|
|
821
|
-
schema.required = true;
|
|
822
|
-
paramsSchema.properties[key] = schema;
|
|
823
|
-
}
|
|
824
|
-
schemas.params = paramsSchema;
|
|
825
|
-
}
|
|
826
|
-
if (config.queries) {
|
|
827
|
-
const schema = assertToJsonSchema(config.queries);
|
|
828
|
-
delete schema.$schema;
|
|
829
|
-
if (schema.type === "object" && schema.properties) {
|
|
830
|
-
const requiredFields = schema.required || [];
|
|
831
|
-
const properties = schema.properties;
|
|
832
|
-
for (const key of Object.keys(properties)) {
|
|
833
|
-
const propSchema = properties[key];
|
|
834
|
-
propSchema.required = requiredFields.includes(key);
|
|
835
|
-
}
|
|
836
|
-
delete schema.required;
|
|
837
|
-
}
|
|
838
|
-
schemas.queries = schema;
|
|
839
|
-
}
|
|
840
|
-
if (config.payload) {
|
|
841
|
-
const schema = assertToJsonSchema(config.payload);
|
|
842
|
-
delete schema.$schema;
|
|
843
|
-
if (schema.type === "object" && schema.properties) {
|
|
844
|
-
const requiredFields = schema.required || [];
|
|
845
|
-
const properties = schema.properties;
|
|
846
|
-
for (const key of Object.keys(properties)) {
|
|
847
|
-
const propSchema = properties[key];
|
|
848
|
-
propSchema.required = requiredFields.includes(key);
|
|
849
|
-
}
|
|
850
|
-
delete schema.required;
|
|
851
|
-
}
|
|
852
|
-
schemas.payload = schema;
|
|
853
|
-
}
|
|
854
|
-
if (config.response) {
|
|
855
|
-
const schema = assertToJsonSchema(config.response);
|
|
856
|
-
delete schema.$schema;
|
|
857
|
-
if (schema.type === "object" && schema.properties) {
|
|
858
|
-
const requiredFields = schema.required || [];
|
|
859
|
-
const properties = schema.properties;
|
|
860
|
-
for (const key of Object.keys(properties)) {
|
|
861
|
-
const propSchema = properties[key];
|
|
862
|
-
propSchema.required = requiredFields.includes(key);
|
|
863
|
-
}
|
|
864
|
-
delete schema.required;
|
|
865
|
-
}
|
|
866
|
-
schemas.response = schema;
|
|
867
|
-
}
|
|
868
|
-
if (Object.keys(schemas).length > 0) {
|
|
869
|
-
doc.schemas = schemas;
|
|
870
|
-
}
|
|
871
|
-
const security = {};
|
|
872
|
-
if (config.env && config.env.length > 0) {
|
|
873
|
-
security.environments = config.env;
|
|
874
|
-
}
|
|
875
|
-
if (config.roles && config.roles.length > 0) {
|
|
876
|
-
security.roles = config.roles;
|
|
877
|
-
}
|
|
878
|
-
if (config.ip && config.ip.length > 0) {
|
|
879
|
-
security.allowedIPs = config.ip;
|
|
880
|
-
}
|
|
881
|
-
if (config.host && config.host.length > 0) {
|
|
882
|
-
security.allowedHosts = config.host;
|
|
883
|
-
}
|
|
884
|
-
if (Object.keys(security).length > 0) {
|
|
885
|
-
doc.security = security;
|
|
886
|
-
}
|
|
887
|
-
return doc;
|
|
888
|
-
};
|
|
889
|
-
var getRouteAction = (name) => {
|
|
890
|
-
const parts = name.split(".");
|
|
891
|
-
return parts[parts.length - 1] || "";
|
|
892
|
-
};
|
|
893
|
-
var buildPathWithParams = (path, useConfigPrefix = true) => {
|
|
894
|
-
const prefix = useConfigPrefix ? "config.params" : "params";
|
|
895
|
-
return path.replace(/:(\w+)/g, (_match, param) => `\${${prefix}.${param}}`);
|
|
896
|
-
};
|
|
897
|
-
var buildQueryString = (queriesSource) => {
|
|
898
|
-
return `Object.entries(${queriesSource} || {}).reduce((params, [key, value]) => { params.append(key, String(value)); return params; }, new URLSearchParams()).toString()`;
|
|
899
|
-
};
|
|
900
|
-
var routeConfigToFetcherString = (config) => {
|
|
901
|
-
const action = getRouteAction(config.name);
|
|
902
|
-
const typeName = `${action.charAt(0).toUpperCase() + action.slice(1)}RouteConfigType`;
|
|
903
|
-
const className = `${toPascalCase(config.name)}Fetcher`;
|
|
904
|
-
const method = config.method.toLowerCase();
|
|
905
|
-
const typeString = routeConfigToTypeString(config);
|
|
906
|
-
const isNeverType = typeString === "never";
|
|
907
|
-
const typeDefinition = isNeverType ? "" : `export type ${typeName} = ${typeString}`;
|
|
908
|
-
const configProps = [];
|
|
909
|
-
const hasParams = config.params && Object.keys(config.params).length > 0;
|
|
910
|
-
const hasPayload = config.payload !== undefined;
|
|
911
|
-
const hasQueries = config.queries !== undefined;
|
|
912
|
-
const responseType = config.response ? `${typeName}["response"]` : "never";
|
|
913
|
-
if (hasParams) {
|
|
914
|
-
configProps.push(`params: ${typeName}["params"]`);
|
|
915
|
-
}
|
|
916
|
-
if (hasPayload) {
|
|
917
|
-
configProps.push(`payload: ${typeName}["payload"]`);
|
|
918
|
-
}
|
|
919
|
-
if (hasQueries) {
|
|
920
|
-
configProps.push(`queries: ${typeName}["queries"]`);
|
|
921
|
-
}
|
|
922
|
-
const configType = configProps.length > 0 ? `config: {
|
|
923
|
-
${configProps.join(`;
|
|
5
|
+
}`},X=(t)=>{try{return(t&&typeof t==="object"&&"getConstraint"in t?t.getConstraint():t).toJsonSchema()}catch{return{type:"unknown"}}},Ot=(t)=>{let w={name:t.name,path:t.path,method:t.method,description:t.description,controller:t.controller.name,isSocket:t.isSocket,parameters:c(t.path)},u={};if(t.params){let R={type:"object",properties:{}};for(let[M,C]of Object.entries(t.params)){let E=X(C);delete E.$schema,E.required=!0,R.properties[M]=E}u.params=R}if(t.queries){let R=X(t.queries);if(delete R.$schema,R.type==="object"&&R.properties){let M=R.required||[],C=R.properties;for(let E of Object.keys(C)){let $=C[E];$.required=M.includes(E)}delete R.required}u.queries=R}if(t.payload){let R=X(t.payload);if(delete R.$schema,R.type==="object"&&R.properties){let M=R.required||[],C=R.properties;for(let E of Object.keys(C)){let $=C[E];$.required=M.includes(E)}delete R.required}u.payload=R}if(t.response){let R=X(t.response);if(delete R.$schema,R.type==="object"&&R.properties){let M=R.required||[],C=R.properties;for(let E of Object.keys(C)){let $=C[E];$.required=M.includes(E)}delete R.required}u.response=R}if(Object.keys(u).length>0)w.schemas=u;let x={};if(t.env&&t.env.length>0)x.environments=t.env;if(t.roles&&t.roles.length>0)x.roles=t.roles;if(t.ip&&t.ip.length>0)x.allowedIPs=t.ip;if(t.host&&t.host.length>0)x.allowedHosts=t.host;if(Object.keys(x).length>0)w.security=x;return w},l=(t)=>{let w=t.split(".");return w[w.length-1]||""},Y=(t,w=!0)=>{let u=w?"config.params":"params";return t.replace(/:(\w+)/g,(x,R)=>`\${${u}.${R}}`)},J=(t)=>{return`Object.entries(${t} || {}).reduce((params, [key, value]) => { params.append(key, String(value)); return params; }, new URLSearchParams()).toString()`},Gt=(t)=>{let w=l(t.name),u=`${w.charAt(0).toUpperCase()+w.slice(1)}RouteConfigType`,x=`${W(t.name)}Fetcher`,R=t.method.toLowerCase(),M=K(t),C=M==="never",E=C?"":`export type ${u} = ${M}`,$=[],A=t.params&&Object.keys(t.params).length>0,O=t.payload!==void 0,z=t.queries!==void 0,d=t.response?`${u}["response"]`:"never";if(A)$.push(`params: ${u}["params"]`);if(O)$.push(`payload: ${u}["payload"]`);if(z)$.push(`queries: ${u}["queries"]`);let I=$.length>0?`config: {
|
|
6
|
+
${$.join(`;
|
|
924
7
|
`)};
|
|
925
|
-
}
|
|
926
|
-
|
|
927
|
-
let urlExpression = `\`${urlPath}\``;
|
|
928
|
-
if (hasQueries) {
|
|
929
|
-
urlExpression = `\`${urlPath}?\${${buildQueryString("config.queries")}}\``;
|
|
930
|
-
}
|
|
931
|
-
const methodsWithPayload = ["post", "put", "patch"];
|
|
932
|
-
let methodCall = "";
|
|
933
|
-
if (methodsWithPayload.includes(method) && hasPayload) {
|
|
934
|
-
methodCall = `return await fetcher.${method}<${responseType}>(
|
|
935
|
-
${urlExpression},
|
|
8
|
+
}`:"",H=Y(t.path),b=`\`${H}\``;if(z)b=`\`${H}?\${${J("config.queries")}}\``;let G=["post","put","patch"],F="";if(G.includes(R)&&O)F=`return await fetcher.${R}<${d}>(
|
|
9
|
+
${b},
|
|
936
10
|
config.payload,
|
|
937
|
-
);`;
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
);`;
|
|
942
|
-
}
|
|
943
|
-
const classDefinition = `export class ${className} {
|
|
944
|
-
public async ${action}(${configType}): Promise<ResponseDataType<${responseType}>> {
|
|
11
|
+
);`;else F=`return await fetcher.${R}<${d}>(
|
|
12
|
+
${b},
|
|
13
|
+
);`;let U=`export class ${x} {
|
|
14
|
+
public async ${w}(${I}): Promise<ResponseDataType<${d}>> {
|
|
945
15
|
|
|
946
16
|
const fetcher = new Fetcher();
|
|
947
17
|
|
|
948
|
-
${
|
|
18
|
+
${F}
|
|
949
19
|
}
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
import type { ResponseDataType } from "@ooneex/http-response";`;
|
|
953
|
-
return isNeverType ? `${imports}
|
|
20
|
+
}`,B=`import { Fetcher } from "@ooneex/fetcher";
|
|
21
|
+
import type { ResponseDataType } from "@ooneex/http-response";`;return C?`${B}
|
|
954
22
|
|
|
955
|
-
${
|
|
23
|
+
${U}`:`${B}
|
|
956
24
|
|
|
957
|
-
${
|
|
25
|
+
${E}
|
|
958
26
|
|
|
959
|
-
${
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
const typeName = `${action.charAt(0).toUpperCase() + action.slice(1)}RouteConfigType`;
|
|
964
|
-
const className = `${toPascalCase(config.name)}Socket`;
|
|
965
|
-
const typeString = routeConfigToTypeString(config);
|
|
966
|
-
const isNeverType = typeString === "never";
|
|
967
|
-
const typeDefinition = isNeverType ? "" : `export type ${typeName} = ${typeString}`;
|
|
968
|
-
const hasParams = config.params && Object.keys(config.params).length > 0;
|
|
969
|
-
const hasPayload = config.payload && Object.keys(config.payload).length > 0;
|
|
970
|
-
const hasQueries = config.queries && Object.keys(config.queries).length > 0;
|
|
971
|
-
const configType = hasParams ? `params: ${typeName}["params"]` : "";
|
|
972
|
-
const urlPath = buildPathWithParams(config.path, false);
|
|
973
|
-
const urlExpression = `\`${urlPath}\``;
|
|
974
|
-
const sendDataTypeProps = [];
|
|
975
|
-
if (hasPayload) {
|
|
976
|
-
sendDataTypeProps.push(`payload: ${typeName}["payload"]`);
|
|
977
|
-
}
|
|
978
|
-
if (hasQueries) {
|
|
979
|
-
sendDataTypeProps.push(`queries: ${typeName}["queries"]`);
|
|
980
|
-
}
|
|
981
|
-
sendDataTypeProps.push("language?: LocaleInfoType");
|
|
982
|
-
const sendDataType = sendDataTypeProps.length > 0 ? `{ ${sendDataTypeProps.join("; ")} }` : "Record<string, unknown>";
|
|
983
|
-
const responseType = config.response ? `${typeName}["response"]` : "never";
|
|
984
|
-
const classDefinition = `export class ${className} {
|
|
985
|
-
public ${action}(${configType}): ISocket<${sendDataType}, ${responseType}> {
|
|
986
|
-
const url = ${urlExpression};
|
|
987
|
-
const socket = new Socket<${sendDataType}, ${responseType}>(url);
|
|
27
|
+
${U}`},kt=(t)=>{let w=l(t.name),u=`${w.charAt(0).toUpperCase()+w.slice(1)}RouteConfigType`,x=`${W(t.name)}Socket`,R=K(t),M=R==="never",C=M?"":`export type ${u} = ${R}`,E=t.params&&Object.keys(t.params).length>0,$=t.payload&&Object.keys(t.payload).length>0,A=t.queries&&Object.keys(t.queries).length>0,O=E?`params: ${u}["params"]`:"",d=`\`${Y(t.path,!1)}\``,I=[];if($)I.push(`payload: ${u}["payload"]`);if(A)I.push(`queries: ${u}["queries"]`);I.push("language?: LocaleInfoType");let H=I.length>0?`{ ${I.join("; ")} }`:"Record<string, unknown>",b=t.response?`${u}["response"]`:"never",G=`export class ${x} {
|
|
28
|
+
public ${w}(${O}): ISocket<${H}, ${b}> {
|
|
29
|
+
const url = ${d};
|
|
30
|
+
const socket = new Socket<${H}, ${b}>(url);
|
|
988
31
|
|
|
989
|
-
socket.onMessage((response: ResponseDataType<${
|
|
32
|
+
socket.onMessage((response: ResponseDataType<${b}>) => {
|
|
990
33
|
// TODO: Handle socket message event
|
|
991
34
|
});
|
|
992
35
|
|
|
@@ -998,155 +41,61 @@ var routeConfigToSocketString = (config) => {
|
|
|
998
41
|
// TODO: Handle socket close event
|
|
999
42
|
});
|
|
1000
43
|
|
|
1001
|
-
socket.onError((event: Event, response?: ResponseDataType<${
|
|
44
|
+
socket.onError((event: Event, response?: ResponseDataType<${b}>) => {
|
|
1002
45
|
// TODO: Handle socket error event
|
|
1003
46
|
});
|
|
1004
47
|
|
|
1005
48
|
return socket;
|
|
1006
49
|
}
|
|
1007
|
-
}
|
|
1008
|
-
const imports = `import type { ResponseDataType } from "@ooneex/http-response";
|
|
50
|
+
}`,F=`import type { ResponseDataType } from "@ooneex/http-response";
|
|
1009
51
|
import { type ISocket, Socket } from "@ooneex/socket/client";
|
|
1010
|
-
import type { LocaleInfoType } from "@ooneex/translation";`;
|
|
1011
|
-
return isNeverType ? `${imports}
|
|
52
|
+
import type { LocaleInfoType } from "@ooneex/translation";`;return M?`${F}
|
|
1012
53
|
|
|
1013
|
-
${
|
|
54
|
+
${G}`:`${F}
|
|
1014
55
|
|
|
1015
|
-
${
|
|
56
|
+
${C}
|
|
1016
57
|
|
|
1017
|
-
${
|
|
1018
|
-
|
|
1019
|
-
var routeConfigToHookString = (config) => {
|
|
1020
|
-
const action = getRouteAction(config.name);
|
|
1021
|
-
const typeName = `${action.charAt(0).toUpperCase() + action.slice(1)}RouteConfigType`;
|
|
1022
|
-
const hookName = `use${toPascalCase(config.name)}`;
|
|
1023
|
-
const method = config.method.toUpperCase();
|
|
1024
|
-
const typeString = routeConfigToTypeString(config);
|
|
1025
|
-
const isNeverType = typeString === "never";
|
|
1026
|
-
const typeDefinition = isNeverType ? "" : `export type ${typeName} = ${typeString}`;
|
|
1027
|
-
const queryMethods = ["GET", "HEAD", "OPTIONS"];
|
|
1028
|
-
const isQuery = queryMethods.includes(method);
|
|
1029
|
-
const hasParams = config.params && Object.keys(config.params).length > 0;
|
|
1030
|
-
const hasPayload = config.payload !== undefined;
|
|
1031
|
-
const hasQueries = config.queries !== undefined;
|
|
1032
|
-
const responseType = config.response ? `${typeName}["response"]` : "never";
|
|
1033
|
-
if (isQuery) {
|
|
1034
|
-
const configProps2 = [];
|
|
1035
|
-
if (hasParams) {
|
|
1036
|
-
configProps2.push(`params: ${typeName}["params"]`);
|
|
1037
|
-
}
|
|
1038
|
-
if (hasQueries) {
|
|
1039
|
-
configProps2.push(`queries?: ${typeName}["queries"]`);
|
|
1040
|
-
}
|
|
1041
|
-
const configParam = configProps2.length > 0 ? `config: {
|
|
1042
|
-
${configProps2.join(`;
|
|
58
|
+
${G}`},zt=(t)=>{let w=l(t.name),u=`${w.charAt(0).toUpperCase()+w.slice(1)}RouteConfigType`,x=`use${W(t.name)}`,R=t.method.toUpperCase(),M=K(t),C=M==="never",E=C?"":`export type ${u} = ${M}`,A=["GET","HEAD","OPTIONS"].includes(R),O=t.params&&Object.keys(t.params).length>0,z=t.payload!==void 0,d=t.queries!==void 0,I=t.response?`${u}["response"]`:"never";if(A){let L=[];if(O)L.push(`params: ${u}["params"]`);if(d)L.push(`queries?: ${u}["queries"]`);let m=L.length>0?`config: {
|
|
59
|
+
${L.join(`;
|
|
1043
60
|
`)};
|
|
1044
|
-
}`
|
|
1045
|
-
|
|
1046
|
-
const queryKeyBase = queryKeyParts.map((part) => `'${part}'`).join(", ");
|
|
1047
|
-
let queryKey = `[${queryKeyBase}`;
|
|
1048
|
-
if (hasParams && config.params) {
|
|
1049
|
-
const paramKeys = Object.keys(config.params);
|
|
1050
|
-
for (const paramKey of paramKeys) {
|
|
1051
|
-
queryKey += `, config.params.${paramKey}`;
|
|
1052
|
-
}
|
|
1053
|
-
}
|
|
1054
|
-
if (hasQueries) {
|
|
1055
|
-
queryKey += ", config.queries";
|
|
1056
|
-
}
|
|
1057
|
-
queryKey += "]";
|
|
1058
|
-
const urlPath2 = buildPathWithParams(config.path);
|
|
1059
|
-
let urlExpression2 = `\`${urlPath2}\``;
|
|
1060
|
-
if (hasQueries) {
|
|
1061
|
-
urlExpression2 = `\`${urlPath2}?\${${buildQueryString("config.queries")}}\``;
|
|
1062
|
-
}
|
|
1063
|
-
const fetcherMethod2 = method.toLowerCase();
|
|
1064
|
-
const fetchCall2 = `const fetcher = new Fetcher();
|
|
1065
|
-
const url = ${urlExpression2};
|
|
61
|
+
}`:"",Z=`[${t.name.split(".").map((D)=>`'${D}'`).join(", ")}`;if(O&&t.params){let D=Object.keys(t.params);for(let e of D)Z+=`, config.params.${e}`}if(d)Z+=", config.queries";Z+="]";let N=Y(t.path),S=`\`${N}\``;if(d)S=`\`${N}?\${${J("config.queries")}}\``;let h=R.toLowerCase(),y=`const fetcher = new Fetcher();
|
|
62
|
+
const url = ${S};
|
|
1066
63
|
|
|
1067
|
-
return await fetcher.${
|
|
1068
|
-
const hookDefinition2 = `export const ${hookName} = (${configParam}) => {
|
|
64
|
+
return await fetcher.${h}<${I}>(url);`,P=`export const ${x} = (${m}) => {
|
|
1069
65
|
return useQuery({
|
|
1070
|
-
queryKey: ${
|
|
66
|
+
queryKey: ${Z},
|
|
1071
67
|
queryFn: async () => {
|
|
1072
|
-
${
|
|
68
|
+
${y}
|
|
1073
69
|
},
|
|
1074
70
|
});
|
|
1075
|
-
}
|
|
1076
|
-
|
|
1077
|
-
import { Fetcher } from '@ooneex/fetcher';`;
|
|
1078
|
-
return isNeverType ? `${imports2}
|
|
71
|
+
};`,o=`import { useQuery } from '@tanstack/react-query';
|
|
72
|
+
import { Fetcher } from '@ooneex/fetcher';`;return C?`${o}
|
|
1079
73
|
|
|
1080
|
-
${
|
|
74
|
+
${P}`:`${o}
|
|
1081
75
|
|
|
1082
|
-
${
|
|
76
|
+
${E}
|
|
1083
77
|
|
|
1084
|
-
${
|
|
1085
|
-
|
|
1086
|
-
const configProps = [];
|
|
1087
|
-
if (hasParams) {
|
|
1088
|
-
configProps.push(`params: ${typeName}["params"]`);
|
|
1089
|
-
}
|
|
1090
|
-
if (hasPayload) {
|
|
1091
|
-
configProps.push(`payload: ${typeName}["payload"]`);
|
|
1092
|
-
}
|
|
1093
|
-
if (hasQueries) {
|
|
1094
|
-
configProps.push(`queries?: ${typeName}["queries"]`);
|
|
1095
|
-
}
|
|
1096
|
-
const mutationConfigType = configProps.length > 0 ? `config: {
|
|
1097
|
-
${configProps.join(`;
|
|
78
|
+
${P}`}let H=[];if(O)H.push(`params: ${u}["params"]`);if(z)H.push(`payload: ${u}["payload"]`);if(d)H.push(`queries?: ${u}["queries"]`);let b=H.length>0?`config: {
|
|
79
|
+
${H.join(`;
|
|
1098
80
|
`)};
|
|
1099
|
-
}
|
|
1100
|
-
|
|
1101
|
-
let urlExpression = `\`${urlPath}\``;
|
|
1102
|
-
if (hasQueries) {
|
|
1103
|
-
urlExpression = `\`${urlPath}\${config.queries ? \`?\${${buildQueryString("config.queries")}}\` : ''}\``;
|
|
1104
|
-
}
|
|
1105
|
-
const methodsWithPayload = ["POST", "PUT", "PATCH"];
|
|
1106
|
-
const hasFetchBody = methodsWithPayload.includes(method) && hasPayload;
|
|
1107
|
-
const fetcherMethod = method.toLowerCase();
|
|
1108
|
-
let fetchCall = `const fetcher = new Fetcher();
|
|
1109
|
-
const url = ${urlExpression};
|
|
81
|
+
}`:"config?: Record<string, never>",G=Y(t.path),F=`\`${G}\``;if(d)F=`\`${G}\${config.queries ? \`?\${${J("config.queries")}}\` : ''}\``;let B=["POST","PUT","PATCH"].includes(R)&&z,q=R.toLowerCase(),V=`const fetcher = new Fetcher();
|
|
82
|
+
const url = ${F};
|
|
1110
83
|
|
|
1111
|
-
`;
|
|
1112
|
-
if (hasFetchBody) {
|
|
1113
|
-
fetchCall += `return await fetcher.${fetcherMethod}<${responseType}>(url, config.payload);`;
|
|
1114
|
-
} else {
|
|
1115
|
-
fetchCall += `return await fetcher.${fetcherMethod}<${responseType}>(url);`;
|
|
1116
|
-
}
|
|
1117
|
-
const hookDefinition = `export const ${hookName} = () => {
|
|
84
|
+
`;if(B)V+=`return await fetcher.${q}<${I}>(url, config.payload);`;else V+=`return await fetcher.${q}<${I}>(url);`;let r=`export const ${x} = () => {
|
|
1118
85
|
const mutation = useMutation({
|
|
1119
|
-
mutationFn: async (${
|
|
1120
|
-
${
|
|
86
|
+
mutationFn: async (${b}) => {
|
|
87
|
+
${V}
|
|
1121
88
|
},
|
|
1122
89
|
});
|
|
1123
90
|
|
|
1124
91
|
return mutation;
|
|
1125
|
-
}
|
|
1126
|
-
|
|
1127
|
-
import { Fetcher } from '@ooneex/fetcher';`;
|
|
1128
|
-
return isNeverType ? `${imports}
|
|
92
|
+
};`,Q=`import { useMutation } from '@tanstack/react-query';
|
|
93
|
+
import { Fetcher } from '@ooneex/fetcher';`;return C?`${Q}
|
|
1129
94
|
|
|
1130
|
-
${
|
|
95
|
+
${r}`:`${Q}
|
|
1131
96
|
|
|
1132
|
-
${
|
|
97
|
+
${E}
|
|
1133
98
|
|
|
1134
|
-
${
|
|
1135
|
-
};
|
|
1136
|
-
export {
|
|
1137
|
-
router,
|
|
1138
|
-
routeConfigToTypeString,
|
|
1139
|
-
routeConfigToSocketString,
|
|
1140
|
-
routeConfigToJsonDoc,
|
|
1141
|
-
routeConfigToHookString,
|
|
1142
|
-
routeConfigToFetcherString,
|
|
1143
|
-
isValidRoutePath,
|
|
1144
|
-
extractParameterNames,
|
|
1145
|
-
VALID_NAMESPACES,
|
|
1146
|
-
VALID_ACTIONS,
|
|
1147
|
-
RouterException,
|
|
1148
|
-
Router,
|
|
1149
|
-
Route
|
|
1150
|
-
};
|
|
99
|
+
${r}`};export{_ as router,K as routeConfigToTypeString,kt as routeConfigToSocketString,Ot as routeConfigToJsonDoc,zt as routeConfigToHookString,Gt as routeConfigToFetcherString,Tt as isValidRoutePath,c as extractParameterNames,dt as VALID_NAMESPACES,It as VALID_ACTIONS,T as RouterException,j as Router,g as Route};
|
|
1151
100
|
|
|
1152
|
-
//# debugId=
|
|
101
|
+
//# debugId=71957B2AF18D3E1B64756E2164756E21
|