@bleedingdev/modern-js-runtime-extensions 3.9.0-ultramodern.4 → 3.9.0-ultramodern.6
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/cjs/contextExtensions.js +74 -0
- package/dist/cjs/headRuntime.js +91 -0
- package/dist/cjs/helmetContext.js +54 -0
- package/dist/cjs/index.js +18 -4
- package/dist/cjs/prefetchPolicy.js +52 -0
- package/dist/cjs/request-policy/browser.js +139 -0
- package/dist/cjs/request-policy/client.js +234 -0
- package/dist/cjs/request-policy/node.js +149 -0
- package/dist/cjs/request-policy/policyCore.js +266 -0
- package/dist/cjs/request-policy/requestContext.js +137 -0
- package/dist/cjs/request-policy/traceparent.js +56 -0
- package/dist/cjs/request-policy/transport.js +234 -0
- package/dist/cjs/request-policy/types.js +57 -0
- package/dist/cjs/routeHydration.js +127 -0
- package/dist/cjs/routerPrefetchPolicy.js +153 -0
- package/dist/cjs/routerProvider.js +105 -0
- package/dist/cjs/routerState.js +167 -0
- package/dist/cjs/routerStatePlugin.js +86 -0
- package/dist/cjs/routerStateTypes.js +18 -0
- package/dist/cjs/runtimeContextProjection.js +112 -0
- package/dist/cjs/server-config/bffRuntime.js +18 -0
- package/dist/cjs/server-config/index.js +18 -0
- package/dist/cjs/server-config/serverTelemetry.js +18 -0
- package/dist/cjs/shellStream.js +34 -2
- package/dist/cjs/workspaceEvents.js +159 -0
- package/dist/esm/contextExtensions.mjs +33 -0
- package/dist/esm/headRuntime.mjs +43 -0
- package/dist/esm/helmetContext.mjs +13 -0
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/prefetchPolicy.mjs +11 -0
- package/dist/esm/request-policy/browser.mjs +11 -0
- package/dist/esm/request-policy/client.mjs +195 -0
- package/dist/esm/request-policy/policyCore.mjs +171 -0
- package/dist/esm/request-policy/requestContext.mjs +75 -0
- package/dist/esm/request-policy/traceparent.mjs +18 -0
- package/dist/esm/request-policy/transport.mjs +196 -0
- package/dist/esm/request-policy/types.mjs +10 -0
- package/dist/esm/routeHydration.mjs +77 -0
- package/dist/esm/routerPrefetchPolicy.mjs +115 -0
- package/dist/esm/routerProvider.mjs +58 -0
- package/dist/esm/routerState.mjs +105 -0
- package/dist/esm/routerStatePlugin.mjs +48 -0
- package/dist/esm/routerStateTypes.mjs +0 -0
- package/dist/esm/runtimeContextProjection.mjs +74 -0
- package/dist/esm/server-config/bffRuntime.mjs +0 -0
- package/dist/esm/server-config/index.mjs +0 -0
- package/dist/esm/server-config/serverTelemetry.mjs +0 -0
- package/dist/esm/shellStream.mjs +34 -2
- package/dist/esm/workspaceEvents.mjs +66 -0
- package/dist/esm-node/contextExtensions.mjs +34 -0
- package/dist/esm-node/headRuntime.mjs +44 -0
- package/dist/esm-node/helmetContext.mjs +14 -0
- package/dist/esm-node/index.mjs +2 -0
- package/dist/esm-node/prefetchPolicy.mjs +12 -0
- package/dist/esm-node/request-policy/browser.mjs +12 -0
- package/dist/esm-node/request-policy/client.mjs +196 -0
- package/dist/esm-node/request-policy/node.mjs +22 -0
- package/dist/esm-node/request-policy/policyCore.mjs +172 -0
- package/dist/esm-node/request-policy/requestContext.mjs +76 -0
- package/dist/esm-node/request-policy/traceparent.mjs +19 -0
- package/dist/esm-node/request-policy/transport.mjs +197 -0
- package/dist/esm-node/request-policy/types.mjs +11 -0
- package/dist/esm-node/routeHydration.mjs +78 -0
- package/dist/esm-node/routerPrefetchPolicy.mjs +116 -0
- package/dist/esm-node/routerProvider.mjs +59 -0
- package/dist/esm-node/routerState.mjs +106 -0
- package/dist/esm-node/routerStatePlugin.mjs +49 -0
- package/dist/esm-node/routerStateTypes.mjs +1 -0
- package/dist/esm-node/runtimeContextProjection.mjs +75 -0
- package/dist/esm-node/server-config/bffRuntime.mjs +1 -0
- package/dist/esm-node/server-config/index.mjs +1 -0
- package/dist/esm-node/server-config/serverTelemetry.mjs +1 -0
- package/dist/esm-node/shellStream.mjs +34 -2
- package/dist/esm-node/workspaceEvents.mjs +67 -0
- package/dist/types/contextExtensions.d.ts +34 -0
- package/dist/types/headRuntime.d.ts +12 -0
- package/dist/types/helmetContext.d.ts +10 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/prefetchPolicy.d.ts +4 -0
- package/dist/types/request-policy/browser.d.ts +10 -0
- package/dist/types/request-policy/client.d.ts +14 -0
- package/dist/types/request-policy/node.d.ts +10 -0
- package/dist/types/request-policy/policyCore.d.ts +107 -0
- package/dist/types/request-policy/requestContext.d.ts +22 -0
- package/dist/types/request-policy/traceparent.d.ts +10 -0
- package/dist/types/request-policy/transport.d.ts +12 -0
- package/dist/types/request-policy/types.d.ts +144 -0
- package/dist/types/routeHydration.d.ts +24 -0
- package/dist/types/routerPrefetchPolicy.d.ts +28 -0
- package/dist/types/routerProvider.d.ts +55 -0
- package/dist/types/routerState.d.ts +12 -0
- package/dist/types/routerStatePlugin.d.ts +19 -0
- package/dist/types/routerStateTypes.d.ts +40 -0
- package/dist/types/runtimeContextProjection.d.ts +30 -0
- package/dist/types/server-config/bffRuntime.d.ts +122 -0
- package/dist/types/server-config/index.d.ts +2 -0
- package/dist/types/server-config/serverTelemetry.d.ts +322 -0
- package/dist/types/workspaceEvents.d.ts +62 -0
- package/package.json +198 -13
- package/rslib.config.mts +17 -2
- package/rstest.config.mts +33 -2
- package/src/contextExtensions.ts +81 -0
- package/src/headRuntime.tsx +77 -0
- package/src/helmetContext.ts +31 -0
- package/src/index.ts +2 -0
- package/src/prefetchPolicy.ts +33 -0
- package/src/request-policy/browser.ts +22 -0
- package/src/request-policy/client.ts +404 -0
- package/src/request-policy/node.ts +41 -0
- package/src/request-policy/policyCore.ts +424 -0
- package/src/request-policy/requestContext.ts +149 -0
- package/src/request-policy/traceparent.ts +43 -0
- package/src/request-policy/transport.ts +349 -0
- package/src/request-policy/types.ts +229 -0
- package/src/routeHydration.ts +208 -0
- package/src/routerPrefetchPolicy.ts +195 -0
- package/src/routerProvider.ts +160 -0
- package/src/routerState.ts +208 -0
- package/src/routerStatePlugin.ts +86 -0
- package/src/routerStateTypes.ts +46 -0
- package/src/runtimeContextProjection.ts +105 -0
- package/src/server-config/bffRuntime.ts +136 -0
- package/src/server-config/index.ts +2 -0
- package/src/server-config/serverTelemetry.ts +337 -0
- package/src/shellStream.ts +55 -25
- package/src/workspaceEvents.ts +324 -0
- package/tests/buildIdentity.test.ts +2 -4
- package/tests/contextExtensions.test.ts +71 -0
- package/tests/headRuntime.test.tsx +369 -0
- package/tests/nativeSafeFailureCompatibility.test.ts +117 -0
- package/tests/prefetchPolicy.test.ts +51 -0
- package/tests/rendererHead.test.ts +1 -72
- package/tests/request-policy/browser-policy.test.ts +608 -0
- package/tests/request-policy/client-isolation.test.ts +149 -0
- package/tests/request-policy/identityBinding.test.ts +75 -0
- package/tests/request-policy/node-policy.test.ts +741 -0
- package/tests/request-policy/policyCore.test.ts +250 -0
- package/tests/request-policy/requestContext.test.ts +80 -0
- package/tests/request-policy/requestFactory.outbound-contract.test.ts +691 -0
- package/tests/request-policy/traceparent.test.ts +55 -0
- package/tests/request-policy/transport-retry.test.ts +370 -0
- package/tests/routeHydration.test.ts +180 -0
- package/tests/routerPrefetchPolicy.test.ts +102 -0
- package/tests/routerProvider.test.ts +29 -0
- package/tests/routerState.test.ts +157 -0
- package/tests/routerStatePlugin.test.ts +108 -0
- package/tests/runtimeContextProjection.test.ts +135 -0
- package/tests/shellStream.test.ts +37 -0
- package/tests/workspaceEvents.test.ts +391 -0
- package/dist/cjs/rscHtmlStream.js +0 -128
- package/dist/esm/rscHtmlStream.mjs +0 -86
- package/dist/esm-node/rscHtmlStream.mjs +0 -87
- package/dist/types/rscHtmlStream.d.ts +0 -4
- package/src/rscHtmlStream.ts +0 -142
- package/tests/rscHtmlStream.test.ts +0 -153
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type UltramodernPerformanceReadinessSignalId = 'bfcache' | 'core-web-vitals-rum' | 'duplicate-prefetch-warmup' | 'cache-policy-sanity' | 'save-data-behavior' | 'cloudflare-ssr-cache-hints';
|
|
2
|
+
export type UltramodernWorkspaceLocale = 'en' | 'cs';
|
|
3
|
+
export type UltramodernPerformanceReadinessSignalStatus = 'pass' | 'warn' | 'fail';
|
|
4
|
+
export declare const ultramodernWorkspaceEventNames: {
|
|
5
|
+
readonly navigate: 'ultramodern:navigate';
|
|
6
|
+
readonly performanceSignal: 'ultramodern:performance-signal';
|
|
7
|
+
readonly remoteReady: 'ultramodern:remote-ready';
|
|
8
|
+
readonly routeSettled: 'ultramodern:route-settled';
|
|
9
|
+
};
|
|
10
|
+
export type UltramodernWorkspaceEventName = (typeof ultramodernWorkspaceEventNames)[keyof typeof ultramodernWorkspaceEventNames];
|
|
11
|
+
export interface UltramodernNavigatePayload {
|
|
12
|
+
to: string;
|
|
13
|
+
replace?: boolean;
|
|
14
|
+
state?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
export interface UltramodernRouteSettledPayload {
|
|
17
|
+
pathname: string;
|
|
18
|
+
locale?: UltramodernWorkspaceLocale;
|
|
19
|
+
title?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface UltramodernRemoteReadyPayload {
|
|
22
|
+
appId: string;
|
|
23
|
+
build?: string;
|
|
24
|
+
surface?: string;
|
|
25
|
+
version?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface UltramodernPerformanceSignalPayload {
|
|
28
|
+
signalId: UltramodernPerformanceReadinessSignalId;
|
|
29
|
+
status: UltramodernPerformanceReadinessSignalStatus;
|
|
30
|
+
durationMs?: number;
|
|
31
|
+
detail?: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
export interface UltramodernWorkspaceEventPayloadMap {
|
|
34
|
+
'ultramodern:navigate': UltramodernNavigatePayload;
|
|
35
|
+
'ultramodern:performance-signal': UltramodernPerformanceSignalPayload;
|
|
36
|
+
'ultramodern:remote-ready': UltramodernRemoteReadyPayload;
|
|
37
|
+
'ultramodern:route-settled': UltramodernRouteSettledPayload;
|
|
38
|
+
}
|
|
39
|
+
export declare class UltramodernWorkspaceEventValidationError {
|
|
40
|
+
readonly message: string;
|
|
41
|
+
readonly name = "UltramodernWorkspaceEventValidationError";
|
|
42
|
+
readonly eventName: UltramodernWorkspaceEventName;
|
|
43
|
+
readonly payload: unknown;
|
|
44
|
+
constructor(eventName: UltramodernWorkspaceEventName, payload: unknown);
|
|
45
|
+
}
|
|
46
|
+
export declare const isUltramodernNavigatePayload: (payload: unknown) => payload is UltramodernNavigatePayload;
|
|
47
|
+
export declare const isUltramodernRouteSettledPayload: (payload: unknown) => payload is UltramodernRouteSettledPayload;
|
|
48
|
+
export declare const isUltramodernRemoteReadyPayload: (payload: unknown) => payload is UltramodernRemoteReadyPayload;
|
|
49
|
+
export declare const isUltramodernPerformanceSignalPayload: (payload: unknown) => payload is UltramodernPerformanceSignalPayload;
|
|
50
|
+
export declare const isUltramodernWorkspaceEventPayload: <Name extends UltramodernWorkspaceEventName>(eventName: Name, payload: unknown) => payload is UltramodernWorkspaceEventPayloadMap[Name];
|
|
51
|
+
export declare const assertUltramodernWorkspaceEventPayload: <Name extends UltramodernWorkspaceEventName>(eventName: Name, payload: unknown) => UltramodernWorkspaceEventPayloadMap[Name];
|
|
52
|
+
export declare const createUltramodernWorkspaceEvent: <Name extends UltramodernWorkspaceEventName>(eventName: Name, payload: UltramodernWorkspaceEventPayloadMap[Name]) => CustomEvent<UltramodernWorkspaceEventPayloadMap[Name]>;
|
|
53
|
+
export declare const dispatchUltramodernWorkspaceEvent: <Name extends UltramodernWorkspaceEventName>(target: EventTarget, eventName: Name, payload: UltramodernWorkspaceEventPayloadMap[Name]) => boolean;
|
|
54
|
+
export declare const onUltramodernWorkspaceEvent: <Name extends UltramodernWorkspaceEventName>(target: EventTarget, eventName: Name, handler: (payload: UltramodernWorkspaceEventPayloadMap[Name], event: CustomEvent<UltramodernWorkspaceEventPayloadMap[Name]>) => void) => () => void;
|
|
55
|
+
export declare const dispatchUltramodernNavigate: (target: EventTarget, payload: UltramodernNavigatePayload) => boolean;
|
|
56
|
+
export declare const dispatchUltramodernRouteSettled: (target: EventTarget, payload: UltramodernRouteSettledPayload) => boolean;
|
|
57
|
+
export declare const dispatchUltramodernRemoteReady: (target: EventTarget, payload: UltramodernRemoteReadyPayload) => boolean;
|
|
58
|
+
export declare const dispatchUltramodernPerformanceSignal: (target: EventTarget, payload: UltramodernPerformanceSignalPayload) => boolean;
|
|
59
|
+
export declare const onUltramodernNavigate: (target: EventTarget, handler: (payload: UltramodernNavigatePayload, event: CustomEvent<UltramodernNavigatePayload>) => void) => () => void;
|
|
60
|
+
export declare const onUltramodernRouteSettled: (target: EventTarget, handler: (payload: UltramodernRouteSettledPayload, event: CustomEvent<UltramodernRouteSettledPayload>) => void) => () => void;
|
|
61
|
+
export declare const onUltramodernRemoteReady: (target: EventTarget, handler: (payload: UltramodernRemoteReadyPayload, event: CustomEvent<UltramodernRemoteReadyPayload>) => void) => () => void;
|
|
62
|
+
export declare const onUltramodernPerformanceSignal: (target: EventTarget, handler: (payload: UltramodernPerformanceSignalPayload, event: CustomEvent<UltramodernPerformanceSignalPayload>) => void) => () => void;
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"directory": "packages/runtime/runtime-extensions"
|
|
12
12
|
},
|
|
13
13
|
"license": "MIT",
|
|
14
|
-
"version": "3.9.0-ultramodern.
|
|
14
|
+
"version": "3.9.0-ultramodern.6",
|
|
15
15
|
"engines": {
|
|
16
16
|
"node": ">=26.7.0"
|
|
17
17
|
},
|
|
@@ -34,14 +34,6 @@
|
|
|
34
34
|
},
|
|
35
35
|
"default": "./dist/esm-node/node.mjs"
|
|
36
36
|
},
|
|
37
|
-
"./rsc-html-stream": {
|
|
38
|
-
"types": "./dist/types/rscHtmlStream.d.ts",
|
|
39
|
-
"node": {
|
|
40
|
-
"import": "./dist/esm-node/rscHtmlStream.mjs",
|
|
41
|
-
"require": "./dist/cjs/rscHtmlStream.js"
|
|
42
|
-
},
|
|
43
|
-
"default": "./dist/esm-node/rscHtmlStream.mjs"
|
|
44
|
-
},
|
|
45
37
|
"./safe-failure": {
|
|
46
38
|
"types": "./dist/types/safeFailure.d.ts",
|
|
47
39
|
"node": {
|
|
@@ -58,6 +50,14 @@
|
|
|
58
50
|
},
|
|
59
51
|
"default": "./dist/esm/buildIdentity.mjs"
|
|
60
52
|
},
|
|
53
|
+
"./workspace-events": {
|
|
54
|
+
"types": "./dist/types/workspaceEvents.d.ts",
|
|
55
|
+
"node": {
|
|
56
|
+
"import": "./dist/esm-node/workspaceEvents.mjs",
|
|
57
|
+
"require": "./dist/cjs/workspaceEvents.js"
|
|
58
|
+
},
|
|
59
|
+
"default": "./dist/esm/workspaceEvents.mjs"
|
|
60
|
+
},
|
|
61
61
|
"./rsc-disabled/*": {
|
|
62
62
|
"types": "./dist/types/rsc-disabled/*.d.ts",
|
|
63
63
|
"default": "./dist/esm/rsc-disabled/*.mjs"
|
|
@@ -77,6 +77,115 @@
|
|
|
77
77
|
"require": "./dist/cjs/reactContext.js"
|
|
78
78
|
},
|
|
79
79
|
"default": "./dist/esm/reactContext.mjs"
|
|
80
|
+
},
|
|
81
|
+
"./context-extensions": {
|
|
82
|
+
"types": "./dist/types/contextExtensions.d.ts",
|
|
83
|
+
"node": {
|
|
84
|
+
"import": "./dist/esm-node/contextExtensions.mjs",
|
|
85
|
+
"require": "./dist/cjs/contextExtensions.js"
|
|
86
|
+
},
|
|
87
|
+
"default": "./dist/esm/contextExtensions.mjs"
|
|
88
|
+
},
|
|
89
|
+
"./helmet-context": {
|
|
90
|
+
"types": "./dist/types/helmetContext.d.ts",
|
|
91
|
+
"node": {
|
|
92
|
+
"import": "./dist/esm-node/helmetContext.mjs",
|
|
93
|
+
"require": "./dist/cjs/helmetContext.js"
|
|
94
|
+
},
|
|
95
|
+
"default": "./dist/esm/helmetContext.mjs"
|
|
96
|
+
},
|
|
97
|
+
"./head-runtime": {
|
|
98
|
+
"types": "./dist/types/headRuntime.d.ts",
|
|
99
|
+
"node": {
|
|
100
|
+
"import": "./dist/esm-node/headRuntime.mjs",
|
|
101
|
+
"require": "./dist/cjs/headRuntime.js"
|
|
102
|
+
},
|
|
103
|
+
"default": "./dist/esm/headRuntime.mjs"
|
|
104
|
+
},
|
|
105
|
+
"./context-projection": {
|
|
106
|
+
"types": "./dist/types/runtimeContextProjection.d.ts",
|
|
107
|
+
"node": {
|
|
108
|
+
"import": "./dist/esm-node/runtimeContextProjection.mjs",
|
|
109
|
+
"require": "./dist/cjs/runtimeContextProjection.js"
|
|
110
|
+
},
|
|
111
|
+
"default": "./dist/esm/runtimeContextProjection.mjs"
|
|
112
|
+
},
|
|
113
|
+
"./server-config": {
|
|
114
|
+
"types": "./dist/types/server-config/index.d.ts",
|
|
115
|
+
"node": {
|
|
116
|
+
"import": "./dist/esm-node/server-config/index.mjs",
|
|
117
|
+
"require": "./dist/cjs/server-config/index.js"
|
|
118
|
+
},
|
|
119
|
+
"default": "./dist/esm/server-config/index.mjs"
|
|
120
|
+
},
|
|
121
|
+
"./router-state": {
|
|
122
|
+
"types": "./dist/types/routerState.d.ts",
|
|
123
|
+
"node": {
|
|
124
|
+
"import": "./dist/esm-node/routerState.mjs",
|
|
125
|
+
"require": "./dist/cjs/routerState.js"
|
|
126
|
+
},
|
|
127
|
+
"default": "./dist/esm/routerState.mjs"
|
|
128
|
+
},
|
|
129
|
+
"./request-policy": {
|
|
130
|
+
"types": "./dist/types/request-policy/browser.d.ts",
|
|
131
|
+
"node": {
|
|
132
|
+
"import": "./dist/esm-node/request-policy/node.mjs",
|
|
133
|
+
"require": "./dist/esm-node/request-policy/node.mjs",
|
|
134
|
+
"default": "./dist/esm-node/request-policy/node.mjs"
|
|
135
|
+
},
|
|
136
|
+
"import": "./dist/esm/request-policy/browser.mjs",
|
|
137
|
+
"require": "./dist/esm/request-policy/browser.mjs",
|
|
138
|
+
"default": "./dist/esm/request-policy/browser.mjs"
|
|
139
|
+
},
|
|
140
|
+
"./request-policy/client": {
|
|
141
|
+
"types": "./dist/types/request-policy/browser.d.ts",
|
|
142
|
+
"import": "./dist/esm/request-policy/browser.mjs",
|
|
143
|
+
"require": "./dist/esm/request-policy/browser.mjs",
|
|
144
|
+
"default": "./dist/esm/request-policy/browser.mjs"
|
|
145
|
+
},
|
|
146
|
+
"./request-policy/server": {
|
|
147
|
+
"types": "./dist/types/request-policy/node.d.ts",
|
|
148
|
+
"node": {
|
|
149
|
+
"import": "./dist/esm-node/request-policy/node.mjs",
|
|
150
|
+
"require": "./dist/esm-node/request-policy/node.mjs",
|
|
151
|
+
"default": "./dist/esm-node/request-policy/node.mjs"
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
"./request-context": {
|
|
155
|
+
"types": "./dist/types/request-policy/requestContext.d.ts",
|
|
156
|
+
"node": {
|
|
157
|
+
"import": "./dist/esm-node/request-policy/requestContext.mjs",
|
|
158
|
+
"require": "./dist/esm-node/request-policy/requestContext.mjs",
|
|
159
|
+
"default": "./dist/esm-node/request-policy/requestContext.mjs"
|
|
160
|
+
},
|
|
161
|
+
"import": "./dist/esm/request-policy/requestContext.mjs",
|
|
162
|
+
"require": "./dist/esm/request-policy/requestContext.mjs",
|
|
163
|
+
"default": "./dist/esm/request-policy/requestContext.mjs"
|
|
164
|
+
},
|
|
165
|
+
"./package.json": "./package.json",
|
|
166
|
+
"./router-state-plugin": {
|
|
167
|
+
"types": "./dist/types/routerStatePlugin.d.ts",
|
|
168
|
+
"node": {
|
|
169
|
+
"import": "./dist/esm-node/routerStatePlugin.mjs",
|
|
170
|
+
"require": "./dist/cjs/routerStatePlugin.js"
|
|
171
|
+
},
|
|
172
|
+
"default": "./dist/esm/routerStatePlugin.mjs"
|
|
173
|
+
},
|
|
174
|
+
"./router-provider": {
|
|
175
|
+
"types": "./dist/types/routerProvider.d.ts",
|
|
176
|
+
"node": {
|
|
177
|
+
"import": "./dist/esm-node/routerProvider.mjs",
|
|
178
|
+
"require": "./dist/cjs/routerProvider.js"
|
|
179
|
+
},
|
|
180
|
+
"default": "./dist/esm/routerProvider.mjs"
|
|
181
|
+
},
|
|
182
|
+
"./router-prefetch-policy": {
|
|
183
|
+
"types": "./dist/types/routerPrefetchPolicy.d.ts",
|
|
184
|
+
"node": {
|
|
185
|
+
"import": "./dist/esm-node/routerPrefetchPolicy.mjs",
|
|
186
|
+
"require": "./dist/cjs/routerPrefetchPolicy.js"
|
|
187
|
+
},
|
|
188
|
+
"default": "./dist/esm/routerPrefetchPolicy.mjs"
|
|
80
189
|
}
|
|
81
190
|
},
|
|
82
191
|
"typesVersions": {
|
|
@@ -89,10 +198,6 @@
|
|
|
89
198
|
"./dist/types/node.d.ts",
|
|
90
199
|
"./src/node.ts"
|
|
91
200
|
],
|
|
92
|
-
"rsc-html-stream": [
|
|
93
|
-
"./dist/types/rscHtmlStream.d.ts",
|
|
94
|
-
"./src/rscHtmlStream.ts"
|
|
95
|
-
],
|
|
96
201
|
"safe-failure": [
|
|
97
202
|
"./dist/types/safeFailure.d.ts",
|
|
98
203
|
"./src/safeFailure.ts"
|
|
@@ -101,6 +206,10 @@
|
|
|
101
206
|
"./dist/types/buildIdentity.d.ts",
|
|
102
207
|
"./src/buildIdentity.ts"
|
|
103
208
|
],
|
|
209
|
+
"workspace-events": [
|
|
210
|
+
"./dist/types/workspaceEvents.d.ts",
|
|
211
|
+
"./src/workspaceEvents.ts"
|
|
212
|
+
],
|
|
104
213
|
"localised-loader-identity": [
|
|
105
214
|
"./dist/types/localisedLoaderIdentity.d.ts",
|
|
106
215
|
"./src/localisedLoaderIdentity.ts"
|
|
@@ -108,20 +217,96 @@
|
|
|
108
217
|
"react-context": [
|
|
109
218
|
"./dist/types/reactContext.d.ts",
|
|
110
219
|
"./src/reactContext.ts"
|
|
220
|
+
],
|
|
221
|
+
"context-extensions": [
|
|
222
|
+
"./dist/types/contextExtensions.d.ts",
|
|
223
|
+
"./src/contextExtensions.ts"
|
|
224
|
+
],
|
|
225
|
+
"helmet-context": [
|
|
226
|
+
"./dist/types/helmetContext.d.ts",
|
|
227
|
+
"./src/helmetContext.ts"
|
|
228
|
+
],
|
|
229
|
+
"head-runtime": [
|
|
230
|
+
"./dist/types/headRuntime.d.ts",
|
|
231
|
+
"./src/headRuntime.tsx"
|
|
232
|
+
],
|
|
233
|
+
"context-projection": [
|
|
234
|
+
"./dist/types/runtimeContextProjection.d.ts",
|
|
235
|
+
"./src/runtimeContextProjection.ts"
|
|
236
|
+
],
|
|
237
|
+
"server-config": [
|
|
238
|
+
"./dist/types/server-config/index.d.ts",
|
|
239
|
+
"./src/server-config/index.ts"
|
|
240
|
+
],
|
|
241
|
+
"router-state": [
|
|
242
|
+
"./dist/types/routerState.d.ts",
|
|
243
|
+
"./src/routerState.ts"
|
|
244
|
+
],
|
|
245
|
+
"request-policy": [
|
|
246
|
+
"./dist/types/request-policy/browser.d.ts",
|
|
247
|
+
"./src/request-policy/browser.ts"
|
|
248
|
+
],
|
|
249
|
+
"request-policy/client": [
|
|
250
|
+
"./dist/types/request-policy/browser.d.ts",
|
|
251
|
+
"./src/request-policy/browser.ts"
|
|
252
|
+
],
|
|
253
|
+
"request-policy/server": [
|
|
254
|
+
"./dist/types/request-policy/node.d.ts",
|
|
255
|
+
"./src/request-policy/node.ts"
|
|
256
|
+
],
|
|
257
|
+
"request-context": [
|
|
258
|
+
"./dist/types/request-policy/requestContext.d.ts",
|
|
259
|
+
"./src/request-policy/requestContext.ts"
|
|
260
|
+
],
|
|
261
|
+
"router-state-plugin": [
|
|
262
|
+
"./dist/types/routerStatePlugin.d.ts",
|
|
263
|
+
"./src/routerStatePlugin.ts"
|
|
264
|
+
],
|
|
265
|
+
"router-provider": [
|
|
266
|
+
"./dist/types/routerProvider.d.ts",
|
|
267
|
+
"./src/routerProvider.ts"
|
|
268
|
+
],
|
|
269
|
+
"router-prefetch-policy": [
|
|
270
|
+
"./dist/types/routerPrefetchPolicy.d.ts",
|
|
271
|
+
"./src/routerPrefetchPolicy.ts"
|
|
111
272
|
]
|
|
112
273
|
}
|
|
113
274
|
},
|
|
114
275
|
"devDependencies": {
|
|
276
|
+
"@loadable/component": "5.16.7",
|
|
277
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.6",
|
|
278
|
+
"@rsbuild/core": "2.2.3",
|
|
115
279
|
"@rslib/core": "1.0.0",
|
|
116
280
|
"@scripts/rstest-config": "2.66.0",
|
|
281
|
+
"@testing-library/dom": "^10.4.1",
|
|
282
|
+
"@testing-library/react": "^16.3.3",
|
|
117
283
|
"@types/node": "^26.4.1",
|
|
284
|
+
"@types/react": "^19.2.18",
|
|
285
|
+
"@types/react-dom": "^19.2.7",
|
|
118
286
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
287
|
+
"esbuild": "^0.28.2",
|
|
288
|
+
"nock": "^14.0.17",
|
|
289
|
+
"react": "^19.2.8",
|
|
290
|
+
"react-dom": "^19.2.8",
|
|
119
291
|
"typescript": "^7.0.2"
|
|
120
292
|
},
|
|
121
293
|
"sideEffects": false,
|
|
122
294
|
"publishConfig": {
|
|
123
295
|
"access": "public"
|
|
124
296
|
},
|
|
297
|
+
"peerDependencies": {
|
|
298
|
+
"react": "^19.2.8"
|
|
299
|
+
},
|
|
300
|
+
"peerDependenciesMeta": {
|
|
301
|
+
"react": {
|
|
302
|
+
"optional": true
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
"dependencies": {
|
|
306
|
+
"@modern-js/create-request": "npm:@bleedingdev/modern-js-create-request@3.9.0-ultramodern.6",
|
|
307
|
+
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.6",
|
|
308
|
+
"react-helmet-async": "3.0.0"
|
|
309
|
+
},
|
|
125
310
|
"scripts": {
|
|
126
311
|
"dev": "rslib build --watch",
|
|
127
312
|
"build": "rslib build",
|
package/rslib.config.mts
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
|
-
import { rslibConfig } from '@modern-js/rslib';
|
|
1
|
+
import { RSLIB_CODE_ENTRY_GLOB, rslibConfig } from '@modern-js/rslib';
|
|
2
2
|
import { defineConfig } from '@rslib/core';
|
|
3
3
|
|
|
4
|
-
export default defineConfig(
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
...rslibConfig,
|
|
6
|
+
lib: rslibConfig.lib.map(lib =>
|
|
7
|
+
lib.id === 'esm-web'
|
|
8
|
+
? {
|
|
9
|
+
...lib,
|
|
10
|
+
source: {
|
|
11
|
+
...lib.source,
|
|
12
|
+
entry: {
|
|
13
|
+
index: [RSLIB_CODE_ENTRY_GLOB, '!./src/request-policy/node.ts'],
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
}
|
|
17
|
+
: lib,
|
|
18
|
+
),
|
|
19
|
+
});
|
package/rstest.config.mts
CHANGED
|
@@ -1,7 +1,38 @@
|
|
|
1
|
+
import type { ProjectConfig } from '@rstest/core';
|
|
1
2
|
import { withTestPreset } from '@scripts/rstest-config';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
const commonConfig: ProjectConfig = {
|
|
4
5
|
root: __dirname,
|
|
5
|
-
testEnvironment: 'node',
|
|
6
6
|
globals: true,
|
|
7
|
+
setupFiles: ['@scripts/rstest-config/setup.ts'],
|
|
8
|
+
tools: {
|
|
9
|
+
swc: {
|
|
10
|
+
jsc: {
|
|
11
|
+
transform: {
|
|
12
|
+
react: {
|
|
13
|
+
runtime: 'automatic',
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const browserPolicyProject = withTestPreset({
|
|
22
|
+
name: 'runtime-extensions-request-policy-browser',
|
|
23
|
+
testEnvironment: 'happy-dom',
|
|
24
|
+
extends: commonConfig,
|
|
25
|
+
include: ['tests/request-policy/browser-policy.test.ts'],
|
|
7
26
|
});
|
|
27
|
+
|
|
28
|
+
export default {
|
|
29
|
+
projects: [
|
|
30
|
+
withTestPreset({
|
|
31
|
+
name: 'runtime-extensions-node',
|
|
32
|
+
exclude: ['tests/request-policy/browser-policy.test.ts'],
|
|
33
|
+
testEnvironment: 'node',
|
|
34
|
+
extends: commonConfig,
|
|
35
|
+
}),
|
|
36
|
+
browserPolicyProject,
|
|
37
|
+
],
|
|
38
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fork-owned runtime-context extension mechanism.
|
|
3
|
+
*
|
|
4
|
+
* Plugins must not add ad-hoc fields to `TRuntimeContext` /
|
|
5
|
+
* `TInternalRuntimeContext`. Instead they store state in a single internal
|
|
6
|
+
* slot (a `Map` keyed by symbol) attached to the context object under a
|
|
7
|
+
* symbol property, so nothing leaks into string-key enumeration
|
|
8
|
+
* (`Object.keys`, `JSON.stringify`). Object spreads preserve the slot.
|
|
9
|
+
*
|
|
10
|
+
* `Symbol.for` is used for both the slot and the extension keys so that the
|
|
11
|
+
* mechanism stays coherent even if this module is instantiated twice
|
|
12
|
+
* (e.g. esm/cjs interop in test runners).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const EXTENSIONS_SLOT: unique symbol = Symbol.for(
|
|
16
|
+
'@modern-js/runtime:context-extensions',
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
type ExtensionStore = Map<symbol, unknown>;
|
|
20
|
+
|
|
21
|
+
type ExtensibleContext = {
|
|
22
|
+
[EXTENSIONS_SLOT]?: ExtensionStore;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export interface RuntimeContextExtension<T> {
|
|
26
|
+
/** Stable identity of this extension. */
|
|
27
|
+
readonly key: symbol;
|
|
28
|
+
get(context: object): T | undefined;
|
|
29
|
+
set(context: object, value: T): void;
|
|
30
|
+
remove(context: object): void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function getStore(context: object): ExtensionStore | undefined {
|
|
34
|
+
return (context as ExtensibleContext)[EXTENSIONS_SLOT];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function ensureStore(context: object): ExtensionStore {
|
|
38
|
+
const target = context as ExtensibleContext;
|
|
39
|
+
const store = target[EXTENSIONS_SLOT] ?? new Map();
|
|
40
|
+
Object.defineProperty(target, EXTENSIONS_SLOT, {
|
|
41
|
+
configurable: true,
|
|
42
|
+
enumerable: true,
|
|
43
|
+
value: store,
|
|
44
|
+
});
|
|
45
|
+
return store;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Removes the extension slot from a context object.
|
|
50
|
+
*
|
|
51
|
+
* The symbol slot crosses object spreads while remaining absent from string-key
|
|
52
|
+
* enumeration and JSON. Callers can still explicitly clear the original context.
|
|
53
|
+
*/
|
|
54
|
+
export function stripRuntimeContextExtensions(context: object): void {
|
|
55
|
+
delete (context as ExtensibleContext)[EXTENSIONS_SLOT];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Creates a typed accessor pair over the shared extension slot.
|
|
60
|
+
*
|
|
61
|
+
* The `id` must be globally unique (it is interned via `Symbol.for`); use a
|
|
62
|
+
* package-prefixed name such as `@modern-js/plugin-tanstack:router-state`.
|
|
63
|
+
*/
|
|
64
|
+
export function createRuntimeContextExtension<T>(
|
|
65
|
+
id: string,
|
|
66
|
+
): RuntimeContextExtension<T> {
|
|
67
|
+
const key = Symbol.for(`@modern-js/runtime:context-extension:${id}`);
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
key,
|
|
71
|
+
get(context: object): T | undefined {
|
|
72
|
+
return getStore(context)?.get(key) as T | undefined;
|
|
73
|
+
},
|
|
74
|
+
set(context: object, value: T): void {
|
|
75
|
+
ensureStore(context).set(key, value);
|
|
76
|
+
},
|
|
77
|
+
remove(context: object): void {
|
|
78
|
+
getStore(context)?.delete(key);
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Helmet as AsyncHelmet,
|
|
4
|
+
type HelmetProps,
|
|
5
|
+
HelmetProvider,
|
|
6
|
+
type HelmetServerState,
|
|
7
|
+
} from 'react-helmet-async';
|
|
8
|
+
import type { HelmetContextSlot } from './helmetContext';
|
|
9
|
+
import * as runtimeHead from './rendererHead';
|
|
10
|
+
|
|
11
|
+
export interface HeadRenderContext {
|
|
12
|
+
runtimeContext: object;
|
|
13
|
+
helmetContext: HelmetContextSlot;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Keep one adapter per plugin setup. Its component/provider identity is stable;
|
|
17
|
+
// each HTML render supplies its own original context and captured helmet slot.
|
|
18
|
+
export function createHeadRuntime() {
|
|
19
|
+
const HeadContext = React.createContext<HeadRenderContext | undefined>(
|
|
20
|
+
undefined,
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
const collectServerHelmet = (
|
|
24
|
+
{ runtimeContext, helmetContext }: HeadRenderContext,
|
|
25
|
+
props: React.PropsWithChildren<HelmetProps>,
|
|
26
|
+
) => {
|
|
27
|
+
const createRecord = () => runtimeHead.createHelmetRecord(React, props);
|
|
28
|
+
const deriveState = (records: runtimeHead.HelmetCompatRecord[]) =>
|
|
29
|
+
runtimeHead.deriveHelmetServerState(React, records) as HelmetServerState;
|
|
30
|
+
const marker = runtimeHead.collectHeadState(
|
|
31
|
+
runtimeContext,
|
|
32
|
+
createRecord,
|
|
33
|
+
deriveState,
|
|
34
|
+
helmetContext,
|
|
35
|
+
);
|
|
36
|
+
if (marker !== undefined) return marker;
|
|
37
|
+
helmetContext.helmet = runtimeHead.collectImmediateHelmetState(
|
|
38
|
+
React,
|
|
39
|
+
helmetContext,
|
|
40
|
+
createRecord(),
|
|
41
|
+
) as HelmetServerState;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const Head = (props: React.PropsWithChildren<HelmetProps>) => {
|
|
45
|
+
const state = React.useContext(HeadContext);
|
|
46
|
+
if (state !== undefined) {
|
|
47
|
+
return runtimeHead.renderHeadMarker(
|
|
48
|
+
React,
|
|
49
|
+
collectServerHelmet(state, props),
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
return React.createElement(AsyncHelmet, props);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const ClientRoot = ({ children }: { children: React.ReactNode }) => {
|
|
56
|
+
const state = React.useContext(HeadContext);
|
|
57
|
+
return state === undefined ? (
|
|
58
|
+
<HelmetProvider>{children}</HelmetProvider>
|
|
59
|
+
) : (
|
|
60
|
+
children
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
Head,
|
|
66
|
+
wrapServerRoot(root: React.ReactNode, state: HeadRenderContext) {
|
|
67
|
+
return (
|
|
68
|
+
<HeadContext.Provider value={state}>
|
|
69
|
+
<HelmetProvider context={state.helmetContext}>{root}</HelmetProvider>
|
|
70
|
+
</HeadContext.Provider>
|
|
71
|
+
);
|
|
72
|
+
},
|
|
73
|
+
wrapClientRoot(root: React.ReactNode) {
|
|
74
|
+
return <ClientRoot>{root}</ClientRoot>;
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fork-owned helmet state, stored via the runtime-context extension slot
|
|
3
|
+
* instead of an ad-hoc `_helmetContext` field on `TInternalRuntimeContext`.
|
|
4
|
+
*/
|
|
5
|
+
import type { HelmetServerState } from 'react-helmet-async';
|
|
6
|
+
import { createRuntimeContextExtension } from './contextExtensions';
|
|
7
|
+
|
|
8
|
+
export interface HelmetContextSlot {
|
|
9
|
+
helmet?: HelmetServerState | null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const helmetContextExtension = createRuntimeContextExtension<HelmetContextSlot>(
|
|
13
|
+
'@modern-js/runtime:helmet-context',
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
export function getHelmetContext(
|
|
17
|
+
context: object,
|
|
18
|
+
): HelmetContextSlot | undefined {
|
|
19
|
+
return helmetContextExtension.get(context);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function ensureHelmetContext(context: object): HelmetContextSlot {
|
|
23
|
+
const existing = helmetContextExtension.get(context);
|
|
24
|
+
if (existing !== undefined) {
|
|
25
|
+
return existing;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const created: HelmetContextSlot = {};
|
|
29
|
+
helmetContextExtension.set(context, created);
|
|
30
|
+
return created;
|
|
31
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type PrefetchBehavior = 'intent' | 'render' | 'viewport' | 'none';
|
|
2
|
+
|
|
3
|
+
export function resolvePreloadFromPrefetch(
|
|
4
|
+
prefetch: PrefetchBehavior | undefined,
|
|
5
|
+
preload: unknown,
|
|
6
|
+
) {
|
|
7
|
+
if (typeof preload !== 'undefined') {
|
|
8
|
+
return preload;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
if (prefetch === 'none') {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (
|
|
16
|
+
prefetch === 'intent' ||
|
|
17
|
+
prefetch === 'render' ||
|
|
18
|
+
prefetch === 'viewport'
|
|
19
|
+
) {
|
|
20
|
+
return prefetch;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return 'viewport';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// React Router supplies its render default before calling this adapter.
|
|
27
|
+
export function normalizePreloadBehavior(
|
|
28
|
+
preload: PrefetchBehavior | false | undefined,
|
|
29
|
+
prefetch: PrefetchBehavior,
|
|
30
|
+
): PrefetchBehavior {
|
|
31
|
+
const resolved = resolvePreloadFromPrefetch(prefetch, preload);
|
|
32
|
+
return resolved === false ? 'none' : (resolved as PrefetchBehavior);
|
|
33
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createClient as createNativeClient } from '@modern-js/create-request/client';
|
|
2
|
+
import { createPolicyClient } from './client';
|
|
3
|
+
|
|
4
|
+
/** Create a browser producer client with its own configuration and policy. */
|
|
5
|
+
export const createClient = () =>
|
|
6
|
+
createPolicyClient(createNativeClient(), {
|
|
7
|
+
target: 'browser',
|
|
8
|
+
resolveSourceOrigin: () =>
|
|
9
|
+
typeof window !== 'undefined' ? window.location.origin : undefined,
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export const { configure, createRequest, createUploader } = createClient();
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
CrossOriginEnvelopePolicyError,
|
|
16
|
+
IdentityBindingViolationError,
|
|
17
|
+
OperationContractViolationError,
|
|
18
|
+
ProducerClientNotInitializedError,
|
|
19
|
+
ProducerDomainNotConfiguredError,
|
|
20
|
+
} from './policyCore';
|
|
21
|
+
export * from './requestContext';
|
|
22
|
+
export * from './types';
|