@bleedingdev/modern-js-runtime-extensions 3.9.0-ultramodern.2 → 3.9.0-ultramodern.21

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 (251) hide show
  1. package/dist/cjs/buildIdentity.js +73 -0
  2. package/dist/cjs/contextExtensions.js +74 -0
  3. package/dist/cjs/headRuntime.js +91 -0
  4. package/dist/cjs/helmetContext.js +54 -0
  5. package/dist/cjs/index.js +18 -4
  6. package/dist/cjs/localisedLoaderIdentity.js +51 -0
  7. package/dist/cjs/localisedUrls/config.js +49 -0
  8. package/dist/cjs/localisedUrls/index.js +95 -0
  9. package/dist/cjs/localisedUrls/normalise.js +87 -0
  10. package/dist/cjs/localisedUrls/pathname.js +68 -0
  11. package/dist/cjs/localisedUrls/patterns.js +214 -0
  12. package/dist/cjs/localisedUrls/redirect.js +100 -0
  13. package/dist/cjs/localisedUrls/resolve.js +78 -0
  14. package/dist/cjs/localisedUrls/routeIdentity.js +92 -0
  15. package/dist/cjs/localisedUrls/routes.js +217 -0
  16. package/dist/cjs/localisedUrls/types.js +18 -0
  17. package/dist/cjs/prefetchPolicy.js +52 -0
  18. package/dist/cjs/rendererHead.js +18 -5
  19. package/dist/cjs/request-policy/browser.js +139 -0
  20. package/dist/cjs/request-policy/client.js +234 -0
  21. package/dist/cjs/request-policy/node.js +149 -0
  22. package/dist/cjs/request-policy/policyCore.js +266 -0
  23. package/dist/cjs/request-policy/requestContext.js +137 -0
  24. package/dist/cjs/request-policy/traceparent.js +56 -0
  25. package/dist/cjs/request-policy/transport.js +234 -0
  26. package/dist/cjs/request-policy/types.js +57 -0
  27. package/dist/cjs/routeHydration.js +127 -0
  28. package/dist/cjs/routerPrefetchPolicy.js +153 -0
  29. package/dist/cjs/routerProvider.js +105 -0
  30. package/dist/cjs/routerState.js +175 -0
  31. package/dist/cjs/routerStatePlugin.js +113 -0
  32. package/dist/cjs/routerStateTypes.js +18 -0
  33. package/dist/cjs/rsc-disabled/rscDisabledClientBrowserRuntime.js +69 -0
  34. package/dist/cjs/rsc-disabled/rscDisabledClientEdgeRuntime.js +61 -0
  35. package/dist/cjs/rsc-disabled/rscDisabledClientNodeRuntime.js +65 -0
  36. package/dist/cjs/rsc-disabled/rscDisabledRuntimeError.js +42 -0
  37. package/dist/cjs/rsc-disabled/rscDisabledServerEdgeRuntime.js +93 -0
  38. package/dist/cjs/rsc-disabled/rscDisabledServerNodeRuntime.js +101 -0
  39. package/dist/cjs/runtimeContextProjection.js +112 -0
  40. package/dist/cjs/server-config/bffRuntime.js +18 -0
  41. package/dist/cjs/server-config/index.js +18 -0
  42. package/dist/cjs/server-config/serverTelemetry.js +18 -0
  43. package/dist/cjs/shellStream.js +34 -2
  44. package/dist/cjs/workspaceEvents.js +159 -0
  45. package/dist/esm/buildIdentity.mjs +35 -0
  46. package/dist/esm/contextExtensions.mjs +33 -0
  47. package/dist/esm/headRuntime.mjs +43 -0
  48. package/dist/esm/helmetContext.mjs +13 -0
  49. package/dist/esm/index.mjs +2 -0
  50. package/dist/esm/localisedLoaderIdentity.mjs +13 -0
  51. package/dist/esm/localisedUrls/config.mjs +11 -0
  52. package/dist/esm/localisedUrls/index.mjs +8 -0
  53. package/dist/esm/localisedUrls/normalise.mjs +37 -0
  54. package/dist/esm/localisedUrls/pathname.mjs +24 -0
  55. package/dist/esm/localisedUrls/patterns.mjs +152 -0
  56. package/dist/esm/localisedUrls/redirect.mjs +53 -0
  57. package/dist/esm/localisedUrls/resolve.mjs +37 -0
  58. package/dist/esm/localisedUrls/routeIdentity.mjs +54 -0
  59. package/dist/esm/localisedUrls/routes.mjs +176 -0
  60. package/dist/esm/localisedUrls/types.mjs +0 -0
  61. package/dist/esm/prefetchPolicy.mjs +11 -0
  62. package/dist/esm/rendererHead.mjs +14 -5
  63. package/dist/esm/request-policy/browser.mjs +11 -0
  64. package/dist/esm/request-policy/client.mjs +195 -0
  65. package/dist/esm/request-policy/policyCore.mjs +171 -0
  66. package/dist/esm/request-policy/requestContext.mjs +75 -0
  67. package/dist/esm/request-policy/traceparent.mjs +18 -0
  68. package/dist/esm/request-policy/transport.mjs +196 -0
  69. package/dist/esm/request-policy/types.mjs +10 -0
  70. package/dist/esm/routeHydration.mjs +77 -0
  71. package/dist/esm/routerPrefetchPolicy.mjs +115 -0
  72. package/dist/esm/routerProvider.mjs +58 -0
  73. package/dist/esm/routerState.mjs +113 -0
  74. package/dist/esm/routerStatePlugin.mjs +75 -0
  75. package/dist/esm/routerStateTypes.mjs +0 -0
  76. package/dist/esm/rsc-disabled/rscDisabledClientBrowserRuntime.mjs +10 -0
  77. package/dist/esm/rsc-disabled/rscDisabledClientEdgeRuntime.mjs +8 -0
  78. package/dist/esm/rsc-disabled/rscDisabledClientNodeRuntime.mjs +9 -0
  79. package/dist/esm/rsc-disabled/rscDisabledRuntimeError.mjs +4 -0
  80. package/dist/esm/rsc-disabled/rscDisabledServerEdgeRuntime.mjs +16 -0
  81. package/dist/esm/rsc-disabled/rscDisabledServerNodeRuntime.mjs +18 -0
  82. package/dist/esm/runtimeContextProjection.mjs +74 -0
  83. package/dist/esm/server-config/bffRuntime.mjs +0 -0
  84. package/dist/esm/server-config/index.mjs +0 -0
  85. package/dist/esm/server-config/serverTelemetry.mjs +0 -0
  86. package/dist/esm/shellStream.mjs +34 -2
  87. package/dist/esm/workspaceEvents.mjs +66 -0
  88. package/dist/esm-node/buildIdentity.mjs +36 -0
  89. package/dist/esm-node/contextExtensions.mjs +34 -0
  90. package/dist/esm-node/headRuntime.mjs +44 -0
  91. package/dist/esm-node/helmetContext.mjs +14 -0
  92. package/dist/esm-node/index.mjs +2 -0
  93. package/dist/esm-node/localisedLoaderIdentity.mjs +14 -0
  94. package/dist/esm-node/localisedUrls/config.mjs +12 -0
  95. package/dist/esm-node/localisedUrls/index.mjs +9 -0
  96. package/dist/esm-node/localisedUrls/normalise.mjs +38 -0
  97. package/dist/esm-node/localisedUrls/pathname.mjs +25 -0
  98. package/dist/esm-node/localisedUrls/patterns.mjs +153 -0
  99. package/dist/esm-node/localisedUrls/redirect.mjs +54 -0
  100. package/dist/esm-node/localisedUrls/resolve.mjs +38 -0
  101. package/dist/esm-node/localisedUrls/routeIdentity.mjs +55 -0
  102. package/dist/esm-node/localisedUrls/routes.mjs +177 -0
  103. package/dist/esm-node/localisedUrls/types.mjs +1 -0
  104. package/dist/esm-node/prefetchPolicy.mjs +12 -0
  105. package/dist/esm-node/rendererHead.mjs +14 -5
  106. package/dist/esm-node/request-policy/browser.mjs +12 -0
  107. package/dist/esm-node/request-policy/client.mjs +196 -0
  108. package/dist/esm-node/request-policy/node.mjs +22 -0
  109. package/dist/esm-node/request-policy/policyCore.mjs +172 -0
  110. package/dist/esm-node/request-policy/requestContext.mjs +76 -0
  111. package/dist/esm-node/request-policy/traceparent.mjs +19 -0
  112. package/dist/esm-node/request-policy/transport.mjs +197 -0
  113. package/dist/esm-node/request-policy/types.mjs +11 -0
  114. package/dist/esm-node/routeHydration.mjs +78 -0
  115. package/dist/esm-node/routerPrefetchPolicy.mjs +116 -0
  116. package/dist/esm-node/routerProvider.mjs +59 -0
  117. package/dist/esm-node/routerState.mjs +114 -0
  118. package/dist/esm-node/routerStatePlugin.mjs +76 -0
  119. package/dist/esm-node/routerStateTypes.mjs +1 -0
  120. package/dist/esm-node/rsc-disabled/rscDisabledClientBrowserRuntime.mjs +11 -0
  121. package/dist/esm-node/rsc-disabled/rscDisabledClientEdgeRuntime.mjs +9 -0
  122. package/dist/esm-node/rsc-disabled/rscDisabledClientNodeRuntime.mjs +10 -0
  123. package/dist/esm-node/rsc-disabled/rscDisabledRuntimeError.mjs +5 -0
  124. package/dist/esm-node/rsc-disabled/rscDisabledServerEdgeRuntime.mjs +17 -0
  125. package/dist/esm-node/rsc-disabled/rscDisabledServerNodeRuntime.mjs +19 -0
  126. package/dist/esm-node/runtimeContextProjection.mjs +75 -0
  127. package/dist/esm-node/server-config/bffRuntime.mjs +1 -0
  128. package/dist/esm-node/server-config/index.mjs +1 -0
  129. package/dist/esm-node/server-config/serverTelemetry.mjs +1 -0
  130. package/dist/esm-node/shellStream.mjs +34 -2
  131. package/dist/esm-node/workspaceEvents.mjs +67 -0
  132. package/dist/types/buildIdentity.d.ts +37 -0
  133. package/dist/types/contextExtensions.d.ts +34 -0
  134. package/dist/types/headRuntime.d.ts +12 -0
  135. package/dist/types/helmetCompat.d.ts +1 -1
  136. package/dist/types/helmetContext.d.ts +10 -0
  137. package/dist/types/index.d.ts +2 -0
  138. package/dist/types/localisedLoaderIdentity.d.ts +10 -0
  139. package/dist/types/localisedUrls/config.d.ts +9 -0
  140. package/dist/types/localisedUrls/index.d.ts +10 -0
  141. package/dist/types/localisedUrls/normalise.d.ts +10 -0
  142. package/dist/types/localisedUrls/pathname.d.ts +4 -0
  143. package/dist/types/localisedUrls/patterns.d.ts +11 -0
  144. package/dist/types/localisedUrls/redirect.d.ts +19 -0
  145. package/dist/types/localisedUrls/resolve.d.ts +7 -0
  146. package/dist/types/localisedUrls/routeIdentity.d.ts +22 -0
  147. package/dist/types/localisedUrls/routes.d.ts +3 -0
  148. package/dist/types/localisedUrls/types.d.ts +14 -0
  149. package/dist/types/prefetchPolicy.d.ts +4 -0
  150. package/dist/types/rendererHead.d.ts +5 -3
  151. package/dist/types/request-policy/browser.d.ts +10 -0
  152. package/dist/types/request-policy/client.d.ts +14 -0
  153. package/dist/types/request-policy/node.d.ts +10 -0
  154. package/dist/types/request-policy/policyCore.d.ts +107 -0
  155. package/dist/types/request-policy/requestContext.d.ts +22 -0
  156. package/dist/types/request-policy/traceparent.d.ts +10 -0
  157. package/dist/types/request-policy/transport.d.ts +12 -0
  158. package/dist/types/request-policy/types.d.ts +144 -0
  159. package/dist/types/routeHydration.d.ts +24 -0
  160. package/dist/types/routerPrefetchPolicy.d.ts +28 -0
  161. package/dist/types/routerProvider.d.ts +55 -0
  162. package/dist/types/routerState.d.ts +17 -0
  163. package/dist/types/routerStatePlugin.d.ts +19 -0
  164. package/dist/types/routerStateTypes.d.ts +70 -0
  165. package/dist/types/rsc-disabled/rscDisabledClientBrowserRuntime.d.ts +9 -0
  166. package/dist/types/rsc-disabled/rscDisabledClientEdgeRuntime.d.ts +7 -0
  167. package/dist/types/rsc-disabled/rscDisabledClientNodeRuntime.d.ts +8 -0
  168. package/dist/types/rsc-disabled/rscDisabledRuntimeError.d.ts +1 -0
  169. package/dist/types/rsc-disabled/rscDisabledServerEdgeRuntime.d.ts +15 -0
  170. package/dist/types/rsc-disabled/rscDisabledServerNodeRuntime.d.ts +17 -0
  171. package/dist/types/runtimeContextProjection.d.ts +30 -0
  172. package/dist/types/server-config/bffRuntime.d.ts +122 -0
  173. package/dist/types/server-config/index.d.ts +2 -0
  174. package/dist/types/server-config/serverTelemetry.d.ts +322 -0
  175. package/dist/types/workspaceEvents.d.ts +62 -0
  176. package/package.json +240 -15
  177. package/rslib.config.mts +17 -2
  178. package/rstest.config.mts +33 -2
  179. package/src/buildIdentity.ts +61 -0
  180. package/src/contextExtensions.ts +81 -0
  181. package/src/headRuntime.tsx +77 -0
  182. package/src/helmetCompat.ts +1 -1
  183. package/src/helmetContext.ts +31 -0
  184. package/src/index.ts +2 -0
  185. package/src/localisedLoaderIdentity.ts +30 -0
  186. package/src/localisedUrls/config.ts +18 -0
  187. package/src/localisedUrls/index.ts +25 -0
  188. package/src/localisedUrls/normalise.ts +62 -0
  189. package/src/localisedUrls/pathname.ts +60 -0
  190. package/src/localisedUrls/patterns.ts +283 -0
  191. package/src/localisedUrls/redirect.ts +107 -0
  192. package/src/localisedUrls/resolve.ts +106 -0
  193. package/src/localisedUrls/routeIdentity.ts +83 -0
  194. package/src/localisedUrls/routes.ts +451 -0
  195. package/src/localisedUrls/types.ts +18 -0
  196. package/src/prefetchPolicy.ts +33 -0
  197. package/src/rendererHead.ts +25 -8
  198. package/src/request-policy/browser.ts +22 -0
  199. package/src/request-policy/client.ts +404 -0
  200. package/src/request-policy/node.ts +41 -0
  201. package/src/request-policy/policyCore.ts +424 -0
  202. package/src/request-policy/requestContext.ts +149 -0
  203. package/src/request-policy/traceparent.ts +43 -0
  204. package/src/request-policy/transport.ts +349 -0
  205. package/src/request-policy/types.ts +229 -0
  206. package/src/routeHydration.ts +208 -0
  207. package/src/routerPrefetchPolicy.ts +195 -0
  208. package/src/routerProvider.ts +160 -0
  209. package/src/routerState.ts +220 -0
  210. package/src/routerStatePlugin.ts +125 -0
  211. package/src/routerStateTypes.ts +76 -0
  212. package/src/rsc-disabled/rscDisabledClientBrowserRuntime.ts +10 -0
  213. package/src/rsc-disabled/rscDisabledClientEdgeRuntime.ts +8 -0
  214. package/src/rsc-disabled/rscDisabledClientNodeRuntime.ts +9 -0
  215. package/src/rsc-disabled/rscDisabledRuntimeError.ts +3 -0
  216. package/src/rsc-disabled/rscDisabledServerEdgeRuntime.ts +16 -0
  217. package/src/rsc-disabled/rscDisabledServerNodeRuntime.ts +18 -0
  218. package/src/runtimeContextProjection.ts +105 -0
  219. package/src/server-config/bffRuntime.ts +136 -0
  220. package/src/server-config/index.ts +2 -0
  221. package/src/server-config/serverTelemetry.ts +337 -0
  222. package/src/shellStream.ts +55 -25
  223. package/src/workspaceEvents.ts +324 -0
  224. package/tests/buildIdentity.test.ts +51 -0
  225. package/tests/contextExtensions.test.ts +27 -0
  226. package/tests/headRuntime.test.tsx +229 -0
  227. package/tests/localisedUrls.test.ts +560 -0
  228. package/tests/rendererHead.test.ts +52 -121
  229. package/tests/request-policy/browser-policy.test.ts +108 -0
  230. package/tests/request-policy/client-isolation.test.ts +109 -0
  231. package/tests/request-policy/node-policy.test.ts +447 -0
  232. package/tests/request-policy/policyCore.test.ts +129 -0
  233. package/tests/request-policy/requestContext.test.ts +66 -0
  234. package/tests/request-policy/requestFactory.outbound-contract.test.ts +290 -0
  235. package/tests/request-policy/traceparent.test.ts +52 -0
  236. package/tests/request-policy/transport-retry.test.ts +367 -0
  237. package/tests/routeHydration.test.ts +180 -0
  238. package/tests/routerPrefetchPolicy.test.ts +102 -0
  239. package/tests/routerProvider.test.ts +29 -0
  240. package/tests/routerState.test.ts +77 -0
  241. package/tests/routerStatePlugin.test.ts +63 -0
  242. package/tests/runtimeContextProjection.test.ts +83 -0
  243. package/tests/safeFailure.test.ts +10 -28
  244. package/tests/shellStream.test.ts +39 -2
  245. package/tests/workspaceEvents.test.ts +221 -0
  246. package/dist/cjs/rscHtmlStream.js +0 -128
  247. package/dist/esm/rscHtmlStream.mjs +0 -86
  248. package/dist/esm-node/rscHtmlStream.mjs +0 -87
  249. package/dist/types/rscHtmlStream.d.ts +0 -4
  250. package/src/rscHtmlStream.ts +0 -142
  251. package/tests/rscHtmlStream.test.ts +0 -153
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.2",
14
+ "version": "3.9.0-ultramodern.21",
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": {
@@ -49,6 +41,151 @@
49
41
  "require": "./dist/cjs/safeFailure.js"
