@atlaspack/runtime-js 2.12.1-dev.3567 → 2.13.1-canary.3630

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/lib/JSRuntime.js +48 -17
  3. package/lib/helpers/browser/analytics/analytics.js +11 -0
  4. package/lib/helpers/browser/css-loader.js +3 -3
  5. package/lib/helpers/browser/esm-js-loader-retry.js +66 -45
  6. package/lib/helpers/browser/esm-js-loader-shards.js +7 -0
  7. package/lib/helpers/browser/html-loader.js +1 -1
  8. package/lib/helpers/browser/import-polyfill.js +7 -7
  9. package/lib/helpers/browser/js-loader.js +4 -4
  10. package/lib/helpers/browser/prefetch-loader.js +1 -1
  11. package/lib/helpers/browser/preload-loader.js +1 -1
  12. package/lib/helpers/browser/wasm-loader.js +1 -1
  13. package/lib/helpers/bundle-manifest.js +2 -1
  14. package/lib/helpers/bundle-url.js +36 -18
  15. package/lib/helpers/cacheLoader.js +4 -4
  16. package/lib/helpers/conditional-loader-dev.js +1 -1
  17. package/lib/helpers/get-worker-url.js +1 -1
  18. package/lib/helpers/node/html-loader.js +2 -2
  19. package/lib/helpers/node/js-loader.js +2 -2
  20. package/lib/helpers/node/wasm-loader.js +2 -2
  21. package/lib/helpers/worker/js-loader.js +1 -1
  22. package/lib/helpers/worker/wasm-loader.js +1 -1
  23. package/package.json +8 -7
  24. package/src/JSRuntime.js +98 -26
  25. package/src/helpers/browser/analytics/analytics.d.ts +6 -0
  26. package/src/helpers/browser/analytics/analytics.js +6 -0
  27. package/src/helpers/browser/analytics/analytics.js.flow +8 -0
  28. package/src/helpers/browser/esm-js-loader-retry.js +61 -14
  29. package/src/helpers/browser/esm-js-loader-shards.js +11 -0
  30. package/src/helpers/bundle-manifest.js +4 -1
  31. package/src/helpers/bundle-url.js +37 -27
  32. package/test/analytics.test.ts +47 -0
  33. package/test/bundle-url.test.js +62 -0
  34. package/test/esm-js-loader-retry.test.ts +65 -0
  35. 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)})( ${getAbsoluteUrlExpr(relativePathExpr, bundle)})`;
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 = shouldUseRuntimeManifest(bundle, options) ? `require('./helpers/bundle-manifest').resolve(${JSON.stringify(to.publicId)})` : getAbsoluteUrlExpr(relativePathExpr, bundle);
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
- // Load conditional bundles with helper (and a dev mode with additional hints)
411
- loaderModules.push(`require('./helpers/conditional-loader${options.mode === 'development' ? '-dev' : ''}')('${cond.key}', function (){return Promise.all([${cond.ifTrueBundles.map(targetBundle => getLoaderForBundle(bundle, targetBundle)).join(',')}]);}, function (){return Promise.all([${cond.ifFalseBundles.map(targetBundle => getLoaderForBundle(bundle, targetBundle)).join(',')}]);})`);
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
- code.push(`let load = require('./helpers/browser/esm-js-loader');`);
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, bundle) {
586
- if (bundle.env.outputFormat === 'esmodule' && bundle.env.supports('import-meta-url') || bundle.env.outputFormat === 'commonjs') {
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;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ function sendAnalyticsEvent(detail) {
4
+ const ev = new globalThis.CustomEvent('atlaspack:analytics', {
5
+ detail
6
+ });
7
+ globalThis.dispatchEvent(ev);
8
+ }
9
+ module.exports = {
10
+ sendAnalyticsEvent
11
+ };
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
 
3
- var cacheLoader = require('../cacheLoader');
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
- var existingLinks = document.getElementsByTagName('link');
8
- if ([].concat(existingLinks).some(function isCurrentBundle(link) {
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
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : "suspendedYield", p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
5
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
6
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
7
- function load() {
8
- return _load.apply(this, arguments);
9
- }
10
- function _load() {
11
- _load = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(id) {
12
- var url;
13
- return _regeneratorRuntime().wrap(function _callee$(_context) {
14
- while (1) switch (_context.prev = _context.next) {
15
- case 0:
16
- if (!parcelRequire.retryState) {
17
- parcelRequire.retryState = {};
18
- }
19
- if (globalThis.navigator.onLine) {
20
- _context.next = 4;
21
- break;
22
- }
23
- _context.next = 4;
24
- return new Promise(function (res) {
25
- return globalThis.addEventListener('online', res, {
26
- once: true
27
- });
28
- });
29
- case 4:
30
- url = require('../bundle-manifest').resolve(id);
31
- if (parcelRequire.retryState[id] != undefined) {
32
- url = "".concat(url, "?retry=").concat(parcelRequire.retryState[id]);
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
- _context.prev = 6;
35
- _context.next = 9;
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
- }, _callee, null, [[6, 12]]);
48
- }));
49
- return _load.apply(this, arguments);
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;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ let load = maxShards => id => {
4
+ // eslint-disable-next-line no-undef
5
+ return __parcel__import__(require('@atlaspack/domain-sharding').shardUrl(require('../bundle-manifest').resolve(id), maxShards));
6
+ };
7
+ module.exports = load;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var cacheLoader = require('../cacheLoader');
3
+ const cacheLoader = require('../cacheLoader');
4
4
  module.exports = cacheLoader(function (bundle) {
5
5
  return fetch(bundle).then(function (res) {
6
6
  return res.text();
@@ -1,28 +1,28 @@
1
1
  "use strict";
2
2
 
3
- var cacheLoader = require('../cacheLoader');
3
+ const cacheLoader = require('../cacheLoader');
4
4
  module.exports = cacheLoader(function (bundle) {
5
- return new Promise(function (resolve, reject) {
5
+ return new Promise((resolve, reject) => {
6
6
  // Add a global function to handle when the script loads.
7
- var globalName = "i".concat(('' + Math.random()).slice(2));
8
- global[globalName] = function (m) {
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
- var cleanup = function () {
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
- var script = document.createElement('script');
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 = "import * as m from '".concat(bundle, "'; ").concat(globalName, "(m);");
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
- var cacheLoader = require('../cacheLoader');
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
- var existingScripts = document.getElementsByTagName('script');
8
- if ([].concat(existingScripts).some(function isCurrentBundle(script) {
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("Failed to fetch dynamically imported module: ".concat(bundle, ". Error: ").concat(e.message));
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,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var cacheLoader = require('../cacheLoader');
3
+ const cacheLoader = require('../cacheLoader');
4
4
  module.exports = cacheLoader(function (bundle, priority) {
5
5
  var link = document.createElement('link');
6
6
  link.rel = 'prefetch';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var cacheLoader = require('../cacheLoader');
3
+ const cacheLoader = require('../cacheLoader');
4
4
  module.exports = cacheLoader(function (bundle, priority, isModule) {
5
5
  var link = document.createElement('link');
6
6
  link.charset = 'utf-8';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var cacheLoader = require('../cacheLoader');
3
+ const cacheLoader = require('../cacheLoader');
4
4
  module.exports = cacheLoader(function (bundle) {
5
5
  return fetch(bundle).then(function (res) {
6
6
  if (WebAssembly.instantiateStreaming) {
@@ -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
- var bundleURL = {};
4
- function getBundleURLCached(id) {
5
- var value = bundleURL[id];
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
- function getBundleURL() {
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(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\/\/[^)\n]+/g);
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
- // TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.
46
+ /**
47
+ * @param {string} url
48
+ * @returns {string}
49
+ */
30
50
  function getOrigin(url) {
31
- var matches = ('' + url).match(/(https?|file|ftp|(chrome|moz|safari-web)-extension):\/\/[^/]+/);
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
- var cachedBundles = {};
4
- var cachedPreloads = {};
5
- var cachedPrefetches = {};
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
- var cache = getCache(type);
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("\"".concat(cond, "\" did not match on globalThis.__MCOND. The conditional dependency will be loaded with the false variant."));
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
- var source = isESM ? 'import ' + JSON.stringify(workerUrl) + ';' : 'importScripts(' + JSON.stringify(workerUrl) + ');';
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
- var fs = require('fs');
4
- var cacheLoader = require('../cacheLoader');
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
- var fs = require('fs');
4
- var cacheLoader = require('../cacheLoader');
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
- var fs = require('fs');
4
- var cacheLoader = require('../cacheLoader');
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
- var cacheLoader = require('../cacheLoader');
4
+ const cacheLoader = require('../cacheLoader');
5
5
  module.exports = cacheLoader(function (bundle) {
6
6
  return new Promise(function (resolve, reject) {
7
7
  try {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- var cacheLoader = require('../cacheLoader');
3
+ const cacheLoader = require('../cacheLoader');
4
4
  module.exports = cacheLoader(function (bundle) {
5
5
  return fetch(bundle).then(function (res) {
6
6
  if (WebAssembly.instantiateStreaming) {