@atlaspack/runtime-js 2.12.1-dev.3566 → 2.13.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/CHANGELOG.md +16 -0
- package/lib/JSRuntime.js +48 -17
- package/lib/helpers/browser/analytics/analytics.js +11 -0
- package/lib/helpers/browser/css-loader.js +3 -3
- package/lib/helpers/browser/esm-js-loader-retry.js +66 -45
- package/lib/helpers/browser/esm-js-loader-shards.js +7 -0
- package/lib/helpers/browser/html-loader.js +1 -1
- package/lib/helpers/browser/import-polyfill.js +7 -7
- package/lib/helpers/browser/js-loader.js +4 -4
- package/lib/helpers/browser/prefetch-loader.js +1 -1
- package/lib/helpers/browser/preload-loader.js +1 -1
- package/lib/helpers/browser/wasm-loader.js +1 -1
- package/lib/helpers/bundle-manifest.js +2 -1
- package/lib/helpers/bundle-url.js +36 -18
- package/lib/helpers/cacheLoader.js +4 -4
- package/lib/helpers/conditional-loader-dev.js +1 -1
- package/lib/helpers/get-worker-url.js +1 -1
- package/lib/helpers/node/html-loader.js +2 -2
- package/lib/helpers/node/js-loader.js +2 -2
- package/lib/helpers/node/wasm-loader.js +2 -2
- package/lib/helpers/worker/js-loader.js +1 -1
- package/lib/helpers/worker/wasm-loader.js +1 -1
- package/package.json +8 -8
- package/src/JSRuntime.js +98 -26
- package/src/helpers/browser/analytics/analytics.d.ts +6 -0
- package/src/helpers/browser/analytics/analytics.js +6 -0
- package/src/helpers/browser/analytics/analytics.js.flow +8 -0
- package/src/helpers/browser/esm-js-loader-retry.js +61 -14
- package/src/helpers/browser/esm-js-loader-shards.js +11 -0
- package/src/helpers/bundle-manifest.js +4 -1
- package/src/helpers/bundle-url.js +37 -27
- package/test/analytics.test.ts +47 -0
- package/test/bundle-url.test.js +62 -0
- package/test/esm-js-loader-retry.test.ts +65 -0
- package/LICENSE +0 -201
- package/src/helpers/.babelrc +0 -12
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# @atlaspack/runtime-js
|
|
2
|
+
|
|
3
|
+
## 2.13.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#335](https://github.com/atlassian-labs/atlaspack/pull/335) [`b4dbd4d`](https://github.com/atlassian-labs/atlaspack/commit/b4dbd4d5b23d1b7aa3fcdf59cc7bc8bedd3a59cf) Thanks [@yamadapc](https://github.com/yamadapc)! - Initial changeset release
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [[`b4dbd4d`](https://github.com/atlassian-labs/atlaspack/commit/b4dbd4d5b23d1b7aa3fcdf59cc7bc8bedd3a59cf)]:
|
|
12
|
+
- @atlaspack/domain-sharding@2.13.0
|
|
13
|
+
- @atlaspack/diagnostic@2.13.0
|
|
14
|
+
- @atlaspack/feature-flags@2.13.0
|
|
15
|
+
- @atlaspack/plugin@2.13.0
|
|
16
|
+
- @atlaspack/utils@2.13.0
|
package/lib/JSRuntime.js
CHANGED
|
@@ -93,6 +93,16 @@ const CONFIG_SCHEMA = {
|
|
|
93
93
|
properties: {
|
|
94
94
|
splitManifestThreshold: {
|
|
95
95
|
type: 'number'
|
|
96
|
+
},
|
|
97
|
+
domainSharding: {
|
|
98
|
+
type: 'object',
|
|
99
|
+
properties: {
|
|
100
|
+
maxShards: {
|
|
101
|
+
type: 'number'
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
additionalProperties: false,
|
|
105
|
+
required: ['maxShards']
|
|
96
106
|
}
|
|
97
107
|
},
|
|
98
108
|
additionalProperties: false
|
|
@@ -181,7 +191,8 @@ var _default = exports.default = new (_plugin().Runtime)({
|
|
|
181
191
|
dependency,
|
|
182
192
|
bundleGraph,
|
|
183
193
|
bundleGroup: resolved.value,
|
|
184
|
-
options
|
|
194
|
+
options,
|
|
195
|
+
shardingConfig: config.domainSharding
|
|
185
196
|
});
|
|
186
197
|
if (loaderRuntime != null) {
|
|
187
198
|
assets.push(loaderRuntime);
|
|
@@ -257,7 +268,7 @@ var _default = exports.default = new (_plugin().Runtime)({
|
|
|
257
268
|
}
|
|
258
269
|
|
|
259
270
|
// URL dependency or not, fall back to including a runtime that exports the url
|
|
260
|
-
assets.push(getURLRuntime(dependency, bundle, mainBundle, options));
|
|
271
|
+
assets.push(getURLRuntime(dependency, bundle, mainBundle, options, config.domainSharding));
|
|
261
272
|
}
|
|
262
273
|
|
|
263
274
|
// In development, bundles can be created lazily. This means that the parent bundle may not
|
|
@@ -275,7 +286,7 @@ var _default = exports.default = new (_plugin().Runtime)({
|
|
|
275
286
|
continue;
|
|
276
287
|
}
|
|
277
288
|
let relativePathExpr = getRelativePathExpr(bundle, referencedBundle, options);
|
|
278
|
-
let loaderCode = `require(${JSON.stringify(loader)})(
|
|
289
|
+
let loaderCode = `require(${JSON.stringify(loader)})(${getAbsoluteUrlExpr(relativePathExpr, bundle, config.domainSharding)})`;
|
|
279
290
|
assets.push({
|
|
280
291
|
filePath: __filename,
|
|
281
292
|
code: loaderCode,
|
|
@@ -338,7 +349,8 @@ function getLoaderRuntime({
|
|
|
338
349
|
dependency,
|
|
339
350
|
bundleGroup,
|
|
340
351
|
bundleGraph,
|
|
341
|
-
options
|
|
352
|
+
options,
|
|
353
|
+
shardingConfig
|
|
342
354
|
}) {
|
|
343
355
|
let loaders = getLoaders(bundle.env);
|
|
344
356
|
if (loaders == null) {
|
|
@@ -372,7 +384,7 @@ function getLoaderRuntime({
|
|
|
372
384
|
let needsDynamicImportPolyfill = !bundle.env.isLibrary && !bundle.env.supports('dynamic-import', true);
|
|
373
385
|
let needsEsmLoadPrelude = false;
|
|
374
386
|
let loaderModules = [];
|
|
375
|
-
function getLoaderForBundle(bundle, to) {
|
|
387
|
+
function getLoaderForBundle(bundle, to, shardingConfig) {
|
|
376
388
|
let loader = loaders[to.type];
|
|
377
389
|
if (!loader) {
|
|
378
390
|
return;
|
|
@@ -392,7 +404,16 @@ function getLoaderRuntime({
|
|
|
392
404
|
} else if (to.type === 'js' && to.env.outputFormat === 'commonjs') {
|
|
393
405
|
return `Promise.resolve(__parcel__require__("./" + ${relativePathExpr}))`;
|
|
394
406
|
}
|
|
395
|
-
let absoluteUrlExpr
|
|
407
|
+
let absoluteUrlExpr;
|
|
408
|
+
if (shouldUseRuntimeManifest(bundle, options)) {
|
|
409
|
+
let publicId = JSON.stringify(to.publicId);
|
|
410
|
+
absoluteUrlExpr = `require('./helpers/bundle-manifest').resolve(${publicId})`;
|
|
411
|
+
if (shardingConfig) {
|
|
412
|
+
absoluteUrlExpr = `require('@atlaspack/domain-sharding').shardUrl(${absoluteUrlExpr}, ${shardingConfig.maxShards})`;
|
|
413
|
+
}
|
|
414
|
+
} else {
|
|
415
|
+
absoluteUrlExpr = getAbsoluteUrlExpr(relativePathExpr, bundle, shardingConfig);
|
|
416
|
+
}
|
|
396
417
|
let code = `require(${JSON.stringify(loader)})(${absoluteUrlExpr})`;
|
|
397
418
|
|
|
398
419
|
// In development, clear the require cache when an error occurs so the
|
|
@@ -406,13 +427,16 @@ function getLoaderRuntime({
|
|
|
406
427
|
let conditionalDependencies = externalBundles.flatMap(to => getDependencies(to).conditionalDependencies);
|
|
407
428
|
for (const cond of bundleGraph.getConditionsForDependencies(conditionalDependencies, bundle)) {
|
|
408
429
|
// This bundle has a conditional dependency, we need to load the bundle group
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
430
|
+
const ifTrueLoaders = cond.ifTrueBundles.map(targetBundle => getLoaderForBundle(bundle, targetBundle));
|
|
431
|
+
const ifFalseLoaders = cond.ifFalseBundles.map(targetBundle => getLoaderForBundle(bundle, targetBundle));
|
|
432
|
+
if (ifTrueLoaders.length > 0 || ifFalseLoaders.length > 0) {
|
|
433
|
+
// Load conditional bundles with helper (and a dev mode with additional hints)
|
|
434
|
+
loaderModules.push(`require('./helpers/conditional-loader${options.mode === 'development' ? '-dev' : ''}')('${cond.key}', function (){return Promise.all([${ifTrueLoaders.join(',')}]);}, function (){return Promise.all([${ifFalseLoaders.join(',')}]);})`);
|
|
435
|
+
}
|
|
412
436
|
}
|
|
413
437
|
}
|
|
414
438
|
for (let to of externalBundles) {
|
|
415
|
-
let loaderModule = getLoaderForBundle(bundle, to);
|
|
439
|
+
let loaderModule = getLoaderForBundle(bundle, to, shardingConfig);
|
|
416
440
|
if (loaderModule !== undefined) loaderModules.push(loaderModule);
|
|
417
441
|
}
|
|
418
442
|
|
|
@@ -462,7 +486,8 @@ function getLoaderRuntime({
|
|
|
462
486
|
}
|
|
463
487
|
let code = [];
|
|
464
488
|
if (needsEsmLoadPrelude) {
|
|
465
|
-
|
|
489
|
+
let preludeLoad = shardingConfig ? `let load = require('./helpers/browser/esm-js-loader-shards')(${shardingConfig.maxShards});` : `let load = require('./helpers/browser/esm-js-loader');`;
|
|
490
|
+
code.push(preludeLoad);
|
|
466
491
|
}
|
|
467
492
|
code.push(`module.exports = ${loaderCode};`);
|
|
468
493
|
return {
|
|
@@ -520,7 +545,7 @@ function isNewContext(bundle, bundleGraph) {
|
|
|
520
545
|
let isInEntryBundleGroup = bundleGraph.getBundleGroupsContainingBundle(bundle).some(g => bundleGraph.isEntryBundleGroup(g));
|
|
521
546
|
return isInEntryBundleGroup || parents.length === 0 || parents.some(parent => parent.env.context !== bundle.env.context || parent.type !== 'js');
|
|
522
547
|
}
|
|
523
|
-
function getURLRuntime(dependency, from, to, options) {
|
|
548
|
+
function getURLRuntime(dependency, from, to, options, shardingConfig) {
|
|
524
549
|
let relativePathExpr = getRelativePathExpr(from, to, options);
|
|
525
550
|
let code;
|
|
526
551
|
if (dependency.meta.webworker === true && !from.env.isLibrary) {
|
|
@@ -531,10 +556,13 @@ function getURLRuntime(dependency, from, to, options) {
|
|
|
531
556
|
} else {
|
|
532
557
|
code += `let bundleURL = require('./helpers/bundle-url');\n`;
|
|
533
558
|
code += `let url = bundleURL.getBundleURL('${from.publicId}') + ${relativePathExpr};`;
|
|
559
|
+
if (shardingConfig) {
|
|
560
|
+
code += `url = require('@atlaspack/domain-sharding').shardUrl(url, ${shardingConfig.maxShards});`;
|
|
561
|
+
}
|
|
534
562
|
code += `module.exports = workerURL(url, bundleURL.getOrigin(url), ${String(from.env.outputFormat === 'esmodule')});`;
|
|
535
563
|
}
|
|
536
564
|
} else {
|
|
537
|
-
code = `module.exports = ${getAbsoluteUrlExpr(relativePathExpr, from)};`;
|
|
565
|
+
code = `module.exports = ${getAbsoluteUrlExpr(relativePathExpr, from, shardingConfig)};`;
|
|
538
566
|
}
|
|
539
567
|
return {
|
|
540
568
|
filePath: __filename,
|
|
@@ -582,13 +610,16 @@ function getRelativePathExpr(from, to, options) {
|
|
|
582
610
|
}
|
|
583
611
|
return res;
|
|
584
612
|
}
|
|
585
|
-
function getAbsoluteUrlExpr(relativePathExpr,
|
|
586
|
-
if (
|
|
613
|
+
function getAbsoluteUrlExpr(relativePathExpr, fromBundle, shardingConfig) {
|
|
614
|
+
if (fromBundle.env.outputFormat === 'esmodule' && fromBundle.env.supports('import-meta-url') || fromBundle.env.outputFormat === 'commonjs') {
|
|
587
615
|
// This will be compiled to new URL(url, import.meta.url) or new URL(url, 'file:' + __filename).
|
|
588
616
|
return `new __parcel__URL__(${relativePathExpr}).toString()`;
|
|
589
|
-
} else {
|
|
590
|
-
return `require('./helpers/bundle-url').getBundleURL('${bundle.publicId}') + ${relativePathExpr}`;
|
|
591
617
|
}
|
|
618
|
+
const regularBundleUrl = `require('./helpers/bundle-url').getBundleURL('${fromBundle.publicId}') + ${relativePathExpr}`;
|
|
619
|
+
if (!shardingConfig) {
|
|
620
|
+
return regularBundleUrl;
|
|
621
|
+
}
|
|
622
|
+
return `require('@atlaspack/domain-sharding').shardUrl(${regularBundleUrl}, ${shardingConfig.maxShards})`;
|
|
592
623
|
}
|
|
593
624
|
function shouldUseRuntimeManifest(bundle, options) {
|
|
594
625
|
let env = bundle.env;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const cacheLoader = require('../cacheLoader');
|
|
4
4
|
module.exports = cacheLoader(function (bundle) {
|
|
5
5
|
return new Promise(function (resolve, reject) {
|
|
6
6
|
// Don't insert the same link element twice (e.g. if it was already in the HTML)
|
|
7
|
-
|
|
8
|
-
if ([].concat(existingLinks).some(function
|
|
7
|
+
let existingLinks = document.getElementsByTagName('link');
|
|
8
|
+
if ([].concat(existingLinks).some(function (link) {
|
|
9
9
|
return link.href === bundle && link.rel.indexOf('stylesheet') > -1;
|
|
10
10
|
})) {
|
|
11
11
|
resolve();
|
|
@@ -1,51 +1,72 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
3
|
+
async function load(id) {
|
|
4
|
+
// Global state maps the initial url to the completed task.
|
|
5
|
+
// This ensures the same URL is used in subsequent imports
|
|
6
|
+
if (!parcelRequire._retryState) parcelRequire._retryState = {};
|
|
7
|
+
/** @type {Record<string, Promise<void>>} */
|
|
8
|
+
const retryState = parcelRequire._retryState;
|
|
9
|
+
|
|
10
|
+
// The number of retries before rethrowing the error
|
|
11
|
+
const maxRetries = 6;
|
|
12
|
+
|
|
13
|
+
// Resolve the request URL from the bundle ID
|
|
14
|
+
const url = require('../bundle-manifest').resolve(id);
|
|
15
|
+
|
|
16
|
+
// Wait for the user to go online before making a request
|
|
17
|
+
if (!globalThis.navigator.onLine) {
|
|
18
|
+
await new Promise(resolve => globalThis.addEventListener('online', resolve, {
|
|
19
|
+
once: true
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// If the import has not run or is not currently running
|
|
24
|
+
// then start the import retry task. Otherwise reuse the
|
|
25
|
+
// existing result or wait for the current task to complete
|
|
26
|
+
if (!retryState[url]) {
|
|
27
|
+
retryState[url] = (async () => {
|
|
28
|
+
// Try first request with normal import circuit
|
|
29
|
+
try {
|
|
30
|
+
// eslint-disable-next-line no-undef
|
|
31
|
+
return await __parcel__import__(url);
|
|
32
|
+
} catch {
|
|
33
|
+
/**/
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Attempt to retry request
|
|
37
|
+
for (let i = 1; i <= maxRetries; i++) {
|
|
38
|
+
try {
|
|
39
|
+
// Wait for an increasing delay time
|
|
40
|
+
const jitter = Math.round(Math.random() * 100);
|
|
41
|
+
const delay = Math.min(Math.pow(2, i), 8) * 1000;
|
|
42
|
+
await new Promise(resolve => setTimeout(resolve, delay + jitter));
|
|
43
|
+
|
|
44
|
+
// Append the current time to the request URL
|
|
45
|
+
// to ensure it has not been cached by the browser
|
|
46
|
+
// eslint-disable-next-line no-undef
|
|
47
|
+
const result = await __parcel__import__(`${url}?t=${Date.now()}`);
|
|
48
|
+
sendAnalyticsEvent('recovered', url, i);
|
|
49
|
+
return result;
|
|
50
|
+
} catch (error) {
|
|
51
|
+
if (i === maxRetries) {
|
|
52
|
+
sendAnalyticsEvent('failure', url, i);
|
|
53
|
+
throw error;
|
|
33
54
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return __parcel__import__(url);
|
|
37
|
-
case 9:
|
|
38
|
-
return _context.abrupt("return", _context.sent);
|
|
39
|
-
case 12:
|
|
40
|
-
_context.prev = 12;
|
|
41
|
-
_context.t0 = _context["catch"](6);
|
|
42
|
-
parcelRequire.retryState[id] = Date.now();
|
|
43
|
-
case 15:
|
|
44
|
-
case "end":
|
|
45
|
-
return _context.stop();
|
|
55
|
+
sendAnalyticsEvent('progress', url, i);
|
|
56
|
+
}
|
|
46
57
|
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return
|
|
58
|
+
})();
|
|
59
|
+
}
|
|
60
|
+
return retryState[url];
|
|
61
|
+
}
|
|
62
|
+
function sendAnalyticsEvent(status, targetUrl, attempt) {
|
|
63
|
+
require('./analytics/analytics.js').sendAnalyticsEvent({
|
|
64
|
+
action: 'importRetry',
|
|
65
|
+
attributes: {
|
|
66
|
+
status,
|
|
67
|
+
targetUrl,
|
|
68
|
+
attempt
|
|
69
|
+
}
|
|
70
|
+
});
|
|
50
71
|
}
|
|
51
72
|
module.exports = load;
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const cacheLoader = require('../cacheLoader');
|
|
4
4
|
module.exports = cacheLoader(function (bundle) {
|
|
5
|
-
return new Promise(
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
6
|
// Add a global function to handle when the script loads.
|
|
7
|
-
|
|
8
|
-
global[globalName] =
|
|
7
|
+
let globalName = `i${('' + Math.random()).slice(2)}`;
|
|
8
|
+
global[globalName] = m => {
|
|
9
9
|
resolve(m);
|
|
10
10
|
cleanup();
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
// Remove script on load or error
|
|
14
|
-
|
|
14
|
+
let cleanup = () => {
|
|
15
15
|
delete global[globalName];
|
|
16
16
|
script.onerror = null;
|
|
17
17
|
script.remove();
|
|
18
18
|
};
|
|
19
19
|
|
|
20
20
|
// Append an inline script tag into the document head
|
|
21
|
-
|
|
21
|
+
let script = document.createElement('script');
|
|
22
22
|
script.async = true;
|
|
23
23
|
script.type = 'module';
|
|
24
24
|
script.charset = 'utf-8';
|
|
25
|
-
script.textContent =
|
|
25
|
+
script.textContent = `import * as m from '${bundle}'; ${globalName}(m);`;
|
|
26
26
|
script.onerror = function (e) {
|
|
27
27
|
reject(e);
|
|
28
28
|
cleanup();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const cacheLoader = require('../cacheLoader');
|
|
4
4
|
module.exports = cacheLoader(function (bundle) {
|
|
5
5
|
return new Promise(function (resolve, reject) {
|
|
6
6
|
// Don't insert the same script twice (e.g. if it was already in the HTML)
|
|
7
|
-
|
|
8
|
-
if ([].concat(existingScripts).some(function
|
|
7
|
+
let existingScripts = document.getElementsByTagName('script');
|
|
8
|
+
if ([].concat(existingScripts).some(function (script) {
|
|
9
9
|
return script.src === bundle;
|
|
10
10
|
})) {
|
|
11
11
|
resolve();
|
|
@@ -21,7 +21,7 @@ module.exports = cacheLoader(function (bundle) {
|
|
|
21
21
|
script.type = 'text/javascript';
|
|
22
22
|
script.src = bundle;
|
|
23
23
|
script.onerror = function (e) {
|
|
24
|
-
var error = new TypeError(
|
|
24
|
+
var error = new TypeError(`Failed to fetch dynamically imported module: ${bundle}. Error: ${e.message}`);
|
|
25
25
|
script.onerror = script.onload = null;
|
|
26
26
|
script.remove();
|
|
27
27
|
reject(error);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var mapping = new Map();
|
|
4
|
-
function register(baseUrl, manifest
|
|
4
|
+
function register( /** @type {string} */baseUrl, /** @type {Array<string>} */manifest // ['id', 'path', 'id2', 'path2']
|
|
5
|
+
) {
|
|
5
6
|
for (var i = 0; i < manifest.length - 1; i += 2) {
|
|
6
7
|
mapping.set(manifest[i], {
|
|
7
8
|
baseUrl: baseUrl,
|
|
@@ -1,19 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
const stackTraceUrlRegexp = /(https?|file|ftp|(chrome|moz|safari-web)-extension):\/\/[^)\n]+/g;
|
|
4
|
+
const bundleURL = {};
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Retrieves the cached bundle URL for a given identifier.
|
|
8
|
+
* If the URL is not cached, it computes and stores it in the cache.
|
|
9
|
+
*
|
|
10
|
+
* @param {string} id - The identifier for the bundle.
|
|
11
|
+
* @param {Error?} inputError - An error object to extract the stack trace from
|
|
12
|
+
* (for testing purposes).
|
|
13
|
+
* @returns {string} The URL of the bundle, without file name.
|
|
14
|
+
*/
|
|
15
|
+
function getBundleURLCached(id, inputError) {
|
|
16
|
+
let value = bundleURL[id];
|
|
6
17
|
if (!value) {
|
|
7
|
-
value = getBundleURL();
|
|
18
|
+
value = getBundleURL(inputError);
|
|
8
19
|
bundleURL[id] = value;
|
|
9
20
|
}
|
|
10
21
|
return value;
|
|
11
22
|
}
|
|
12
|
-
|
|
23
|
+
|
|
24
|
+
/** Get the URL without the filename (last / segment)
|
|
25
|
+
*
|
|
26
|
+
* @param {string} url
|
|
27
|
+
* @returns {string} The URL with the file name removed
|
|
28
|
+
*/
|
|
29
|
+
function getBaseURL(url) {
|
|
30
|
+
return url.slice(0, url.lastIndexOf('/')) + '/';
|
|
31
|
+
}
|
|
32
|
+
function getBundleURL(inputError) {
|
|
13
33
|
try {
|
|
14
|
-
throw new Error();
|
|
34
|
+
throw inputError ?? new Error();
|
|
15
35
|
} catch (err) {
|
|
16
|
-
var matches = ('' + err.stack).match(
|
|
36
|
+
var matches = ('' + err.stack).match(stackTraceUrlRegexp);
|
|
17
37
|
if (matches) {
|
|
18
38
|
// The first two stack frames will be this function and getBundleURLCached.
|
|
19
39
|
// Use the 3rd one, which will be a runtime in the original bundle.
|
|
@@ -22,18 +42,16 @@ function getBundleURL() {
|
|
|
22
42
|
}
|
|
23
43
|
return '/';
|
|
24
44
|
}
|
|
25
|
-
function getBaseURL(url) {
|
|
26
|
-
return ('' + url).replace(/^((?:https?|file|ftp|(chrome|moz|safari-web)-extension):\/\/.+)\/[^/]+$/, '$1') + '/';
|
|
27
|
-
}
|
|
28
45
|
|
|
29
|
-
|
|
46
|
+
/**
|
|
47
|
+
* @param {string} url
|
|
48
|
+
* @returns {string}
|
|
49
|
+
*/
|
|
30
50
|
function getOrigin(url) {
|
|
31
|
-
|
|
32
|
-
if (!matches) {
|
|
33
|
-
throw new Error('Origin not found');
|
|
34
|
-
}
|
|
35
|
-
return matches[0];
|
|
51
|
+
return new URL(url).origin;
|
|
36
52
|
}
|
|
53
|
+
|
|
54
|
+
// TODO: convert this file to ESM once HMR issues are resolved
|
|
55
|
+
exports.getOrigin = getOrigin;
|
|
37
56
|
exports.getBundleURL = getBundleURLCached;
|
|
38
|
-
exports.getBaseURL = getBaseURL;
|
|
39
|
-
exports.getOrigin = getOrigin;
|
|
57
|
+
exports.getBaseURL = getBaseURL;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
let cachedBundles = {};
|
|
4
|
+
let cachedPreloads = {};
|
|
5
|
+
let cachedPrefetches = {};
|
|
6
6
|
function getCache(type) {
|
|
7
7
|
switch (type) {
|
|
8
8
|
case 'preload':
|
|
@@ -15,7 +15,7 @@ function getCache(type) {
|
|
|
15
15
|
}
|
|
16
16
|
module.exports = function (loader, type) {
|
|
17
17
|
return function (bundle) {
|
|
18
|
-
|
|
18
|
+
let cache = getCache(type);
|
|
19
19
|
if (cache[bundle]) {
|
|
20
20
|
return cache[bundle];
|
|
21
21
|
}
|
|
@@ -5,7 +5,7 @@ module.exports = function (cond, ifTrue, ifFalse) {
|
|
|
5
5
|
throw new TypeError('"globalThis.__MCOND" was not set to an object. Ensure the function is set to return the key condition for conditional bundles to load with.');
|
|
6
6
|
}
|
|
7
7
|
if (typeof globalThis.__MCOND(cond) === 'undefined') {
|
|
8
|
-
console.error("
|
|
8
|
+
console.error(`"${cond}" did not match on globalThis.__MCOND. The conditional dependency will be loaded with the false variant.`);
|
|
9
9
|
}
|
|
10
10
|
try {
|
|
11
11
|
return globalThis.__MCOND(cond) ? ifTrue() : ifFalse();
|
|
@@ -7,7 +7,7 @@ module.exports = function (workerUrl, origin, isESM) {
|
|
|
7
7
|
return workerUrl;
|
|
8
8
|
} else {
|
|
9
9
|
// Otherwise, create a blob URL which loads the worker bundle with `importScripts`.
|
|
10
|
-
|
|
10
|
+
let source = isESM ? 'import ' + JSON.stringify(workerUrl) + ';' : 'importScripts(' + JSON.stringify(workerUrl) + ');';
|
|
11
11
|
return URL.createObjectURL(new Blob([source], {
|
|
12
12
|
type: 'application/javascript'
|
|
13
13
|
}));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const cacheLoader = require('../cacheLoader');
|
|
5
5
|
module.exports = cacheLoader(function (bundle) {
|
|
6
6
|
return new Promise(function (resolve, reject) {
|
|
7
7
|
fs.readFile(__dirname + bundle, 'utf8', function (err, data) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const cacheLoader = require('../cacheLoader');
|
|
5
5
|
module.exports = cacheLoader(function (bundle) {
|
|
6
6
|
return new Promise(function (resolve, reject) {
|
|
7
7
|
fs.readFile(__dirname + bundle, 'utf8', function (err, data) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const cacheLoader = require('../cacheLoader');
|
|
5
5
|
module.exports = cacheLoader(function (bundle) {
|
|
6
6
|
return new Promise(function (resolve, reject) {
|
|
7
7
|
fs.readFile(__dirname + bundle, function (err, data) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
/* global __parcel__importScripts__:readonly*/
|
|
4
|
-
|
|
4
|
+
const cacheLoader = require('../cacheLoader');
|
|
5
5
|
module.exports = cacheLoader(function (bundle) {
|
|
6
6
|
return new Promise(function (resolve, reject) {
|
|
7
7
|
try {
|