50
42
  },
51
43
  "default": "./dist/esm/safeFailure.mjs"
44
+ },
45
+ "./build-identity": {
46
+ "types": "./dist/types/buildIdentity.d.ts",
47
+ "node": {
48
+ "import": "./dist/esm-node/buildIdentity.mjs",
49
+ "require": "./dist/cjs/buildIdentity.js"
50
+ },
51
+ "default": "./dist/esm/buildIdentity.mjs"
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
+ "./rsc-disabled/*": {
62
+ "types": "./dist/types/rsc-disabled/*.d.ts",
63
+ "default": "./dist/esm/rsc-disabled/*.mjs"
64
+ },
65
+ "./localised-loader-identity": {
66
+ "types": "./dist/types/localisedLoaderIdentity.d.ts",
67
+ "node": {
68
+ "import": "./dist/esm-node/localisedLoaderIdentity.mjs",
69
+ "require": "./dist/cjs/localisedLoaderIdentity.js"
70
+ },
71
+ "default": "./dist/esm/localisedLoaderIdentity.mjs"
72
+ },
73
+ "./context-extensions": {
74
+ "types": "./dist/types/contextExtensions.d.ts",
75
+ "node": {
76
+ "import": "./dist/esm-node/contextExtensions.mjs",
77
+ "require": "./dist/cjs/contextExtensions.js"
78
+ },
79
+ "default": "./dist/esm/contextExtensions.mjs"
80
+ },
81
+ "./helmet-context": {
82
+ "types": "./dist/types/helmetContext.d.ts",
83
+ "node": {
84
+ "import": "./dist/esm-node/helmetContext.mjs",
85
+ "require": "./dist/cjs/helmetContext.js"
86
+ },
87
+ "default": "./dist/esm/helmetContext.mjs"
88
+ },
89
+ "./head-runtime": {
90
+ "types": "./dist/types/headRuntime.d.ts",
91
+ "node": {
92
+ "import": "./dist/esm-node/headRuntime.mjs",
93
+ "require": "./dist/cjs/headRuntime.js"
94
+ },
95
+ "default": "./dist/esm/headRuntime.mjs"
96
+ },
97
+ "./context-projection": {
98
+ "types": "./dist/types/runtimeContextProjection.d.ts",
99
+ "node": {
100
+ "import": "./dist/esm-node/runtimeContextProjection.mjs",
101
+ "require": "./dist/cjs/runtimeContextProjection.js"
102
+ },
103
+ "default": "./dist/esm/runtimeContextProjection.mjs"
104
+ },
105
+ "./server-config": {
106
+ "types": "./dist/types/server-config/index.d.ts",
107
+ "node": {
108
+ "import": "./dist/esm-node/server-config/index.mjs",
109
+ "require": "./dist/cjs/server-config/index.js"
110
+ },
111
+ "default": "./dist/esm/server-config/index.mjs"
112
+ },
113
+ "./router-state": {
114
+ "types": "./dist/types/routerState.d.ts",
115
+ "node": {
116
+ "import": "./dist/esm-node/routerState.mjs",
117
+ "require": "./dist/cjs/routerState.js"
118
+ },
119
+ "default": "./dist/esm/routerState.mjs"
120
+ },
121
+ "./request-policy": {
122
+ "types": "./dist/types/request-policy/browser.d.ts",
123
+ "node": {
124
+ "import": "./dist/esm-node/request-policy/node.mjs",
125
+ "require": "./dist/esm-node/request-policy/node.mjs",
126
+ "default": "./dist/esm-node/request-policy/node.mjs"
127
+ },
128
+ "import": "./dist/esm/request-policy/browser.mjs",
129
+ "require": "./dist/esm/request-policy/browser.mjs",
130
+ "default": "./dist/esm/request-policy/browser.mjs"
131
+ },
132
+ "./request-policy/client": {
133
+ "types": "./dist/types/request-policy/browser.d.ts",
134
+ "import": "./dist/esm/request-policy/browser.mjs",
135
+ "require": "./dist/esm/request-policy/browser.mjs",
136
+ "default": "./dist/esm/request-policy/browser.mjs"
137
+ },
138
+ "./request-policy/server": {
139
+ "types": "./dist/types/request-policy/node.d.ts",
140
+ "node": {
141
+ "import": "./dist/esm-node/request-policy/node.mjs",
142
+ "require": "./dist/esm-node/request-policy/node.mjs",
143
+ "default": "./dist/esm-node/request-policy/node.mjs"
144
+ }
145
+ },
146
+ "./request-context": {
147
+ "types": "./dist/types/request-policy/requestContext.d.ts",
148
+ "node": {
149
+ "import": "./dist/esm-node/request-policy/requestContext.mjs",
150
+ "require": "./dist/esm-node/request-policy/requestContext.mjs",
151
+ "default": "./dist/esm-node/request-policy/requestContext.mjs"
152
+ },
153
+ "import": "./dist/esm/request-policy/requestContext.mjs",
154
+ "require": "./dist/esm/request-policy/requestContext.mjs",
155
+ "default": "./dist/esm/request-policy/requestContext.mjs"
156
+ },
157
+ "./package.json": "./package.json",
158
+ "./router-state-plugin": {
159
+ "types": "./dist/types/routerStatePlugin.d.ts",
160
+ "node": {
161
+ "import": "./dist/esm-node/routerStatePlugin.mjs",
162
+ "require": "./dist/cjs/routerStatePlugin.js"
163
+ },
164
+ "default": "./dist/esm/routerStatePlugin.mjs"
165
+ },
166
+ "./router-provider": {
167
+ "types": "./dist/types/routerProvider.d.ts",
168
+ "node": {
169
+ "import": "./dist/esm-node/routerProvider.mjs",
170
+ "require": "./dist/cjs/routerProvider.js"
171
+ },
172
+ "default": "./dist/esm/routerProvider.mjs"
173
+ },
174
+ "./router-prefetch-policy": {
175
+ "types": "./dist/types/routerPrefetchPolicy.d.ts",
176
+ "node": {
177
+ "import": "./dist/esm-node/routerPrefetchPolicy.mjs",
178
+ "require": "./dist/cjs/routerPrefetchPolicy.js"
179
+ },
180
+ "default": "./dist/esm/routerPrefetchPolicy.mjs"
181
+ },
182
+ "./localised-urls": {
183
+ "types": "./dist/types/localisedUrls/index.d.ts",
184
+ "node": {
185
+ "import": "./dist/esm-node/localisedUrls/index.mjs",
186
+ "require": "./dist/cjs/localisedUrls/index.js"
187
+ },
188
+ "default": "./dist/esm/localisedUrls/index.mjs"
52
189
  }
53
190
  },
