@webqit/webflo 0.11.61 → 1.0.0
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/package.json +1 -1
- package/src/{Context.js → AbstractContext.js} +1 -9
- package/src/deployment-pi/origins/index.js +1 -1
- package/src/index.js +1 -9
- package/src/runtime-pi/HttpEvent.js +101 -81
- package/src/runtime-pi/HttpUser.js +126 -0
- package/src/runtime-pi/MessagingOverBroadcast.js +9 -0
- package/src/runtime-pi/MessagingOverChannel.js +85 -0
- package/src/runtime-pi/MessagingOverSocket.js +106 -0
- package/src/runtime-pi/MultiportMessagingAPI.js +81 -0
- package/src/runtime-pi/WebfloCookieStorage.js +27 -0
- package/src/runtime-pi/WebfloEventTarget.js +39 -0
- package/src/runtime-pi/WebfloMessageEvent.js +58 -0
- package/src/runtime-pi/WebfloMessagingAPI.js +69 -0
- package/src/runtime-pi/{Router.js → WebfloRouter.js} +3 -34
- package/src/runtime-pi/WebfloRuntime.js +52 -0
- package/src/runtime-pi/WebfloStorage.js +109 -0
- package/src/runtime-pi/client/ClientMessaging.js +5 -0
- package/src/runtime-pi/client/Context.js +2 -6
- package/src/runtime-pi/client/CookieStorage.js +17 -0
- package/src/runtime-pi/client/Router.js +3 -13
- package/src/runtime-pi/client/SessionStorage.js +33 -0
- package/src/runtime-pi/client/Url.js +24 -72
- package/src/runtime-pi/client/WebfloClient.js +544 -0
- package/src/runtime-pi/client/WebfloRootClient1.js +179 -0
- package/src/runtime-pi/client/WebfloRootClient2.js +109 -0
- package/src/runtime-pi/client/WebfloSubClient.js +165 -0
- package/src/runtime-pi/client/Workport.js +89 -161
- package/src/runtime-pi/client/generate.js +1 -1
- package/src/runtime-pi/client/index.js +13 -18
- package/src/runtime-pi/client/worker/ClientMessaging.js +5 -0
- package/src/runtime-pi/client/worker/Context.js +2 -6
- package/src/runtime-pi/client/worker/CookieStorage.js +17 -0
- package/src/runtime-pi/client/worker/SessionStorage.js +13 -0
- package/src/runtime-pi/client/worker/WebfloWorker.js +294 -0
- package/src/runtime-pi/client/worker/Workport.js +13 -73
- package/src/runtime-pi/client/worker/index.js +7 -18
- package/src/runtime-pi/index.js +1 -8
- package/src/runtime-pi/server/ClientMessaging.js +18 -0
- package/src/runtime-pi/server/ClientMessagingRegistry.js +57 -0
- package/src/runtime-pi/server/Context.js +2 -6
- package/src/runtime-pi/server/CookieStorage.js +17 -0
- package/src/runtime-pi/server/Router.js +2 -68
- package/src/runtime-pi/server/SessionStorage.js +53 -0
- package/src/runtime-pi/server/WebfloServer.js +755 -0
- package/src/runtime-pi/server/index.js +7 -18
- package/src/runtime-pi/util-http.js +268 -32
- package/src/runtime-pi/xURL.js +25 -22
- package/src/runtime-pi/xfetch.js +2 -2
- package/src/runtime-pi/Application.js +0 -29
- package/src/runtime-pi/Cookies.js +0 -82
- package/src/runtime-pi/Runtime.js +0 -21
- package/src/runtime-pi/client/Application.js +0 -76
- package/src/runtime-pi/client/Runtime.js +0 -525
- package/src/runtime-pi/client/createStorage.js +0 -58
- package/src/runtime-pi/client/worker/Application.js +0 -44
- package/src/runtime-pi/client/worker/Runtime.js +0 -275
- package/src/runtime-pi/server/Application.js +0 -101
- package/src/runtime-pi/server/Runtime.js +0 -558
- package/src/runtime-pi/xFormData.js +0 -24
- package/src/runtime-pi/xHeaders.js +0 -146
- package/src/runtime-pi/xRequest.js +0 -46
- package/src/runtime-pi/xRequestHeaders.js +0 -109
- package/src/runtime-pi/xResponse.js +0 -33
- package/src/runtime-pi/xResponseHeaders.js +0 -117
- package/src/runtime-pi/xxHttpMessage.js +0 -102
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* @imports
|
|
4
|
-
*/
|
|
5
|
-
import Observer from '@webqit/observer';
|
|
6
|
-
import { _any } from '@webqit/util/arr/index.js';
|
|
7
|
-
import { pattern } from '../../util-url.js';
|
|
8
|
-
import Workport from './Workport.js';
|
|
9
|
-
import _Runtime from '../../Runtime.js';
|
|
10
|
-
import xRequest from "../../xRequest.js";
|
|
11
|
-
import xResponse from "../../xResponse.js";
|
|
12
|
-
import xfetch from '../../xfetch.js';
|
|
13
|
-
import HttpEvent from '../../HttpEvent.js';
|
|
14
|
-
|
|
15
|
-
export {
|
|
16
|
-
HttpEvent,
|
|
17
|
-
Observer,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* ---------------------------
|
|
22
|
-
* The Runtime Initializer
|
|
23
|
-
* ---------------------------
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
export default class Runtime extends _Runtime {
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Runtime
|
|
30
|
-
*
|
|
31
|
-
* @param Object cx
|
|
32
|
-
* @param Function applicationInstance
|
|
33
|
-
*
|
|
34
|
-
* @return void
|
|
35
|
-
*/
|
|
36
|
-
constructor(cx, applicationInstance) {
|
|
37
|
-
super(cx, applicationInstance);
|
|
38
|
-
// ---------------
|
|
39
|
-
this.mockSessionStore = {};
|
|
40
|
-
// --------------
|
|
41
|
-
// ONINSTALL
|
|
42
|
-
self.addEventListener('install', evt => {
|
|
43
|
-
if (this.cx.params.skip_waiting) { self.skipWaiting(); }
|
|
44
|
-
// Manage CACHE
|
|
45
|
-
if (this.cx.params.cache_name && (this.cx.params.cache_only_urls || []).length) {
|
|
46
|
-
// Add files to cache
|
|
47
|
-
evt.waitUntil( self.caches.open(this.cx.params.cache_name).then(async cache => {
|
|
48
|
-
if (this.cx.logger) { this.cx.logger.log('[ServiceWorker] Pre-caching resources.'); }
|
|
49
|
-
for (const urls of [ 'cache_first_urls', 'cache_only_urls' ]) {
|
|
50
|
-
const _urls = (this.cx.params[urls] || []).map(c => c.trim()).filter(c => c && !pattern(c, self.origin).isPattern());
|
|
51
|
-
await cache.addAll(_urls);
|
|
52
|
-
}
|
|
53
|
-
}) );
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
// -------------
|
|
58
|
-
// ONACTIVATE
|
|
59
|
-
self.addEventListener('activate', evt => {
|
|
60
|
-
evt.waitUntil( new Promise(async resolve => {
|
|
61
|
-
if (this.cx.params.skip_waiting) { await self.clients.claim(); }
|
|
62
|
-
// Manage CACHE
|
|
63
|
-
if (this.cx.params.cache_name) {
|
|
64
|
-
// Clear outdated CACHES
|
|
65
|
-
await self.caches.keys().then(keyList => {
|
|
66
|
-
return Promise.all(keyList.map(key => {
|
|
67
|
-
if (key !== this.cx.params.cache_name && key !== this.cx.params.cache_name + '_json') {
|
|
68
|
-
if (this.cx.logger) { this.cx.logger.log('[ServiceWorker] Removing old cache:', key); }
|
|
69
|
-
return self.caches.delete(key);
|
|
70
|
-
}
|
|
71
|
-
}));
|
|
72
|
-
})
|
|
73
|
-
}
|
|
74
|
-
resolve();
|
|
75
|
-
}) );
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
// ---------------
|
|
79
|
-
Observer.set(this, 'location', {});
|
|
80
|
-
Observer.set(this, 'network', {});
|
|
81
|
-
|
|
82
|
-
// -------------
|
|
83
|
-
// ONFETCH
|
|
84
|
-
self.addEventListener('fetch', event => {
|
|
85
|
-
// URL schemes that might arrive here but not supported; e.g.: chrome-extension://
|
|
86
|
-
if (!event.request.url.startsWith('http')) return;
|
|
87
|
-
event.respondWith((async evt => {
|
|
88
|
-
let requestingClient = await self.clients.get(evt.clientId);
|
|
89
|
-
this.workport.setCurrentClient(requestingClient);
|
|
90
|
-
const [ url, requestInit ] = await xRequest.rip(evt.request);
|
|
91
|
-
// Now, the following is key:
|
|
92
|
-
// The browser likes to use "force-cache" for "navigate" requests, when, e.g: re-entering your site with the back button
|
|
93
|
-
// Problem here, force-cache forces out JSON not HTML as per webflo's design.
|
|
94
|
-
// So, we detect this scenerio and avoid it.
|
|
95
|
-
if (requestInit.cache === 'force-cache'/* && evt.request.mode === 'navigate' - even webflo client init call also comes with that... needs investigation */) {
|
|
96
|
-
requestInit.cache = 'default';
|
|
97
|
-
}
|
|
98
|
-
return this.go(url, requestInit, { event: evt });
|
|
99
|
-
})(event));
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// -------------
|
|
103
|
-
// Workport
|
|
104
|
-
const workport = new Workport();
|
|
105
|
-
Observer.set(this, 'workport', workport);
|
|
106
|
-
|
|
107
|
-
// -------------
|
|
108
|
-
// Initialize
|
|
109
|
-
(async () => {
|
|
110
|
-
if (!this.app.init) return;
|
|
111
|
-
const request = this.generateRequest('/');
|
|
112
|
-
const httpEvent = new HttpEvent(request, { navigationType: 'init' }, (id = null, persistent = false) => this.getSession(httpEvent, id, persistent));
|
|
113
|
-
await this.app.init(httpEvent, ( ...args ) => this.remoteFetch( ...args ));
|
|
114
|
-
})();
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Performs a request.
|
|
120
|
-
*
|
|
121
|
-
* @param object|string url
|
|
122
|
-
* @param object|Request init
|
|
123
|
-
* @param object detail
|
|
124
|
-
*
|
|
125
|
-
* @return Response
|
|
126
|
-
*/
|
|
127
|
-
async go(url, init = {}, detail = {}) {
|
|
128
|
-
// ------------
|
|
129
|
-
url = typeof url === 'string' ? new URL(url, self.location.origin) : url;
|
|
130
|
-
if (!(init instanceof Request) && !init.referrer) {
|
|
131
|
-
init = { referrer: this.location.href, ...init };
|
|
132
|
-
}
|
|
133
|
-
// ------------
|
|
134
|
-
// The request object
|
|
135
|
-
const request = this.generateRequest(url.href, init);
|
|
136
|
-
if (detail.event) { Object.defineProperty(detail.event, 'request', { value: request }); }
|
|
137
|
-
// The navigation event
|
|
138
|
-
const httpEvent = new HttpEvent(request, detail, (id = null, persistent = false) => this.getSession(httpEvent, id, persistent));
|
|
139
|
-
httpEvent.port.listen(message => {
|
|
140
|
-
if (message.$type === 'handler:hints' && message.session) {
|
|
141
|
-
// TODO: Sync session data from client
|
|
142
|
-
return Promise.resolve();
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
// Response
|
|
146
|
-
let response;
|
|
147
|
-
if (httpEvent.request.url.startsWith(self.origin)/* && httpEvent.request.mode === 'navigate'*/) {
|
|
148
|
-
response = await this.app.handle(httpEvent, ( ...args ) => this.remoteFetch( ...args ));
|
|
149
|
-
} else {
|
|
150
|
-
response = await this.remoteFetch(httpEvent.request);
|
|
151
|
-
}
|
|
152
|
-
const finalResponse = await this.handleResponse(httpEvent, response);
|
|
153
|
-
// Return value
|
|
154
|
-
return finalResponse;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Generates request object
|
|
158
|
-
generateRequest(href, init = {}) {
|
|
159
|
-
const request = new xRequest(href, init);
|
|
160
|
-
return request;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Generates session object
|
|
164
|
-
getSession(e, id = null, persistent = false) {
|
|
165
|
-
return {
|
|
166
|
-
get: () => this.mockSessionStore,
|
|
167
|
-
set: value => { this.mockSessionStore = value },
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Initiates remote fetch and sets the status
|
|
172
|
-
remoteFetch(request, ...args) {
|
|
173
|
-
if (arguments.length > 1) {
|
|
174
|
-
request = this.generateRequest(request, ...args);
|
|
175
|
-
}
|
|
176
|
-
const matchUrl = (patterns, url) => _any((patterns || []).map(p => p.trim()).filter(p => p), p => pattern(p, self.origin).test(url));
|
|
177
|
-
const execFetch = () => {
|
|
178
|
-
// cache_only_urls
|
|
179
|
-
if (matchUrl(this.cx.params.cache_only_urls, request.url)) {
|
|
180
|
-
Observer.set(this.network, 'strategy', 'cache-only');
|
|
181
|
-
return this.cacheFetch(request, { networkFallback: false, cacheRefresh: false });
|
|
182
|
-
}
|
|
183
|
-
// network_only_urls
|
|
184
|
-
if (matchUrl(this.cx.params.network_only_urls, request.url)) {
|
|
185
|
-
Observer.set(this.network, 'strategy', 'network-only');
|
|
186
|
-
return this.networkFetch(request, { cacheFallback: false, cacheRefresh: false });
|
|
187
|
-
}
|
|
188
|
-
// cache_first_urls
|
|
189
|
-
if (matchUrl(this.cx.params.cache_first_urls, request.url)) {
|
|
190
|
-
Observer.set(this.network, 'strategy', 'cache-first');
|
|
191
|
-
return this.cacheFetch(request, { networkFallback: true, cacheRefresh: true });
|
|
192
|
-
}
|
|
193
|
-
// network_first_urls
|
|
194
|
-
if (matchUrl(this.cx.params.network_first_urls, request.url) || !this.cx.params.default_fetching_strategy) {
|
|
195
|
-
Observer.set(this.network, 'strategy', 'network-first');
|
|
196
|
-
return this.networkFetch(request, { cacheFallback: true, cacheRefresh: true });
|
|
197
|
-
}
|
|
198
|
-
// Default strategy
|
|
199
|
-
Observer.set(this.network, 'strategy', this.cx.params.default_fetching_strategy);
|
|
200
|
-
switch (this.cx.params.default_fetching_strategy) {
|
|
201
|
-
case 'cache-only': return this.cacheFetch(request, { networkFallback: false, cacheRefresh: false });
|
|
202
|
-
case 'network-only': return this.networkFetch(request, { cacheFallback: false, cacheRefresh: false });
|
|
203
|
-
case 'cache-first': return this.cacheFetch(request, { networkFallback: true, cacheRefresh: true });
|
|
204
|
-
case 'network-first': return this.networkFetch(request, { cacheFallback: true, cacheRefresh: true });
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
let response = execFetch(request);
|
|
208
|
-
// This catch() is NOT intended to handle failure of the fetch
|
|
209
|
-
response.catch(e => Observer.set(this.network, 'error', e.message));
|
|
210
|
-
// Return xResponse
|
|
211
|
-
return response.then(_response => xResponse.compat(_response));
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Caching strategy: network_first
|
|
215
|
-
networkFetch(request, params = {}) {
|
|
216
|
-
if (!params.cacheFallback) {
|
|
217
|
-
Observer.set(this.network, 'remote', true);
|
|
218
|
-
return xfetch(request);
|
|
219
|
-
}
|
|
220
|
-
return xfetch(request).then(response => {
|
|
221
|
-
if (params.cacheRefresh) this.refreshCache(request, response);
|
|
222
|
-
Observer.set(this.network, 'remote', true);
|
|
223
|
-
return response;
|
|
224
|
-
}).catch(() => this.getRequestCache(request).then(cache => {
|
|
225
|
-
Observer.set(this.network, 'cache', true);
|
|
226
|
-
return cache.match(request);
|
|
227
|
-
}));
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Caching strategy: cache_first
|
|
231
|
-
cacheFetch(request, params = {}) {
|
|
232
|
-
return this.getRequestCache(request).then(cache => cache.match(request).then(response => {
|
|
233
|
-
// Nothing cache, use network
|
|
234
|
-
if (!response && params.networkFallback) return this.networkFetch(request, { ...params, cacheFallback: false });
|
|
235
|
-
// Note: fetch, but for refreshing purposes only... not the returned response
|
|
236
|
-
if (response && params.cacheRefresh) this.networkFetch(request, { ...params, justRefreshing: true });
|
|
237
|
-
Observer.set(this.network, 'cache', true);
|
|
238
|
-
return response;
|
|
239
|
-
}));
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Caches response
|
|
243
|
-
refreshCache(request, response) {
|
|
244
|
-
// Check if we received a valid response
|
|
245
|
-
if (request.method !== 'GET' || !response || response.status !== 200 || (response.type !== 'basic' && response.type !== 'cors')) {
|
|
246
|
-
return response;
|
|
247
|
-
}
|
|
248
|
-
// IMPORTANT: Clone the response. A response is a stream
|
|
249
|
-
// and because we want the browser to consume the response
|
|
250
|
-
// as well as the cache consuming the response, we need
|
|
251
|
-
// to clone it so we have two streams.
|
|
252
|
-
var responseToCache = response.clone();
|
|
253
|
-
this.getRequestCache(request).then(cache => {
|
|
254
|
-
Observer.set(this.network, 'cacheRefresh', true);
|
|
255
|
-
cache.put(request, responseToCache);
|
|
256
|
-
});
|
|
257
|
-
return response;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// Returns either the regular cache or a json-specific cache
|
|
261
|
-
getRequestCache(request) {
|
|
262
|
-
let cacheName = request.headers.get('Accept') === 'application/json'
|
|
263
|
-
? this.cx.params.cache_name + '_json'
|
|
264
|
-
: this.cx.params.cache_name;
|
|
265
|
-
return self.caches.open(cacheName);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Handles response object
|
|
269
|
-
handleResponse(e, response) {
|
|
270
|
-
if (!response && response !== 0) { response = new xResponse(null, { status: 404 }); }
|
|
271
|
-
else if (!(response instanceof xResponse)) { response = xResponse.compat(response); }
|
|
272
|
-
return response;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* imports
|
|
4
|
-
*/
|
|
5
|
-
import Fs from 'fs';
|
|
6
|
-
import Url from 'url';
|
|
7
|
-
import Path from 'path';
|
|
8
|
-
import QueryString from 'querystring';
|
|
9
|
-
import Router from './Router.js';
|
|
10
|
-
import _Application from '../Application.js';
|
|
11
|
-
|
|
12
|
-
export default class Application extends _Application {
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Application
|
|
16
|
-
*
|
|
17
|
-
* @param Context cx
|
|
18
|
-
*/
|
|
19
|
-
constructor(cx) {
|
|
20
|
-
super(cx);
|
|
21
|
-
this.renderFileCache = {};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Returns router class
|
|
25
|
-
get Router() {
|
|
26
|
-
return Router;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Handles navigation events.
|
|
31
|
-
*
|
|
32
|
-
* @param NavigationEvent httpEvent
|
|
33
|
-
* @param Function remoteFetch
|
|
34
|
-
*
|
|
35
|
-
* @return Response
|
|
36
|
-
*/
|
|
37
|
-
async handle(httpEvent, remoteFetch) {
|
|
38
|
-
// The app router
|
|
39
|
-
const router = new this.Router(this.cx, httpEvent.url.pathname);
|
|
40
|
-
const handle = async () => {
|
|
41
|
-
return await router.route([httpEvent.request.method, 'default'], httpEvent, {}, async event => {
|
|
42
|
-
return router.file(event);
|
|
43
|
-
}, remoteFetch);
|
|
44
|
-
};
|
|
45
|
-
return (this.cx.middlewares || []).concat(handle).reverse().reduce((next, fn) => {
|
|
46
|
-
return () => fn.call(this.cx, httpEvent, router, next);
|
|
47
|
-
}, null)();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Renderer
|
|
51
|
-
async render(httpEvent, response) {
|
|
52
|
-
let data = await response.jsonfy();
|
|
53
|
-
const router = new this.Router(this.cx, httpEvent.url.pathname);
|
|
54
|
-
return router.route('render', httpEvent, data, async (httpEvent, data) => {
|
|
55
|
-
let renderFile, pathnameSplit = httpEvent.url.pathname.split('/');
|
|
56
|
-
while ((renderFile = Path.join(this.cx.CWD, this.cx.layout.PUBLIC_DIR, './' + pathnameSplit.join('/'), 'index.html'))
|
|
57
|
-
&& (this.renderFileCache[renderFile] === false/* false on previous runs */ || !Fs.existsSync(renderFile))) {
|
|
58
|
-
this.renderFileCache[renderFile] = false;
|
|
59
|
-
pathnameSplit.pop();
|
|
60
|
-
}
|
|
61
|
-
const dirPublic = Url.pathToFileURL( Path.resolve( Path.join(this.cx.CWD, this.cx.layout.PUBLIC_DIR) ) );
|
|
62
|
-
const instanceParams = QueryString.stringify({
|
|
63
|
-
file: renderFile,
|
|
64
|
-
url: dirPublic.href,// httpEvent.url.href,
|
|
65
|
-
root: this.cx.CWD,
|
|
66
|
-
});
|
|
67
|
-
const { window, document } = await import('@webqit/oohtml-ssr/src/instance.js?' + instanceParams);
|
|
68
|
-
await new Promise(res => {
|
|
69
|
-
if (document.readyState === 'complete') return res();
|
|
70
|
-
document.addEventListener('load', res);
|
|
71
|
-
});
|
|
72
|
-
if (window.webqit?.oohtml?.configs) {
|
|
73
|
-
const {
|
|
74
|
-
CONTEXT_API: { attr: contextConfig } = {},
|
|
75
|
-
BINDINGS_API: { api: bindingsConfig } = {},
|
|
76
|
-
HTML_IMPORTS: { attr: modulesContextAttrs } = {},
|
|
77
|
-
} = window.webqit.oohtml.configs;
|
|
78
|
-
if ( bindingsConfig ) {
|
|
79
|
-
document[ bindingsConfig.bind ]({
|
|
80
|
-
env: 'server',
|
|
81
|
-
state: this.cx.runtime,
|
|
82
|
-
...data
|
|
83
|
-
}, { diff: true });
|
|
84
|
-
}
|
|
85
|
-
if ( modulesContextAttrs ) {
|
|
86
|
-
const routingContext = document.body.querySelector(`[${ window.CSS.escape( contextConfig.contextname ) }="route"]`) || document.body;
|
|
87
|
-
routingContext.setAttribute( modulesContextAttrs.importscontext, '/' + `routes/${ httpEvent.url.pathname }`.split('/').map(a => a.trim()).filter(a => a).join('/'));
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
if (window.webqit.$qCompilerImport) {
|
|
91
|
-
await new Promise(res => {
|
|
92
|
-
window.webqit.$qCompilerImport.then(res);
|
|
93
|
-
setTimeout(res, 300);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
await new Promise(res => setTimeout(res, 50));
|
|
97
|
-
return window;
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
}
|