@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.
- 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/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 +263 -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 +11 -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 +216 -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 +11 -17
- 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/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/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 +159 -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/index.ts +4 -2
- package/src/plugin/profile.ts +14 -10
- package/src/router-client.ts +1 -1
- package/src/router-external-snapshot.ts +306 -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 +28 -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,
|
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-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.
|
|
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,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
|
|
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'));
|
package/dist/cjs/routes.js
CHANGED
|
@@ -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
|
|
54
|
-
|
|
55
|
-
|
|
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.
|
|
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);
|
package/dist/cjs/server.js
CHANGED
|
@@ -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("
|
|
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,
|
|
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,
|
|
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,
|
|
114
|
+
children: 'function' == typeof input.App ? (0, external_octane_server_namespaceObject.createElement)(input.App, input.props) : input.App
|
|
113
115
|
}) : input.App;
|
|
114
|
-
const
|
|
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;
|