@finesoft/front 0.1.39 → 0.1.42
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/dist/app-re7jUCuM.mjs +178 -0
- package/dist/app-re7jUCuM.mjs.map +1 -0
- package/dist/index.d.mts +1276 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +2749 -0
- package/dist/index.mjs.map +1 -0
- package/dist/locale-D2Bu7w47.mjs +27 -0
- package/dist/locale-D2Bu7w47.mjs.map +1 -0
- package/dist/rolldown-runtime-wcPFST8Q.mjs +13 -0
- package/dist/server-peer-modules-BSSsxBaF.d.mts +41 -0
- package/dist/server-peer-modules-BSSsxBaF.d.mts.map +1 -0
- package/package.json +21 -32
- package/README.md +0 -1136
- package/dist/app-XEMPAI6H.js +0 -10
- package/dist/app-XEMPAI6H.js.map +0 -1
- package/dist/browser.cjs +0 -1465
- package/dist/browser.cjs.map +0 -1
- package/dist/browser.d.cts +0 -904
- package/dist/browser.d.ts +0 -904
- package/dist/browser.js +0 -115
- package/dist/browser.js.map +0 -1
- package/dist/chunk-4PPCVAKZ.js +0 -463
- package/dist/chunk-4PPCVAKZ.js.map +0 -1
- package/dist/chunk-OYTIGVEG.js +0 -193
- package/dist/chunk-OYTIGVEG.js.map +0 -1
- package/dist/chunk-PSPVIVC2.js +0 -25
- package/dist/chunk-PSPVIVC2.js.map +0 -1
- package/dist/chunk-SDPWQT2T.js +0 -936
- package/dist/chunk-SDPWQT2T.js.map +0 -1
- package/dist/chunk-XQ3UWZOS.js +0 -187
- package/dist/chunk-XQ3UWZOS.js.map +0 -1
- package/dist/index.cjs +0 -3661
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -582
- package/dist/index.d.ts +0 -582
- package/dist/index.js +0 -1648
- package/dist/index.js.map +0 -1
- package/dist/locale-CAZ4INCX.js +0 -7
- package/dist/locale-CAZ4INCX.js.map +0 -1
- package/dist/src-XNC7QNVI.js +0 -21
- package/dist/src-XNC7QNVI.js.map +0 -1
package/dist/chunk-OYTIGVEG.js
DELETED
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
injectCSRShell,
|
|
3
|
-
injectSSRContent
|
|
4
|
-
} from "./chunk-XQ3UWZOS.js";
|
|
5
|
-
import {
|
|
6
|
-
parseAcceptLanguage
|
|
7
|
-
} from "./chunk-PSPVIVC2.js";
|
|
8
|
-
|
|
9
|
-
// ../server/src/app.ts
|
|
10
|
-
import { Hono } from "hono";
|
|
11
|
-
|
|
12
|
-
// ../server/src/internal-fetch.ts
|
|
13
|
-
var SSR_DEPTH_HEADER = "x-ssr-depth";
|
|
14
|
-
var MAX_SSR_DEPTH = 5;
|
|
15
|
-
function createInternalFetch(appFetch, depth = 1) {
|
|
16
|
-
return ((input, init) => {
|
|
17
|
-
if (typeof input === "string" && input.startsWith("/")) {
|
|
18
|
-
const request = new Request(`http://localhost${input}`, init);
|
|
19
|
-
request.headers.set(SSR_DEPTH_HEADER, String(depth));
|
|
20
|
-
return Promise.resolve(appFetch(request));
|
|
21
|
-
}
|
|
22
|
-
return globalThis.fetch(input, init);
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// ../server/src/app.ts
|
|
27
|
-
function matchRenderModeOverride(url, renderModes) {
|
|
28
|
-
if (!renderModes) return null;
|
|
29
|
-
const path = url.split("?")[0];
|
|
30
|
-
if (renderModes[path]) return renderModes[path];
|
|
31
|
-
for (const [pattern, mode] of Object.entries(renderModes)) {
|
|
32
|
-
if (pattern.includes("*")) {
|
|
33
|
-
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
|
|
34
|
-
const re = new RegExp("^" + escaped.replace(/\*/g, ".*") + "$");
|
|
35
|
-
if (re.test(path)) return mode;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
function createSSRApp(options) {
|
|
41
|
-
const {
|
|
42
|
-
root,
|
|
43
|
-
vite,
|
|
44
|
-
isProduction,
|
|
45
|
-
ssrEntryPath = "/src/ssr.ts",
|
|
46
|
-
ssrProductionModule,
|
|
47
|
-
supportedLocales,
|
|
48
|
-
defaultLocale,
|
|
49
|
-
parentFetch,
|
|
50
|
-
renderModes
|
|
51
|
-
} = options;
|
|
52
|
-
const app = new Hono();
|
|
53
|
-
const ISR_CACHE_MAX = 1e3;
|
|
54
|
-
const isrCache = /* @__PURE__ */ new Map();
|
|
55
|
-
function isrSet(key, val) {
|
|
56
|
-
if (isrCache.size >= ISR_CACHE_MAX) {
|
|
57
|
-
const first = isrCache.keys().next().value;
|
|
58
|
-
if (first !== void 0) isrCache.delete(first);
|
|
59
|
-
}
|
|
60
|
-
isrCache.set(key, val);
|
|
61
|
-
}
|
|
62
|
-
let templateCache;
|
|
63
|
-
async function readTemplate(url) {
|
|
64
|
-
if (!isProduction && vite) {
|
|
65
|
-
const { readFileSync: readFileSync2 } = await import(
|
|
66
|
-
/* @vite-ignore */
|
|
67
|
-
"fs"
|
|
68
|
-
);
|
|
69
|
-
const { resolve: resolve2 } = await import(
|
|
70
|
-
/* @vite-ignore */
|
|
71
|
-
"path"
|
|
72
|
-
);
|
|
73
|
-
const raw = readFileSync2(resolve2(root, "index.html"), "utf-8");
|
|
74
|
-
return vite.transformIndexHtml(url, raw);
|
|
75
|
-
}
|
|
76
|
-
if (templateCache) return templateCache;
|
|
77
|
-
const isDeno = typeof globalThis.Deno !== "undefined";
|
|
78
|
-
if (isDeno) {
|
|
79
|
-
templateCache = globalThis.Deno.readTextFileSync(
|
|
80
|
-
new URL("../dist/client/index.html", import.meta.url)
|
|
81
|
-
);
|
|
82
|
-
return templateCache;
|
|
83
|
-
}
|
|
84
|
-
const { readFileSync } = await import(
|
|
85
|
-
/* @vite-ignore */
|
|
86
|
-
"fs"
|
|
87
|
-
);
|
|
88
|
-
const { resolve } = await import(
|
|
89
|
-
/* @vite-ignore */
|
|
90
|
-
"path"
|
|
91
|
-
);
|
|
92
|
-
templateCache = readFileSync(
|
|
93
|
-
resolve(root, "dist/client/index.html"),
|
|
94
|
-
"utf-8"
|
|
95
|
-
);
|
|
96
|
-
return templateCache;
|
|
97
|
-
}
|
|
98
|
-
async function loadSSRModule() {
|
|
99
|
-
if (!isProduction && vite) {
|
|
100
|
-
return await vite.ssrLoadModule(ssrEntryPath);
|
|
101
|
-
}
|
|
102
|
-
if (ssrProductionModule) {
|
|
103
|
-
return import(
|
|
104
|
-
/* @vite-ignore */
|
|
105
|
-
ssrProductionModule
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
const { resolve } = await import(
|
|
109
|
-
/* @vite-ignore */
|
|
110
|
-
"path"
|
|
111
|
-
);
|
|
112
|
-
const { pathToFileURL } = await import(
|
|
113
|
-
/* @vite-ignore */
|
|
114
|
-
"url"
|
|
115
|
-
);
|
|
116
|
-
const absPath = pathToFileURL(resolve(root, "dist/server/ssr.js")).href;
|
|
117
|
-
return import(
|
|
118
|
-
/* @vite-ignore */
|
|
119
|
-
absPath
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
app.get("*", async (c) => {
|
|
123
|
-
const ssrDepth = parseInt(c.req.header(SSR_DEPTH_HEADER) ?? "0", 10);
|
|
124
|
-
if (ssrDepth >= MAX_SSR_DEPTH) {
|
|
125
|
-
return c.text("SSR recursion loop detected", 508);
|
|
126
|
-
}
|
|
127
|
-
const url = c.req.path + (c.req.url.includes("?") ? "?" + c.req.url.split("?")[1] : "");
|
|
128
|
-
try {
|
|
129
|
-
const template = await readTemplate(url);
|
|
130
|
-
const { render, serializeServerData } = await loadSSRModule();
|
|
131
|
-
const locale = parseAcceptLanguage(
|
|
132
|
-
c.req.header("accept-language"),
|
|
133
|
-
supportedLocales,
|
|
134
|
-
defaultLocale
|
|
135
|
-
);
|
|
136
|
-
const overrideMode = matchRenderModeOverride(url, renderModes);
|
|
137
|
-
if (overrideMode === "csr") {
|
|
138
|
-
return c.html(injectCSRShell(template, locale));
|
|
139
|
-
}
|
|
140
|
-
const cacheKey = `${locale}:${url}`;
|
|
141
|
-
const cached = isrCache.get(cacheKey);
|
|
142
|
-
if (cached) return c.html(cached);
|
|
143
|
-
const requestFetch = parentFetch ? createInternalFetch(parentFetch, ssrDepth + 1) : void 0;
|
|
144
|
-
const ssrContext = { request: c.req.raw };
|
|
145
|
-
if (requestFetch) ssrContext.fetch = requestFetch;
|
|
146
|
-
const {
|
|
147
|
-
html: appHtml,
|
|
148
|
-
head,
|
|
149
|
-
css,
|
|
150
|
-
serverData,
|
|
151
|
-
renderMode,
|
|
152
|
-
redirect: middlewareRedirect
|
|
153
|
-
} = await render(url, locale, ssrContext);
|
|
154
|
-
if (middlewareRedirect) {
|
|
155
|
-
return c.redirect(
|
|
156
|
-
middlewareRedirect.url,
|
|
157
|
-
middlewareRedirect.status
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
if (renderMode === "csr") {
|
|
161
|
-
return c.html(injectCSRShell(template, locale));
|
|
162
|
-
}
|
|
163
|
-
const serializedData = serializeServerData(serverData);
|
|
164
|
-
const finalHtml = injectSSRContent({
|
|
165
|
-
template,
|
|
166
|
-
locale,
|
|
167
|
-
head,
|
|
168
|
-
css,
|
|
169
|
-
html: appHtml,
|
|
170
|
-
serializedData
|
|
171
|
-
});
|
|
172
|
-
if (renderMode === "prerender" || overrideMode === "prerender") {
|
|
173
|
-
isrSet(cacheKey, finalHtml);
|
|
174
|
-
}
|
|
175
|
-
return c.html(finalHtml);
|
|
176
|
-
} catch (e) {
|
|
177
|
-
if (!isProduction && vite) {
|
|
178
|
-
vite.ssrFixStacktrace(e);
|
|
179
|
-
}
|
|
180
|
-
console.error("[SSR Error]", e);
|
|
181
|
-
return c.text("Internal Server Error", 500);
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
return app;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export {
|
|
188
|
-
SSR_DEPTH_HEADER,
|
|
189
|
-
MAX_SSR_DEPTH,
|
|
190
|
-
createInternalFetch,
|
|
191
|
-
createSSRApp
|
|
192
|
-
};
|
|
193
|
-
//# sourceMappingURL=chunk-OYTIGVEG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/src/app.ts","../../server/src/internal-fetch.ts"],"sourcesContent":["/**\n * createSSRApp — 创建 Hono SSR 应用\n *\n * 提供 SSR 通配路由,读取模板、加载 SSR 模块、渲染。\n * 应用层可在此之上追加自定义路由(API 代理等)。\n */\n\nimport { injectCSRShell, injectSSRContent } from \"@finesoft/ssr\";\nimport { Hono } from \"hono\";\nimport type { ViteDevServer } from \"vite\";\nimport {\n\tcreateInternalFetch,\n\tMAX_SSR_DEPTH,\n\tSSR_DEPTH_HEADER,\n} from \"./internal-fetch\";\nimport { parseAcceptLanguage } from \"./locale\";\n\n/**\n * 匹配 Vite 配置级别的 renderMode 覆盖。\n * 精确路径优先,然后 glob 模式。\n */\nfunction matchRenderModeOverride(\n\turl: string,\n\trenderModes?: Record<string, string>,\n): string | null {\n\tif (!renderModes) return null;\n\tconst path = url.split(\"?\")[0];\n\tif (renderModes[path]) return renderModes[path];\n\tfor (const [pattern, mode] of Object.entries(renderModes)) {\n\t\tif (pattern.includes(\"*\")) {\n\t\t\tconst escaped = pattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\t\tconst re = new RegExp(\"^\" + escaped.replace(/\\*/g, \".*\") + \"$\");\n\t\t\tif (re.test(path)) return mode;\n\t\t}\n\t}\n\treturn null;\n}\n\nexport interface SSRModule {\n\trender: (\n\t\turl: string,\n\t\tlocale: string,\n\t\tssrContext?: {\n\t\t\tfetch?: typeof globalThis.fetch;\n\t\t\trequest?: Request;\n\t\t},\n\t) => Promise<{\n\t\thtml: string;\n\t\thead: string;\n\t\tcss: string;\n\t\tserverData: unknown;\n\t\trenderMode?: string;\n\t\tredirect?: { url: string; status: number };\n\t}>;\n\tserializeServerData: (data: unknown) => string;\n}\n\nexport interface SSRAppOptions {\n\t/** 项目根路径 */\n\troot: string;\n\t/** Vite dev server(仅开发模式) */\n\tvite?: ViteDevServer;\n\t/** 是否生产环境 */\n\tisProduction: boolean;\n\t/** SSR 入口文件路径(开发用,如 \"/src/ssr.ts\") */\n\tssrEntryPath?: string;\n\t/** 生产环境 SSR 模块路径(如 \"../dist/server/ssr.js\") */\n\tssrProductionModule?: string;\n\t/** 支持的语言列表 */\n\tsupportedLocales?: string[];\n\t/** 默认语言 */\n\tdefaultLocale?: string;\n\t/**\n\t * 父级 Hono app 的 fetch 函数,用于 SSR 内部路由回环。\n\t * SSR 渲染时,控制器的 fetch 请求(如 /api/apple/*)会通过此函数\n\t * 直接在进程内路由到代理 handler,避免网络自请求死锁。\n\t */\n\tparentFetch?: (request: Request) => Response | Promise<Response>;\n\t/**\n\t * 按路由覆盖渲染模式(精确路径或 glob 模式)。\n\t * 优先级高于路由级 renderMode。\n\t */\n\trenderModes?: Record<string, string>;\n}\n\nexport function createSSRApp(options: SSRAppOptions): Hono {\n\tconst {\n\t\troot,\n\t\tvite,\n\t\tisProduction,\n\t\tssrEntryPath = \"/src/ssr.ts\",\n\t\tssrProductionModule,\n\t\tsupportedLocales,\n\t\tdefaultLocale,\n\t\tparentFetch,\n\t\trenderModes,\n\t} = options;\n\n\tconst app = new Hono();\n\n\t/** ISR 内存缓存(prerender 路由首次请求后缓存,LRU 驱逐) */\n\tconst ISR_CACHE_MAX = 1000;\n\tconst isrCache = new Map<string, string>();\n\tfunction isrSet(key: string, val: string) {\n\t\tif (isrCache.size >= ISR_CACHE_MAX) {\n\t\t\tconst first = isrCache.keys().next().value;\n\t\t\tif (first !== undefined) isrCache.delete(first);\n\t\t}\n\t\tisrCache.set(key, val);\n\t}\n\n\t/** 生产环境模板缓存(模板不变,避免每请求重复读盘) */\n\tlet templateCache: string | undefined;\n\n\tasync function readTemplate(url: string): Promise<string> {\n\t\tif (!isProduction && vite) {\n\t\t\tconst { readFileSync } = await import(/* @vite-ignore */ \"node:fs\");\n\t\t\tconst { resolve } = await import(/* @vite-ignore */ \"node:path\");\n\t\t\tconst raw = readFileSync(resolve(root, \"index.html\"), \"utf-8\");\n\t\t\treturn vite.transformIndexHtml(url, raw);\n\t\t}\n\n\t\tif (templateCache) return templateCache;\n\n\t\tconst isDeno = typeof (globalThis as any).Deno !== \"undefined\";\n\t\tif (isDeno) {\n\t\t\ttemplateCache = (globalThis as any).Deno.readTextFileSync(\n\t\t\t\tnew URL(\"../dist/client/index.html\", import.meta.url),\n\t\t\t);\n\t\t\treturn templateCache!;\n\t\t}\n\n\t\tconst { readFileSync } = await import(/* @vite-ignore */ \"node:fs\");\n\t\tconst { resolve } = await import(/* @vite-ignore */ \"node:path\");\n\t\ttemplateCache = readFileSync(\n\t\t\tresolve(root, \"dist/client/index.html\"),\n\t\t\t\"utf-8\",\n\t\t);\n\t\treturn templateCache!;\n\t}\n\n\tasync function loadSSRModule(): Promise<SSRModule> {\n\t\tif (!isProduction && vite) {\n\t\t\treturn (await vite.ssrLoadModule(ssrEntryPath)) as SSRModule;\n\t\t}\n\t\tif (ssrProductionModule) {\n\t\t\treturn import(\n\t\t\t\t/* @vite-ignore */ ssrProductionModule\n\t\t\t) as Promise<SSRModule>;\n\t\t}\n\t\tconst { resolve } = await import(/* @vite-ignore */ \"node:path\");\n\t\tconst { pathToFileURL } = await import(/* @vite-ignore */ \"node:url\");\n\t\tconst absPath = pathToFileURL(resolve(root, \"dist/server/ssr.js\")).href;\n\t\treturn import(/* @vite-ignore */ absPath) as Promise<SSRModule>;\n\t}\n\n\tapp.get(\"*\", async (c) => {\n\t\t// 递归深度保护:从请求头读取 SSR 深度\n\t\tconst ssrDepth = parseInt(c.req.header(SSR_DEPTH_HEADER) ?? \"0\", 10);\n\t\tif (ssrDepth >= MAX_SSR_DEPTH) {\n\t\t\treturn c.text(\"SSR recursion loop detected\", 508);\n\t\t}\n\n\t\tconst url =\n\t\t\tc.req.path +\n\t\t\t(c.req.url.includes(\"?\") ? \"?\" + c.req.url.split(\"?\")[1] : \"\");\n\n\t\ttry {\n\t\t\tconst template = await readTemplate(url);\n\t\t\tconst { render, serializeServerData } = await loadSSRModule();\n\n\t\t\tconst locale = parseAcceptLanguage(\n\t\t\t\tc.req.header(\"accept-language\"),\n\t\t\t\tsupportedLocales,\n\t\t\t\tdefaultLocale,\n\t\t\t);\n\n\t\t\t// Vite 配置级别覆盖:CSR 直接返回空壳\n\t\t\tconst overrideMode = matchRenderModeOverride(url, renderModes);\n\t\t\tif (overrideMode === \"csr\") {\n\t\t\t\treturn c.html(injectCSRShell(template, locale));\n\t\t\t}\n\n\t\t\t// ISR 缓存命中(key 含 locale,避免跨语言缓存污染)\n\t\t\tconst cacheKey = `${locale}:${url}`;\n\t\t\tconst cached = isrCache.get(cacheKey);\n\t\t\tif (cached) return c.html(cached);\n\n\t\t\t// 每请求创建 internalFetch,深度通过请求头传递\n\t\t\tconst requestFetch = parentFetch\n\t\t\t\t? createInternalFetch(parentFetch, ssrDepth + 1)\n\t\t\t\t: undefined;\n\n\t\t\tconst ssrContext: {\n\t\t\t\tfetch?: typeof globalThis.fetch;\n\t\t\t\trequest?: Request;\n\t\t\t} = { request: c.req.raw };\n\t\t\tif (requestFetch) ssrContext.fetch = requestFetch;\n\n\t\t\tconst {\n\t\t\t\thtml: appHtml,\n\t\t\t\thead,\n\t\t\t\tcss,\n\t\t\t\tserverData,\n\t\t\t\trenderMode,\n\t\t\t\tredirect: middlewareRedirect,\n\t\t\t} = await render(url, locale, ssrContext);\n\n\t\t\t// 中间件要求重定向\n\t\t\tif (middlewareRedirect) {\n\t\t\t\treturn c.redirect(\n\t\t\t\t\tmiddlewareRedirect.url,\n\t\t\t\t\tmiddlewareRedirect.status as 301 | 302,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// CSR 模式:返回空壳 HTML\n\t\t\tif (renderMode === \"csr\") {\n\t\t\t\treturn c.html(injectCSRShell(template, locale));\n\t\t\t}\n\n\t\t\tconst serializedData = serializeServerData(serverData);\n\n\t\t\tconst finalHtml = injectSSRContent({\n\t\t\t\ttemplate,\n\t\t\t\tlocale,\n\t\t\t\thead,\n\t\t\t\tcss,\n\t\t\t\thtml: appHtml,\n\t\t\t\tserializedData,\n\t\t\t});\n\n\t\t\t// Prerender ISR 缓存(包括 Vite 配置覆盖和路由级)\n\t\t\tif (renderMode === \"prerender\" || overrideMode === \"prerender\") {\n\t\t\t\tisrSet(cacheKey, finalHtml);\n\t\t\t}\n\n\t\t\treturn c.html(finalHtml);\n\t\t} catch (e) {\n\t\t\tif (!isProduction && vite) {\n\t\t\t\tvite.ssrFixStacktrace(e as Error);\n\t\t\t}\n\t\t\tconsole.error(\"[SSR Error]\", e);\n\t\t\treturn c.text(\"Internal Server Error\", 500);\n\t\t}\n\t});\n\n\treturn app;\n}\n","/**\n * createInternalFetch — SSR 内部路由回环 fetch 包装器\n *\n * 将相对路径(/api/…)请求转为 Hono app.fetch 内存调用,\n * 绝对 URL 和非字符串 input 走 globalThis.fetch(真实网络)。\n *\n * 递归深度保护采用请求头传递:每次 SSR 回环在请求头中写入深度值,\n * SSR catch-all 读取深度判断是否超限。对比闭包计数器方案:\n * - 并发安全:无共享可变状态\n * - 跨渲染准确:深度随请求在 Hono 路由链中传递\n */\n\nexport const SSR_DEPTH_HEADER = \"x-ssr-depth\";\nexport const MAX_SSR_DEPTH = 5;\n\n/**\n * 创建请求级 internal fetch\n *\n * @param appFetch - Hono app.fetch(父级路由)\n * @param depth - 当前 SSR 深度(由 catch-all handler 从请求头读取后 +1 传入)\n */\nexport function createInternalFetch(\n\tappFetch: (request: Request) => Response | Promise<Response>,\n\tdepth: number = 1,\n): typeof globalThis.fetch {\n\treturn ((input: RequestInfo | URL, init?: RequestInit) => {\n\t\t// 只拦截相对路径(以 / 开头),其他一律走真实网络\n\t\tif (typeof input === \"string\" && input.startsWith(\"/\")) {\n\t\t\tconst request = new Request(`http://localhost${input}`, init);\n\t\t\trequest.headers.set(SSR_DEPTH_HEADER, String(depth));\n\t\t\treturn Promise.resolve(appFetch(request));\n\t\t}\n\n\t\t// 绝对 URL / URL 对象 / Request 对象 → 走正常网络\n\t\treturn globalThis.fetch(input, init);\n\t}) as typeof globalThis.fetch;\n}\n"],"mappings":"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","names":["readFileSync","resolve"]}
|
package/dist/chunk-PSPVIVC2.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// ../server/src/locale.ts
|
|
2
|
-
function parseAcceptLanguage(header, supported, fallback) {
|
|
3
|
-
const effectiveSupported = supported ?? ["zh", "en"];
|
|
4
|
-
const effectiveFallback = fallback ?? effectiveSupported[0] ?? "en";
|
|
5
|
-
if (!header) return effectiveFallback;
|
|
6
|
-
const langs = header.split(",").map((part) => {
|
|
7
|
-
const [lang, q] = part.trim().split(";q=");
|
|
8
|
-
return {
|
|
9
|
-
lang: lang.trim().toLowerCase(),
|
|
10
|
-
q: q ? parseFloat(q) || 0 : 1
|
|
11
|
-
};
|
|
12
|
-
}).sort((a, b) => b.q - a.q);
|
|
13
|
-
for (const { lang } of langs) {
|
|
14
|
-
const prefix = lang.split("-")[0];
|
|
15
|
-
if (effectiveSupported.includes(prefix)) {
|
|
16
|
-
return prefix;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return effectiveFallback;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export {
|
|
23
|
-
parseAcceptLanguage
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=chunk-PSPVIVC2.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/src/locale.ts"],"sourcesContent":["/**\n * Accept-Language 解析\n */\n\nexport function parseAcceptLanguage(\n\theader: string | undefined,\n\tsupported?: string[],\n\tfallback?: string,\n): string {\n\tconst effectiveSupported = supported ?? [\"zh\", \"en\"];\n\tconst effectiveFallback = fallback ?? effectiveSupported[0] ?? \"en\";\n\tif (!header) return effectiveFallback;\n\tconst langs = header\n\t\t.split(\",\")\n\t\t.map((part) => {\n\t\t\tconst [lang, q] = part.trim().split(\";q=\");\n\t\t\treturn {\n\t\t\t\tlang: lang.trim().toLowerCase(),\n\t\t\t\tq: q ? parseFloat(q) || 0 : 1,\n\t\t\t};\n\t\t})\n\t\t.sort((a, b) => b.q - a.q);\n\n\tfor (const { lang } of langs) {\n\t\tconst prefix = lang.split(\"-\")[0];\n\t\tif (effectiveSupported.includes(prefix)) {\n\t\t\treturn prefix;\n\t\t}\n\t}\n\treturn effectiveFallback;\n}\n"],"mappings":";AAIO,SAAS,oBACf,QACA,WACA,UACS;AACT,QAAM,qBAAqB,aAAa,CAAC,MAAM,IAAI;AACnD,QAAM,oBAAoB,YAAY,mBAAmB,CAAC,KAAK;AAC/D,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ,OACZ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS;AACd,UAAM,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,MAAM,KAAK;AACzC,WAAO;AAAA,MACN,MAAM,KAAK,KAAK,EAAE,YAAY;AAAA,MAC9B,GAAG,IAAI,WAAW,CAAC,KAAK,IAAI;AAAA,IAC7B;AAAA,EACD,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AAE1B,aAAW,EAAE,KAAK,KAAK,OAAO;AAC7B,UAAM,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC;AAChC,QAAI,mBAAmB,SAAS,MAAM,GAAG;AACxC,aAAO;AAAA,IACR;AAAA,EACD;AACA,SAAO;AACR;","names":[]}
|