@bleedingdev/modern-js-renderer-octane 3.9.3-ultramodern.1 → 3.9.3-ultramodern.10
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/client.js +56 -6
- package/dist/cjs/entry-application.js +7 -2
- package/dist/cjs/entry-client.js +3 -0
- package/dist/cjs/entry-server.js +13 -5
- package/dist/cjs/federation.js +108 -6
- package/dist/cjs/i18n/I18nProvider.js +6 -14
- package/dist/cjs/i18n/LocalizedLink.js +24 -33
- package/dist/cjs/i18n/index.js +0 -3
- package/dist/cjs/i18n-external-snapshot.js +645 -0
- package/dist/cjs/index.js +4 -4
- package/dist/cjs/manifest.js +2 -2
- package/dist/cjs/plugin/compiler.js +2 -5
- package/dist/cjs/plugin/create.js +27 -26
- package/dist/cjs/plugin/index.js +2 -2
- package/dist/cjs/plugin/profile.js +12 -10
- package/dist/cjs/router-client.js +1 -1
- package/dist/cjs/router-external-snapshot.js +291 -0
- package/dist/cjs/router-handler.js +11 -8
- package/dist/cjs/router-server.js +3 -11
- package/dist/cjs/router.js +1 -1
- package/dist/cjs/routes.js +20 -17
- package/dist/cjs/server.js +28 -7
- package/dist/cjs/worker-federation-context.js +63 -0
- package/dist/cjs/worker-federation-contexts.js +97 -0
- package/dist/cjs/worker-federation.js +97 -0
- package/dist/esm/client.mjs +56 -6
- package/dist/esm/entry-application.mjs +7 -2
- package/dist/esm/entry-client.mjs +3 -0
- package/dist/esm/entry-server.mjs +11 -6
- package/dist/esm/federation.mjs +110 -8
- package/dist/esm/i18n/I18nProvider.mjs +7 -15
- package/dist/esm/i18n/LocalizedLink.mjs +24 -30
- package/dist/esm/i18n/index.mjs +1 -1
- package/dist/esm/i18n-external-snapshot.mjs +576 -0
- package/dist/esm/index.mjs +4 -4
- package/dist/esm/manifest.mjs +2 -2
- package/dist/esm/router-client.mjs +1 -1
- package/dist/esm/router-external-snapshot.mjs +244 -0
- package/dist/esm/router-handler.mjs +11 -8
- package/dist/esm/router-server.mjs +0 -1
- package/dist/esm/router.mjs +2 -2
- package/dist/esm/routes.mjs +18 -18
- package/dist/esm/server.mjs +24 -3
- package/dist/esm/worker-federation-context.mjs +19 -0
- package/dist/esm/worker-federation-contexts.mjs +47 -0
- package/dist/esm/worker-federation.mjs +59 -0
- package/dist/esm-node/manifest.mjs +2 -2
- package/dist/esm-node/plugin/compiler.mjs +2 -5
- package/dist/esm-node/plugin/create.mjs +27 -26
- package/dist/esm-node/plugin/index.mjs +2 -2
- package/dist/esm-node/plugin/profile.mjs +12 -10
- package/dist/types/client.d.ts +5 -1
- package/dist/types/entry-client.d.ts +2 -0
- package/dist/types/entry-server.d.ts +4 -1
- package/dist/types/federation.d.ts +2 -0
- package/dist/types/i18n/LocalizedLink.d.ts +5 -32
- package/dist/types/i18n/context.d.ts +1 -1
- package/dist/types/i18n/index.d.ts +1 -1
- package/dist/types/i18n-external-snapshot.d.ts +43 -0
- package/dist/types/index.d.ts +4 -4
- package/dist/types/manifest.d.ts +2 -2
- package/dist/types/router-external-snapshot.d.ts +10 -0
- package/dist/types/router-server.d.ts +0 -2
- package/dist/types/routes.d.ts +2 -0
- package/dist/types/server.d.ts +6 -0
- package/dist/types/worker-federation-context.d.ts +34 -0
- package/dist/types/worker-federation-contexts.d.ts +25 -0
- package/dist/types/worker-federation.d.ts +20 -0
- package/package.json +84 -22
- package/src/client.ts +99 -16
- package/src/entry-application.ts +7 -3
- package/src/entry-client.ts +10 -0
- package/src/entry-server.ts +20 -9
- package/src/federation.ts +164 -15
- package/src/i18n/I18nProvider.ts +11 -20
- package/src/i18n/LocalizedLink.ts +46 -72
- package/src/i18n/context.ts +1 -1
- package/src/i18n/index.ts +1 -5
- package/src/i18n-external-snapshot.ts +803 -0
- package/src/index.ts +4 -4
- package/src/manifest.ts +2 -2
- package/src/plugin/compiler-manifest.cjs +27 -1
- package/src/plugin/compiler.ts +6 -14
- package/src/plugin/create.ts +27 -26
- package/src/plugin/index.ts +4 -2
- package/src/plugin/profile.ts +14 -10
- package/src/router-client.ts +1 -1
- package/src/router-external-snapshot.ts +363 -0
- package/src/router-handler.ts +11 -8
- package/src/router-server.ts +0 -2
- package/src/router.ts +2 -2
- package/src/routes.ts +37 -26
- package/src/server.ts +45 -5
- package/src/worker-federation-context.ts +51 -0
- package/src/worker-federation-contexts.ts +91 -0
- package/src/worker-federation.ts +120 -0
- package/dist/cjs/router-injection.js +0 -139
- package/dist/esm/router-injection.mjs +0 -101
- package/dist/types/router-injection.d.ts +0 -8
- 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
|
|
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,
|
|
@@ -43,7 +43,7 @@ function generateOctaneAppSources(options) {
|
|
|
43
43
|
{
|
|
44
44
|
path: 'src/routes/layout.tsx',
|
|
45
45
|
content: `import { Link, Outlet } from '@modern-js/renderer-octane/router';
|
|
46
|
-
import Stable from '../components/
|
|
46
|
+
import Stable from '../components/stable';
|
|
47
47
|
import './index.css';
|
|
48
48
|
|
|
49
49
|
const appTitle = ${title};
|
|
@@ -74,7 +74,7 @@ ${options.capabilities.federation ? ' <Link to="/remotes">Federated app
|
|
|
74
74
|
useOctaneRouteAction,
|
|
75
75
|
} from '@modern-js/renderer-octane/router';
|
|
76
76
|
import { useActionState } from 'octane';
|
|
77
|
-
import Counter from '../components/
|
|
77
|
+
import Counter from '../components/counter';
|
|
78
78
|
|
|
79
79
|
const appId = ${appId};
|
|
80
80
|
const appTitle = ${title};
|
|
@@ -145,7 +145,7 @@ export const head: NonNullable<FileSystemRouteModule['head']> = () => ({
|
|
|
145
145
|
`
|
|
146
146
|
},
|
|
147
147
|
{
|
|
148
|
-
path: 'src/components/
|
|
148
|
+
path: 'src/components/counter.tsx',
|
|
149
149
|
content: `import { useState } from 'octane';
|
|
150
150
|
|
|
151
151
|
export default function Counter() {
|
|
@@ -163,7 +163,7 @@ export default function Counter() {
|
|
|
163
163
|
`
|
|
164
164
|
},
|
|
165
165
|
{
|
|
166
|
-
path: 'src/components/
|
|
166
|
+
path: 'src/components/stable.tsx',
|
|
167
167
|
content: `import { useState } from 'octane';
|
|
168
168
|
|
|
169
169
|
export default function Stable() {
|
|
@@ -190,34 +190,35 @@ export function loader({ request }: DataHandlerInput) {
|
|
|
190
190
|
if (url.searchParams.get('case') === 'error')
|
|
191
191
|
throw new Error('Native loader failure');
|
|
192
192
|
if (url.searchParams.get('case') === 'redirect')
|
|
193
|
-
return new Response(null, {
|
|
193
|
+
return new Response(null, { headers: { location: '/about' }, status: 302 });
|
|
194
194
|
return {
|
|
195
195
|
message: 'Native loader value',
|
|
196
196
|
privateValue: request.headers.get('x-conformance-private'),
|
|
197
197
|
};
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
export
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
200
|
+
export function action({ request }: DataHandlerInput) {
|
|
201
|
+
return request.formData().then(form => {
|
|
202
|
+
const name = form.get('name');
|
|
203
|
+
if (typeof name !== 'string' || name.trim().length === 0)
|
|
204
|
+
return Response.json(
|
|
205
|
+
{ fieldErrors: { name: 'Name required' } },
|
|
206
|
+
{ status: 422 },
|
|
207
|
+
);
|
|
208
|
+
if (form.get('intent') === 'redirect')
|
|
209
|
+
return new Response(null, {
|
|
210
|
+
headers: {
|
|
211
|
+
location: '/about',
|
|
212
|
+
'set-cookie': 'conformance-saved=1; Path=/; SameSite=Lax',
|
|
213
|
+
},
|
|
214
|
+
status: 303,
|
|
215
|
+
});
|
|
216
|
+
if (form.get('intent') === 'throw') throw new Error('Native action failure');
|
|
217
|
+
return {
|
|
218
|
+
saved: name,
|
|
219
|
+
privateValue: request.headers.get('x-conformance-private'),
|
|
220
|
+
};
|
|
221
|
+
});
|
|
221
222
|
}
|
|
222
223
|
`
|
|
223
224
|
},
|
package/dist/cjs/plugin/index.js
CHANGED
|
@@ -119,7 +119,7 @@ const rendererAdapter = (0, adapter_namespaceObject.defineRendererAdapter)({
|
|
|
119
119
|
create: {
|
|
120
120
|
templates: {
|
|
121
121
|
federation: true,
|
|
122
|
-
workers:
|
|
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.
|
|
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.
|
|
44
|
+
version: '0.2.4'
|
|
45
45
|
},
|
|
46
46
|
hydration: {
|
|
47
47
|
name: 'octane',
|
|
48
|
-
version: '0.
|
|
48
|
+
version: '0.13.8'
|
|
49
49
|
},
|
|
50
50
|
router: {
|
|
51
51
|
name: '@octanejs/tanstack-router',
|
|
52
|
-
version: '0.
|
|
52
|
+
version: '0.2.10',
|
|
53
53
|
coreName: '@tanstack/router-core',
|
|
54
|
-
coreVersion: '1.171.
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
'@octanejs/
|
|
64
|
+
'@tsrx/oxc': '0.20.0',
|
|
65
|
+
octane: 'https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-2383d2ab1e70/octane-0.13.8.tgz',
|
|
66
|
+
'@octanejs/tanstack-router': 'https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-2383d2ab1e70/octanejs-tanstack-router-0.2.10.tgz',
|
|
67
|
+
'@octanejs/rspack-plugin': 'https://github.com/BleedingDev/octane/releases/download/ultramodern-octane-2383d2ab1e70/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.
|
|
69
|
-
'seroval-plugins': '1.6.
|
|
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.
|
|
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,291 @@
|
|
|
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_routes_js_namespaceObject = require("./routes.js");
|
|
38
|
+
const external_worker_federation_contexts_js_namespaceObject = require("./worker-federation-contexts.js");
|
|
39
|
+
const OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE = Object.freeze({
|
|
40
|
+
key: 'ultramodern.file-routes',
|
|
41
|
+
version: '1'
|
|
42
|
+
});
|
|
43
|
+
const origins = new WeakMap();
|
|
44
|
+
let profileRegistered = false;
|
|
45
|
+
function plainRecord(value) {
|
|
46
|
+
return null !== value && 'object' == typeof value && [
|
|
47
|
+
Object.prototype,
|
|
48
|
+
null
|
|
49
|
+
].includes(Object.getPrototypeOf(value));
|
|
50
|
+
}
|
|
51
|
+
function record(value, fields) {
|
|
52
|
+
if (!plainRecord(value)) throw new TypeError('Worker router context requires a plain record');
|
|
53
|
+
for (const key of Reflect.ownKeys(value)){
|
|
54
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
55
|
+
if ('string' != typeof key || fields && !fields.includes(key) || !descriptor || !descriptor.enumerable || !('value' in descriptor)) throw new TypeError('Unknown Worker router context field or accessor');
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
function nonempty(value) {
|
|
60
|
+
if ('string' != typeof value || !value.trim() || value.length > 1024) throw new TypeError('Invalid Worker router identity');
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
function publicContext(value) {
|
|
64
|
+
const context = record(value, [
|
|
65
|
+
'ultramodern'
|
|
66
|
+
]);
|
|
67
|
+
const metadata = record(context.ultramodern, [
|
|
68
|
+
'rendererIdentity'
|
|
69
|
+
]);
|
|
70
|
+
const identity = record(metadata.rendererIdentity, [
|
|
71
|
+
'renderer',
|
|
72
|
+
'appId',
|
|
73
|
+
'entryName',
|
|
74
|
+
'protocolVersion',
|
|
75
|
+
'buildId'
|
|
76
|
+
]);
|
|
77
|
+
if ('octane' !== identity.renderer || 1 !== identity.protocolVersion) throw new TypeError('Unsupported Worker router identity');
|
|
78
|
+
return Object.freeze({
|
|
79
|
+
ultramodern: Object.freeze({
|
|
80
|
+
rendererIdentity: Object.freeze({
|
|
81
|
+
renderer: 'octane',
|
|
82
|
+
appId: nonempty(identity.appId),
|
|
83
|
+
entryName: nonempty(identity.entryName),
|
|
84
|
+
protocolVersion: 1,
|
|
85
|
+
buildId: nonempty(identity.buildId)
|
|
86
|
+
})
|
|
87
|
+
})
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function localizedUrls(value) {
|
|
91
|
+
if (void 0 === value || 'boolean' == typeof value) return value;
|
|
92
|
+
const input = record(value);
|
|
93
|
+
const result = {};
|
|
94
|
+
for (const [path, translations] of Object.entries(input)){
|
|
95
|
+
const names = {};
|
|
96
|
+
for (const [language, target] of Object.entries(record(translations)))names[nonempty(language)] = nonempty(target);
|
|
97
|
+
result[path] = names;
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
function rewriteDescriptor(value) {
|
|
102
|
+
if (void 0 === value) return;
|
|
103
|
+
const input = record(value, [
|
|
104
|
+
'language',
|
|
105
|
+
'languages',
|
|
106
|
+
'localisedUrls'
|
|
107
|
+
]);
|
|
108
|
+
if (!Array.isArray(input.languages) || !input.languages.length || input.languages.length > 64) throw new TypeError('Invalid Worker router i18n languages');
|
|
109
|
+
const languages = input.languages.map(nonempty);
|
|
110
|
+
const language = nonempty(input.language);
|
|
111
|
+
if (new Set(languages).size !== languages.length || !languages.includes(language)) throw new TypeError('Invalid Worker router i18n language');
|
|
112
|
+
const urls = localizedUrls(input.localisedUrls);
|
|
113
|
+
return {
|
|
114
|
+
language,
|
|
115
|
+
languages,
|
|
116
|
+
...void 0 === urls ? {} : {
|
|
117
|
+
localisedUrls: urls
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function nativeRewriteDescriptor(router) {
|
|
122
|
+
if (!router.options.rewrite) return;
|
|
123
|
+
const known = (0, external_worker_federation_contexts_js_namespaceObject.getOctaneWorkerRouterRewrite)()?.capture(router.options.rewrite);
|
|
124
|
+
if (!known) throw new TypeError('Custom router rewrite requires an exact Worker profile');
|
|
125
|
+
const descriptor = rewriteDescriptor(known);
|
|
126
|
+
if (!descriptor) throw new TypeError('Missing native router rewrite provenance');
|
|
127
|
+
return {
|
|
128
|
+
language: descriptor.language,
|
|
129
|
+
languages: [
|
|
130
|
+
...descriptor.languages
|
|
131
|
+
],
|
|
132
|
+
...void 0 === descriptor.localisedUrls ? {} : {
|
|
133
|
+
localisedUrls: descriptor.localisedUrls
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function validateDefaultSnapshot(snapshot) {
|
|
138
|
+
publicContext(snapshot.publicContext);
|
|
139
|
+
rewriteDescriptor(snapshot.i18n);
|
|
140
|
+
}
|
|
141
|
+
function assertFileRouteRenderHost(router, allowRewrite) {
|
|
142
|
+
if (router.options.parseSearch !== tanstack_router_namespaceObject.defaultParseSearch || router.options.stringifySearch !== tanstack_router_namespaceObject.defaultStringifySearch || !allowRewrite && router.options.rewrite || router.options.routeMasks?.length) throw new TypeError('Router render snapshot: authored router behavior requires an exact local profile');
|
|
143
|
+
const authoredRouting = [
|
|
144
|
+
'caseSensitive',
|
|
145
|
+
'validateSearch',
|
|
146
|
+
'loaderDeps',
|
|
147
|
+
'beforeLoad',
|
|
148
|
+
'context',
|
|
149
|
+
'onEnter',
|
|
150
|
+
'onStay',
|
|
151
|
+
'onLeave',
|
|
152
|
+
'lazyFn',
|
|
153
|
+
"scripts",
|
|
154
|
+
'headers',
|
|
155
|
+
'onError',
|
|
156
|
+
'parseParams',
|
|
157
|
+
'stringifyParams'
|
|
158
|
+
];
|
|
159
|
+
const seen = new Set();
|
|
160
|
+
const visit = (route, depth)=>{
|
|
161
|
+
if (seen.has(route) || seen.size >= 4096 || depth > 64) throw new TypeError('Router render snapshot: route geometry must be bounded and acyclic');
|
|
162
|
+
seen.add(route);
|
|
163
|
+
if (authoredRouting.some((key)=>void 0 !== Reflect.get(route.options, key)) || route.options.params?.parse || route.options.params?.stringify || route.options.search?.middlewares?.length || route.lazyFn || 'path' in route.options && 'id' in route.options || !(0, external_routes_js_namespaceObject.hasUnchangedOctaneFileRouteHead)(route)) throw new TypeError('Router render snapshot: authored route behavior requires an exact local profile');
|
|
164
|
+
for (const child of route.children ?? [])visit(child, depth + 1);
|
|
165
|
+
};
|
|
166
|
+
visit(router.options.routeTree, 0);
|
|
167
|
+
}
|
|
168
|
+
function ensureDefaultProfile() {
|
|
169
|
+
if (profileRegistered) return;
|
|
170
|
+
(0, tanstack_router_namespaceObject.registerRouterRenderProfile)({
|
|
171
|
+
id: OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE,
|
|
172
|
+
assertHost: (router, snapshot)=>{
|
|
173
|
+
const origin = origins.get(router);
|
|
174
|
+
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');
|
|
175
|
+
assertFileRouteRenderHost(router, void 0 !== snapshot.i18n);
|
|
176
|
+
validateDefaultSnapshot(snapshot);
|
|
177
|
+
if (JSON.stringify(nativeRewriteDescriptor(router)) !== JSON.stringify(snapshot.i18n)) throw new TypeError('Worker router rewrite differs from its native provenance');
|
|
178
|
+
},
|
|
179
|
+
createRoutingTree: (snapshot)=>{
|
|
180
|
+
validateDefaultSnapshot(snapshot);
|
|
181
|
+
return (0, tanstack_router_namespaceObject.createRouterRenderRouteTree)(snapshot.routes);
|
|
182
|
+
},
|
|
183
|
+
routingOptions: (snapshot)=>{
|
|
184
|
+
const defaults = {
|
|
185
|
+
parseSearch: tanstack_router_namespaceObject.defaultParseSearch,
|
|
186
|
+
stringifySearch: tanstack_router_namespaceObject.defaultStringifySearch
|
|
187
|
+
};
|
|
188
|
+
const i18n = rewriteDescriptor(snapshot.i18n);
|
|
189
|
+
if (!i18n) return defaults;
|
|
190
|
+
const codec = (0, external_worker_federation_contexts_js_namespaceObject.getOctaneWorkerRouterRewrite)();
|
|
191
|
+
if (!codec) throw new TypeError('Missing owning Worker router i18n codec');
|
|
192
|
+
return {
|
|
193
|
+
...defaults,
|
|
194
|
+
rewrite: codec.restore(i18n)
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
profileRegistered = true;
|
|
199
|
+
}
|
|
200
|
+
function associateOctaneFileRouteSnapshot(router) {
|
|
201
|
+
ensureDefaultProfile();
|
|
202
|
+
const context = publicContext(router.options.context);
|
|
203
|
+
origins.set(router, {
|
|
204
|
+
publicContext: context,
|
|
205
|
+
rewrite: router.options.rewrite
|
|
206
|
+
});
|
|
207
|
+
(0, tanstack_router_namespaceObject.associateRouterRenderProfile)(router, {
|
|
208
|
+
id: OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE,
|
|
209
|
+
publicContext: context
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
function captureOctaneRouterSnapshot(router) {
|
|
213
|
+
const origin = origins.get(router);
|
|
214
|
+
const declared = (0, tanstack_router_namespaceObject.getRouterRenderProfile)(router);
|
|
215
|
+
if (origin && declared?.key === OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE.key && declared.version === OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE.version) {
|
|
216
|
+
const i18n = nativeRewriteDescriptor(router);
|
|
217
|
+
(0, tanstack_router_namespaceObject.associateRouterRenderProfile)(router, {
|
|
218
|
+
id: OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE,
|
|
219
|
+
publicContext: origin.publicContext,
|
|
220
|
+
...void 0 === i18n ? {} : {
|
|
221
|
+
i18n
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
return (0, tanstack_router_namespaceObject.captureRouterRenderSnapshot)(router);
|
|
226
|
+
}
|
|
227
|
+
let registrations = 0;
|
|
228
|
+
let releaseContexts;
|
|
229
|
+
function registerOctaneRouterWorkerContexts() {
|
|
230
|
+
ensureDefaultProfile();
|
|
231
|
+
if (!releaseContexts) {
|
|
232
|
+
const releaseRouter = (0, external_worker_federation_contexts_js_namespaceObject.registerOctaneWorkerContext)(tanstack_router_namespaceObject.routerContext, {
|
|
233
|
+
key: external_worker_federation_contexts_js_namespaceObject.OCTANE_WORKER_CONTEXT_KEYS.router,
|
|
234
|
+
encode: (value)=>{
|
|
235
|
+
if (!value) throw new TypeError('Missing native router provider');
|
|
236
|
+
return captureOctaneRouterSnapshot(value);
|
|
237
|
+
},
|
|
238
|
+
decode: (value, signal)=>(0, tanstack_router_namespaceObject.restoreRouterRenderSnapshot)(value, {
|
|
239
|
+
signal
|
|
240
|
+
}),
|
|
241
|
+
dispose: (value)=>{
|
|
242
|
+
if (value) (0, tanstack_router_namespaceObject.disposeRouterRenderSnapshot)(value);
|
|
243
|
+
},
|
|
244
|
+
isProvided: (value)=>void 0 !== value
|
|
245
|
+
});
|
|
246
|
+
try {
|
|
247
|
+
const releaseMatch = (0, external_worker_federation_contexts_js_namespaceObject.registerOctaneWorkerContext)(tanstack_router_namespaceObject.matchContext, {
|
|
248
|
+
key: external_worker_federation_contexts_js_namespaceObject.OCTANE_WORKER_CONTEXT_KEYS.match,
|
|
249
|
+
encode: nonempty,
|
|
250
|
+
decode: nonempty,
|
|
251
|
+
validate: (value, readContext)=>{
|
|
252
|
+
const selected = readContext(tanstack_router_namespaceObject.routerContext);
|
|
253
|
+
const router = selected.present ? selected.value : void 0;
|
|
254
|
+
const current = router?.state.matches.find((match)=>match.routeId === value);
|
|
255
|
+
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');
|
|
256
|
+
},
|
|
257
|
+
isProvided: (value)=>void 0 !== value
|
|
258
|
+
});
|
|
259
|
+
releaseContexts = ()=>{
|
|
260
|
+
releaseMatch();
|
|
261
|
+
releaseRouter();
|
|
262
|
+
};
|
|
263
|
+
} catch (error) {
|
|
264
|
+
releaseRouter();
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
registrations++;
|
|
269
|
+
let released = false;
|
|
270
|
+
return ()=>{
|
|
271
|
+
if (released) return;
|
|
272
|
+
released = true;
|
|
273
|
+
if (0 === --registrations) {
|
|
274
|
+
releaseContexts?.();
|
|
275
|
+
releaseContexts = void 0;
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
exports.OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE = __webpack_exports__.OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE;
|
|
280
|
+
exports.associateOctaneFileRouteSnapshot = __webpack_exports__.associateOctaneFileRouteSnapshot;
|
|
281
|
+
exports.captureOctaneRouterSnapshot = __webpack_exports__.captureOctaneRouterSnapshot;
|
|
282
|
+
exports.registerOctaneRouterWorkerContexts = __webpack_exports__.registerOctaneRouterWorkerContexts;
|
|
283
|
+
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
284
|
+
"OCTANE_FILE_ROUTE_SNAPSHOT_PROFILE",
|
|
285
|
+
"associateOctaneFileRouteSnapshot",
|
|
286
|
+
"captureOctaneRouterSnapshot",
|
|
287
|
+
"registerOctaneRouterWorkerContexts"
|
|
288
|
+
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
289
|
+
Object.defineProperty(exports, '__esModule', {
|
|
290
|
+
value: true
|
|
291
|
+
});
|
|
@@ -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
|
|
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(
|
|
120
|
+
await withAbort(router.load({
|
|
121
|
+
_signal: session.signal
|
|
122
|
+
}), session.signal);
|
|
122
123
|
guard.assertActive();
|
|
123
|
-
const
|
|
124
|
-
if (redirect) {
|
|
125
|
-
const resolved =
|
|
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(
|
|
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
|
|
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
|
-
|
|
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', {
|
package/dist/cjs/router.js
CHANGED
|
@@ -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.
|
|
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'));
|