54
191
  "typesVersions": {
@@ -61,27 +198,115 @@
61
198
  "./dist/types/node.d.ts",
62
199
  "./src/node.ts"
63
200
  ],
64
- "rsc-html-stream": [
65
- "./dist/types/rscHtmlStream.d.ts",
66
- "./src/rscHtmlStream.ts"
67
- ],
68
201
  "safe-failure": [
69
202
  "./dist/types/safeFailure.d.ts",
70
203
  "./src/safeFailure.ts"
204
+ ],
205
+ "build-identity": [
206
+ "./dist/types/buildIdentity.d.ts",
207
+ "./src/buildIdentity.ts"
208
+ ],
209
+ "workspace-events": [
210
+ "./dist/types/workspaceEvents.d.ts",
211
+ "./src/workspaceEvents.ts"
212
+ ],
213
+ "localised-loader-identity": [
214
+ "./dist/types/localisedLoaderIdentity.d.ts",
215
+ "./src/localisedLoaderIdentity.ts"
216
+ ],
217
+ "context-extensions": [
218
+ "./dist/types/contextExtensions.d.ts",
219
+ "./src/contextExtensions.ts"
220
+ ],
221
+ "helmet-context": [
222
+ "./dist/types/helmetContext.d.ts",
223
+ "./src/helmetContext.ts"
224
+ ],
225
+ "head-runtime": [
226
+ "./dist/types/headRuntime.d.ts",
227
+ "./src/headRuntime.tsx"
228
+ ],
229
+ "context-projection": [
230
+ "./dist/types/runtimeContextProjection.d.ts",
231
+ "./src/runtimeContextProjection.ts"
232
+ ],
233
+ "server-config": [
234
+ "./dist/types/server-config/index.d.ts",
235
+ "./src/server-config/index.ts"
236
+ ],
237
+ "router-state": [
238
+ "./dist/types/routerState.d.ts",
239
+ "./src/routerState.ts"
240
+ ],
241
+ "request-policy": [
242
+ "./dist/types/request-policy/browser.d.ts",
243
+ "./src/request-policy/browser.ts"
244
+ ],
245
+ "request-policy/client": [
246
+ "./dist/types/request-policy/browser.d.ts",
247
+ "./src/request-policy/browser.ts"
248
+ ],
249
+ "request-policy/server": [
250
+ "./dist/types/request-policy/node.d.ts",
251
+ "./src/request-policy/node.ts"
252
+ ],
253
+ "request-context": [
254
+ "./dist/types/request-policy/requestContext.d.ts",
255
+ "./src/request-policy/requestContext.ts"
256
+ ],
257
+ "router-state-plugin": [
258
+ "./dist/types/routerStatePlugin.d.ts",
259
+ "./src/routerStatePlugin.ts"
260
+ ],
261
+ "router-provider": [
262
+ "./dist/types/routerProvider.d.ts",
263
+ "./src/routerProvider.ts"
264
+ ],
265
+ "router-prefetch-policy": [
266
+ "./dist/types/routerPrefetchPolicy.d.ts",
267
+ "./src/routerPrefetchPolicy.ts"
268
+ ],
269
+ "localised-urls": [
270
+ "./dist/types/localisedUrls/index.d.ts",
271
+ "./src/localisedUrls/index.ts"
71
272
  ]
