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.0",
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.0",
81
- "@intlayer/core": "8.12.0",
82
- "@intlayer/types": "8.12.0",
83
- "vite-intlayer": "8.12.0",
84
- "vue-intlayer": "8.12.0"
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",