@trebired/frontend 6.5.0 → 6.6.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.
Files changed (66) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/server/assets.d.ts +28 -0
  3. package/dist/server/assets.d.ts.map +1 -0
  4. package/dist/server/assets.js +157 -0
  5. package/dist/server/assets.js.map +1 -0
  6. package/dist/server/index.d.ts +4 -0
  7. package/dist/server/index.d.ts.map +1 -1
  8. package/dist/server/index.js +4 -0
  9. package/dist/server/index.js.map +1 -1
  10. package/dist/server/locale.d.ts +22 -0
  11. package/dist/server/locale.d.ts.map +1 -0
  12. package/dist/server/locale.js +74 -0
  13. package/dist/server/locale.js.map +1 -0
  14. package/dist/server/page-task.d.ts +36 -0
  15. package/dist/server/page-task.d.ts.map +1 -0
  16. package/dist/server/page-task.js +91 -0
  17. package/dist/server/page-task.js.map +1 -0
  18. package/dist/server/react/document.d.ts +29 -0
  19. package/dist/server/react/document.d.ts.map +1 -0
  20. package/dist/server/react/document.js +123 -0
  21. package/dist/server/react/document.js.map +1 -0
  22. package/dist/server/react/render.d.ts +15 -0
  23. package/dist/server/react/render.d.ts.map +1 -0
  24. package/dist/server/react/render.js +60 -0
  25. package/dist/server/react/render.js.map +1 -0
  26. package/dist/server/react/shell.d.ts +7 -0
  27. package/dist/server/react/shell.d.ts.map +1 -0
  28. package/dist/server/react/shell.js +49 -0
  29. package/dist/server/react/shell.js.map +1 -0
  30. package/dist/server/react/types.d.ts +71 -0
  31. package/dist/server/react/types.d.ts.map +1 -0
  32. package/dist/server/react/types.js +2 -0
  33. package/dist/server/react/types.js.map +1 -0
  34. package/dist/src/server/assets.d.ts +28 -0
  35. package/dist/src/server/assets.d.ts.map +1 -0
  36. package/dist/src/server/assets.js +157 -0
  37. package/dist/src/server/assets.js.map +1 -0
  38. package/dist/src/server/index.d.ts +4 -0
  39. package/dist/src/server/index.d.ts.map +1 -1
  40. package/dist/src/server/index.js +4 -0
  41. package/dist/src/server/index.js.map +1 -1
  42. package/dist/src/server/locale.d.ts +22 -0
  43. package/dist/src/server/locale.d.ts.map +1 -0
  44. package/dist/src/server/locale.js +74 -0
  45. package/dist/src/server/locale.js.map +1 -0
  46. package/dist/src/server/page-task.d.ts +36 -0
  47. package/dist/src/server/page-task.d.ts.map +1 -0
  48. package/dist/src/server/page-task.js +91 -0
  49. package/dist/src/server/page-task.js.map +1 -0
  50. package/dist/src/server/react/document.d.ts +29 -0
  51. package/dist/src/server/react/document.d.ts.map +1 -0
  52. package/dist/src/server/react/document.js +123 -0
  53. package/dist/src/server/react/document.js.map +1 -0
  54. package/dist/src/server/react/render.d.ts +15 -0
  55. package/dist/src/server/react/render.d.ts.map +1 -0
  56. package/dist/src/server/react/render.js +60 -0
  57. package/dist/src/server/react/render.js.map +1 -0
  58. package/dist/src/server/react/shell.d.ts +7 -0
  59. package/dist/src/server/react/shell.d.ts.map +1 -0
  60. package/dist/src/server/react/shell.js +49 -0
  61. package/dist/src/server/react/shell.js.map +1 -0
  62. package/dist/src/server/react/types.d.ts +71 -0
  63. package/dist/src/server/react/types.d.ts.map +1 -0
  64. package/dist/src/server/react/types.js +2 -0
  65. package/dist/src/server/react/types.js.map +1 -0
  66. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable package changes are documented here.
4
4
 
5
+ ## 6.6.1
6
+
7
+ - Re-exported React server renderer option/context types from `@trebired/frontend/server`.
8
+
9
+ ## 6.6.0
10
+
11
+ - Added server framework helpers for asset responses, locale locals, page task timeouts, and adapter-based React document rendering.
12
+ - Exposed React SSR shell assembly hooks so apps supply product data, permission state, component resolution, and title rules without owning document orchestration.
13
+ - Added verification coverage for asset compression/cache behavior, locale middleware, page task fallback results, and React document rendering.
14
+
5
15
  ## 6.5.0
