@bleedingdev/modern-js-renderer-octane 3.9.3-ultramodern.7 → 3.9.3-ultramodern.9

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 (96) hide show
  1. package/dist/cjs/client.js +56 -6
  2. package/dist/cjs/entry-application.js +7 -2
  3. package/dist/cjs/entry-client.js +3 -0
  4. package/dist/cjs/entry-server.js +13 -5
  5. package/dist/cjs/federation.js +108 -6
  6. package/dist/cjs/i18n/I18nProvider.js +6 -14
  7. package/dist/cjs/i18n/LocalizedLink.js +24 -33
  8. package/dist/cjs/i18n/index.js +0 -3
  9. package/dist/cjs/i18n-external-snapshot.js +645 -0
  10. package/dist/cjs/index.js +4 -4
  11. package/dist/cjs/manifest.js +2 -2
  12. package/dist/cjs/plugin/compiler.js +2 -5
  13. package/dist/cjs/plugin/index.js +2 -2
  14. package/dist/cjs/plugin/profile.js +12 -10
  15. package/dist/cjs/router-client.js +1 -1
  16. package/dist/cjs/router-external-snapshot.js +263 -0
  17. package/dist/cjs/router-handler.js +11 -8
  18. package/dist/cjs/router-server.js +3 -11
  19. package/dist/cjs/router.js +1 -1
  20. package/dist/cjs/routes.js +11 -17
  21. package/dist/cjs/server.js +28 -7
  22. package/dist/cjs/worker-federation-context.js +63 -0
  23. package/dist/cjs/worker-federation-contexts.js +97 -0
  24. package/dist/cjs/worker-federation.js +97 -0
  25. package/dist/esm/client.mjs +56 -6
  26. package/dist/esm/entry-application.mjs +7 -2
  27. package/dist/esm/entry-client.mjs +3 -0
  28. package/dist/esm/entry-server.mjs +11 -6
  29. package/dist/esm/federation.mjs +110 -8
  30. package/dist/esm/i18n/I18nProvider.mjs +7 -15
  31. package/dist/esm/i18n/LocalizedLink.mjs +24 -30
  32. package/dist/esm/i18n/index.mjs +1 -1
  33. package/dist/esm/i18n-external-snapshot.mjs +576 -0
  34. package/dist/esm/index.mjs +4 -4
  35. package/dist/esm/manifest.mjs +2 -2
  36. package/dist/esm/router-client.mjs +1 -1
  37. package/dist/esm/router-external-snapshot.mjs +216 -0
  38. package/dist/esm/router-handler.mjs +11 -8
  39. package/dist/esm/router-server.mjs +0 -1
  40. package/dist/esm/router.mjs +2 -2
  41. package/dist/esm/routes.mjs +11 -17
  42. package/dist/esm/server.mjs +24 -3
  43. package/dist/esm/worker-federation-context.mjs +19 -0
  44. package/dist/esm/worker-federation-contexts.mjs +47 -0
  45. package/dist/esm/worker-federation.mjs +59 -0
  46. package/dist/esm-node/manifest.mjs +2 -2
  47. package/dist/esm-node/plugin/compiler.mjs +2 -5
  48. package/dist/esm-node/plugin/index.mjs +2 -2
  49. package/dist/esm-node/plugin/profile.mjs +12 -10
  50. package/dist/types/client.d.ts +5 -1
  51. package/dist/types/entry-client.d.ts +2 -0
  52. package/dist/types/entry-server.d.ts +4 -1
  53. package/dist/types/federation.d.ts +2 -0
  54. package/dist/types/i18n/LocalizedLink.d.ts +5 -32
  55. package/dist/types/i18n/context.d.ts +1 -1
  56. package/dist/types/i18n/index.d.ts +1 -1
  57. package/dist/types/i18n-external-snapshot.d.ts +43 -0
  58. package/dist/types/index.d.ts +4 -4
  59. package/dist/types/manifest.d.ts +2 -2
  60. package/dist/types/router-external-snapshot.d.ts +10 -0
  61. package/dist/types/router-server.d.ts +0 -2
  62. package/dist/types/server.d.ts +6 -0
  63. package/dist/types/worker-federation-context.d.ts +34 -0
  64. package/dist/types/worker-federation-contexts.d.ts +25 -0
  65. package/dist/types/worker-federation.d.ts +20 -0
  66. package/package.json +84 -22
  67. package/src/client.ts +99 -16
  68. package/src/entry-application.ts +7 -3
  69. package/src/entry-client.ts +10 -0
  70. package/src/entry-server.ts +20 -9
  71. package/src/federation.ts +159 -15
  72. package/src/i18n/I18nProvider.ts +11 -20
  73. package/src/i18n/LocalizedLink.ts +46 -72
  74. package/src/i18n/context.ts +1 -1
  75. package/src/i18n/index.ts +1 -5
  76. package/src/i18n-external-snapshot.ts +803 -0
  77. package/src/index.ts +4 -4
  78. package/src/manifest.ts +2 -2
  79. package/src/plugin/compiler-manifest.cjs +27 -1
  80. package/src/plugin/compiler.ts +6 -14
  81. package/src/plugin/index.ts +4 -2
  82. package/src/plugin/profile.ts +14 -10
  83. package/src/router-client.ts +1 -1
  84. package/src/router-external-snapshot.ts +306 -0
  85. package/src/router-handler.ts +11 -8
  86. package/src/router-server.ts +0 -2
  87. package/src/router.ts +2 -2
  88. package/src/routes.ts +28 -26
  89. package/src/server.ts +45 -5
  90. package/src/worker-federation-context.ts +51 -0
  91. package/src/worker-federation-contexts.ts +91 -0
  92. package/src/worker-federation.ts +120 -0
  93. package/dist/cjs/router-injection.js +0 -139
  94. package/dist/esm/router-injection.mjs +0 -101
  95. package/dist/types/router-injection.d.ts +0 -8
  96. package/src/router-injection.ts +0 -145
