nuxt-intlayer 8.12.0 → 8.12.2
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.
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createIntlayerProxyHandler } from "vite-intlayer";
|
|
2
|
+
|
|
3
|
+
//#region src/runtime/intlayer-middleware.ts
|
|
4
|
+
const nodeMiddleware = createIntlayerProxyHandler();
|
|
5
|
+
/**
|
|
6
|
+
* Native h3 v2 event handler for Nitro-powered Nuxt servers.
|
|
7
|
+
*
|
|
8
|
+
* Registered automatically by `nuxt-intlayer` via `addServerHandler` so locale
|
|
9
|
+
* detection, redirects, and rewrites run in both dev and production.
|
|
10
|
+
*
|
|
11
|
+
* Bridges the Web Fetch API event model (h3 v2) to the Node.js-style
|
|
12
|
+
* `createIntlayerProxyHandler` middleware via IncomingMessage / ServerResponse shims.
|
|
13
|
+
* Compatible with ALL Nitro presets — Node, Bun, Deno — where `event.node` may be
|
|
14
|
+
* undefined and `fromNodeMiddleware` (h3 v1 API) would crash.
|
|
15
|
+
*
|
|
16
|
+
* If you need custom Intlayer config or an `ignore` predicate, bypass
|
|
17
|
+
* auto-registration and add your own handler in `server/middleware/intlayerProxy.ts`:
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* // server/middleware/intlayerProxy.ts
|
|
22
|
+
* import type { H3Event } from 'h3';
|
|
23
|
+
* import { createIntlayerProxyHandler } from 'vite-intlayer';
|
|
24
|
+
*
|
|
25
|
+
* const nodeMiddleware = createIntlayerProxyHandler(myConfig, {
|
|
26
|
+
* ignore: (req) => req.url?.startsWith('/api'),
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* export default async (event: H3Event): Promise<Response | void> => {
|
|
30
|
+
* // ... same shim pattern as this file
|
|
31
|
+
* };
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
var intlayer_middleware_default = async (event) => new Promise((resolve) => {
|
|
35
|
+
const initialPath = event.path;
|
|
36
|
+
const fakeReq = {
|
|
37
|
+
url: initialPath,
|
|
38
|
+
method: "GET",
|
|
39
|
+
headers: {
|
|
40
|
+
cookie: event.headers.get("cookie") ?? "",
|
|
41
|
+
host: event.headers.get("host") ?? "",
|
|
42
|
+
"accept-language": event.headers.get("accept-language") ?? "",
|
|
43
|
+
"x-forwarded-host": event.headers.get("x-forwarded-host") ?? "",
|
|
44
|
+
"x-forwarded-proto": event.headers.get("x-forwarded-proto") ?? ""
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
let responseStatusCode = 200;
|
|
48
|
+
const accumulatedHeaders = {};
|
|
49
|
+
const fakeRes = {
|
|
50
|
+
writeHead(statusCode, headersArg) {
|
|
51
|
+
responseStatusCode = statusCode;
|
|
52
|
+
if (headersArg && typeof headersArg === "object") for (const [key, value] of Object.entries(headersArg)) accumulatedHeaders[key.toLowerCase()] = Array.isArray(value) ? value[0] ?? "" : String(value);
|
|
53
|
+
return fakeRes;
|
|
54
|
+
},
|
|
55
|
+
setHeader(name, value) {
|
|
56
|
+
accumulatedHeaders[name.toLowerCase()] = Array.isArray(value) ? value[0] ?? "" : String(value);
|
|
57
|
+
return fakeRes;
|
|
58
|
+
},
|
|
59
|
+
getHeader(name) {
|
|
60
|
+
return accumulatedHeaders[name.toLowerCase()];
|
|
61
|
+
},
|
|
62
|
+
getHeaders() {
|
|
63
|
+
return { ...accumulatedHeaders };
|
|
64
|
+
},
|
|
65
|
+
end(body) {
|
|
66
|
+
const webHeaders = new Headers();
|
|
67
|
+
for (const [key, value] of Object.entries(accumulatedHeaders)) webHeaders.set(key, value);
|
|
68
|
+
resolve(new Response(responseStatusCode >= 300 && responseStatusCode < 400 ? null : typeof body === "string" ? body : null, {
|
|
69
|
+
status: responseStatusCode,
|
|
70
|
+
headers: webHeaders
|
|
71
|
+
}));
|
|
72
|
+
return fakeRes;
|
|
73
|
+
},
|
|
74
|
+
headersSent: false
|
|
75
|
+
};
|
|
76
|
+
nodeMiddleware(fakeReq, fakeRes, () => {
|
|
77
|
+
const rewrittenPath = fakeReq.url;
|
|
78
|
+
if (rewrittenPath !== initialPath) try {
|
|
79
|
+
event.url = new URL(rewrittenPath, event.url.origin);
|
|
80
|
+
} catch {
|
|
81
|
+
console.error("[intlayer-proxy] URL rewrite failed — invalid path:", rewrittenPath);
|
|
82
|
+
}
|
|
83
|
+
if (Object.keys(accumulatedHeaders).length > 0) for (const [key, value] of Object.entries(accumulatedHeaders)) event.res.headers.set(key, value);
|
|
84
|
+
resolve(void 0);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
//#endregion
|
|
89
|
+
export { intlayer_middleware_default as default };
|
|
90
|
+
//# sourceMappingURL=intlayer-middleware.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intlayer-middleware.mjs","names":[],"sources":["../../../src/runtime/intlayer-middleware.ts"],"sourcesContent":["import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { createIntlayerProxyHandler } from 'vite-intlayer';\n\n/**\n * Minimal duck-type for h3 v2's H3Event (same pattern as vite-intlayer's\n * intlayerNitroHandler). We avoid importing from 'h3' so this file compiles\n * without h3 in devDependencies and works with all Nitro presets.\n */\ntype H3EventLike = {\n readonly path: string;\n url: URL;\n readonly headers: Headers;\n readonly res: { readonly headers: Headers };\n};\n\nconst nodeMiddleware = createIntlayerProxyHandler();\n\n/**\n * Native h3 v2 event handler for Nitro-powered Nuxt servers.\n *\n * Registered automatically by `nuxt-intlayer` via `addServerHandler` so locale\n * detection, redirects, and rewrites run in both dev and production.\n *\n * Bridges the Web Fetch API event model (h3 v2) to the Node.js-style\n * `createIntlayerProxyHandler` middleware via IncomingMessage / ServerResponse shims.\n * Compatible with ALL Nitro presets — Node, Bun, Deno — where `event.node` may be\n * undefined and `fromNodeMiddleware` (h3 v1 API) would crash.\n *\n * If you need custom Intlayer config or an `ignore` predicate, bypass\n * auto-registration and add your own handler in `server/middleware/intlayerProxy.ts`:\n *\n * @example\n * ```ts\n * // server/middleware/intlayerProxy.ts\n * import type { H3Event } from 'h3';\n * import { createIntlayerProxyHandler } from 'vite-intlayer';\n *\n * const nodeMiddleware = createIntlayerProxyHandler(myConfig, {\n * ignore: (req) => req.url?.startsWith('/api'),\n * });\n *\n * export default async (event: H3Event): Promise<Response | void> => {\n * // ... same shim pattern as this file\n * };\n * ```\n */\nexport default async (event: H3EventLike): Promise<Response | void> =>\n new Promise<Response | void>((resolve) => {\n const initialPath = event.path;\n\n const fakeReq = {\n url: initialPath,\n method: 'GET',\n headers: {\n cookie: event.headers.get('cookie') ?? '',\n host: event.headers.get('host') ?? '',\n 'accept-language': event.headers.get('accept-language') ?? '',\n 'x-forwarded-host': event.headers.get('x-forwarded-host') ?? '',\n 'x-forwarded-proto': event.headers.get('x-forwarded-proto') ?? '',\n } as Record<string, string>,\n } as unknown as IncomingMessage;\n\n let responseStatusCode = 200;\n const accumulatedHeaders: Record<string, string> = {};\n\n const fakeRes = {\n writeHead(\n statusCode: number,\n headersArg?: Record<string, string | string[] | number> | string\n ) {\n responseStatusCode = statusCode;\n if (headersArg && typeof headersArg === 'object') {\n for (const [key, value] of Object.entries(headersArg)) {\n accumulatedHeaders[key.toLowerCase()] = Array.isArray(value)\n ? (value[0] ?? '')\n : String(value);\n }\n }\n return fakeRes;\n },\n setHeader(name: string, value: string | number | string[]) {\n accumulatedHeaders[name.toLowerCase()] = Array.isArray(value)\n ? (value[0] ?? '')\n : String(value);\n return fakeRes;\n },\n getHeader(name: string) {\n return accumulatedHeaders[name.toLowerCase()];\n },\n getHeaders() {\n return { ...accumulatedHeaders };\n },\n end(body?: string | Buffer | null) {\n const webHeaders = new Headers();\n for (const [key, value] of Object.entries(accumulatedHeaders)) {\n webHeaders.set(key, value);\n }\n const isRedirect =\n responseStatusCode >= 300 && responseStatusCode < 400;\n resolve(\n new Response(\n isRedirect ? null : typeof body === 'string' ? body : null,\n { status: responseStatusCode, headers: webHeaders }\n )\n );\n return fakeRes;\n },\n headersSent: false,\n } as unknown as ServerResponse<IncomingMessage>;\n\n nodeMiddleware(fakeReq, fakeRes, () => {\n const rewrittenPath = fakeReq.url as string;\n\n if (rewrittenPath !== initialPath) {\n // Rewrite: update event.url so event.path reflects the new path for the router.\n try {\n event.url = new URL(rewrittenPath, event.url.origin);\n } catch {\n console.error(\n '[intlayer-proxy] URL rewrite failed — invalid path:',\n rewrittenPath\n );\n }\n }\n\n // Forward Set-Cookie and any other headers to the h3 v2 response.\n if (Object.keys(accumulatedHeaders).length > 0) {\n for (const [key, value] of Object.entries(accumulatedHeaders)) {\n event.res.headers.set(key, value);\n }\n }\n\n resolve(undefined);\n });\n });\n"],"mappings":";;;AAeA,MAAM,iBAAiB,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BlD,kCAAe,OAAO,UACpB,IAAI,SAA0B,YAAY;CACxC,MAAM,cAAc,MAAM;CAE1B,MAAM,UAAU;EACd,KAAK;EACL,QAAQ;EACR,SAAS;GACP,QAAQ,MAAM,QAAQ,IAAI,QAAQ,KAAK;GACvC,MAAM,MAAM,QAAQ,IAAI,MAAM,KAAK;GACnC,mBAAmB,MAAM,QAAQ,IAAI,iBAAiB,KAAK;GAC3D,oBAAoB,MAAM,QAAQ,IAAI,kBAAkB,KAAK;GAC7D,qBAAqB,MAAM,QAAQ,IAAI,mBAAmB,KAAK;EACjE;CACF;CAEA,IAAI,qBAAqB;CACzB,MAAM,qBAA6C,CAAC;CAEpD,MAAM,UAAU;EACd,UACE,YACA,YACA;GACA,qBAAqB;GACrB,IAAI,cAAc,OAAO,eAAe,UACtC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,GAClD,mBAAmB,IAAI,YAAY,KAAK,MAAM,QAAQ,KAAK,IACtD,MAAM,MAAM,KACb,OAAO,KAAK;GAGpB,OAAO;EACT;EACA,UAAU,MAAc,OAAmC;GACzD,mBAAmB,KAAK,YAAY,KAAK,MAAM,QAAQ,KAAK,IACvD,MAAM,MAAM,KACb,OAAO,KAAK;GAChB,OAAO;EACT;EACA,UAAU,MAAc;GACtB,OAAO,mBAAmB,KAAK,YAAY;EAC7C;EACA,aAAa;GACX,OAAO,EAAE,GAAG,mBAAmB;EACjC;EACA,IAAI,MAA+B;GACjC,MAAM,aAAa,IAAI,QAAQ;GAC/B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,kBAAkB,GAC1D,WAAW,IAAI,KAAK,KAAK;GAI3B,QACE,IAAI,SAFJ,sBAAsB,OAAO,qBAAqB,MAGnC,OAAO,OAAO,SAAS,WAAW,OAAO,MACtD;IAAE,QAAQ;IAAoB,SAAS;GAAW,CACpD,CACF;GACA,OAAO;EACT;EACA,aAAa;CACf;CAEA,eAAe,SAAS,eAAe;EACrC,MAAM,gBAAgB,QAAQ;EAE9B,IAAI,kBAAkB,aAEpB,IAAI;GACF,MAAM,MAAM,IAAI,IAAI,eAAe,MAAM,IAAI,MAAM;EACrD,QAAQ;GACN,QAAQ,MACN,uDACA,aACF;EACF;EAIF,IAAI,OAAO,KAAK,kBAAkB,EAAE,SAAS,GAC3C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,kBAAkB,GAC1D,MAAM,IAAI,QAAQ,IAAI,KAAK,KAAK;EAIpC,QAAQ,MAAS;CACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//#region src/runtime/intlayer-middleware.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Minimal duck-type for h3 v2's H3Event (same pattern as vite-intlayer's
|
|
4
|
+
* intlayerNitroHandler). We avoid importing from 'h3' so this file compiles
|
|
5
|
+
* without h3 in devDependencies and works with all Nitro presets.
|
|
6
|
+
*/
|
|
7
|
+
type H3EventLike = {
|
|
8
|
+
readonly path: string;
|
|
9
|
+
url: URL;
|
|
10
|
+
readonly headers: Headers;
|
|
11
|
+
readonly res: {
|
|
12
|
+
readonly headers: Headers;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Native h3 v2 event handler for Nitro-powered Nuxt servers.
|
|
17
|
+
*
|
|
18
|
+
* Registered automatically by `nuxt-intlayer` via `addServerHandler` so locale
|
|
19
|
+
* detection, redirects, and rewrites run in both dev and production.
|
|
20
|
+
*
|
|
21
|
+
* Bridges the Web Fetch API event model (h3 v2) to the Node.js-style
|
|
22
|
+
* `createIntlayerProxyHandler` middleware via IncomingMessage / ServerResponse shims.
|
|
23
|
+
* Compatible with ALL Nitro presets — Node, Bun, Deno — where `event.node` may be
|
|
24
|
+
* undefined and `fromNodeMiddleware` (h3 v1 API) would crash.
|
|
25
|
+
*
|
|
26
|
+
* If you need custom Intlayer config or an `ignore` predicate, bypass
|
|
27
|
+
* auto-registration and add your own handler in `server/middleware/intlayerProxy.ts`:
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* // server/middleware/intlayerProxy.ts
|
|
32
|
+
* import type { H3Event } from 'h3';
|
|
33
|
+
* import { createIntlayerProxyHandler } from 'vite-intlayer';
|
|
34
|
+
*
|
|
35
|
+
* const nodeMiddleware = createIntlayerProxyHandler(myConfig, {
|
|
36
|
+
* ignore: (req) => req.url?.startsWith('/api'),
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* export default async (event: H3Event): Promise<Response | void> => {
|
|
40
|
+
* // ... same shim pattern as this file
|
|
41
|
+
* };
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
declare const _default: (event: H3EventLike) => Promise<Response | void>;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { _default as default };
|
|
47
|
+
//# sourceMappingURL=intlayer-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intlayer-middleware.d.ts","names":[],"sources":["../../../src/runtime/intlayer-middleware.ts"],"mappings":";;;;;;KAQK,WAAA;EAAA,SACM,IAAA;EACT,GAAA,EAAK,GAAA;EAAA,SACI,OAAA,EAAS,OAAA;EAAA,SACT,GAAA;IAAA,SAAgB,OAAA,EAAS,OAAA;EAAA;AAAA;;;;;;AAAO;AAAA;;;;;;;;;;;;;AAkCgB;;;;;;;;;;cAlChB,QAAA,GAkCrB,KAAA,EAAO,WAAA,KAAc,OAAA,CAAQ,QAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nuxt-intlayer",
|
|
3
|
-
"version": "8.12.
|
|
3
|
+
"version": "8.12.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Easily internationalize i18n your Nuxt applications with type-safe multilingual content management.",
|
|
6
6
|
"keywords": [
|
|
@@ -77,11 +77,11 @@
|
|
|
77
77
|
"typecheck": "tsc --noEmit --project tsconfig.types.json"
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
|
-
"@intlayer/config": "8.12.
|
|
81
|
-
"@intlayer/core": "8.12.
|
|
82
|
-
"@intlayer/types": "8.12.
|
|
83
|
-
"vite-intlayer": "8.12.
|
|
84
|
-
"vue-intlayer": "8.12.
|
|
80
|
+
"@intlayer/config": "8.12.2",
|
|
81
|
+
"@intlayer/core": "8.12.2",
|
|
82
|
+
"@intlayer/types": "8.12.2",
|
|
83
|
+
"vite-intlayer": "8.12.2",
|
|
84
|
+
"vue-intlayer": "8.12.2"
|
|
85
85
|
},
|
|
86
86
|
"devDependencies": {
|
|
87
87
|
"@types/node": "25.9.1",
|