@finesoft/front 0.1.38 → 0.1.41
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 -1066
- package/dist/app-D4K35MX3.js +0 -10
- package/dist/app-D4K35MX3.js.map +0 -1
- package/dist/browser.cjs +0 -1265
- package/dist/browser.cjs.map +0 -1
- package/dist/browser.d.cts +0 -771
- package/dist/browser.d.ts +0 -771
- package/dist/browser.js +0 -99
- package/dist/browser.js.map +0 -1
- package/dist/chunk-AYO3UUQC.js +0 -118
- package/dist/chunk-AYO3UUQC.js.map +0 -1
- package/dist/chunk-OXKFPW4U.js +0 -824
- package/dist/chunk-OXKFPW4U.js.map +0 -1
- package/dist/chunk-PHDR7PIL.js +0 -382
- package/dist/chunk-PHDR7PIL.js.map +0 -1
- package/dist/chunk-PSPVIVC2.js +0 -25
- package/dist/chunk-PSPVIVC2.js.map +0 -1
- package/dist/chunk-SFGR32K6.js +0 -188
- package/dist/chunk-SFGR32K6.js.map +0 -1
- package/dist/index.cjs +0 -3369
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -570
- package/dist/index.d.ts +0 -570
- package/dist/index.js +0 -1632
- 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-MVACJWBF.js +0 -21
- package/dist/src-MVACJWBF.js.map +0 -1
package/dist/browser.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
History,
|
|
3
|
-
createPrefetchedIntentsFromDom,
|
|
4
|
-
deserializeServerData,
|
|
5
|
-
registerActionHandlers,
|
|
6
|
-
registerExternalUrlHandler,
|
|
7
|
-
registerFlowActionHandler,
|
|
8
|
-
startBrowserApp,
|
|
9
|
-
tryScroll
|
|
10
|
-
} from "./chunk-PHDR7PIL.js";
|
|
11
|
-
import {
|
|
12
|
-
ACTION_KINDS,
|
|
13
|
-
ActionDispatcher,
|
|
14
|
-
BaseController,
|
|
15
|
-
BaseLogger,
|
|
16
|
-
CompositeLogger,
|
|
17
|
-
CompositeLoggerFactory,
|
|
18
|
-
ConsoleLogger,
|
|
19
|
-
ConsoleLoggerFactory,
|
|
20
|
-
Container,
|
|
21
|
-
DEP_KEYS,
|
|
22
|
-
Framework,
|
|
23
|
-
HttpClient,
|
|
24
|
-
HttpError,
|
|
25
|
-
IntentDispatcher,
|
|
26
|
-
LruMap,
|
|
27
|
-
PrefetchedIntents,
|
|
28
|
-
Router,
|
|
29
|
-
buildUrl,
|
|
30
|
-
defineRoutes,
|
|
31
|
-
generateUuid,
|
|
32
|
-
getBaseUrl,
|
|
33
|
-
isCompoundAction,
|
|
34
|
-
isExternalUrlAction,
|
|
35
|
-
isFlowAction,
|
|
36
|
-
isNone,
|
|
37
|
-
isSome,
|
|
38
|
-
makeDependencies,
|
|
39
|
-
makeExternalUrlAction,
|
|
40
|
-
makeFlowAction,
|
|
41
|
-
mapEach,
|
|
42
|
-
pipe,
|
|
43
|
-
pipeAsync,
|
|
44
|
-
removeHost,
|
|
45
|
-
removeQueryParams,
|
|
46
|
-
removeScheme,
|
|
47
|
-
resetFilterCache,
|
|
48
|
-
shouldLog,
|
|
49
|
-
stableStringify
|
|
50
|
-
} from "./chunk-OXKFPW4U.js";
|
|
51
|
-
export {
|
|
52
|
-
ACTION_KINDS,
|
|
53
|
-
ActionDispatcher,
|
|
54
|
-
BaseController,
|
|
55
|
-
BaseLogger,
|
|
56
|
-
CompositeLogger,
|
|
57
|
-
CompositeLoggerFactory,
|
|
58
|
-
ConsoleLogger,
|
|
59
|
-
ConsoleLoggerFactory,
|
|
60
|
-
Container,
|
|
61
|
-
DEP_KEYS,
|
|
62
|
-
Framework,
|
|
63
|
-
History,
|
|
64
|
-
HttpClient,
|
|
65
|
-
HttpError,
|
|
66
|
-
IntentDispatcher,
|
|
67
|
-
LruMap,
|
|
68
|
-
PrefetchedIntents,
|
|
69
|
-
Router,
|
|
70
|
-
buildUrl,
|
|
71
|
-
createPrefetchedIntentsFromDom,
|
|
72
|
-
defineRoutes,
|
|
73
|
-
deserializeServerData,
|
|
74
|
-
generateUuid,
|
|
75
|
-
getBaseUrl,
|
|
76
|
-
isCompoundAction,
|
|
77
|
-
isExternalUrlAction,
|
|
78
|
-
isFlowAction,
|
|
79
|
-
isNone,
|
|
80
|
-
isSome,
|
|
81
|
-
makeDependencies,
|
|
82
|
-
makeExternalUrlAction,
|
|
83
|
-
makeFlowAction,
|
|
84
|
-
mapEach,
|
|
85
|
-
pipe,
|
|
86
|
-
pipeAsync,
|
|
87
|
-
registerActionHandlers,
|
|
88
|
-
registerExternalUrlHandler,
|
|
89
|
-
registerFlowActionHandler,
|
|
90
|
-
removeHost,
|
|
91
|
-
removeQueryParams,
|
|
92
|
-
removeScheme,
|
|
93
|
-
resetFilterCache,
|
|
94
|
-
shouldLog,
|
|
95
|
-
stableStringify,
|
|
96
|
-
startBrowserApp,
|
|
97
|
-
tryScroll
|
|
98
|
-
};
|
|
99
|
-
//# sourceMappingURL=browser.js.map
|
package/dist/browser.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/chunk-AYO3UUQC.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Framework
|
|
3
|
-
} from "./chunk-OXKFPW4U.js";
|
|
4
|
-
|
|
5
|
-
// ../ssr/src/render.ts
|
|
6
|
-
async function ssrRender(options) {
|
|
7
|
-
const {
|
|
8
|
-
url,
|
|
9
|
-
frameworkConfig,
|
|
10
|
-
bootstrap,
|
|
11
|
-
getErrorPage,
|
|
12
|
-
renderApp,
|
|
13
|
-
ssrContext
|
|
14
|
-
} = options;
|
|
15
|
-
const mergedConfig = ssrContext?.fetch ? { ...frameworkConfig, fetch: ssrContext.fetch } : frameworkConfig;
|
|
16
|
-
const framework = Framework.create(mergedConfig);
|
|
17
|
-
bootstrap(framework);
|
|
18
|
-
try {
|
|
19
|
-
const parsed = new URL(url, "http://localhost");
|
|
20
|
-
const fullPath = parsed.pathname + parsed.search;
|
|
21
|
-
const match = framework.routeUrl(fullPath);
|
|
22
|
-
if (match?.renderMode === "csr") {
|
|
23
|
-
return {
|
|
24
|
-
html: "",
|
|
25
|
-
head: "",
|
|
26
|
-
css: "",
|
|
27
|
-
serverData: [],
|
|
28
|
-
renderMode: "csr"
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
let page;
|
|
32
|
-
let serverData = [];
|
|
33
|
-
if (match) {
|
|
34
|
-
try {
|
|
35
|
-
page = await framework.dispatch(match.intent);
|
|
36
|
-
serverData = [{ intent: match.intent, data: page }];
|
|
37
|
-
} catch (e) {
|
|
38
|
-
console.error(
|
|
39
|
-
`[SSR] dispatch failed for intent "${match.intent.id}":`,
|
|
40
|
-
e
|
|
41
|
-
);
|
|
42
|
-
page = getErrorPage(500, "Internal error");
|
|
43
|
-
}
|
|
44
|
-
} else {
|
|
45
|
-
page = getErrorPage(404, "Page not found");
|
|
46
|
-
}
|
|
47
|
-
const result = renderApp(page, framework);
|
|
48
|
-
return {
|
|
49
|
-
html: result.html,
|
|
50
|
-
head: result.head,
|
|
51
|
-
css: result.css,
|
|
52
|
-
serverData,
|
|
53
|
-
renderMode: match?.renderMode
|
|
54
|
-
};
|
|
55
|
-
} finally {
|
|
56
|
-
framework.dispose();
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// ../ssr/src/create-render.ts
|
|
61
|
-
function createSSRRender(config) {
|
|
62
|
-
const { bootstrap, getErrorPage, renderApp, frameworkConfig } = config;
|
|
63
|
-
return (url, locale, ssrContext) => ssrRender({
|
|
64
|
-
url,
|
|
65
|
-
frameworkConfig: frameworkConfig ?? {},
|
|
66
|
-
bootstrap,
|
|
67
|
-
getErrorPage,
|
|
68
|
-
renderApp: (page) => renderApp(page, locale),
|
|
69
|
-
ssrContext
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// ../ssr/src/inject.ts
|
|
74
|
-
var SSR_PLACEHOLDERS = {
|
|
75
|
-
LANG: "<!--ssr-lang-->",
|
|
76
|
-
HEAD: "<!--ssr-head-->",
|
|
77
|
-
BODY: "<!--ssr-body-->",
|
|
78
|
-
DATA: "<!--ssr-data-->"
|
|
79
|
-
};
|
|
80
|
-
function injectSSRContent(options) {
|
|
81
|
-
const { template, locale, head, css, html, serializedData } = options;
|
|
82
|
-
const cssTag = css ? `<style>${css}</style>` : "";
|
|
83
|
-
return template.replace(SSR_PLACEHOLDERS.LANG, locale).replace(SSR_PLACEHOLDERS.HEAD, `${head}
|
|
84
|
-
${cssTag}`).replace(SSR_PLACEHOLDERS.BODY, html).replace(
|
|
85
|
-
SSR_PLACEHOLDERS.DATA,
|
|
86
|
-
`<script id="serialized-server-data" type="application/json">${serializedData}</script>`
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
function injectCSRShell(template, locale) {
|
|
90
|
-
return template.replace(SSR_PLACEHOLDERS.LANG, locale).replace(SSR_PLACEHOLDERS.HEAD, "").replace(SSR_PLACEHOLDERS.BODY, "").replace(SSR_PLACEHOLDERS.DATA, "");
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// ../ssr/src/server-data.ts
|
|
94
|
-
var HTML_REPLACEMENTS = {
|
|
95
|
-
"<": "\\u003C",
|
|
96
|
-
">": "\\u003E",
|
|
97
|
-
"/": "\\u002F",
|
|
98
|
-
"\u2028": "\\u2028",
|
|
99
|
-
"\u2029": "\\u2029"
|
|
100
|
-
};
|
|
101
|
-
var HTML_ESCAPE_PATTERN = /[<>/\u2028\u2029]/g;
|
|
102
|
-
function serializeServerData(data) {
|
|
103
|
-
const json = JSON.stringify(data);
|
|
104
|
-
return json.replace(
|
|
105
|
-
HTML_ESCAPE_PATTERN,
|
|
106
|
-
(match) => HTML_REPLACEMENTS[match] ?? match
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export {
|
|
111
|
-
ssrRender,
|
|
112
|
-
createSSRRender,
|
|
113
|
-
SSR_PLACEHOLDERS,
|
|
114
|
-
injectSSRContent,
|
|
115
|
-
injectCSRShell,
|
|
116
|
-
serializeServerData
|
|
117
|
-
};
|
|
118
|
-
//# sourceMappingURL=chunk-AYO3UUQC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../ssr/src/render.ts","../../ssr/src/create-render.ts","../../ssr/src/inject.ts","../../ssr/src/server-data.ts"],"sourcesContent":["/**\n * ssrRender — 通用 SSR 渲染管线\n *\n * 1. 创建 Framework + 注册 Controllers\n * 2. routeUrl → Intent\n * 3. dispatch → Page 数据\n * 4. 调用应用层提供的渲染函数\n */\n\nimport {\n\tFramework,\n\ttype BasePage,\n\ttype FrameworkConfig,\n\ttype PrefetchedIntent,\n} from \"@finesoft/core\";\n\nexport interface SSRRenderOptions {\n\t/** 请求 URL */\n\turl: string;\n\t/** Framework 配置(含路由注册等) */\n\tframeworkConfig: FrameworkConfig;\n\t/** 注册 controllers 和路由的引导函数 */\n\tbootstrap: (framework: Framework) => void;\n\t/** 获取错误页面 */\n\tgetErrorPage: (status: number, message: string) => BasePage;\n\t/** 应用层渲染函数(如 Svelte SSR render) */\n\trenderApp: (page: BasePage, framework: Framework) => SSRAppResult;\n\t/** 可选的 SSR 请求上下文(如自定义 fetch) */\n\tssrContext?: SSRContext;\n}\n\n/** SSR 请求级上下文 */\nexport interface SSRContext {\n\t/** 自定义 fetch(如 Hono 内部路由回环) */\n\tfetch?: typeof globalThis.fetch;\n}\n\nexport interface SSRAppResult {\n\thtml: string;\n\thead: string;\n\tcss: string;\n}\n\nexport interface SSRRenderResult {\n\thtml: string;\n\thead: string;\n\tcss: string;\n\tserverData: PrefetchedIntent[];\n\t/** 该路由的渲染模式(由 Router 返回) */\n\trenderMode?: string;\n}\n\nexport async function ssrRender(\n\toptions: SSRRenderOptions,\n): Promise<SSRRenderResult> {\n\tconst {\n\t\turl,\n\t\tframeworkConfig,\n\t\tbootstrap,\n\t\tgetErrorPage,\n\t\trenderApp,\n\t\tssrContext,\n\t} = options;\n\n\t// 将 SSR 上下文中的 fetch 合并到 frameworkConfig,注入 DI 容器\n\tconst mergedConfig: FrameworkConfig = ssrContext?.fetch\n\t\t? { ...frameworkConfig, fetch: ssrContext.fetch }\n\t\t: frameworkConfig;\n\n\tconst framework = Framework.create(mergedConfig);\n\tbootstrap(framework);\n\n\ttry {\n\t\tconst parsed = new URL(url, \"http://localhost\");\n\t\tconst fullPath = parsed.pathname + parsed.search;\n\t\tconst match = framework.routeUrl(fullPath);\n\n\t\t// CSR 模式:跳过服务端渲染,返回空内容由客户端 JS 渲染\n\t\tif (match?.renderMode === \"csr\") {\n\t\t\treturn {\n\t\t\t\thtml: \"\",\n\t\t\t\thead: \"\",\n\t\t\t\tcss: \"\",\n\t\t\t\tserverData: [],\n\t\t\t\trenderMode: \"csr\",\n\t\t\t};\n\t\t}\n\n\t\tlet page: BasePage;\n\t\tlet serverData: PrefetchedIntent[] = [];\n\n\t\tif (match) {\n\t\t\ttry {\n\t\t\t\tpage = (await framework.dispatch(match.intent)) as BasePage;\n\t\t\t\tserverData = [{ intent: match.intent, data: page }];\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[SSR] dispatch failed for intent \"${match.intent.id}\":`,\n\t\t\t\t\te,\n\t\t\t\t);\n\t\t\t\tpage = getErrorPage(500, \"Internal error\");\n\t\t\t}\n\t\t} else {\n\t\t\tpage = getErrorPage(404, \"Page not found\");\n\t\t}\n\n\t\tconst result = renderApp(page, framework);\n\n\t\treturn {\n\t\t\thtml: result.html,\n\t\t\thead: result.head,\n\t\t\tcss: result.css,\n\t\t\tserverData,\n\t\t\trenderMode: match?.renderMode,\n\t\t};\n\t} finally {\n\t\tframework.dispose();\n\t}\n}\n","/**\n * createSSRRender — 工厂函数,返回可直接被 SSR 服务器调用的 render 函数\n *\n * 将一次性配置(bootstrap / getErrorPage / renderApp)绑定后,\n * 返回 `(url, locale) => Promise<SSRRenderResult>` 签名,\n * 与 @finesoft/server 的 SSRModule 接口对齐。\n */\n\nimport type { BasePage, Framework, FrameworkConfig } from \"@finesoft/core\";\nimport {\n\tssrRender,\n\ttype SSRAppResult,\n\ttype SSRContext,\n\ttype SSRRenderResult,\n} from \"./render\";\n\nexport interface SSRRenderConfig {\n\t/** 注册 controllers 和路由的引导函数 */\n\tbootstrap: (framework: Framework) => void;\n\n\t/** 获取错误页面 */\n\tgetErrorPage: (status: number, message: string) => BasePage;\n\n\t/**\n\t * 应用层渲染函数\n\t *\n\t * @param page - 当前页面数据\n\t * @param locale - 当前语言\n\t * @returns SSR 渲染结果 { html, head, css }\n\t */\n\trenderApp: (page: BasePage, locale: string) => SSRAppResult;\n\n\t/** Framework 构造配置(可选) */\n\tframeworkConfig?: FrameworkConfig;\n}\n\n/**\n * 创建 render 函数\n *\n * @returns `render(url, locale, ssrContext?)` — 供 @finesoft/server SSRModule 使用\n */\nexport function createSSRRender(\n\tconfig: SSRRenderConfig,\n): (\n\turl: string,\n\tlocale: string,\n\tssrContext?: SSRContext,\n) => Promise<SSRRenderResult> {\n\tconst { bootstrap, getErrorPage, renderApp, frameworkConfig } = config;\n\n\treturn (url: string, locale: string, ssrContext?: SSRContext) =>\n\t\tssrRender({\n\t\t\turl,\n\t\t\tframeworkConfig: frameworkConfig ?? {},\n\t\t\tbootstrap,\n\t\t\tgetErrorPage,\n\t\t\trenderApp: (page) => renderApp(page, locale),\n\t\t\tssrContext,\n\t\t});\n}\n","/**\n * injectSSRContent — 将 SSR 渲染结果注入 HTML 模板\n */\n\n/** SSR HTML 模板占位符常量 */\nexport const SSR_PLACEHOLDERS = {\n\tLANG: \"<!--ssr-lang-->\",\n\tHEAD: \"<!--ssr-head-->\",\n\tBODY: \"<!--ssr-body-->\",\n\tDATA: \"<!--ssr-data-->\",\n} as const;\n\nexport interface InjectSSROptions {\n\ttemplate: string;\n\tlocale: string;\n\thead: string;\n\tcss: string;\n\thtml: string;\n\tserializedData: string;\n}\n\nexport function injectSSRContent(options: InjectSSROptions): string {\n\tconst { template, locale, head, css, html, serializedData } = options;\n\tconst cssTag = css ? `<style>${css}</style>` : \"\";\n\n\treturn template\n\t\t.replace(SSR_PLACEHOLDERS.LANG, locale)\n\t\t.replace(SSR_PLACEHOLDERS.HEAD, `${head}\\n${cssTag}`)\n\t\t.replace(SSR_PLACEHOLDERS.BODY, html)\n\t\t.replace(\n\t\t\tSSR_PLACEHOLDERS.DATA,\n\t\t\t`<script id=\"serialized-server-data\" type=\"application/json\">${serializedData}</script>`,\n\t\t);\n}\n\n/**\n * CSR 空壳注入 — 只替换 lang,清空 body/head/data 占位符\n * 用于 renderMode === \"csr\" 的路由\n */\nexport function injectCSRShell(template: string, locale: string): string {\n\treturn template\n\t\t.replace(SSR_PLACEHOLDERS.LANG, locale)\n\t\t.replace(SSR_PLACEHOLDERS.HEAD, \"\")\n\t\t.replace(SSR_PLACEHOLDERS.BODY, \"\")\n\t\t.replace(SSR_PLACEHOLDERS.DATA, \"\");\n}\n","/**\n * serializeServerData — 将 PrefetchedIntents 数据序列化为安全的 JSON\n *\n * 返回值可安全嵌入 <script> 标签。\n */\n\nimport type { PrefetchedIntent } from \"@finesoft/core\";\n\nconst HTML_REPLACEMENTS: Record<string, string> = {\n\t\"<\": \"\\\\u003C\",\n\t\">\": \"\\\\u003E\",\n\t\"/\": \"\\\\u002F\",\n\t\"\\u2028\": \"\\\\u2028\",\n\t\"\\u2029\": \"\\\\u2029\",\n};\n\nconst HTML_ESCAPE_PATTERN = /[<>/\\u2028\\u2029]/g;\n\nexport function serializeServerData(data: PrefetchedIntent[]): string {\n\tconst json = JSON.stringify(data);\n\treturn json.replace(\n\t\tHTML_ESCAPE_PATTERN,\n\t\t(match) => HTML_REPLACEMENTS[match] ?? match,\n\t);\n}\n"],"mappings":"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","names":[]}
|