i18next-http-middleware 3.8.2 → 3.9.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 +29 -0
- package/cjs/httpFunctions.js +19 -2
- package/cjs/index.d.ts +2 -0
- package/cjs/index.js +49 -0
- package/esm/httpFunctions.js +19 -2
- package/esm/index.d.ts +2 -0
- package/esm/index.js +48 -0
- package/index.d.ts +2 -0
- package/lib/httpFunctions.js +19 -2
- package/lib/index.js +36 -0
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -238,6 +238,35 @@ app.get('/', async (req) => {
|
|
|
238
238
|
await app.listen({ port })
|
|
239
239
|
```
|
|
240
240
|
|
|
241
|
+
#### Fresh 2.x
|
|
242
|
+
|
|
243
|
+
```js
|
|
244
|
+
import i18next from 'https://deno.land/x/i18next/index.js'
|
|
245
|
+
import i18nextMiddleware from 'https://deno.land/x/i18next_http_middleware/index.js'
|
|
246
|
+
import { App, createDefine } from "jsr:@fresh/core";
|
|
247
|
+
|
|
248
|
+
i18next
|
|
249
|
+
.use(i18nextMiddleware.LanguageDetector)
|
|
250
|
+
.init({
|
|
251
|
+
preload: ["en", "fr"],
|
|
252
|
+
fallbackLng: "en",
|
|
253
|
+
resources: {
|
|
254
|
+
en: {
|
|
255
|
+
translation: { hi: "hello" }
|
|
256
|
+
},
|
|
257
|
+
fr: {
|
|
258
|
+
translation: { hi: "bonjour" }
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
const app = new App()
|
|
264
|
+
.use(i18nextMiddleware.freshPlugin(i18next))
|
|
265
|
+
.get("/", (ctx) => {
|
|
266
|
+
return new Response(ctx.state.t('hi'))
|
|
267
|
+
});
|
|
268
|
+
```
|
|
269
|
+
|
|
241
270
|
## add routes
|
|
242
271
|
|
|
243
272
|
```js
|
package/cjs/httpFunctions.js
CHANGED
|
@@ -39,6 +39,11 @@ var getQuery = exports.getQuery = function getQuery(req) {
|
|
|
39
39
|
if (req.url && req.url.searchParams) return req.url.searchParams;
|
|
40
40
|
var url = req.url || req.raw && req.raw.url;
|
|
41
41
|
if (url && url.indexOf('?') < 0) return {};
|
|
42
|
+
if (typeof URL !== 'undefined') {
|
|
43
|
+
try {
|
|
44
|
+
return Object.fromEntries(new URL(url).searchParams.entries());
|
|
45
|
+
} catch (_unused) {}
|
|
46
|
+
}
|
|
42
47
|
console.log('no possibility found to get query');
|
|
43
48
|
return {};
|
|
44
49
|
};
|
|
@@ -50,8 +55,14 @@ var getParams = exports.getParams = function getParams(req) {
|
|
|
50
55
|
return {};
|
|
51
56
|
};
|
|
52
57
|
var getHeaders = exports.getHeaders = function getHeaders(req) {
|
|
53
|
-
if (req.headers)
|
|
54
|
-
|
|
58
|
+
if (!req.headers) {
|
|
59
|
+
console.log('no possibility found to get headers');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (typeof Headers !== 'undefined' && req.headers.constructor === Headers) {
|
|
63
|
+
return Object.fromEntries(req.headers.entries());
|
|
64
|
+
}
|
|
65
|
+
return req.headers;
|
|
55
66
|
};
|
|
56
67
|
var getCookies = exports.getCookies = function getCookies(req) {
|
|
57
68
|
if (req.cookies) return req.cookies;
|
|
@@ -113,6 +124,12 @@ var setStatus = exports.setStatus = function setStatus(res, code) {
|
|
|
113
124
|
var send = exports.send = function send(res, body) {
|
|
114
125
|
if (typeof res.send === 'function') return res.send(body);
|
|
115
126
|
if (res.request && res.response && res.app) res.body = body;
|
|
127
|
+
if (typeof Response !== 'undefined' && res.constructor === Response) {
|
|
128
|
+
return new Response(body, {
|
|
129
|
+
status: res.status,
|
|
130
|
+
headers: res.headers
|
|
131
|
+
});
|
|
132
|
+
}
|
|
116
133
|
return body;
|
|
117
134
|
};
|
|
118
135
|
var getSession = exports.getSession = function getSession(req) {
|
package/cjs/index.d.ts
CHANGED
|
@@ -76,6 +76,8 @@ export function handle(i18next: I18next, options?: HandleOptions): Handler;
|
|
|
76
76
|
|
|
77
77
|
export function koaPlugin(i18next: I18next, options?: HandleOptions): (context: unknown, next: Function) => any;
|
|
78
78
|
|
|
79
|
+
export function freshPlugin(i18next:I18next, options?: HandleOptions): Promise<any>;
|
|
80
|
+
|
|
79
81
|
export function plugin(
|
|
80
82
|
instance: any,
|
|
81
83
|
options: HandleOptions & { i18next?: I18next },
|
package/cjs/index.js
CHANGED
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.LanguageDetector = void 0;
|
|
8
8
|
exports.addRoute = addRoute;
|
|
9
9
|
exports.default = void 0;
|
|
10
|
+
exports.freshPlugin = freshPlugin;
|
|
10
11
|
exports.getResourcesHandler = getResourcesHandler;
|
|
11
12
|
exports.handle = handle;
|
|
12
13
|
exports.hapiPlugin = void 0;
|
|
@@ -38,6 +39,15 @@ var checkForCombinedReqRes = function checkForCombinedReqRes(req, res, next) {
|
|
|
38
39
|
} else if (req.respond) {
|
|
39
40
|
res = req;
|
|
40
41
|
if (!next) next = function next() {};
|
|
42
|
+
} else if (typeof Request !== 'undefined' && typeof Response !== 'undefined' && req.req && req.req.constructor === Request) {
|
|
43
|
+
if (req.state) {
|
|
44
|
+
req.state.res = req.state.res || new Response();
|
|
45
|
+
res = req.state.res;
|
|
46
|
+
} else {
|
|
47
|
+
res = new Response();
|
|
48
|
+
}
|
|
49
|
+
req = req.req;
|
|
50
|
+
if (!next) next = function next() {};
|
|
41
51
|
}
|
|
42
52
|
} else if (!next && typeof res === 'function' && req.req && req.res) {
|
|
43
53
|
return {
|
|
@@ -161,6 +171,41 @@ function koaPlugin(i18next, options) {
|
|
|
161
171
|
return koaMiddleware;
|
|
162
172
|
}();
|
|
163
173
|
}
|
|
174
|
+
function freshPlugin(i18next, options) {
|
|
175
|
+
return function () {
|
|
176
|
+
var _ref = _asyncToGenerator(_regeneratorRuntime().mark(function _callee2(ctx) {
|
|
177
|
+
var placeholder, resp;
|
|
178
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
179
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
180
|
+
case 0:
|
|
181
|
+
handle(i18next, _objectSpread(_objectSpread({}, options), {}, {
|
|
182
|
+
attachLocals: true
|
|
183
|
+
}))(ctx);
|
|
184
|
+
ctx.state.t = ctx.req.t;
|
|
185
|
+
ctx.state.i18n = ctx.req.i18n;
|
|
186
|
+
ctx.state.lng = ctx.req.lng;
|
|
187
|
+
ctx.state.locale = ctx.req.locale;
|
|
188
|
+
ctx.state.language = ctx.req.language;
|
|
189
|
+
ctx.state.languages = ctx.req.languages;
|
|
190
|
+
placeholder = ctx.state.res;
|
|
191
|
+
delete ctx.state.res;
|
|
192
|
+
_context2.next = 11;
|
|
193
|
+
return ctx.next();
|
|
194
|
+
case 11:
|
|
195
|
+
resp = _context2.sent;
|
|
196
|
+
resp.headers.set('Content-Language', placeholder.headers.get('Content-Language'));
|
|
197
|
+
return _context2.abrupt("return", resp);
|
|
198
|
+
case 14:
|
|
199
|
+
case "end":
|
|
200
|
+
return _context2.stop();
|
|
201
|
+
}
|
|
202
|
+
}, _callee2);
|
|
203
|
+
}));
|
|
204
|
+
return function (_x3) {
|
|
205
|
+
return _ref.apply(this, arguments);
|
|
206
|
+
};
|
|
207
|
+
}();
|
|
208
|
+
}
|
|
164
209
|
var hapiPlugin = exports.hapiPlugin = {
|
|
165
210
|
name: 'i18next-http-middleware',
|
|
166
211
|
version: '1',
|
|
@@ -215,6 +260,9 @@ function getResourcesHandler(i18next) {
|
|
|
215
260
|
});
|
|
216
261
|
});
|
|
217
262
|
});
|
|
263
|
+
if (typeof Response !== 'undefined' && res.constructor === Response && typeof JSON !== 'undefined') {
|
|
264
|
+
return options.send(res, JSON.stringify(resources));
|
|
265
|
+
}
|
|
218
266
|
return options.send(res, resources);
|
|
219
267
|
};
|
|
220
268
|
}
|
|
@@ -280,6 +328,7 @@ var _default = exports.default = {
|
|
|
280
328
|
plugin: plugin,
|
|
281
329
|
hapiPlugin: hapiPlugin,
|
|
282
330
|
koaPlugin: koaPlugin,
|
|
331
|
+
freshPlugin: freshPlugin,
|
|
283
332
|
handle: handle,
|
|
284
333
|
getResourcesHandler: getResourcesHandler,
|
|
285
334
|
missingKeyHandler: missingKeyHandler,
|
package/esm/httpFunctions.js
CHANGED
|
@@ -33,6 +33,11 @@ export var getQuery = function getQuery(req) {
|
|
|
33
33
|
if (req.url && req.url.searchParams) return req.url.searchParams;
|
|
34
34
|
var url = req.url || req.raw && req.raw.url;
|
|
35
35
|
if (url && url.indexOf('?') < 0) return {};
|
|
36
|
+
if (typeof URL !== 'undefined') {
|
|
37
|
+
try {
|
|
38
|
+
return Object.fromEntries(new URL(url).searchParams.entries());
|
|
39
|
+
} catch (_unused) {}
|
|
40
|
+
}
|
|
36
41
|
console.log('no possibility found to get query');
|
|
37
42
|
return {};
|
|
38
43
|
};
|
|
@@ -44,8 +49,14 @@ export var getParams = function getParams(req) {
|
|
|
44
49
|
return {};
|
|
45
50
|
};
|
|
46
51
|
export var getHeaders = function getHeaders(req) {
|
|
47
|
-
if (req.headers)
|
|
48
|
-
|
|
52
|
+
if (!req.headers) {
|
|
53
|
+
console.log('no possibility found to get headers');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (typeof Headers !== 'undefined' && req.headers.constructor === Headers) {
|
|
57
|
+
return Object.fromEntries(req.headers.entries());
|
|
58
|
+
}
|
|
59
|
+
return req.headers;
|
|
49
60
|
};
|
|
50
61
|
export var getCookies = function getCookies(req) {
|
|
51
62
|
if (req.cookies) return req.cookies;
|
|
@@ -107,6 +118,12 @@ export var setStatus = function setStatus(res, code) {
|
|
|
107
118
|
export var send = function send(res, body) {
|
|
108
119
|
if (typeof res.send === 'function') return res.send(body);
|
|
109
120
|
if (res.request && res.response && res.app) res.body = body;
|
|
121
|
+
if (typeof Response !== 'undefined' && res.constructor === Response) {
|
|
122
|
+
return new Response(body, {
|
|
123
|
+
status: res.status,
|
|
124
|
+
headers: res.headers
|
|
125
|
+
});
|
|
126
|
+
}
|
|
110
127
|
return body;
|
|
111
128
|
};
|
|
112
129
|
export var getSession = function getSession(req) {
|
package/esm/index.d.ts
CHANGED
|
@@ -76,6 +76,8 @@ export function handle(i18next: I18next, options?: HandleOptions): Handler;
|
|
|
76
76
|
|
|
77
77
|
export function koaPlugin(i18next: I18next, options?: HandleOptions): (context: unknown, next: Function) => any;
|
|
78
78
|
|
|
79
|
+
export function freshPlugin(i18next:I18next, options?: HandleOptions): Promise<any>;
|
|
80
|
+
|
|
79
81
|
export function plugin(
|
|
80
82
|
instance: any,
|
|
81
83
|
options: HandleOptions & { i18next?: I18next },
|
package/esm/index.js
CHANGED
|
@@ -21,6 +21,15 @@ var checkForCombinedReqRes = function checkForCombinedReqRes(req, res, next) {
|
|
|
21
21
|
} else if (req.respond) {
|
|
22
22
|
res = req;
|
|
23
23
|
if (!next) next = function next() {};
|
|
24
|
+
} else if (typeof Request !== 'undefined' && typeof Response !== 'undefined' && req.req && req.req.constructor === Request) {
|
|
25
|
+
if (req.state) {
|
|
26
|
+
req.state.res = req.state.res || new Response();
|
|
27
|
+
res = req.state.res;
|
|
28
|
+
} else {
|
|
29
|
+
res = new Response();
|
|
30
|
+
}
|
|
31
|
+
req = req.req;
|
|
32
|
+
if (!next) next = function next() {};
|
|
24
33
|
}
|
|
25
34
|
} else if (!next && typeof res === 'function' && req.req && req.res) {
|
|
26
35
|
return {
|
|
@@ -144,6 +153,41 @@ export function koaPlugin(i18next, options) {
|
|
|
144
153
|
return koaMiddleware;
|
|
145
154
|
}();
|
|
146
155
|
}
|
|
156
|
+
export function freshPlugin(i18next, options) {
|
|
157
|
+
return function () {
|
|
158
|
+
var _ref = _asyncToGenerator(_regeneratorRuntime().mark(function _callee2(ctx) {
|
|
159
|
+
var placeholder, resp;
|
|
160
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
161
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
162
|
+
case 0:
|
|
163
|
+
handle(i18next, _objectSpread(_objectSpread({}, options), {}, {
|
|
164
|
+
attachLocals: true
|
|
165
|
+
}))(ctx);
|
|
166
|
+
ctx.state.t = ctx.req.t;
|
|
167
|
+
ctx.state.i18n = ctx.req.i18n;
|
|
168
|
+
ctx.state.lng = ctx.req.lng;
|
|
169
|
+
ctx.state.locale = ctx.req.locale;
|
|
170
|
+
ctx.state.language = ctx.req.language;
|
|
171
|
+
ctx.state.languages = ctx.req.languages;
|
|
172
|
+
placeholder = ctx.state.res;
|
|
173
|
+
delete ctx.state.res;
|
|
174
|
+
_context2.next = 11;
|
|
175
|
+
return ctx.next();
|
|
176
|
+
case 11:
|
|
177
|
+
resp = _context2.sent;
|
|
178
|
+
resp.headers.set('Content-Language', placeholder.headers.get('Content-Language'));
|
|
179
|
+
return _context2.abrupt("return", resp);
|
|
180
|
+
case 14:
|
|
181
|
+
case "end":
|
|
182
|
+
return _context2.stop();
|
|
183
|
+
}
|
|
184
|
+
}, _callee2);
|
|
185
|
+
}));
|
|
186
|
+
return function (_x3) {
|
|
187
|
+
return _ref.apply(this, arguments);
|
|
188
|
+
};
|
|
189
|
+
}();
|
|
190
|
+
}
|
|
147
191
|
export var hapiPlugin = {
|
|
148
192
|
name: 'i18next-http-middleware',
|
|
149
193
|
version: '1',
|
|
@@ -198,6 +242,9 @@ export function getResourcesHandler(i18next) {
|
|
|
198
242
|
});
|
|
199
243
|
});
|
|
200
244
|
});
|
|
245
|
+
if (typeof Response !== 'undefined' && res.constructor === Response && typeof JSON !== 'undefined') {
|
|
246
|
+
return options.send(res, JSON.stringify(resources));
|
|
247
|
+
}
|
|
201
248
|
return options.send(res, resources);
|
|
202
249
|
};
|
|
203
250
|
}
|
|
@@ -263,6 +310,7 @@ export default {
|
|
|
263
310
|
plugin: plugin,
|
|
264
311
|
hapiPlugin: hapiPlugin,
|
|
265
312
|
koaPlugin: koaPlugin,
|
|
313
|
+
freshPlugin: freshPlugin,
|
|
266
314
|
handle: handle,
|
|
267
315
|
getResourcesHandler: getResourcesHandler,
|
|
268
316
|
missingKeyHandler: missingKeyHandler,
|
package/index.d.ts
CHANGED
|
@@ -76,6 +76,8 @@ export function handle(i18next: I18next, options?: HandleOptions): Handler;
|
|
|
76
76
|
|
|
77
77
|
export function koaPlugin(i18next: I18next, options?: HandleOptions): (context: unknown, next: Function) => any;
|
|
78
78
|
|
|
79
|
+
export function freshPlugin(i18next:I18next, options?: HandleOptions): Promise<any>;
|
|
80
|
+
|
|
79
81
|
export function plugin(
|
|
80
82
|
instance: any,
|
|
81
83
|
options: HandleOptions & { i18next?: I18next },
|
package/lib/httpFunctions.js
CHANGED
|
@@ -38,6 +38,11 @@ export const getQuery = (req) => {
|
|
|
38
38
|
if (req.url && req.url.searchParams) return req.url.searchParams
|
|
39
39
|
const url = req.url || (req.raw && req.raw.url)
|
|
40
40
|
if (url && url.indexOf('?') < 0) return {}
|
|
41
|
+
if (typeof URL !== 'undefined') {
|
|
42
|
+
try {
|
|
43
|
+
return Object.fromEntries(new URL(url).searchParams.entries())
|
|
44
|
+
} catch { }
|
|
45
|
+
}
|
|
41
46
|
console.log('no possibility found to get query')
|
|
42
47
|
return {}
|
|
43
48
|
}
|
|
@@ -49,8 +54,14 @@ export const getParams = (req) => {
|
|
|
49
54
|
return {}
|
|
50
55
|
}
|
|
51
56
|
export const getHeaders = (req) => {
|
|
52
|
-
if (req.headers)
|
|
53
|
-
|
|
57
|
+
if (!req.headers) {
|
|
58
|
+
console.log('no possibility found to get headers')
|
|
59
|
+
return
|
|
60
|
+
}
|
|
61
|
+
if (typeof Headers !== 'undefined' && req.headers.constructor === Headers) {
|
|
62
|
+
return Object.fromEntries(req.headers.entries())
|
|
63
|
+
}
|
|
64
|
+
return req.headers
|
|
54
65
|
}
|
|
55
66
|
export const getCookies = (req) => {
|
|
56
67
|
if (req.cookies) return req.cookies
|
|
@@ -114,6 +125,12 @@ export const setStatus = (res, code) => {
|
|
|
114
125
|
export const send = (res, body) => {
|
|
115
126
|
if (typeof res.send === 'function') return res.send(body)
|
|
116
127
|
if (res.request && res.response && res.app) res.body = body
|
|
128
|
+
if (typeof Response !== 'undefined' && res.constructor === Response) {
|
|
129
|
+
return new Response(body, {
|
|
130
|
+
status: res.status,
|
|
131
|
+
headers: res.headers
|
|
132
|
+
})
|
|
133
|
+
}
|
|
117
134
|
return body
|
|
118
135
|
}
|
|
119
136
|
export const getSession = (req) => {
|
package/lib/index.js
CHANGED
|
@@ -14,6 +14,19 @@ const checkForCombinedReqRes = (req, res, next) => {
|
|
|
14
14
|
} else if (req.respond) {
|
|
15
15
|
res = req
|
|
16
16
|
if (!next) next = () => {}
|
|
17
|
+
} else if (typeof Request !== 'undefined' &&
|
|
18
|
+
typeof Response !== 'undefined' &&
|
|
19
|
+
req.req &&
|
|
20
|
+
req.req.constructor === Request
|
|
21
|
+
) {
|
|
22
|
+
if (req.state) {
|
|
23
|
+
req.state.res = req.state.res || new Response()
|
|
24
|
+
res = req.state.res
|
|
25
|
+
} else {
|
|
26
|
+
res = new Response()
|
|
27
|
+
}
|
|
28
|
+
req = req.req
|
|
29
|
+
if (!next) next = () => {}
|
|
17
30
|
}
|
|
18
31
|
} else if (!next && typeof res === 'function' && req.req && req.res) {
|
|
19
32
|
return {
|
|
@@ -137,6 +150,23 @@ export function koaPlugin (i18next, options) {
|
|
|
137
150
|
}
|
|
138
151
|
}
|
|
139
152
|
|
|
153
|
+
export function freshPlugin (i18next, options) {
|
|
154
|
+
return async (ctx) => {
|
|
155
|
+
handle(i18next, { ...options, attachLocals: true })(ctx)
|
|
156
|
+
ctx.state.t = ctx.req.t
|
|
157
|
+
ctx.state.i18n = ctx.req.i18n
|
|
158
|
+
ctx.state.lng = ctx.req.lng
|
|
159
|
+
ctx.state.locale = ctx.req.locale
|
|
160
|
+
ctx.state.language = ctx.req.language
|
|
161
|
+
ctx.state.languages = ctx.req.languages
|
|
162
|
+
const placeholder = ctx.state.res
|
|
163
|
+
delete ctx.state.res
|
|
164
|
+
const resp = await ctx.next()
|
|
165
|
+
resp.headers.set('Content-Language', placeholder.headers.get('Content-Language'))
|
|
166
|
+
return resp
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
140
170
|
export const hapiPlugin = {
|
|
141
171
|
name: 'i18next-http-middleware',
|
|
142
172
|
version: '1',
|
|
@@ -232,6 +262,11 @@ export function getResourcesHandler (i18next, options = {}) {
|
|
|
232
262
|
})
|
|
233
263
|
})
|
|
234
264
|
|
|
265
|
+
if (typeof Response !== 'undefined' &&
|
|
266
|
+
res.constructor === Response &&
|
|
267
|
+
typeof JSON !== 'undefined') {
|
|
268
|
+
return options.send(res, JSON.stringify(resources))
|
|
269
|
+
}
|
|
235
270
|
return options.send(res, resources)
|
|
236
271
|
}
|
|
237
272
|
}
|
|
@@ -311,6 +346,7 @@ export default {
|
|
|
311
346
|
plugin,
|
|
312
347
|
hapiPlugin,
|
|
313
348
|
koaPlugin,
|
|
349
|
+
freshPlugin,
|
|
314
350
|
handle,
|
|
315
351
|
getResourcesHandler,
|
|
316
352
|
missingKeyHandler,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "i18next-http-middleware",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./cjs/index.js",
|
|
@@ -32,6 +32,8 @@
|
|
|
32
32
|
"@babel/core": "7.26.0",
|
|
33
33
|
"@babel/preset-env": "7.26.0",
|
|
34
34
|
"@hapi/hapi": "^21.3.12",
|
|
35
|
+
"@opentelemetry/api": "^1.9.0",
|
|
36
|
+
"@preact/signals": "^2.2.1",
|
|
35
37
|
"@types/express-serve-static-core": "^5.0.1",
|
|
36
38
|
"@koa/router": "12.0.1",
|
|
37
39
|
"koa": "2.16.1",
|
|
@@ -48,6 +50,8 @@
|
|
|
48
50
|
"fastify": "5.3.2",
|
|
49
51
|
"i18next": "25.5.2",
|
|
50
52
|
"mocha": "10.8.2",
|
|
53
|
+
"preact": "10.27.2",
|
|
54
|
+
"preact-render-to-string": "6.6.3",
|
|
51
55
|
"supertest": "7.0.0",
|
|
52
56
|
"tsd": "0.31.2",
|
|
53
57
|
"uglify-js": "3.19.3"
|