koa-micro-ts 6.0.0 → 6.0.1
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/README.md +9 -3
- package/dist/autoRoute.js +19 -8
- package/dist/autoRoute.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -66,6 +66,12 @@ run unchanged — see the breaking changes and the upgrade path below.
|
|
|
66
66
|
- Wildcard routes (`exports.star`) now generate a **named** wildcard
|
|
67
67
|
`{/*path}` instead of a bare `/*`. A bare `*` is rejected by path-to-regexp 8
|
|
68
68
|
and threw on route registration (`Missing parameter name at index ...`)
|
|
69
|
+
- `star` is now a regular token like `detail`: it works for **every** method and
|
|
70
|
+
at any position in the export name (`post_star`, `put_detail_star`,
|
|
71
|
+
`delete_star`, …), so a path-based resource API can be expressed through
|
|
72
|
+
`autoRoute` alone — with API doc and automatic `jwt.middleware()`. Only export
|
|
73
|
+
names are affected: a `star` **directory** still maps to a literal `/star`
|
|
74
|
+
segment
|
|
69
75
|
- The matched remainder is no longer an unnamed index param: use
|
|
70
76
|
`ctx.params.path` instead of `ctx.params[0]`. It is `undefined` (not `''`)
|
|
71
77
|
when nothing follows the base, so default it when you post-process it
|
|
@@ -95,9 +101,9 @@ rule: replace `router.get('/files/*', ...)` with
|
|
|
95
101
|
`router.get('/files{/*path}', ...)`.
|
|
96
102
|
|
|
97
103
|
- `autoRoute()` now logs a **warning** when it registers a route below an
|
|
98
|
-
already registered wildcard. That combination is a silent
|
|
99
|
-
hole: a public wildcard swallows authenticated routes mounted
|
|
100
|
-
prefix afterwards, so their `jwt.middleware()` never runs — see
|
|
104
|
+
already registered wildcard of the same method. That combination is a silent
|
|
105
|
+
authorization hole: a public wildcard swallows authenticated routes mounted
|
|
106
|
+
at the same prefix afterwards, so their `jwt.middleware()` never runs — see
|
|
101
107
|
[AUTOROUTES.md](docs/AUTOROUTES.md)
|
|
102
108
|
|
|
103
109
|
## Version 5 - Breaking Changes
|
package/dist/autoRoute.js
CHANGED
|
@@ -17,7 +17,7 @@ const heads = {
|
|
|
17
17
|
list: { method: 'get' },
|
|
18
18
|
get: { method: 'get', seg: 'get' },
|
|
19
19
|
set: { method: 'get', seg: 'set' },
|
|
20
|
-
star: { method: 'get', seg: '
|
|
20
|
+
star: { method: 'get', seg: 'star' },
|
|
21
21
|
detail: { method: 'get', seg: 'detail' },
|
|
22
22
|
post: { method: 'post' },
|
|
23
23
|
put: { method: 'put' },
|
|
@@ -42,7 +42,17 @@ const routeFromExport = (baseUrl, key) => {
|
|
|
42
42
|
n += 1;
|
|
43
43
|
return n === 1 ? '/:id' : `/:id${n}`;
|
|
44
44
|
});
|
|
45
|
-
|
|
45
|
+
const baseStars = (baseUrl.replace(/\\/g, '/').match(/\/star(?=\/|$)/g) || []).length;
|
|
46
|
+
let seen = 0;
|
|
47
|
+
let w = 0;
|
|
48
|
+
url = url.replace(/\/star(?=\/|$)/g, (match) => {
|
|
49
|
+
seen += 1;
|
|
50
|
+
if (seen <= baseStars) {
|
|
51
|
+
return match;
|
|
52
|
+
}
|
|
53
|
+
w += 1;
|
|
54
|
+
return w === 1 ? '{/*path}' : `{/*path${w}}`;
|
|
55
|
+
});
|
|
46
56
|
return { method: head.method, url };
|
|
47
57
|
};
|
|
48
58
|
exports.routeFromExport = routeFromExport;
|
|
@@ -66,8 +76,8 @@ const autoRoute = async (app, routepath, mountpoint, auth) => {
|
|
|
66
76
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
67
77
|
mountpoint = mountpoint !== null && mountpoint !== void 0 ? mountpoint : '';
|
|
68
78
|
auth = auth !== null && auth !== void 0 ? auth : false;
|
|
69
|
-
app.
|
|
70
|
-
const shadowedBy = (url) => app.
|
|
79
|
+
app.wildcardRoutes = (_a = app.wildcardRoutes) !== null && _a !== void 0 ? _a : [];
|
|
80
|
+
const shadowedBy = (method, url) => app.wildcardRoutes.find((w) => w.method === method && (url === w.prefix || url.startsWith(`${w.prefix}/`)));
|
|
71
81
|
const routes = new router_1.default({
|
|
72
82
|
prefix: mountpoint
|
|
73
83
|
});
|
|
@@ -113,12 +123,13 @@ const autoRoute = async (app, routepath, mountpoint, auth) => {
|
|
|
113
123
|
(0, apiDoc_1.autoDocEntry)(docObj, group, route.method, `${mountpoint}${route.url}`, auth, (_d = docsMeta[key]) !== null && _d !== void 0 ? _d : reducedDocs[key]);
|
|
114
124
|
}
|
|
115
125
|
const fullUrl = `${mountpoint}${route.url}`;
|
|
116
|
-
const shadow = shadowedBy(fullUrl);
|
|
126
|
+
const shadow = shadowedBy(route.method, fullUrl);
|
|
117
127
|
if (shadow) {
|
|
118
|
-
(_e = app === null || app === void 0 ? void 0 : app.log) === null || _e === void 0 ? void 0 : _e.warn(`autoRoute: ${route.method.toUpperCase()} ${fullUrl} is shadowed by the wildcard route ${shadow}
|
|
128
|
+
(_e = app === null || app === void 0 ? void 0 : app.log) === null || _e === void 0 ? void 0 : _e.warn(`autoRoute: ${route.method.toUpperCase()} ${fullUrl} is shadowed by the wildcard route ${shadow.url}${auth ? ' — its jwt auth will never run' : ''}`);
|
|
119
129
|
}
|
|
120
|
-
|
|
121
|
-
|
|
130
|
+
const terminalWildcard = /\{\/\*path\d*\}$/.exec(fullUrl);
|
|
131
|
+
if (terminalWildcard) {
|
|
132
|
+
app.wildcardRoutes.push({ method: route.method, url: fullUrl, prefix: fullUrl.slice(0, terminalWildcard.index) });
|
|
122
133
|
}
|
|
123
134
|
if (((_f = app === null || app === void 0 ? void 0 : app.log) === null || _f === void 0 ? void 0 : _f.level) && app.log.level === log_1.LogLevels.all) {
|
|
124
135
|
app.log.note(` ${fullUrl} --- ${route.method} - Function: ${key}`, false, false);
|
package/dist/autoRoute.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoRoute.js","sourceRoot":"","sources":["../src/autoRoute.ts"],"names":[],"mappings":";;;;;;AAsBA,yDAAiC;AACjC,qCAAgD;AAChD,yCAAiC;AACjC,qCAAsF;AACtF,gDAAwB;AACxB,+BAAkC;AAGlC,MAAM,cAAc,GAAG,WAAW,CAAC;AACnC,MAAM,cAAc,GAAG,WAAW,CAAC;AAKnC,MAAM,KAAK,GAAwD;IACjE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IACxB,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IACvB,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;IAClC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE;IAClC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"autoRoute.js","sourceRoot":"","sources":["../src/autoRoute.ts"],"names":[],"mappings":"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"}
|