@lerianstudio/sindarian-server 1.0.0-beta.15 → 1.0.0-beta.17
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/dependency-injection/container.d.ts.map +1 -1
- package/dist/dependency-injection/container.js +3 -1
- package/dist/dependency-injection/container.js.map +1 -1
- package/dist/server/server-factory.d.ts.map +1 -1
- package/dist/server/server-factory.js +35 -11
- package/dist/server/server-factory.js.map +1 -1
- package/dist/utils/routes/route-specificity.d.ts +40 -0
- package/dist/utils/routes/route-specificity.d.ts.map +1 -0
- package/dist/utils/routes/route-specificity.js +89 -0
- package/dist/utils/routes/route-specificity.js.map +1 -0
- package/dist/utils/url/url-match.d.ts.map +1 -1
- package/dist/utils/url/url-match.js +16 -2
- package/dist/utils/url/url-match.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/dependency-injection/container.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,SAAS,IAAI,kBAAkB,EAC/B,iBAAiB,EAClB,MAAM,WAAW,CAAA;AAElB;;;GAGG;AACH,qBAAa,SAAS;IACb,SAAS,EAAE,kBAAkB,CAAA;IACpC,OAAO,CAAC,aAAa,CAAkC;;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/dependency-injection/container.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,SAAS,IAAI,kBAAkB,EAC/B,iBAAiB,EAClB,MAAM,WAAW,CAAA;AAElB;;;GAGG;AACH,qBAAa,SAAS;IACb,SAAS,EAAE,kBAAkB,CAAA;IACpC,OAAO,CAAC,aAAa,CAAkC;;IAQvD;;;;;OAKG;IACH,IAAI,CAAC,MAAM,EAAE,eAAe;IAgB5B,IAAI,CAAC,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;IAIvE,GAAG,CAAC,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC;IAIlD,QAAQ,CAAC,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhE,WAAW,CAAC,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAIrE,OAAO,CAAC,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO;IAI5D,MAAM,CAAC,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;CAGzD;AAED,MAAM,MAAM,uBAAuB,GAAG,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAA;AAEpE;;;;GAIG;AACH,qBAAa,eAAe;IACnB,QAAQ,EAAE,uBAAuB,CAAA;gBAE5B,QAAQ,EAAE,uBAAuB;CAG9C"}
|
|
@@ -9,7 +9,9 @@ const inversify_1 = require("inversify");
|
|
|
9
9
|
class Container {
|
|
10
10
|
constructor() {
|
|
11
11
|
this.loadedModules = new Set();
|
|
12
|
-
this.container = new inversify_1.Container(
|
|
12
|
+
this.container = new inversify_1.Container({
|
|
13
|
+
defaultScope: 'Singleton'
|
|
14
|
+
});
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
17
|
* Loads a module into the container.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/dependency-injection/container.ts"],"names":[],"mappings":";;;AAAA,yCAIkB;AAElB;;;GAGG;AACH,MAAa,SAAS;IAIpB;QAFQ,kBAAa,GAAyB,IAAI,GAAG,EAAE,CAAA;QAGrD,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAkB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/dependency-injection/container.ts"],"names":[],"mappings":";;;AAAA,yCAIkB;AAElB;;;GAGG;AACH,MAAa,SAAS;IAIpB;QAFQ,kBAAa,GAAyB,IAAI,GAAG,EAAE,CAAA;QAGrD,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAkB,CAAC;YACtC,YAAY,EAAE,WAAW;SAC1B,CAAC,CAAA;IACJ,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,MAAuB;QAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CACb,qBAAqB,MAAM,kCAAkC,CAC9D,CAAA;QACH,CAAC;QAED,wDAAwD;QACxD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,OAAM;QACR,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAE9B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED,IAAI,CAAI,iBAAuC;QAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC/C,CAAC;IAED,GAAG,CAAI,iBAAuC;QAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAC9C,CAAC;IAED,QAAQ,CAAI,iBAAuC;QACjD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IACnD,CAAC;IAED,WAAW,CAAI,iBAAuC;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAA;IACtD,CAAC;IAED,OAAO,CAAI,iBAAuC;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,CAAI,iBAAuC;QAC/C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAC1C,CAAC;CACF;AAvDD,8BAuDC;AAID;;;;GAIG;AACH,MAAa,eAAe;IAG1B,YAAY,QAAiC;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CACF;AAND,0CAMC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-factory.d.ts","sourceRoot":"","sources":["../../src/server/server-factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAI5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAiB,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAI1E,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAIvD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"server-factory.d.ts","sourceRoot":"","sources":["../../src/server/server-factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAI5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAiB,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAI1E,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAErC,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAIvD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAMtD,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAA;CACjC,CAAA;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,aAAa,CAAiD;IACtE,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,WAAW,CAAsB;IAEzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAO;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE;WAQ3D,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,oBAAoB;IAgBlE;;;OAGG;IACI,eAAe,CAAC,MAAM,EAAE,MAAM;IAI9B,gBAAgB,CAAC,GAAG,OAAO,EAAE,eAAe,EAAE;IAI9C,qBAAqB,CAAC,GAAG,YAAY,EAAE,WAAW,EAAE;IAIpD,cAAc,CAAC,GAAG,KAAK,EAAE,aAAa,EAAE;IAI/C;;;;;OAKG;IACU,OAAO,CAClB,OAAO,EAAE,WAAW,EACpB,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;KAAE;IAgFtC,OAAO,CAAC,MAAM,CAAC,eAAe;IAM9B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAoBrB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;YAiBL,kBAAkB;IAwBhC,OAAO,CAAC,aAAa;YAiBP,sBAAsB;IAqBpC;;;;;OAKG;YACW,WAAW;CAyB1B"}
|
|
@@ -21,6 +21,7 @@ const lodash_1 = require("lodash");
|
|
|
21
21
|
const pipes_1 = require("../services/pipes");
|
|
22
22
|
const use_pipes_1 = require("../pipes/decorators/use-pipes");
|
|
23
23
|
const route_decorator_1 = require("../controllers/decorators/route-decorator");
|
|
24
|
+
const route_specificity_1 = require("../utils/routes/route-specificity");
|
|
24
25
|
class ServerFactory {
|
|
25
26
|
constructor(module, container, routes) {
|
|
26
27
|
this.globalPrefix = '';
|
|
@@ -37,7 +38,10 @@ class ServerFactory {
|
|
|
37
38
|
this._registerLogger(options?.logger);
|
|
38
39
|
container.load(module.prototype[keys_1.MODULE_PROPERTY]);
|
|
39
40
|
const routes = (0, module_decorator_1.moduleHandler)(module);
|
|
40
|
-
|
|
41
|
+
// Sort routes by specificity (most specific first)
|
|
42
|
+
// This ensures routes like /users/active match before /users/:id
|
|
43
|
+
const sortedRoutes = (0, route_specificity_1.sortRoutesBySpecificity)(routes);
|
|
44
|
+
return new ServerFactory(module, container, sortedRoutes);
|
|
41
45
|
}
|
|
42
46
|
/**
|
|
43
47
|
* Set the global prefix for the server
|
|
@@ -115,7 +119,15 @@ class ServerFactory {
|
|
|
115
119
|
*/
|
|
116
120
|
_parseRequest(request) {
|
|
117
121
|
const { pathname } = new URL(request.url);
|
|
118
|
-
|
|
122
|
+
// Strip the global prefix from the pathname
|
|
123
|
+
let strippedPathname = pathname;
|
|
124
|
+
if (this.globalPrefix && pathname.startsWith(this.globalPrefix)) {
|
|
125
|
+
strippedPathname = pathname.slice(this.globalPrefix.length);
|
|
126
|
+
}
|
|
127
|
+
// Ensure pathname starts with / after stripping prefix
|
|
128
|
+
if (!strippedPathname.startsWith('/')) {
|
|
129
|
+
strippedPathname = '/' + strippedPathname;
|
|
130
|
+
}
|
|
119
131
|
return {
|
|
120
132
|
pathname: strippedPathname,
|
|
121
133
|
method: request.method.toUpperCase()
|
|
@@ -143,10 +155,14 @@ class ServerFactory {
|
|
|
143
155
|
async _fetchInterceptors(controller) {
|
|
144
156
|
const interceptors = [...this.globalInterceptors];
|
|
145
157
|
// Fetch all registered global interceptors
|
|
146
|
-
|
|
147
|
-
if (appInterceptor) {
|
|
158
|
+
try {
|
|
148
159
|
const appInterceptors = await this.container.getAllAsync(interceptor_1.APP_INTERCEPTOR);
|
|
149
|
-
|
|
160
|
+
if (appInterceptors.length > 0) {
|
|
161
|
+
interceptors.push(...appInterceptors);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// No bindings found or error retrieving - continue without APP_INTERCEPTOR providers
|
|
150
166
|
}
|
|
151
167
|
if (controller) {
|
|
152
168
|
// Fetch controller interceptors
|
|
@@ -165,10 +181,14 @@ class ServerFactory {
|
|
|
165
181
|
async _fetchExceptionFilters(controller) {
|
|
166
182
|
const filters = [...this.globalFilters];
|
|
167
183
|
// Fetch all registered global filters
|
|
168
|
-
|
|
169
|
-
if (appFilter) {
|
|
184
|
+
try {
|
|
170
185
|
const appFilters = await this.container.getAllAsync(filters_1.APP_FILTER);
|
|
171
|
-
|
|
186
|
+
if (appFilters.length > 0) {
|
|
187
|
+
filters.push(...appFilters);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// No bindings found or error retrieving - continue without APP_FILTER providers
|
|
172
192
|
}
|
|
173
193
|
if (controller) {
|
|
174
194
|
filters.push(...(await use_filters_decorator_1.FilterHandler.fetch(this.container, controller)));
|
|
@@ -184,10 +204,14 @@ class ServerFactory {
|
|
|
184
204
|
async _fetchPipes(controller, methodName) {
|
|
185
205
|
const pipes = [...this.globalPipes];
|
|
186
206
|
// Fetch all registered global pipes
|
|
187
|
-
|
|
188
|
-
if (appPipe) {
|
|
207
|
+
try {
|
|
189
208
|
const appPipes = await this.container.getAllAsync(pipes_1.APP_PIPE);
|
|
190
|
-
|
|
209
|
+
if (appPipes.length > 0) {
|
|
210
|
+
pipes.push(...appPipes);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// No bindings found or error retrieving - continue without APP_PIPE providers
|
|
191
215
|
}
|
|
192
216
|
// Fetch controller pipes
|
|
193
217
|
if (controller) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-factory.js","sourceRoot":"","sources":["../../src/server/server-factory.ts"],"names":[],"mappings":";;;AAAA,6DAAwD;AACxD,mEAA8D;AAC9D,2CAAkD;AAElD,gEAA4D;AAC5D,8EAAwE;AACxE,6EAAsE;AACtE,yFAA6E;AAE7E,kGAAuF;AAEvF,iEAA0E;AAC1E,gDAA+C;AAC/C,wDAAwD;AACxD,gDAAgD;AAEhD,qDAAgD;AAChD,wCAAuD;AAEvD,4CAAwC;AACxC,8DAAiE;AACjE,mCAA8B;AAE9B,4CAA2C;AAC3C,4DAA0D;AAC1D,8EAAuE;
|
|
1
|
+
{"version":3,"file":"server-factory.js","sourceRoot":"","sources":["../../src/server/server-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ModuleMetadata } from '../../modules/module-decorator';
|
|
2
|
+
/**
|
|
3
|
+
* Sort routes by specificity (most specific first)
|
|
4
|
+
* Routes with more static segments come before routes with parameters
|
|
5
|
+
* This matches NestJS behavior to ensure routes like:
|
|
6
|
+
* - GET /organizations/:id/ledgers/with-assets (more specific)
|
|
7
|
+
* - GET /organizations/:id/ledgers/:ledgerId (less specific)
|
|
8
|
+
* are matched in the correct order
|
|
9
|
+
*
|
|
10
|
+
* @param routes - Array of route metadata to sort
|
|
11
|
+
* @returns Sorted array with most specific routes first
|
|
12
|
+
*/
|
|
13
|
+
export declare function sortRoutesBySpecificity(routes: ModuleMetadata[]): ModuleMetadata[];
|
|
14
|
+
/**
|
|
15
|
+
* Calculate specificity score for a route path
|
|
16
|
+
* Higher score = more specific route
|
|
17
|
+
*
|
|
18
|
+
* This algorithm is based on the route-sort library by Luke Edwards
|
|
19
|
+
* https://github.com/lukeed/route-sort
|
|
20
|
+
*
|
|
21
|
+
* Segment Values (lower = more specific):
|
|
22
|
+
* - Static segment: 1
|
|
23
|
+
* - Parameter (:id): 111
|
|
24
|
+
* - Parameter with suffix (:id.format): 11
|
|
25
|
+
* - Optional parameter (:id?): 1111
|
|
26
|
+
* - Wildcard (*): 100000000000 (1e11)
|
|
27
|
+
*
|
|
28
|
+
* Rank = (segment_count - 1) / sum_of_segment_values
|
|
29
|
+
* Higher rank = more specific route
|
|
30
|
+
*
|
|
31
|
+
* Examples:
|
|
32
|
+
* - /users/active (2 static) = 1 / 2 = 0.5
|
|
33
|
+
* - /users/:id (1 static + 1 param) = 1 / 112 = ~0.0089
|
|
34
|
+
* - /users/* (1 static + 1 wildcard) = 1 / 100000000001 = ~1e-11
|
|
35
|
+
*
|
|
36
|
+
* @param path - The route path to score
|
|
37
|
+
* @returns Specificity score (higher = more specific)
|
|
38
|
+
*/
|
|
39
|
+
export declare function calculateRouteSpecificity(path: string): number;
|
|
40
|
+
//# sourceMappingURL=route-specificity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-specificity.d.ts","sourceRoot":"","sources":["../../../src/utils/routes/route-specificity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EAAE,GACvB,cAAc,EAAE,CAMlB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiB9D"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sortRoutesBySpecificity = sortRoutesBySpecificity;
|
|
4
|
+
exports.calculateRouteSpecificity = calculateRouteSpecificity;
|
|
5
|
+
/**
|
|
6
|
+
* Sort routes by specificity (most specific first)
|
|
7
|
+
* Routes with more static segments come before routes with parameters
|
|
8
|
+
* This matches NestJS behavior to ensure routes like:
|
|
9
|
+
* - GET /organizations/:id/ledgers/with-assets (more specific)
|
|
10
|
+
* - GET /organizations/:id/ledgers/:ledgerId (less specific)
|
|
11
|
+
* are matched in the correct order
|
|
12
|
+
*
|
|
13
|
+
* @param routes - Array of route metadata to sort
|
|
14
|
+
* @returns Sorted array with most specific routes first
|
|
15
|
+
*/
|
|
16
|
+
function sortRoutesBySpecificity(routes) {
|
|
17
|
+
return [...routes].sort((a, b) => {
|
|
18
|
+
const aScore = calculateRouteSpecificity(a.path);
|
|
19
|
+
const bScore = calculateRouteSpecificity(b.path);
|
|
20
|
+
return bScore - aScore; // Higher score = more specific = comes first
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Calculate specificity score for a route path
|
|
25
|
+
* Higher score = more specific route
|
|
26
|
+
*
|
|
27
|
+
* This algorithm is based on the route-sort library by Luke Edwards
|
|
28
|
+
* https://github.com/lukeed/route-sort
|
|
29
|
+
*
|
|
30
|
+
* Segment Values (lower = more specific):
|
|
31
|
+
* - Static segment: 1
|
|
32
|
+
* - Parameter (:id): 111
|
|
33
|
+
* - Parameter with suffix (:id.format): 11
|
|
34
|
+
* - Optional parameter (:id?): 1111
|
|
35
|
+
* - Wildcard (*): 100000000000 (1e11)
|
|
36
|
+
*
|
|
37
|
+
* Rank = (segment_count - 1) / sum_of_segment_values
|
|
38
|
+
* Higher rank = more specific route
|
|
39
|
+
*
|
|
40
|
+
* Examples:
|
|
41
|
+
* - /users/active (2 static) = 1 / 2 = 0.5
|
|
42
|
+
* - /users/:id (1 static + 1 param) = 1 / 112 = ~0.0089
|
|
43
|
+
* - /users/* (1 static + 1 wildcard) = 1 / 100000000001 = ~1e-11
|
|
44
|
+
*
|
|
45
|
+
* @param path - The route path to score
|
|
46
|
+
* @returns Specificity score (higher = more specific)
|
|
47
|
+
*/
|
|
48
|
+
function calculateRouteSpecificity(path) {
|
|
49
|
+
const segments = path.split('/').filter((s) => s.length > 0);
|
|
50
|
+
if (segments.length === 0) {
|
|
51
|
+
// Root path is treated as a static route
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
let totalValue = 0;
|
|
55
|
+
for (const segment of segments) {
|
|
56
|
+
totalValue += getSegmentValue(segment);
|
|
57
|
+
}
|
|
58
|
+
// Calculate rank: (segment_count - 1) / total_value
|
|
59
|
+
// Higher rank = more specific
|
|
60
|
+
return (segments.length - 1) / totalValue;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get numeric value for a route segment
|
|
64
|
+
* Lower value = more specific
|
|
65
|
+
*
|
|
66
|
+
* @param segment - Route segment to evaluate
|
|
67
|
+
* @returns Numeric value representing specificity
|
|
68
|
+
*/
|
|
69
|
+
function getSegmentValue(segment) {
|
|
70
|
+
// Wildcard
|
|
71
|
+
if (segment === '*') {
|
|
72
|
+
return 1e11;
|
|
73
|
+
}
|
|
74
|
+
// Optional parameter (:id?)
|
|
75
|
+
if (/^:.*\?$/.test(segment)) {
|
|
76
|
+
return 1111;
|
|
77
|
+
}
|
|
78
|
+
// Parameter with suffix (:id.format)
|
|
79
|
+
if (/^:.*\./.test(segment)) {
|
|
80
|
+
return 11;
|
|
81
|
+
}
|
|
82
|
+
// Regular parameter (:id)
|
|
83
|
+
if (segment.startsWith(':')) {
|
|
84
|
+
return 111;
|
|
85
|
+
}
|
|
86
|
+
// Static segment
|
|
87
|
+
return 1;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=route-specificity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-specificity.js","sourceRoot":"","sources":["../../../src/utils/routes/route-specificity.ts"],"names":[],"mappings":";;AAaA,0DAQC;AA2BD,8DAiBC;AA/DD;;;;;;;;;;GAUG;AACH,SAAgB,uBAAuB,CACrC,MAAwB;IAExB,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAChD,MAAM,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAChD,OAAO,MAAM,GAAG,MAAM,CAAA,CAAC,6CAA6C;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAgB,yBAAyB,CAAC,IAAY;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAE5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,yCAAyC;QACzC,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,UAAU,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC;IAED,oDAAoD;IACpD,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAU,CAAA;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,OAAe;IACtC,WAAW;IACX,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,4BAA4B;IAC5B,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,qCAAqC;IACrC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAA;IACX,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,iBAAiB;IACjB,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-match.d.ts","sourceRoot":"","sources":["../../../src/utils/url/url-match.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"url-match.d.ts","sourceRoot":"","sources":["../../../src/utils/url/url-match.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,WAOvD"}
|
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.urlMatch = urlMatch;
|
|
4
4
|
const path_to_regexp_1 = require("path-to-regexp");
|
|
5
|
+
/**
|
|
6
|
+
* Normalize a path by removing trailing slashes (except for root path)
|
|
7
|
+
* @param path - The path to normalize
|
|
8
|
+
* @returns The normalized path
|
|
9
|
+
*/
|
|
10
|
+
function normalizePath(path) {
|
|
11
|
+
if (path === '/' || path === '') {
|
|
12
|
+
return path;
|
|
13
|
+
}
|
|
14
|
+
return path.endsWith('/') ? path.slice(0, -1) : path;
|
|
15
|
+
}
|
|
5
16
|
/**
|
|
6
17
|
* Check if a pathname matches a route
|
|
7
18
|
* @param pathname - The pathname to check
|
|
@@ -9,7 +20,10 @@ const path_to_regexp_1 = require("path-to-regexp");
|
|
|
9
20
|
* @returns True if the pathname matches the route, false otherwise
|
|
10
21
|
*/
|
|
11
22
|
function urlMatch(pathname, route) {
|
|
12
|
-
|
|
13
|
-
|
|
23
|
+
// Normalize both paths to handle Next.js trailingSlash configuration
|
|
24
|
+
const normalizedPathname = normalizePath(pathname);
|
|
25
|
+
const normalizedRoute = normalizePath(route);
|
|
26
|
+
const { regexp } = (0, path_to_regexp_1.pathToRegexp)(normalizedRoute);
|
|
27
|
+
return regexp.test(normalizedPathname);
|
|
14
28
|
}
|
|
15
29
|
//# sourceMappingURL=url-match.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-match.js","sourceRoot":"","sources":["../../../src/utils/url/url-match.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"url-match.js","sourceRoot":"","sources":["../../../src/utils/url/url-match.ts"],"names":[],"mappings":";;AAoBA,4BAOC;AA3BD,mDAA6C;AAE7C;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACtD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,QAAQ,CAAC,QAAgB,EAAE,KAAa;IACtD,qEAAqE;IACrE,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAClD,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IAE5C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAY,EAAC,eAAe,CAAC,CAAA;IAChD,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;AACxC,CAAC"}
|