72
273
  }
73
274
  },
74
275
  "devDependencies": {
75
- "@rslib/core": "1.0.0",
276
+ "@loadable/component": "5.16.7",
277
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.21",
278
+ "@rsbuild/core": "2.2.10",
279
+ "@rslib/core": "1.0.2",
76
280
  "@scripts/rstest-config": "2.66.0",
77
- "@types/node": "^26.4.1",
281
+ "@testing-library/dom": "^10.4.2",
282
+ "@testing-library/react": "^16.3.3",
283
+ "@types/node": "^26.6.2",
284
+ "@types/react": "^19.3.0",
285
+ "@types/react-dom": "^19.3.0",
78
286
  "@typescript/native-preview": "7.0.0-dev.20260707.2",
287
+ "esbuild": "^0.28.2",
288
+ "nock": "^14.0.17",
289
+ "react": "^19.3.0",
290
+ "react-dom": "^19.3.0",
79
291
  "typescript": "^7.0.2"
80
292
  },
81
293
  "sideEffects": false,
82
294
  "publishConfig": {
83
295
  "access": "public"
84
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.21",
307
+ "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.21",
308
+ "react-helmet-async": "3.0.0"
309
+ },
85
310
  "scripts": {
86
311
  "dev": "rslib build --watch",
87
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(rslibConfig);
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
- export default withTestPreset({
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,61 @@
1
+ interface BuildIdentity {
2
+ readonly build: string;
3
+ readonly buildMarker: string;
4
+ readonly sourceRevision: string;
5
+ }
6
+
7
+ interface BuildArtifact {
8
+ readonly deliveryUnit: BuildIdentity;
9
+ readonly surfaces: {
10
+ readonly api: BuildIdentity;
11
+ readonly ui: BuildIdentity;
12
+ };
13
+ }
14
+
15
+ interface BuildIdentityReaders {
16
+ readonly buildMarker: () => string;
17
+ readonly sourceRevision: () => string;
18
+ }
19
+
20
+ function readBuildValue(read: () => string, fallback: string): string {
21
+ try {
22
+ return read();
23
+ } catch (error) {
24
+ // An uncompiled generated module has no injected constants. Check the
25
+ // error tag across realms, since source validators may evaluate in a VM.
26
+ if (
27
+ error !== null &&
28
+ typeof error === 'object' &&
29
+ 'name' in error &&
30
+ error.name === 'ReferenceError'
31
+ ) {
32
+ return fallback;
33
+ }
34
+ throw error;
35
+ }
36
+ }
37
+
38
+ /** Read compiler constants in the caller, even when this package is external. */
39
+ export function resolveUltramodernBuildArtifact<Artifact extends BuildArtifact>(
40
+ artifact: Artifact,
41
+ readers?: BuildIdentityReaders,
42
+ ) {
43
+ const buildMarker = readers
44
+ ? readBuildValue(readers.buildMarker, artifact.deliveryUnit.buildMarker)
45
+ : artifact.deliveryUnit.buildMarker;
46
+ const sourceRevision = readers
47
+ ? readBuildValue(
48
+ readers.sourceRevision,
49
+ artifact.deliveryUnit.sourceRevision,
50
+ )
51
+ : artifact.deliveryUnit.sourceRevision;
52
+ const identity = { build: buildMarker, buildMarker, sourceRevision };
53
+ return {
54
+ ...artifact,
55
+ deliveryUnit: { ...artifact.deliveryUnit, ...identity },
56
+ surfaces: {
57
+ api: { ...artifact.surfaces.api, ...identity },
58
+ ui: { ...artifact.surfaces.ui, ...identity },
59
+ },
60
+ };
61
+ }
@@ -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
+ }
@@ -149,7 +149,7 @@ const createElementFactory = <Element>(react: ElementFactory<Element>) =>
149
149
 
150
150
  export const renderHeadMarker = <Element>(
151
151
  react: ElementFactory<Element>,
152
- marker: MarkerProps | null | undefined,
152
+ marker: MarkerProps | undefined,
153
153
  ): Element | null =>
154
154
  marker ? createElementFactory(react)('template', marker) : null;
155
155
 
@@ -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
@@ -1,4 +1,6 @@
1
1
  export * from './html';
2
2
  export * from './navigationWarmup';
3
+ export * from './prefetchPolicy';
3
4
  export * from './rendererHead';
5
+ export * from './routeHydration';
4
6
  export * from './shellStream';
@@ -0,0 +1,30 @@
1
+ interface RouteNode {
2
+ id?: string;
3
+ children?: RouteNode[];
4
+ modernLocalisedRoute?: { id?: string };
5
+ }
6
+
7
+ /** Map a source loader ID only to its own alias already matched by the router. */
8
+ export function resolveLocalisedLoaderRouteId(
9
+ routes: RouteNode[],
10
+ requestedId: string,
11
+ matchedIds: (string | undefined)[] = [],
12
+ ): string {
13
+ if (matchedIds.includes(requestedId)) return requestedId;
14
+ const matched = new Set(matchedIds);
15
+ const visit = (nodes: RouteNode[]): string | undefined => {
16
+ for (const route of nodes) {
17
+ if (
18
+ route.id &&
19
+ matched.has(route.id) &&
20
+ route.modernLocalisedRoute?.id === requestedId
21
+ ) {
22
+ return route.id;
23
+ }
24
+ const child = route.children && visit(route.children);
25
+ if (child) return child;
26
+ }
27
+ return undefined;
28
+ };
29
+ return visit(routes) ?? requestedId;
30
+ }
@@ -0,0 +1,18 @@
1
+ import type { LocalisedUrlsOption, ResolvedLocalisedUrlsConfig } from './types';
2
+
3
+ /**
4
+ * Localised URLs are strictly opt-in: only an explicit, non-empty map enables
5
+ * route expansion and validation. `true`, `false`, an empty map and absence
6
+ * all resolve to disabled, so upstream-style configs (`localePathRedirect` +
7
+ * `languages` without a map) keep plain locale-prefix behavior instead of
8
+ * failing the build for every route missing from a map they never wrote.
9
+ */
10
+ export const resolveLocalisedUrlsConfig = (
11
+ option: LocalisedUrlsOption | undefined,
12
+ ): ResolvedLocalisedUrlsConfig => {
13
+ if (option && typeof option === 'object' && Object.keys(option).length > 0) {
14
+ return { enabled: true, map: option };
15
+ }
16
+
17
+ return { enabled: false, map: {} };
18
+ };