6
16
 
7
17
  - Added public server helpers for frontend security locals and render-mode UI composition.
@@ -0,0 +1,28 @@
1
+ import { type ServerRequestLike, type ServerResponseLike } from "./http.js";
2
+ type FrontendAsset = {
3
+ body?: Buffer | string;
4
+ contentType?: string;
5
+ etag?: string;
6
+ };
7
+ type FrontendAssetOptions = {
8
+ brotliQuality?: number;
9
+ contentType?: string;
10
+ gzipLevel?: number;
11
+ immutable?: boolean;
12
+ isImmutablePath?: (path: string) => boolean;
13
+ minCompressBytes?: number;
14
+ precompress?: boolean;
15
+ record?: (durationMs: number) => unknown;
16
+ };
17
+ declare function assetBodyBuffer(asset: FrontendAsset | null | undefined): Buffer<ArrayBufferLike>;
18
+ declare function assetContentType(asset: FrontendAsset | null | undefined, fallback?: string): string;
19
+ declare function assetIsCompressible(asset: FrontendAsset | null | undefined, fallback?: string): boolean;
20
+ declare function prepareAsset(asset: FrontendAsset, options?: FrontendAssetOptions): FrontendAsset;
21
+ declare function sendAsset(req: ServerRequestLike, res: ServerResponseLike, asset: FrontendAsset, options?: FrontendAssetOptions): boolean;
22
+ declare function cacheControlForPercent(percent: unknown): {
23
+ immutable: boolean;
24
+ value: string;
25
+ };
26
+ export { assetBodyBuffer, assetContentType, assetIsCompressible, cacheControlForPercent, prepareAsset, sendAsset, };
27
+ export type { FrontendAsset, FrontendAssetOptions };
28
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/server/assets.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AAEnB,KAAK,aAAa,GAAG;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;CAC1C,CAAC;AAKF,iBAAS,eAAe,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,2BAG/D;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,SAAK,UAE/E;AAED,iBAAS,mBAAmB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,SAAK,WAQlF;AAsDD,iBAAS,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,GAAE,oBAAyB,iBAiB7E;AA+DD,iBAAS,SAAS,CAChB,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,kBAAkB,EACvB,KAAK,EAAE,aAAa,EACpB,OAAO,GAAE,oBAAyB,WAmBnC;AAED,iBAAS,sBAAsB,CAAC,OAAO,EAAE,OAAO;;;EAU/C;AAED,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,EACZ,SAAS,GACV,CAAC;AACF,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,157 @@
1
+ import zlib from "node:zlib";
2
+ import { requestHeader, setResponseHeader, } from "./http.js";
3
+ const encodedCache = new WeakMap();
4
+ const preparedAssets = new WeakSet();
5
+ function assetBodyBuffer(asset) {
6
+ const body = asset && asset.body != null ? asset.body : "";
7
+ return Buffer.isBuffer(body) ? body : Buffer.from(String(body), "utf8");
8
+ }
9
+ function assetContentType(asset, fallback = "") {
10
+ return String(asset && asset.contentType ? asset.contentType : fallback);
11
+ }
12
+ function assetIsCompressible(asset, fallback = "") {
13
+ const type = assetContentType(asset, fallback).toLowerCase();
14
+ return (type.includes("text/css") ||
15
+ type.includes("javascript") ||
16
+ type.includes("application/json") ||
17
+ type.includes("text/plain"));
18
+ }
19
+ function cacheEncodedAsset(asset, encoding, encoded, rawLength) {
20
+ if (!encoding || !encoded || encoded.length >= rawLength)
21
+ return;
22
+ const cache = encodedCache.get(asset) || {};
23
+ cache[encoding] = encoded;
24
+ encodedCache.set(asset, cache);
25
+ }
26
+ function boundedInteger(value, fallback, min, max) {
27
+ const parsed = Math.floor(Number(value));
28
+ if (!Number.isFinite(parsed))
29
+ return fallback;
30
+ return Math.max(min, Math.min(max, parsed));
31
+ }
32
+ function prepareBrotliAsset(asset, raw, options) {
33
+ try {
34
+ cacheEncodedAsset(asset, "br", zlib.brotliCompressSync(raw, {
35
+ params: {
36
+ [zlib.constants.BROTLI_PARAM_QUALITY]: boundedInteger(options.brotliQuality, 5, 0, 11),
37
+ [zlib.constants.BROTLI_PARAM_SIZE_HINT]: raw.length,
38
+ },
39
+ }), raw.length);
40
+ }
41
+ catch { }
42
+ }
43
+ function prepareGzipAsset(asset, raw, options) {
44
+ try {
45
+ cacheEncodedAsset(asset, "gzip", zlib.gzipSync(raw, {
46
+ level: boundedInteger(options.gzipLevel, 6, 1, 9),
47
+ }), raw.length);
48
+ }
49
+ catch { }
50
+ }
51
+ function prepareAsset(asset, options = {}) {
52
+ if (!asset || typeof asset !== "object")
53
+ return asset;
54
+ if (preparedAssets.has(asset))
55
+ return asset;
56
+ preparedAssets.add(asset);
57
+ if (options.precompress === false || !assetIsCompressible(asset, options.contentType)) {
58
+ return asset;
59
+ }
60
+ const raw = assetBodyBuffer(asset);
61
+ if (raw.length < Math.max(0, Number(options.minCompressBytes) || 1024)) {
62
+ return asset;
63
+ }
64
+ prepareBrotliAsset(asset, raw, options);
65
+ prepareGzipAsset(asset, raw, options);
66
+ return asset;
67
+ }
68
+ function requestAssetPath(req) {
69
+ return String((req && (req.path || req.originalUrl || req.url)) || "")
70
+ .split("?")[0];
71
+ }
72
+ function isHashedAssetPath(path) {
73
+ return /^\/(?:css|js)\/.+-[a-f0-9]{8,64}\.(?:css|js)$/i.test(path);
74
+ }
75
+ function shouldUseImmutableCache(req, options) {
76
+ if (options.immutable === false)
77
+ return false;
78
+ const path = requestAssetPath(req);
79
+ return options.isImmutablePath ? options.isImmutablePath(path) : isHashedAssetPath(path);
80
+ }
81
+ function applyAssetCacheHeaders(req, res, options) {
82
+ if (shouldUseImmutableCache(req, options)) {
83
+ setResponseHeader(res, "Cache-Control", "public, max-age=31536000, immutable");
84
+ return;
85
+ }
86
+ setResponseHeader(res, "Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
87
+ setResponseHeader(res, "Pragma", "no-cache");
88
+ setResponseHeader(res, "Expires", "0");
89
+ }
90
+ function preferredAssetEncoding(req) {
91
+ const accept = requestHeader(req, "accept-encoding").toLowerCase();
92
+ if (accept.includes("br"))
93
+ return "br";
94
+ if (accept.includes("gzip"))
95
+ return "gzip";
96
+ return "";
97
+ }
98
+ function encodedAssetBody(asset, encoding) {
99
+ if (!encoding || !assetIsCompressible(asset))
100
+ return null;
101
+ return encodedCache.get(asset)?.[encoding] || null;
102
+ }
103
+ function sendPreparedAssetBody(req, res, asset) {
104
+ const encoding = preferredAssetEncoding(req);
105
+ const encoded = encodedAssetBody(asset, encoding);
106
+ const body = encoded || assetBodyBuffer(asset);
107
+ if (encoded) {
108
+ setResponseHeader(res, "Content-Encoding", encoding);
109
+ setResponseHeader(res, "Vary", "Accept-Encoding");
110
+ }
111
+ setResponseHeader(res, "Content-Length", String(body.length));
112
+ if (typeof res.send === "function")
113
+ return res.send(body);
114
+ return res.end?.(body);
115
+ }
116
+ function sendAsset(req, res, asset, options = {}) {
117
+ const startedAt = performance.now();
118
+ try {
119
+ const etag = asset && typeof asset.etag === "string" ? asset.etag : "";
120
+ if (etag)
121
+ setResponseHeader(res, "ETag", etag);
122
+ if (etag && requestHeader(req, "if-none-match") === etag) {
123
+ if (typeof res.status === "function")
124
+ res.status(304);
125
+ res.end?.();
126
+ return true;
127
+ }
128
+ const type = assetContentType(asset, options.contentType);
129
+ if (type)
130
+ setResponseHeader(res, "Content-Type", type);
131
+ applyAssetCacheHeaders(req, res, options);
132
+ sendPreparedAssetBody(req, res, prepareAsset(asset, options));
133
+ return true;
134
+ }
135
+ finally {
136
+ options.record?.(Math.max(0, performance.now() - startedAt));
137
+ }
138
+ }
139
+ function cacheControlForPercent(percent) {
140
+ const parsed = Number(percent);
141
+ const value = Math.max(0, Math.min(100, Math.floor(Number.isFinite(parsed) ? parsed : 100)));
142
+ if (value === 0)
143
+ return { immutable: false, value: "no-store, must-revalidate" };
144
+ if (value <= 10)
145
+ return { immutable: false, value: "public, max-age=0, must-revalidate" };
146
+ if (value <= 40)
147
+ return { immutable: false, value: "public, max-age=600" };
148
+ if (value <= 70)
149
+ return { immutable: false, value: "public, max-age=3600" };
150
+ if (value <= 90)
151
+ return { immutable: false, value: "public, max-age=86400" };
152
+ if (value < 100)
153
+ return { immutable: false, value: "public, max-age=31536000" };
154
+ return { immutable: true, value: "public, max-age=31536000, immutable" };
155
+ }
156
+ export { assetBodyBuffer, assetContentType, assetIsCompressible, cacheControlForPercent, prepareAsset, sendAsset, };
157
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/server/assets.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,13 @@ export * from "../icons/server-context.d.ts";
4
4
  export * from "../icons/shared.d.ts";
5
5
  export * from "./favicon.js";
6
6
  export * from "./http.js";
7
+ export * from "./assets.js";
7
8
  export * from "./language.js";
9
+ export * from "./locale.js";
8
10
  export * from "./live.js";
9
11
  export * from "./navigation.js";
12
+ export * from "./page-task.js";
13
+ export * from "./react/render.d.ts";
10
14
  export * from "./render-mode.js";
11
15
  export * from "./security.js";
12
16
  export * from "./seo.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -4,9 +4,13 @@ export * from "../icons/server-context.js";
4
4
  export * from "../icons/shared.js";
5
5
  export * from "./favicon.js";
6
6
  export * from "./http.js";
7
+ export * from "./assets.js";
7
8
  export * from "./language.js";
9
+ export * from "./locale.js";
8
10
  export * from "./live.js";
9
11
  export * from "./navigation.js";
12
+ export * from "./page-task.js";
13
+ export * from "./react/render.js";
10
14
  export * from "./render-mode.js";
11
15
  export * from "./security.js";
12
16
  export * from "./seo.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type ServerRequestLike, type ServerResponseLike } from "./http.js";
2
+ type LocaleState = {
3
+ effective: string;
4
+ request: string;
5
+ user: string;
6
+ };
7
+ type LocaleMiddlewareOptions = {
8
+ defaultLocale?: string;
9
+ localsKey?: string;
10
+ normalize?: (value: unknown) => string;
11
+ readUserLocale?: (req: ServerRequestLike, res: ServerResponseLike) => unknown;
12
+ };
13
+ declare function normalizeIntlLocale(input: unknown): string;
14
+ declare function readRequestLocale(req: ServerRequestLike | null | undefined, normalize?: (value: unknown) => string): string;
15
+ declare function createLocaleState(req: ServerRequestLike, res: ServerResponseLike, options?: LocaleMiddlewareOptions): LocaleState;
16
+ declare function applyLocaleToLocals(req: ServerRequestLike, res: ServerResponseLike, options?: LocaleMiddlewareOptions): LocaleState;
17
+ declare function createLocaleMiddleware(options?: LocaleMiddlewareOptions): (req: ServerRequestLike, res: ServerResponseLike, next: () => unknown) => unknown;
18
+ declare function attachLocaleMiddleware(app: unknown, options?: LocaleMiddlewareOptions): void;
19
+ declare const normalizeLocale: typeof normalizeIntlLocale;
20
+ export { applyLocaleToLocals, attachLocaleMiddleware, createLocaleMiddleware, createLocaleState, normalizeLocale, readRequestLocale, };
21
+ export type { LocaleMiddlewareOptions, LocaleState };
22
+ //# sourceMappingURL=locale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../../../src/server/locale.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,WAAW,CAAC;AAEnB,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC;CAC/E,CAAC;AAEF,iBAAS,mBAAmB,CAAC,KAAK,EAAE,OAAO,UAQ1C;AASD,iBAAS,iBAAiB,CACxB,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,EACzC,SAAS,GAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAA4B,UAc5D;AAYD,iBAAS,iBAAiB,CACxB,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,kBAAkB,EACvB,OAAO,GAAE,uBAA4B,GACpC,WAAW,CAWb;AAED,iBAAS,mBAAmB,CAC1B,GAAG,EAAE,iBAAiB,EACtB,GAAG,EAAE,kBAAkB,EACvB,OAAO,GAAE,uBAA4B,eAMtC;AAED,iBAAS,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,IAEjE,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,MAAM,MAAM,OAAO,aAKtB;AAED,iBAAS,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,uBAA4B,QAIlF;AAED,QAAA,MAAM,eAAe,4BAAsB,CAAC;AAE5C,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,GAClB,CAAC;AACF,YAAY,EAAE,uBAAuB,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { requestHeader, } from "./http.js";
2
+ function normalizeIntlLocale(input) {
3
+ const raw = String(input == null ? "" : input).trim();
4
+ if (!raw)
5
+ return "";
6
+ try {
7
+ return Intl.DateTimeFormat.supportedLocalesOf([raw])[0] || "";
8
+ }
9
+ catch {
10
+ return "";
11
+ }
12
+ }
13
+ function localeWeight(entry) {
14
+ const match = entry.match(/(?:^|;)\s*q=([0-9.]+)/i);
15
+ if (!match)
16
+ return 1;
17
+ const parsed = Number(match[1]);
18
+ return Number.isFinite(parsed) ? parsed : 0;
19
+ }
20
+ function readRequestLocale(req, normalize = normalizeIntlLocale) {
21
+ const raw = requestHeader(req, "accept-language");
22
+ if (!raw)
23
+ return "";
24
+ const entries = raw
25
+ .split(",")
26
+ .map((entry) => entry.trim())
27
+ .filter(Boolean)
28
+ .sort((left, right) => localeWeight(right) - localeWeight(left));
29
+ for (const entry of entries) {
30
+ const locale = normalize(entry.split(";")[0]);
31
+ if (locale)
32
+ return locale;
33
+ }
34
+ return "";
35
+ }
36
+ function defaultUserLocale(req, res) {
37
+ const viewer = req?.viewer && typeof req.viewer === "object"
38
+ ? req.viewer
39
+ : res?.locals?.viewer && typeof res.locals.viewer === "object"
40
+ ? res.locals.viewer
41
+ : null;
42
+ return viewer && typeof viewer === "object" ? viewer.locale : "";
43
+ }
44
+ function createLocaleState(req, res, options = {}) {
45
+ const normalize = options.normalize || normalizeIntlLocale;
46
+ const user = normalize(options.readUserLocale ? options.readUserLocale(req, res) : defaultUserLocale(req, res));
47
+ const request = readRequestLocale(req, normalize);
48
+ return {
49
+ effective: user || request || normalize(options.defaultLocale),
50
+ request,
51
+ user,
52
+ };
53
+ }
54
+ function applyLocaleToLocals(req, res, options = {}) {
55
+ if (!res.locals || typeof res.locals !== "object")
56
+ res.locals = {};
57
+ const state = createLocaleState(req, res, options);
58
+ res.locals[options.localsKey || "locale"] = state;
59
+ return state;
60
+ }
61
+ function createLocaleMiddleware(options = {}) {
62
+ return function localeMiddleware(req, res, next) {
63
+ applyLocaleToLocals(req, res, options);
64
+ return next();
65
+ };
66
+ }
67
+ function attachLocaleMiddleware(app, options = {}) {
68
+ if (app && typeof app.use === "function") {
69
+ app.use(createLocaleMiddleware(options));
70
+ }
71
+ }
72
+ const normalizeLocale = normalizeIntlLocale;
73
+ export { applyLocaleToLocals, attachLocaleMiddleware, createLocaleMiddleware, createLocaleState, normalizeLocale, readRequestLocale, };
74
+ //# sourceMappingURL=locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.js","sourceRoot":"","sources":["../../../src/server/locale.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ type PageTaskFailure = {
2
+ details: string;
3
+ ok: false;
4
+ status: number;
5
+ status_code: string;
6
+ };
7
+ type PageTaskFailureContext = {
8
+ entityId: string;
9
+ message: string;
10
+ operation: string;
11
+ page: string;
12
+ status: number;
13
+ statusCode: string;
14
+ timeoutMs: number;
15
+ };
16
+ type PageTaskOptions<TFailure = PageTaskFailure> = {
17
+ entityId?: unknown;
18
+ fail?: (context: PageTaskFailureContext) => TFailure;
19
+ failureMessage?: (context: {
20
+ operation: string;
21
+ status: number;
22
+ statusCode: string;
23
+ }) => string;
24
+ logger?: {
25
+ error?: (scope: string, message: string, metadata?: Record<string, unknown>) => unknown;
26
+ warn?: (scope: string, message: string, metadata?: Record<string, unknown>) => unknown;
27
+ };
28
+ operation: unknown;
29
+ page: unknown;
30
+ timeoutMs?: unknown;
31
+ };
32
+ declare const DEFAULT_PAGE_TASK_TIMEOUT_MS = 15000;
33
+ declare function runPageTask<T, TFailure = PageTaskFailure>(task: () => Promise<T>, options: PageTaskOptions<TFailure>): Promise<T | TFailure>;
34
+ export { DEFAULT_PAGE_TASK_TIMEOUT_MS, runPageTask };
35
+ export type { PageTaskFailure, PageTaskFailureContext, PageTaskOptions };
36
+ //# sourceMappingURL=page-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-task.d.ts","sourceRoot":"","sources":["../../../src/server/page-task.ts"],"names":[],"mappings":"AAEA,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,eAAe,CAAC,QAAQ,GAAG,eAAe,IAAI;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,QAAQ,CAAC;IACrD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACtB,KAAK,MAAM,CAAC;IACb,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;QACxF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;KACxF,CAAC;IACF,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,QAAA,MAAM,4BAA4B,QAAQ,CAAC;AAmF3C,iBAAe,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,eAAe,EACtD,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,GACjC,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAmCvB;AAED,OAAO,EAAE,4BAA4B,EAAE,WAAW,EAAE,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { toText } from "../components/index.js";
2
+ const DEFAULT_PAGE_TASK_TIMEOUT_MS = 15000;
3
+ function pageTaskTimeoutMs(input) {
4
+ const parsed = Number(input);
5
+ return Math.max(1, Number.isFinite(parsed) ? Math.floor(parsed) : DEFAULT_PAGE_TASK_TIMEOUT_MS);
6
+ }
7
+ function pageTaskErrorStatus(error) {
8
+ const status = error && typeof error === "object" && "status" in error
9
+ ? Number(error.status)
10
+ : 0;
11
+ return Number.isFinite(status) && status > 0 ? status : 500;
12
+ }
13
+ function pageTaskErrorCode(error, status) {
14
+ return (toText(error && typeof error === "object" && "status_code" in error
15
+ ? error.status_code
16
+ : "") || (status === 504 ? "page-route-timeout" : "page-route-load-failed"));
17
+ }
18
+ function defaultFailureMessage(status, operation) {
19
+ return status === 504
20
+ ? `Timed out while loading ${operation}.`
21
+ : `Failed to load ${operation}.`;
22
+ }
23
+ function pageTaskErrorMessage(error, context, options) {
24
+ return (toText(error && typeof error === "object" && "message" in error
25
+ ? error.message
26
+ : "") ||
27
+ options.failureMessage?.(context) ||
28
+ defaultFailureMessage(context.status, context.operation));
29
+ }
30
+ function pageTaskFailure(context, options) {
31
+ if (options.fail)
32
+ return options.fail(context);
33
+ return {
34
+ details: context.message,
35
+ ok: false,
36
+ status: context.status,
37
+ status_code: context.statusCode,
38
+ };
39
+ }
40
+ function logPageTaskFailure(context, options) {
41
+ const level = context.status >= 500 && context.status !== 504 ? "error" : "warn";
42
+ options.logger?.[level]?.("frontend.page", "page task failed", {
43
+ entity_id: context.entityId,
44
+ message: context.message,
45
+ operation: context.operation,
46
+ page: context.page,
47
+ status: context.status,
48
+ status_code: context.statusCode,
49
+ timeout_ms: context.timeoutMs,
50
+ });
51
+ }
52
+ function createPageTaskTimeout(operation) {
53
+ const error = new Error(defaultFailureMessage(504, operation));
54
+ error.status = 504;
55
+ error.status_code = "page-route-timeout";
56
+ return error;
57
+ }
58
+ async function runPageTask(task, options) {
59
+ const operation = toText(options.operation, "page task");
60
+ const timeoutMs = pageTaskTimeoutMs(options.timeoutMs);
61
+ let timer = null;
62
+ try {
63
+ return await Promise.race([
64
+ Promise.resolve().then(task),
65
+ new Promise((_, reject) => {
66
+ timer = setTimeout(() => reject(createPageTaskTimeout(operation)), timeoutMs);
67
+ }),
68
+ ]);
69
+ }
70
+ catch (error) {
71
+ const status = pageTaskErrorStatus(error);
72
+ const statusCode = pageTaskErrorCode(error, status);
73
+ const context = {
74
+ entityId: toText(options.entityId),
75
+ message: pageTaskErrorMessage(error, { operation, status, statusCode }, options),
76
+ operation,
77
+ page: toText(options.page, "unknown"),
78
+ status,
79
+ statusCode,
80
+ timeoutMs,
81
+ };
82
+ logPageTaskFailure(context, options);
83
+ return pageTaskFailure(context, options);
84
+ }
85
+ finally {
86
+ if (timer)
87
+ clearTimeout(timer);
88
+ }
89
+ }
90
+ export { DEFAULT_PAGE_TASK_TIMEOUT_MS, runPageTask };
91
+ //# sourceMappingURL=page-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-task.js","sourceRoot":"","sources":["../../../src/server/page-task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type ServerResponseLike } from "../http.d.ts";
2
+ import type { FrontendDocumentContext, FrontendReactRendererOptions, FrontendRenderShell } from "./types.d.ts";
3
+ declare function defaultNormalizePageId(pageId: unknown): string;
4
+ declare function applyScriptNonce(html: string, nonce: unknown): string;
5
+ declare function countHtmlTags(html: string, tagName: string): number;
6
+ declare function readResponseRequestRoute(res: ServerResponseLike | null | undefined): string;
7
+ declare function buildDocumentContext(res: ServerResponseLike, pageId: string, componentId: string, props: Record<string, unknown>, options: FrontendReactRendererOptions, shellInput?: FrontendRenderShell): FrontendDocumentContext;
8
+ declare function rootDocumentProps(body: unknown, context: FrontendDocumentContext, options: FrontendReactRendererOptions): {
9
+ body: unknown;
10
+ cssLinks: string;
11
+ csrfToken: string;
12
+ currentUrl: string;
13
+ faviconHref: string;
14
+ fontPreloadLinks: string;
15
+ jsLinks: string;
16
+ lang: string;
17
+ nonce: string;
18
+ pageId: string;
19
+ pageTitle: string;
20
+ seo: Record<string, unknown>;
21
+ shell: FrontendRenderShell;
22
+ theme: string;
23
+ themeKey: string;
24
+ title: string;
25
+ viewerId: string;
26
+ };
27
+ declare function logDocumentStart(context: FrontendDocumentContext, res: ServerResponseLike, options: FrontendReactRendererOptions): void;
28
+ export { applyScriptNonce, buildDocumentContext, countHtmlTags, defaultNormalizePageId, logDocumentStart, readResponseRequestRoute, rootDocumentProps, };
29
+ //# sourceMappingURL=document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../../src/server/react/document.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EACV,uBAAuB,EACvB,4BAA4B,EAC5B,mBAAmB,EACpB,MAAM,eAAe,CAAC;AAEvB,iBAAS,sBAAsB,CAAC,MAAM,EAAE,OAAO,UAY9C;AAED,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,UAQrD;AAED,iBAAS,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAInD;AAED,iBAAS,wBAAwB,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,SAAS,UAG3E;AAwCD,iBAAS,oBAAoB,CAC3B,GAAG,EAAE,kBAAkB,EACvB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,4BAA4B,EACrC,UAAU,CAAC,EAAE,mBAAmB,GAC/B,uBAAuB,CAoBzB;AAkBD,iBAAS,iBAAiB,CACxB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,4BAA4B;;;;;;;;;;;;;;;;;;EAqBtC;AAED,iBAAS,gBAAgB,CACvB,OAAO,EAAE,uBAAuB,EAChC,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,4BAA4B,QActC;AAED,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GAClB,CAAC"}