@@ -67,7 +67,8 @@ function createOctaneCompilerPlugin(options) {
67
67
  const directory = pluginSourceDirectory();
68
68
  const require1 = (0, external_node_module_namespaceObject.createRequire)(external_node_path_default().join(directory, 'index.cjs'));
69
69
  const { OctaneCompilerManifestPlugin } = require1('./compiler-manifest.cjs');
70
- const { inferRspackEnvironment, OctaneRspackPlugin } = require1('@octanejs/rspack-plugin');
70
+ const appRequire = (0, external_node_module_namespaceObject.createRequire)(external_node_path_default().join(api.context.rootPath, 'package.json'));
71
+ const { inferRspackEnvironment, OctaneRspackPlugin } = appRequire('@octanejs/rspack-plugin');
71
72
  api.modifyRsbuildConfig((config, { mergeRsbuildConfig })=>mergeRsbuildConfig(config, {
72
73
  source: {
73
74
  include: [
@@ -77,10 +78,6 @@ function createOctaneCompilerPlugin(options) {
77
78
  }));
78
79
  api.modifyRspackConfig((config, { environment: rsbuildEnvironment })=>{
79
80
  const environment = rsbuildEnvironment.name === options.workerEnvironmentName ? 'server' : inferRspackEnvironment(config.target);
80
- config.resolve ??= {};
81
- const extensions = (config.resolve.extensions ?? []).filter((extension)=>'.tsrx' !== extension);
82
- extensions.splice(Math.max(extensions.indexOf('.ts'), extensions.indexOf('.tsx')) + 1, 0, '.tsrx');
83
- config.resolve.extensions = extensions;
84
81
  config.plugins ??= [];
85
82
  config.plugins.push(new OctaneRspackPlugin({
86
83
  root: api.context.rootPath,
@@ -119,7 +119,7 @@ const rendererAdapter = (0, adapter_namespaceObject.defineRendererAdapter)({
119
119
  create: {
120
120
  templates: {
121
121
  federation: true,
122
- workers: false
122
+ workers: true
123
123
  },
124
124
  dependencies: (profile, { typescriptVersion })=>({
125
125
  frameworkDependencies: [
@@ -128,7 +128,7 @@ const rendererAdapter = (0, adapter_namespaceObject.defineRendererAdapter)({
128
128
  ],
129
129
  dependencies: (0, adapter_namespaceObject.nativeRendererDependencies)(profile),
130
130
  devDependencies: {
131
- [profile.compiler.name]: profile.compiler.version,
131
+ [profile.compiler.name]: profile.dependencies[profile.compiler.name] ?? profile.compiler.version,
132
132
  typescript: typescriptVersion
133
133
  },
134
134
  typecheckCommand: 'octane-tsc --noEmit --project tsconfig.json',
@@ -31,7 +31,7 @@ const octaneProfile = {
31
31
  renderer: 'octane',
32
32
  status: 'preview',
33
33
  protocolVersion: 1,
34
- minimumNode: '26.10.0',
34
+ minimumNode: '26.12.0',
35
35
  hmr: {
36
36
  editedBoundary: 'may-reset',
37
37
  unaffectedComponents: 'preserved',
@@ -41,17 +41,17 @@ const octaneProfile = {
41
41
  },
42
42
  compiler: {
43
43
  name: '@octanejs/rspack-plugin',
44
- version: '0.1.55'
44
+ version: '0.2.4'
45
45
  },
46
46
  hydration: {
47
47
  name: 'octane',
48
- version: '0.7.1+ultramodern.1331985ea3b0'
48
+ version: '0.13.8'
49
49
  },
50
50
  router: {
51
51
  name: '@octanejs/tanstack-router',
52
- version: '0.1.60+ultramodern.0b9f76ee3003',
52
+ version: '0.2.10',
53
53
  coreName: '@tanstack/router-core',
54
- coreVersion: '1.171.15'
54
+ coreVersion: '1.171.38'
55
55
  },
56
56
  sourceExtensions: [
57
57
  '.tsx',
@@ -61,12 +61,14 @@ const octaneProfile = {
61
61
  ],
62
62
  jsxImportSource: 'octane',
63
63
  dependencies: {
64
- octane: 'https://github.com/bleedingdev/octane/releases/download/octane%400.7.1%2Bultramodern.1331985ea3b0/octane-0.7.1%2Bultramodern.1331985ea3b0.tgz',
65
- '@octanejs/tanstack-router': 'https://github.com/bleedingdev/octane/releases/download/%40octanejs%2Ftanstack-router%400.1.60%2Bultramodern.0b9f76ee3003/octanejs-tanstack-router-0.1.60%2Bultramodern.0b9f76ee3003.tgz',
66
- '@octanejs/rspack-plugin': '0.1.55',
64
+ '@tsrx/oxc': '0.20.0',
65
+ octane: 'https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-0bf2313bbdfb/octane-0.13.8.tgz',
66
+ '@octanejs/tanstack-router': 'https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-0bf2313bbdfb/octanejs-tanstack-router-0.2.10.tgz',
67
+ '@octanejs/rspack-plugin': 'https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-0bf2313bbdfb/octanejs-rspack-plugin-0.2.4.tgz',
68
+ '@tanstack/router-core': 'https://github.com/BleedingDev/router/releases/download/ultramodern-router-core-585d3233f7f5/tanstack-router-core-1.171.38.tgz',
67
69
  '@modern-js/renderer-octane': '3.8.3',
68
- seroval: '1.6.8',
69
- 'seroval-plugins': '1.6.8'
70
+ seroval: '1.6.9',
71
+ 'seroval-plugins': '1.6.9'
70
72
  },
71
73
  capabilities: {
72
74
  worker: true,
@@ -64,7 +64,7 @@ function isReactiveMatchIds(value) {
64
64
  }
65
65
  function waitForCommittedMatches(router, signal) {
66
66
  signal?.throwIfAborted();
67
- const matchesId = router.stores.matchesId;
67
+ const matchesId = router.stores.ids;
68
68
  if (matchesId.get().length > 0) return Promise.resolve();
69
69
  if (!isReactiveMatchIds(matchesId)) throw new Error('Octane router hydration requires its native reactive match store');
70
70
  return new Promise((resolve, reject)=>{
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE: ()=>OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE,
32
+ associateOctaneFileRouteSnapshot: ()=>associateOctaneFileRouteSnapshot,
33
+ captureOctaneRouterSnapshot: ()=>captureOctaneRouterSnapshot,
34
+ registerOctaneRouterWorkerContexts: ()=>registerOctaneRouterWorkerContexts
35
+ });
36
+ const tanstack_router_namespaceObject = require("@octanejs/tanstack-router");
37
+ const external_worker_federation_contexts_js_namespaceObject = require("./worker-federation-contexts.js");
38
+ const OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE = Object.freeze({
39
+ key: 'ultramodern.file-routes',
40
+ version: '1'
41
+ });
42
+ const origins = new WeakMap();
43
+ let profileRegistered = false;
44
+ function plainRecord(value) {
45
+ return null !== value && 'object' == typeof value && [
46
+ Object.prototype,
47
+ null
48
+ ].includes(Object.getPrototypeOf(value));
49
+ }
50
+ function record(value, fields) {
51
+ if (!plainRecord(value)) throw new TypeError('Worker router context requires a plain record');
52
+ for (const key of Reflect.ownKeys(value)){
53
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
54
+ if ('string' != typeof key || fields && !fields.includes(key) || !descriptor || !descriptor.enumerable || !('value' in descriptor)) throw new TypeError('Unknown Worker router context field or accessor');
55
+ }
56
+ return value;
57
+ }
58
+ function nonempty(value) {
59
+ if ('string' != typeof value || !value.trim() || value.length > 1024) throw new TypeError('Invalid Worker router identity');
60
+ return value;
61
+ }
62
+ function publicContext(value) {
63
+ const context = record(value, [
64
+ 'ultramodern'
65
+ ]);
66
+ const metadata = record(context.ultramodern, [
67
+ 'rendererIdentity'
68
+ ]);
69
+ const identity = record(metadata.rendererIdentity, [
70
+ 'renderer',
71
+ 'appId',
72
+ 'entryName',
73
+ 'protocolVersion',
74
+ 'buildId'
75
+ ]);
76
+ if ('octane' !== identity.renderer || 1 !== identity.protocolVersion) throw new TypeError('Unsupported Worker router identity');
77
+ return Object.freeze({
78
+ ultramodern: Object.freeze({
79
+ rendererIdentity: Object.freeze({
80
+ renderer: 'octane',
81
+ appId: nonempty(identity.appId),
82
+ entryName: nonempty(identity.entryName),
83
+ protocolVersion: 1,
84
+ buildId: nonempty(identity.buildId)
85
+ })
86
+ })
87
+ });
88
+ }
89
+ function localizedUrls(value) {
90
+ if (void 0 === value || 'boolean' == typeof value) return value;
91
+ const input = record(value);
92
+ const result = {};
93
+ for (const [path, translations] of Object.entries(input)){
94
+ const names = {};
95
+ for (const [language, target] of Object.entries(record(translations)))names[nonempty(language)] = nonempty(target);
96
+ result[path] = names;
97
+ }
98
+ return result;
99
+ }
100
+ function rewriteDescriptor(value) {
101
+ if (void 0 === value) return;
102
+ const input = record(value, [
103
+ 'language',
104
+ 'languages',
105
+ 'localisedUrls'
106
+ ]);
107
+ if (!Array.isArray(input.languages) || !input.languages.length || input.languages.length > 64) throw new TypeError('Invalid Worker router i18n languages');
108
+ const languages = input.languages.map(nonempty);
109
+ const language = nonempty(input.language);
110
+ if (new Set(languages).size !== languages.length || !languages.includes(language)) throw new TypeError('Invalid Worker router i18n language');
111
+ const urls = localizedUrls(input.localisedUrls);
112
+ return {
113
+ language,
114
+ languages,
115
+ ...void 0 === urls ? {} : {
116
+ localisedUrls: urls
117
+ }
118
+ };
119
+ }
120
+ function nativeRewriteDescriptor(router) {
121
+ if (!router.options.rewrite) return;
122
+ const known = (0, external_worker_federation_contexts_js_namespaceObject.getOctaneWorkerRouterRewrite)()?.capture(router.options.rewrite);
123
+ if (!known) throw new TypeError('Custom router rewrite requires an exact Worker profile');
124
+ const descriptor = rewriteDescriptor(known);
125
+ if (!descriptor) throw new TypeError('Missing native router rewrite provenance');
126
+ return {
127
+ language: descriptor.language,
128
+ languages: [
129
+ ...descriptor.languages
130
+ ],
131
+ ...void 0 === descriptor.localisedUrls ? {} : {
132
+ localisedUrls: descriptor.localisedUrls
133
+ }
134
+ };
135
+ }
136
+ function validateDefaultSnapshot(snapshot) {
137
+ publicContext(snapshot.publicContext);
138
+ rewriteDescriptor(snapshot.i18n);
139
+ }
140
+ function ensureDefaultProfile() {
141
+ if (profileRegistered) return;
142
+ (0, tanstack_router_namespaceObject.registerRouterRenderProfile)({
143
+ id: OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE,
144
+ assertHost: (router, snapshot)=>{
145
+ const origin = origins.get(router);
146
+ if (!origin || origin.rewrite !== router.options.rewrite || JSON.stringify(publicContext(router.options.context)) !== JSON.stringify(origin.publicContext)) throw new TypeError('Generated Worker router origin changed');
147
+ (0, tanstack_router_namespaceObject.assertDefaultRouterRenderHost)(router, void 0 !== snapshot.i18n);
148
+ validateDefaultSnapshot(snapshot);
149
+ if (JSON.stringify(nativeRewriteDescriptor(router)) !== JSON.stringify(snapshot.i18n)) throw new TypeError('Worker router rewrite differs from its native provenance');
150
+ },
151
+ createRoutingTree: (snapshot)=>{
152
+ validateDefaultSnapshot(snapshot);
153
+ return (0, tanstack_router_namespaceObject.createRouterRenderRouteTree)(snapshot.routes);
154
+ },
155
+ routingOptions: (snapshot)=>{
156
+ const defaults = {
157
+ parseSearch: tanstack_router_namespaceObject.defaultParseSearch,
158
+ stringifySearch: tanstack_router_namespaceObject.defaultStringifySearch
159
+ };
160
+ const i18n = rewriteDescriptor(snapshot.i18n);
161
+ if (!i18n) return defaults;
162
+ const codec = (0, external_worker_federation_contexts_js_namespaceObject.getOctaneWorkerRouterRewrite)();
163
+ if (!codec) throw new TypeError('Missing owning Worker router i18n codec');
164
+ return {
165
+ ...defaults,
166
+ rewrite: codec.restore(i18n)
167
+ };
168
+ }
169
+ });
170
+ profileRegistered = true;
171
+ }
172
+ function associateOctaneFileRouteSnapshot(router) {
173
+ ensureDefaultProfile();
174
+ const context = publicContext(router.options.context);
175
+ origins.set(router, {
176
+ publicContext: context,
177
+ rewrite: router.options.rewrite
178
+ });
179
+ (0, tanstack_router_namespaceObject.associateRouterRenderProfile)(router, {
180
+ id: OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE,
181
+ publicContext: context
182
+ });
183
+ }
184
+ function captureOctaneRouterSnapshot(router) {
185
+ const origin = origins.get(router);
186
+ const declared = (0, tanstack_router_namespaceObject.getRouterRenderProfile)(router);
187
+ if (origin && declared?.key === OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE.key && declared.version === OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE.version) {
188
+ const i18n = nativeRewriteDescriptor(router);
189
+ (0, tanstack_router_namespaceObject.associateRouterRenderProfile)(router, {
190
+ id: OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE,
191
+ publicContext: origin.publicContext,
192
+ ...void 0 === i18n ? {} : {
193
+ i18n
194
+ }
195
+ });
196
+ }
197
+ return (0, tanstack_router_namespaceObject.captureRouterRenderSnapshot)(router);
198
+ }
199
+ let registrations = 0;
200
+ let releaseContexts;
201
+ function registerOctaneRouterWorkerContexts() {
202
+ ensureDefaultProfile();
203
+ if (!releaseContexts) {
204
+ const releaseRouter = (0, external_worker_federation_contexts_js_namespaceObject.registerOctaneWorkerContext)(tanstack_router_namespaceObject.routerContext, {
205
+ key: external_worker_federation_contexts_js_namespaceObject.OCTANE_WORKER_CONTEXT_KEYS.router,
206
+ encode: (value)=>{
207
+ if (!value) throw new TypeError('Missing native router provider');
208
+ return captureOctaneRouterSnapshot(value);
209
+ },
210
+ decode: (value, signal)=>(0, tanstack_router_namespaceObject.restoreRouterRenderSnapshot)(value, {
211
+ signal
212
+ }),
213
+ dispose: (value)=>{
214
+ if (value) (0, tanstack_router_namespaceObject.disposeRouterRenderSnapshot)(value);
215
+ },
216
+ isProvided: (value)=>void 0 !== value
217
+ });
218
+ try {
219
+ const releaseMatch = (0, external_worker_federation_contexts_js_namespaceObject.registerOctaneWorkerContext)(tanstack_router_namespaceObject.matchContext, {
220
+ key: external_worker_federation_contexts_js_namespaceObject.OCTANE_WORKER_CONTEXT_KEYS.match,
221
+ encode: nonempty,
222
+ decode: nonempty,
223
+ validate: (value, readContext)=>{
224
+ const selected = readContext(tanstack_router_namespaceObject.routerContext);
225
+ const router = selected.present ? selected.value : void 0;
226
+ const current = router?.state.matches.find((match)=>match.routeId === value);
227
+ if (!router || !current || 'string' != typeof value || router.stores.getMatchStore(value).get() !== current) throw new TypeError('Worker match context requires its selected native router and a current match');
228
+ },
229
+ isProvided: (value)=>void 0 !== value
230
+ });
231
+ releaseContexts = ()=>{
232
+ releaseMatch();
233
+ releaseRouter();
234
+ };
235
+ } catch (error) {
236
+ releaseRouter();
237
+ throw error;
238
+ }
239
+ }
240
+ registrations++;
241
+ let released = false;
242
+ return ()=>{
243
+ if (released) return;
244
+ released = true;
245
+ if (0 === --registrations) {
246
+ releaseContexts?.();
247
+ releaseContexts = void 0;
248
+ }
249
+ };
250
+ }
251
+ exports.OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE = __webpack_exports__.OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE;
252
+ exports.associateOctaneFileRouteSnapshot = __webpack_exports__.associateOctaneFileRouteSnapshot;
253
+ exports.captureOctaneRouterSnapshot = __webpack_exports__.captureOctaneRouterSnapshot;
254
+ exports.registerOctaneRouterWorkerContexts = __webpack_exports__.registerOctaneRouterWorkerContexts;
255
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
256
+ "OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE",
257
+ "associateOctaneFileRouteSnapshot",
258
+ "captureOctaneRouterSnapshot",
259
+ "registerOctaneRouterWorkerContexts"
260
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
261
+ Object.defineProperty(exports, '__esModule', {
262
+ value: true
263
+ });
@@ -84,8 +84,8 @@ function requestHeaders(router) {
84
84
  if (field?.get || field?.set) throw new TypeError('Native Octane response headers must be owned values');
85
85
  appendHeaders(headers, field?.value);
86
86
  }
87
- const redirect = router.stores.redirect.get();
88
- if (redirect) appendHeaders(headers, redirect.headers);
87
+ const result = router._serverResult;
88
+ if (result?.type === 'redirect') appendHeaders(headers, result.redirect.headers);
89
89
  return headers;
90
90
  }
91
91
  function createOctaneRequestHandler({ createRouter, request, session, getRouterManifest, serialization }) {
@@ -106,7 +106,6 @@ function createOctaneRequestHandler({ createRouter, request, session, getRouterM
106
106
  ...serialization?.forbiddenValues ?? []
107
107
  ]
108
108
  });
109
- session.registerCleanup(()=>router.cancelMatches());
110
109
  const { url } = (0, server_namespaceObject.getNormalizedURL)(request.url, 'http://localhost');
111
110
  const href = url.href.replace(url.origin, '');
112
111
  router.update({
@@ -118,11 +117,13 @@ function createOctaneRequestHandler({ createRouter, request, session, getRouterM
118
117
  }),
119
118
  origin: router.options.origin ?? (0, server_namespaceObject.getOrigin)(request)
120
119
  });
121
- await withAbort(router.load(), session.signal);
120
+ await withAbort(router.load({
121
+ _signal: session.signal
122
+ }), session.signal);
122
123
  guard.assertActive();
123
- const redirect = router.stores.redirect.get();
124
- if (redirect) {
125
- const resolved = router.resolveRedirect(redirect);
124
+ const loadResult = router._serverResult;
125
+ if (loadResult?.type === 'redirect') {
126
+ const resolved = loadResult.redirect;
126
127
  const headers = requestHeaders(router);
127
128
  return new Response(null, {
128
129
  status: resolved.status,
@@ -133,7 +134,9 @@ function createOctaneRequestHandler({ createRouter, request, session, getRouterM
133
134
  guard.assertMatches();
134
135
  const serverSsr = router.serverSsr;
135
136
  if (!serverSsr) throw new Error('Native Octane router SSR state is required');
136
- await withAbort(serverSsr.dehydrate(), session.signal);
137
+ await withAbort(serverSsr.dehydrate({
138
+ signal: session.signal
139
+ }), session.signal);
137
140
  guard.assertActive();
138
141
  const responseHeaders = requestHeaders(router);
139
142
  const rendered = Promise.resolve(callback({
@@ -3,9 +3,6 @@ var __webpack_modules__ = {
3
3
  "./router-handler" (module) {
4
4
  module.exports = require("./router-handler.js");
5
5
  },
6
- "./router-injection" (module) {
7
- module.exports = require("./router-injection.js");
8
- },
9
6
  "./router-server-snapshot" (module) {
10
7
  module.exports = require("./router-server-snapshot.js");
11
8
  },
@@ -74,13 +71,11 @@ var __webpack_exports__ = {};
74
71
  "createOctaneRequestHandler",
75
72
  "prepareOctaneRouterSerialization",
76
73
  "default",
77
- "OctaneRouterServer",
78
- "createOctaneRouterInjection"
74
+ "OctaneRouterServer"
79
75
  ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_octanejs_tanstack_router_ssr_server__rspack_import_2[__rspack_import_key];
80
76
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
81
77
  var _router_handler__rspack_import_3 = __webpack_require__("./router-handler");
82
- var _router_injection__rspack_import_4 = __webpack_require__("./router-injection");
83
- var _router_server_snapshot__rspack_import_5 = __webpack_require__("./router-server-snapshot");
78
+ var _router_server_snapshot__rspack_import_4 = __webpack_require__("./router-server-snapshot");
84
79
  function OctaneRouterServer({ router }) {
85
80
  return (0, octane_server__rspack_import_1.createElement)(_octanejs_tanstack_router__rspack_import_0.RouterProvider, {
86
81
  router
@@ -89,18 +84,15 @@ var __webpack_exports__ = {};
89
84
  __webpack_require__.d(__webpack_exports__, {
90
85
  OctaneRouterServer: ()=>OctaneRouterServer,
91
86
  createOctaneRequestHandler: ()=>_router_handler__rspack_import_3.createOctaneRequestHandler,
92
- createOctaneRouterInjection: ()=>_router_injection__rspack_import_4.createOctaneRouterInjection,
93
- prepareOctaneRouterSerialization: ()=>_router_server_snapshot__rspack_import_5.prepareOctaneRouterSerialization
87
+ prepareOctaneRouterSerialization: ()=>_router_server_snapshot__rspack_import_4.prepareOctaneRouterSerialization
94
88
  });
95
89
  })();
96
90
  exports.OctaneRouterServer = __webpack_exports__.OctaneRouterServer;
97
91
  exports.createOctaneRequestHandler = __webpack_exports__.createOctaneRequestHandler;
98
- exports.createOctaneRouterInjection = __webpack_exports__.createOctaneRouterInjection;
99
92
  exports.prepareOctaneRouterSerialization = __webpack_exports__.prepareOctaneRouterSerialization;
100
93
  for(var __rspack_i in __webpack_exports__)if (-1 === [
101
94
  "OctaneRouterServer",
102
95
  "createOctaneRequestHandler",
103
- "createOctaneRouterInjection",
104
96
  "prepareOctaneRouterSerialization"
105
97
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
106
98
  Object.defineProperty(exports, '__esModule', {
@@ -150,7 +150,7 @@ var __webpack_exports__ = {};
150
150
  const identity = useApplicationIdentity();
151
151
  const routeId = useApplicationRouteId();
152
152
  const owner = (0, octane__rspack_import_2.useRef)(null, actionSlot(slot, 'owner'));
153
- (0, octane__rspack_import_2.useEffect)(()=>{
153
+ (0, octane__rspack_import_2.useLayoutEffect)(()=>{
154
154
  const controller = new AbortController();
155
155
  owner.current = controller;
156
156
  return ()=>controller.abort(new DOMException('The route action owner unmounted', 'AbortError'));
@@ -47,21 +47,12 @@ function resolveRouteData(routeId, outcome) {
47
47
  function isReactiveNativeMatch(value) {
48
48
  return 'object' == typeof value && null !== value && 'function' == typeof Reflect.get(value, 'get') && 'function' == typeof Reflect.get(value, 'subscribe');
49
49
  }
50
- function observeRouteCompletion(router, controller, signal, completion) {
50
+ function observeRouteCompletion(router, routeId, controller, signal, completion) {
51
51
  completion.catch((error)=>{
52
52
  if (signal.aborted) return;
53
- const match = [
54
- ...router.stores.pendingMatches.get(),
55
- ...router.stores.matches.get(),
56
- ...router.stores.cachedMatches.get()
57
- ].find((candidate)=>candidate.abortController === controller);
58
- if (!match) return;
59
- const store = [
60
- router.stores.pendingMatchStores.get(match.id),
61
- router.stores.matchStores.get(match.id),
62
- router.stores.cachedMatchStores.get(match.id)
63
- ].find((candidate)=>candidate?.get().abortController === controller);
64
- if (!store) return;
53
+ const route = Object.values(router.routesById).find((candidate)=>candidate.options.staticData?.ultramodernRouteId === routeId);
54
+ if (!route) return;
55
+ const store = router.stores.getMatchStore(route.id);
65
56
  let subscription;
66
57
  let settled = false;
67
58
  const cleanup = ()=>{
@@ -72,9 +63,10 @@ function observeRouteCompletion(router, controller, signal, completion) {
72
63
  settled = true;
73
64
  cleanup();
74
65
  };
75
- const publish = ()=>{
66
+ const publish = async ()=>{
76
67
  if (settled) return;
77
68
  const current = store.get();
69
+ if (!current) return;
78
70
  if (current.abortController !== controller || signal.aborted || 'pending' !== current.status && 'success' !== current.status) return void onAbort();
79
71
  if ('success' !== current.status || current.isFetching) return;
80
72
  settled = true;
@@ -82,17 +74,19 @@ function observeRouteCompletion(router, controller, signal, completion) {
82
74
  const route = router.routesById[current.routeId];
83
75
  let failure = error;
84
76
  try {
77
+ await route?.options.errorComponent?.preload?.();
78
+ if (signal.aborted || store.get()?.abortController !== controller) return;
85
79
  route?.options.onError?.(failure);
86
80
  } catch (onErrorFailure) {
87
81
  failure = onErrorFailure;
88
82
  }
89
83
  if (signal.aborted) return;
90
- router.updateMatch(match.id, (previous)=>previous.abortController !== controller || 'success' !== previous.status || previous.isFetching ? previous : {
84
+ router.stores.setMatches(router.stores.matches.get().map((previous)=>previous.routeId !== route.id || previous.abortController !== controller || 'success' !== previous.status || previous.isFetching ? previous : {
91
85
  ...previous,
92
86
  error: failure,
93
87
  status: 'error',
94
88
  isFetching: false
95
- });
89
+ }));
96
90
  };
97
91
  signal.addEventListener('abort', onAbort, {
98
92
  once: true
@@ -136,7 +130,7 @@ function createFileSystemRouteTree(routes, modules, options = {}) {
136
130
  await Promise.resolve();
137
131
  signal.throwIfAborted();
138
132
  if (failed) throw failure;
139
- observeRouteCompletion(router, match.abortController, signal, outcome.completion);
133
+ observeRouteCompletion(router, route.id, match.abortController, signal, outcome.completion);
140
134
  }
141
135
  options.onOutcome?.(route.id, outcome);
142
136
  return resolveRouteData(route.id, outcome);
@@ -33,9 +33,11 @@ __webpack_require__.d(__webpack_exports__, {
33
33
  });
34
34
  const document_namespaceObject = require("@modern-js/renderer-core/document");
35
35
  const session_namespaceObject = require("@modern-js/renderer-core/session");
36
- const server_namespaceObject = require("octane/server");
36
+ const server_namespaceObject = require("@octanejs/tanstack-router/ssr/server");
37
+ const external_octane_server_namespaceObject = require("octane/server");
37
38
  const external_bootstrap_js_namespaceObject = require("./bootstrap.js");
38
39
  const external_federation_context_js_namespaceObject = require("./federation-context.js");
40
+ const external_worker_federation_context_js_namespaceObject = require("./worker-federation-context.js");
39
41
  function prepareOctaneDocument(session, document, hydrating) {
40
42
  (0, external_bootstrap_js_namespaceObject.assertOctaneIdentity)(session.identity);
41
43
  if ('node' !== session.platform.kind && 'worker' !== session.platform.kind) throw new Error('An Octane document requires a Node or worker request platform.');
@@ -99,19 +101,28 @@ async function renderOctaneApplication(input) {
99
101
  const { session, document } = input;
100
102
  try {
101
103
  const { rootId, lang, bootstrap, headAssets, entryScripts } = prepareOctaneDocument(session, document, true);
102
- const earlyBootstrap = (0, server_namespaceObject.earlySignalBootstrapScript)(void 0 === document.nonce ? {} : {
104
+ const earlyBootstrap = (0, external_octane_server_namespaceObject.earlySignalBootstrapScript)(void 0 === document.nonce ? {} : {
103
105
  nonce: document.nonce
104
106
  });
105
107
  await resolveDocumentResponse(input);
106
108
  if (session.responsePolicy?.kind === 'terminal') return session.respond(null);
107
109
  session.startRendering();
108
110
  let head = '';
109
- const federation = input.federation ? (0, external_federation_context_js_namespaceObject.createFederationScope)(input.federation, true, document.nonce) : void 0;
110
- const App = federation ? ()=>(0, server_namespaceObject.createElement)(external_federation_context_js_namespaceObject.FederationRoot, {
111
+ const federation = input.federation || input.workerFederation ? (0, external_federation_context_js_namespaceObject.createFederationScope)(input.federation, true, document.nonce) : void 0;
112
+ const App = federation ? ()=>(0, external_octane_server_namespaceObject.createElement)(external_federation_context_js_namespaceObject.FederationRoot, {
111
113
  scope: federation,
112
- children: 'function' == typeof input.App ? (0, server_namespaceObject.createElement)(input.App, input.props) : input.App
114
+ children: 'function' == typeof input.App ? (0, external_octane_server_namespaceObject.createElement)(input.App, input.props) : input.App
113
115
  }) : input.App;
114
- const nativeStream = await (0, server_namespaceObject.renderToReadableStream)(App, input.props, {
116
+ const workerFederation = input.workerFederation ? {
117
+ transport: input.workerFederation,
118
+ locale: input.workerFederationLocale ?? 'default',
119
+ signal: session.signal
120
+ } : void 0;
121
+ const NativeApp = workerFederation ? ()=>(0, external_octane_server_namespaceObject.createElement)(external_worker_federation_context_js_namespaceObject.WorkerFederationRoot, {
122
+ scope: workerFederation,
123
+ children: 'function' == typeof App ? (0, external_octane_server_namespaceObject.createElement)(App, input.props) : App
124
+ }) : App;
125
+ const nativeStream = await (0, external_octane_server_namespaceObject.renderToReadableStream)(NativeApp, input.props, {
115
126
  signal: session.signal,
116
127
  ...void 0 === document.nonce ? {} : {
117
128
  nonce: document.nonce
@@ -124,6 +135,9 @@ async function renderOctaneApplication(input) {
124
135
  buildId: document.nativeHydrationBuildId,
125
136
  documentId: document.documentId
126
137
  },
138
+ externalSnapshots: {
139
+ documentId: document.documentId
140
+ },
127
141
  headChannel: 'separate',
128
142
  onHeadReady (value) {
129
143
  head = value;
@@ -207,7 +221,14 @@ async function renderOctaneApplication(input) {
207
221
  }, {
208
222
  highWaterMark: 0
209
223
  });
210
- return session.respond(body);
224
+ return session.respond(input.router ? (0, server_namespaceObject.transformReadableStreamWithRouter)(input.router, body, {
225
+ signal: session.signal,
226
+ rendererSafePoint: "script-close",
227
+ timeoutMs: input.routerSerializationTimeoutMs,
228
+ onAbort: (reason)=>{
229
+ session.fail(reason);
230
+ }
231
+ }) : body);
211
232
  } catch (error) {
212
233
  await session.fail(error);
213
234
  throw error;