@tripod311/currents 0.0.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/README.md +257 -0
- package/dist/binaryBody.d.ts +3 -0
- package/dist/binaryBody.d.ts.map +1 -0
- package/dist/binaryBody.js +14 -0
- package/dist/binaryBody.js.map +1 -0
- package/dist/body/binaryBody.d.ts +3 -0
- package/dist/body/binaryBody.d.ts.map +1 -0
- package/dist/body/binaryBody.js +14 -0
- package/dist/body/binaryBody.js.map +1 -0
- package/dist/body/formBody.d.ts +3 -0
- package/dist/body/formBody.d.ts.map +1 -0
- package/dist/body/formBody.js +15 -0
- package/dist/body/formBody.js.map +1 -0
- package/dist/body/jsonBody.d.ts +3 -0
- package/dist/body/jsonBody.d.ts.map +1 -0
- package/dist/body/jsonBody.js +7 -0
- package/dist/body/jsonBody.js.map +1 -0
- package/dist/body/multipartBody.d.ts +3 -0
- package/dist/body/multipartBody.d.ts.map +1 -0
- package/dist/body/multipartBody.js +115 -0
- package/dist/body/multipartBody.js.map +1 -0
- package/dist/body/textBody.d.ts +3 -0
- package/dist/body/textBody.d.ts.map +1 -0
- package/dist/body/textBody.js +7 -0
- package/dist/body/textBody.js.map +1 -0
- package/dist/context.d.ts +43 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +129 -0
- package/dist/context.js.map +1 -0
- package/dist/cookie.d.ts +13 -0
- package/dist/cookie.d.ts.map +1 -0
- package/dist/cookie.js +61 -0
- package/dist/cookie.js.map +1 -0
- package/dist/cors.d.ts +9 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +34 -0
- package/dist/cors.js.map +1 -0
- package/dist/currents.d.ts +41 -0
- package/dist/currents.d.ts.map +1 -0
- package/dist/currents.js +172 -0
- package/dist/currents.js.map +1 -0
- package/dist/formBody.d.ts +2 -0
- package/dist/formBody.d.ts.map +1 -0
- package/dist/formBody.js +2 -0
- package/dist/formBody.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/jsonBody.d.ts +2 -0
- package/dist/jsonBody.d.ts.map +1 -0
- package/dist/jsonBody.js +2 -0
- package/dist/jsonBody.js.map +1 -0
- package/dist/multipartBody.d.ts +2 -0
- package/dist/multipartBody.d.ts.map +1 -0
- package/dist/multipartBody.js +2 -0
- package/dist/multipartBody.js.map +1 -0
- package/dist/router.d.ts +24 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +113 -0
- package/dist/router.js.map +1 -0
- package/dist/security.d.ts +16 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +34 -0
- package/dist/security.js.map +1 -0
- package/dist/static.d.ts +9 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/static.js +71 -0
- package/dist/static.js.map +1 -0
- package/dist/textBody.d.ts +3 -0
- package/dist/textBody.d.ts.map +1 -0
- package/dist/textBody.js +4 -0
- package/dist/textBody.js.map +1 -0
- package/package.json +31 -0
package/dist/router.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Context } from "./context.js";
|
|
2
|
+
export class Router {
|
|
3
|
+
staticRoutes = [];
|
|
4
|
+
parametricRoutes = [];
|
|
5
|
+
wildcardRoutes = [];
|
|
6
|
+
add(path, handlers) {
|
|
7
|
+
const { pattern, keys } = Router.pathToRegex(path);
|
|
8
|
+
const route = {
|
|
9
|
+
pathname: path,
|
|
10
|
+
pattern: pattern,
|
|
11
|
+
keys: keys,
|
|
12
|
+
staticParts: 0,
|
|
13
|
+
parametricParts: 0,
|
|
14
|
+
handlers: handlers
|
|
15
|
+
};
|
|
16
|
+
let isWildCard = false;
|
|
17
|
+
const sp = path.split('/');
|
|
18
|
+
for (const hop of sp) {
|
|
19
|
+
if (hop === "*") {
|
|
20
|
+
if (sp.indexOf(hop) !== sp.length - 1) {
|
|
21
|
+
console.warn(`Wildcard '*' should be last hop: ${path}`);
|
|
22
|
+
}
|
|
23
|
+
isWildCard = true;
|
|
24
|
+
}
|
|
25
|
+
else if (hop.charAt(0) === ':') {
|
|
26
|
+
route.parametricParts++;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
route.staticParts++;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (isWildCard) {
|
|
33
|
+
this.injectRoute(route, this.wildcardRoutes);
|
|
34
|
+
}
|
|
35
|
+
else if (route.parametricParts > 0) {
|
|
36
|
+
this.injectRoute(route, this.parametricRoutes);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
this.injectRoute(route, this.staticRoutes);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
injectRoute(route, collection) {
|
|
43
|
+
let index = 0;
|
|
44
|
+
while (index < collection.length) {
|
|
45
|
+
const r = collection[index];
|
|
46
|
+
if ((r.parametricParts < route.parametricParts) ||
|
|
47
|
+
(r.parametricParts === route.parametricParts && r.staticParts < route.staticParts)) {
|
|
48
|
+
collection.splice(index, 0, route);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
index++;
|
|
52
|
+
}
|
|
53
|
+
collection.push(route);
|
|
54
|
+
}
|
|
55
|
+
static pathToRegex(path) {
|
|
56
|
+
const keys = [];
|
|
57
|
+
const regex = path
|
|
58
|
+
.split("/")
|
|
59
|
+
.map(seg => {
|
|
60
|
+
if (seg.startsWith(":")) {
|
|
61
|
+
keys.push(seg.slice(1));
|
|
62
|
+
return "([^/]+)";
|
|
63
|
+
}
|
|
64
|
+
if (seg === "*") {
|
|
65
|
+
return "(.*)?";
|
|
66
|
+
}
|
|
67
|
+
return seg.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // escape
|
|
68
|
+
})
|
|
69
|
+
.join("/");
|
|
70
|
+
return {
|
|
71
|
+
pattern: new RegExp("^" + regex + "$"),
|
|
72
|
+
keys
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
match(pathname) {
|
|
76
|
+
for (const route of this.staticRoutes) {
|
|
77
|
+
if (pathname === route.pathname) {
|
|
78
|
+
return {
|
|
79
|
+
handlers: route.handlers,
|
|
80
|
+
params: {}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (const route of this.parametricRoutes) {
|
|
85
|
+
const match = pathname.match(route.pattern);
|
|
86
|
+
if (match !== null) {
|
|
87
|
+
const routeParams = {};
|
|
88
|
+
for (let i = 0; i < route.keys.length; i++) {
|
|
89
|
+
routeParams[route.keys[i]] = match[i + 1];
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
handlers: route.handlers,
|
|
93
|
+
params: routeParams
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
for (const route of this.wildcardRoutes) {
|
|
98
|
+
const match = pathname.match(route.pattern);
|
|
99
|
+
if (match !== null) {
|
|
100
|
+
const routeParams = {};
|
|
101
|
+
for (let i = 0; i < route.keys.length; i++) {
|
|
102
|
+
routeParams[route.keys[i]] = match[i + 1];
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
handlers: route.handlers,
|
|
106
|
+
params: routeParams
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context } from "./context.js";
|
|
2
|
+
export interface SecurityHeadersOptions {
|
|
3
|
+
contentTypeOptions?: boolean;
|
|
4
|
+
xFrameOptions?: 'DENY' | 'SAMEORIGIN';
|
|
5
|
+
referrerPolicy?: "no-referrer" | "no-referrer-when-downgrade" | "origin" | "origin-when-cross-origin" | "same-origin" | "strict-origin" | "strict-origin-when-cross-origin" | "unsafe-url";
|
|
6
|
+
transportSecurity?: {
|
|
7
|
+
maxAge: number;
|
|
8
|
+
includeSubDomains?: boolean;
|
|
9
|
+
preload?: boolean;
|
|
10
|
+
};
|
|
11
|
+
contentSecurityPolicy?: string;
|
|
12
|
+
crossOriginResourcePolicy?: 'same-origin' | 'same-site' | 'cross-origin';
|
|
13
|
+
permissionsPolicy?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function SecurityHeaders(options: SecurityHeadersOptions): (ctx: Context) => Promise<void>;
|
|
16
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,WAAW,sBAAsB;IACtC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IACtC,cAAc,CAAC,EAAE,aAAa,GAAG,4BAA4B,GAAG,QAAQ,GAAG,0BAA0B,GAAG,aAAa,GAAG,eAAe,GAAG,iCAAiC,GAAG,YAAY,CAAC;IAC3L,iBAAiB,CAAC,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yBAAyB,CAAC,EAAE,aAAa,GAAG,WAAW,GAAG,cAAc,CAAC;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAE,OAAO,EAAE,sBAAsB,IACjD,KAAK,OAAO,mBAoC1B"}
|
package/dist/security.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Context } from "./context.js";
|
|
2
|
+
export function SecurityHeaders(options) {
|
|
3
|
+
return async (ctx) => {
|
|
4
|
+
if (options.contentTypeOptions) {
|
|
5
|
+
ctx.responseHeader("X-Content-Type-Options", "nosniff");
|
|
6
|
+
}
|
|
7
|
+
if (options.xFrameOptions) {
|
|
8
|
+
ctx.responseHeader("X-Frame-Options", options.xFrameOptions);
|
|
9
|
+
}
|
|
10
|
+
if (options.referrerPolicy) {
|
|
11
|
+
ctx.responseHeader("Referrer-Policy", options.referrerPolicy);
|
|
12
|
+
}
|
|
13
|
+
if (options.transportSecurity) {
|
|
14
|
+
let value = `max-age=${options.transportSecurity.maxAge}`;
|
|
15
|
+
if (options.transportSecurity.includeSubDomains) {
|
|
16
|
+
value += "; includeSubDomains";
|
|
17
|
+
}
|
|
18
|
+
if (options.transportSecurity.preload) {
|
|
19
|
+
value += "; preload";
|
|
20
|
+
}
|
|
21
|
+
ctx.responseHeader("Strict-Transport-Security", value);
|
|
22
|
+
}
|
|
23
|
+
if (options.contentSecurityPolicy) {
|
|
24
|
+
ctx.responseHeader("Content-Security-Policy", options.contentSecurityPolicy);
|
|
25
|
+
}
|
|
26
|
+
if (options.crossOriginResourcePolicy) {
|
|
27
|
+
ctx.responseHeader("Cross-Origin-Resource-Policy", options.crossOriginResourcePolicy);
|
|
28
|
+
}
|
|
29
|
+
if (options.permissionsPolicy) {
|
|
30
|
+
ctx.responseHeader("Permissions-Policy", options.permissionsPolicy);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../src/security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAgBtC,MAAM,UAAU,eAAe,CAAE,OAA+B;IAC/D,OAAO,KAAK,EAAE,GAAY,EAAE,EAAE;QAC7B,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAChC,GAAG,CAAC,cAAc,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC3B,GAAG,CAAC,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,GAAG,CAAC,cAAc,CAAC,iBAAiB,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC/B,IAAI,KAAK,GAAG,WAAW,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAC1D,IAAI,OAAO,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC;gBACjD,KAAK,IAAI,qBAAqB,CAAC;YAChC,CAAC;YACD,IAAI,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBACvC,KAAK,IAAI,WAAW,CAAC;YACtB,CAAC;YACD,GAAG,CAAC,cAAc,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;YACnC,GAAG,CAAC,cAAc,CAAC,yBAAyB,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,OAAO,CAAC,yBAAyB,EAAE,CAAC;YACvC,GAAG,CAAC,cAAc,CAAC,8BAA8B,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC/B,GAAG,CAAC,cAAc,CAAC,oBAAoB,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACrE,CAAC;IACF,CAAC,CAAA;AACF,CAAC"}
|
package/dist/static.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Context } from "./context.js";
|
|
2
|
+
export interface ServeStaticOptions {
|
|
3
|
+
basePath: string;
|
|
4
|
+
rootDir: string;
|
|
5
|
+
cacheControl?: string[];
|
|
6
|
+
fallback?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function ServeStatic(options: ServeStaticOptions): (ctx: Context) => Promise<void>;
|
|
9
|
+
//# sourceMappingURL=static.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,WAAW,CAAE,OAAO,EAAE,kBAAkB,IAOzC,KAAK,OAAO,mBAmD1B"}
|
package/dist/static.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import mime from "mime-types";
|
|
4
|
+
import { Context } from "./context.js";
|
|
5
|
+
export function ServeStatic(options) {
|
|
6
|
+
let fallbackFull;
|
|
7
|
+
if (options.fallback !== undefined) {
|
|
8
|
+
fallbackFull = path.resolve(options.rootDir, options.fallback);
|
|
9
|
+
}
|
|
10
|
+
return async (ctx) => {
|
|
11
|
+
const tail = ctx.path.slice(options.basePath.length);
|
|
12
|
+
let fullPath = path.resolve(options.rootDir, tail);
|
|
13
|
+
// serve files only from root directory
|
|
14
|
+
if (!fullPath.startsWith(options.rootDir)) {
|
|
15
|
+
ctx.status(403).text(`${ctx.path}: Access forbidden`);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const toServe = await checkFile(fullPath, fallbackFull);
|
|
19
|
+
if (toServe === null) {
|
|
20
|
+
ctx.callNotFound();
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const stats = toServe.stats;
|
|
24
|
+
fullPath = toServe.candidate;
|
|
25
|
+
const range = ctx.headers["range"];
|
|
26
|
+
if (range === undefined) {
|
|
27
|
+
ctx
|
|
28
|
+
.status(200)
|
|
29
|
+
.responseHeader("Content-Type", mime.lookup(fullPath) || "application/octet-stream")
|
|
30
|
+
.send(fs.createReadStream(fullPath), stats.size);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const [startStr, endStr] = range.replace(/bytes=/, "").split("-");
|
|
34
|
+
const start = parseInt(startStr, 10);
|
|
35
|
+
let end = endStr ? parseInt(endStr, 10) : stats.size - 1;
|
|
36
|
+
if (isNaN(end) || end >= stats.size) {
|
|
37
|
+
end = stats.size - 1;
|
|
38
|
+
}
|
|
39
|
+
if (isNaN(start) || start < 0 || end < start || start >= stats.size) {
|
|
40
|
+
ctx
|
|
41
|
+
.status(416)
|
|
42
|
+
.responseHeader("Content-Range", `bytes */${stats.size}`)
|
|
43
|
+
.end();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
ctx
|
|
47
|
+
.status(206)
|
|
48
|
+
.responseHeader("Content-Range", `bytes ${start}-${end}/${stats.size}`)
|
|
49
|
+
.responseHeader("Accept-Ranges", "bytes")
|
|
50
|
+
.responseHeader("Content-Type", mime.lookup(fullPath) || "application/octet-stream")
|
|
51
|
+
.send(fs.createReadStream(fullPath, { start, end }), end - start + 1);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async function checkFile(filePath, fallback) {
|
|
56
|
+
for (const candidate of [filePath, fallback]) {
|
|
57
|
+
if (!candidate)
|
|
58
|
+
continue;
|
|
59
|
+
try {
|
|
60
|
+
const stats = await fs.promises.stat(candidate);
|
|
61
|
+
if (stats.isFile()) {
|
|
62
|
+
return { candidate, stats };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
// ignore
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=static.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../src/static.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textBody.d.ts","sourceRoot":"","sources":["../src/textBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,wBAA8B,QAAQ,CAAE,GAAG,EAAE,OAAO,iBAEnD"}
|
package/dist/textBody.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textBody.js","sourceRoot":"","sources":["../src/textBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAE,GAAY;AAEpD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tripod311/currents",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "Lightweight pipeline API constructor",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"js",
|
|
7
|
+
"ts",
|
|
8
|
+
"api",
|
|
9
|
+
"routing"
|
|
10
|
+
],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"author": "Tripod ind.tripod@gmail.com",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "dist/index.js",
|
|
15
|
+
"types": "dist/index.d.ts",
|
|
16
|
+
"scripts": {
|
|
17
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^24.3.1",
|
|
25
|
+
"typescript": "^5.9.2"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@types/mime-types": "^3.0.1",
|
|
29
|
+
"mime-types": "^3.0.1"
|
|
30
|
+
}
|
|
31
|
+
}
|