diff --git a/packages/core/integration-tests/test/BundleGraph.js b/packages/core/integration-tests/test/BundleGraph.js index 7c1a1d19e..52f242915 100644 --- a/packages/core/integration-tests/test/BundleGraph.js +++ b/packages/core/integration-tests/test/BundleGraph.js @@ -66,10 +66,6 @@ describe('BundleGraph', () => { type: 'asset', value: 'bundle-url.js', }, - { - type: 'asset', - value: 'bundle-url-common.js', - }, { type: 'asset', value: 'runtime.js', @@ -82,10 +78,6 @@ describe('BundleGraph', () => { type: 'asset', value: 'bundle-url.js', }, - { - type: 'asset', - value: 'bundle-url-common.js', - }, { type: 'asset', value: 'esmodule-helpers.js', diff --git a/packages/core/integration-tests/test/bundle-text.js b/packages/core/integration-tests/test/bundle-text.js index c0e504d78..3ecdc52c7 100644 --- a/packages/core/integration-tests/test/bundle-text.js +++ b/packages/core/integration-tests/test/bundle-text.js @@ -245,7 +245,6 @@ describe('bundle-text:', function () { 'index.js', 'esmodule-helpers.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], diff --git a/packages/core/integration-tests/test/bundler.js b/packages/core/integration-tests/test/bundler.js index 905d0c500..e6b8687eb 100644 --- a/packages/core/integration-tests/test/bundler.js +++ b/packages/core/integration-tests/test/bundler.js @@ -71,7 +71,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -161,7 +160,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -256,7 +254,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -348,7 +345,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -467,7 +463,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -546,7 +541,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -625,7 +619,6 @@ describe('bundler', function () { 'inline-module.js', 'local.html', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -656,7 +649,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'esmodule-helpers.js', @@ -709,7 +701,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'esmodule-helpers.js', @@ -761,7 +752,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'esmodule-helpers.js', @@ -816,7 +806,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'esmodule-helpers.js', @@ -870,7 +859,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'esmodule-helpers.js', @@ -945,7 +933,7 @@ describe('bundler', function () { ], }, { - assets: ['bundle-manifest.js', 'bundle-url.js', 'bundle-url-common.js'], // manifest bundle + assets: ['bundle-manifest.js', 'bundle-url.js'], // manifest bundle }, { assets: [ @@ -957,7 +945,7 @@ describe('bundler', function () { ], }, { - assets: ['bundle-manifest.js', 'bundle-url.js', 'bundle-url-common.js'], // manifest bundle + assets: ['bundle-manifest.js', 'bundle-url.js'], // manifest bundle }, { assets: ['c.js'], @@ -1014,7 +1002,6 @@ describe('bundler', function () { 'a.js', 'b.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'esmodule-helpers.js', @@ -1086,7 +1073,6 @@ describe('bundler', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -1429,7 +1415,6 @@ describe('bundler', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'esmodule-helpers.js', @@ -1597,7 +1582,6 @@ describe('bundler', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'esmodule-helpers.js', @@ -1899,7 +1883,6 @@ describe('bundler', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'index.js', 'js-loader.js', @@ -1977,7 +1960,6 @@ describe('bundler', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'index.js', 'js-loader.js', @@ -2059,7 +2041,6 @@ describe('bundler', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'index.js', 'js-loader.js', @@ -2348,7 +2329,6 @@ describe('bundler', function () { 'a.js', 'b.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', diff --git a/packages/core/integration-tests/test/cache.js b/packages/core/integration-tests/test/cache.js index 5de047e92..ea95c07ad 100644 --- a/packages/core/integration-tests/test/cache.js +++ b/packages/core/integration-tests/test/cache.js @@ -4999,7 +4999,6 @@ describe.v2('cache', function () { 'index.js', 'c.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'bundle-manifest.js', @@ -5038,7 +5037,6 @@ describe.v2('cache', function () { 'index.js', 'c.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'bundle-manifest.js', @@ -5115,7 +5113,6 @@ describe.v2('cache', function () { 'index.js', 'c.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'bundle-manifest.js', @@ -5154,7 +5151,6 @@ describe.v2('cache', function () { 'index.js', 'c.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'bundle-manifest.js', @@ -5195,7 +5191,6 @@ describe.v2('cache', function () { 'index.js', 'c.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'bundle-manifest.js', @@ -5228,7 +5223,6 @@ describe.v2('cache', function () { 'index.js', 'c.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'bundle-manifest.js', diff --git a/packages/core/integration-tests/test/css.js b/packages/core/integration-tests/test/css.js index 7b7df559b..d9df8904a 100644 --- a/packages/core/integration-tests/test/css.js +++ b/packages/core/integration-tests/test/css.js @@ -79,13 +79,7 @@ describe('css', () => { { name: 'entry.js', type: 'js', - assets: [ - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'entry.js', - 'js-loader.js', - ], + assets: ['bundle-url.js', 'cacheLoader.js', 'entry.js', 'js-loader.js'], }, { type: 'js', @@ -108,7 +102,6 @@ describe('css', () => { type: 'js', assets: [ 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'entry.js', @@ -133,7 +126,6 @@ describe('css', () => { name: 'index.js', assets: [ 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'index.js', diff --git a/packages/core/integration-tests/test/domain-sharding.js b/packages/core/integration-tests/test/domain-sharding.js new file mode 100644 index 000000000..f803ea787 --- /dev/null +++ b/packages/core/integration-tests/test/domain-sharding.js @@ -0,0 +1,124 @@ +// @flow +import assert from 'assert'; +import path from 'path'; + +import {fsFixture, overlayFS, bundle} from '@atlaspack/test-utils'; + +const maxShards = 8; + +describe('domain-sharding', () => { + describe('should insert all arguments into compiled JS Runtime output', () => { + it('for bundle manifest urls', async () => { + await fsFixture(overlayFS)` + package.json: + { + "name": "bundle-sharding-test", + "targets": { + "default": { + "context": "browser", + "optimize": false + } + }, + "@atlaspack/runtime-js": { + "domainSharding": { + "maxShards": ${maxShards} + } + } + } + + src/index.js: + async function fn() { + const a = await import('./a.js'); + const b = await import('./b.js'); + console.log('a', a, b); + } + fn(); + + src/a.js: + export const a = async () => { + const b = await import('./b'); + return b + 'A'; + } + src/b.js: + export const b = 'B'; + + yarn.lock: + `; + + const bundleGraph = await bundle('src/index.js', { + inputFS: overlayFS, + mode: 'production', + }); + + const mainBundle = bundleGraph + .getBundles() + .find((b) => b.name === 'index.js'); + if (!mainBundle) return assert(mainBundle); + + const code = await overlayFS.readFile(mainBundle.filePath, 'utf-8'); + + assert.ok( + code.includes( + `require("85e3bc75ab94a411")(require("f41955f5cc01151").shardUrl(require("40cc202a4c7abf8d").resolve("aVRxe"), ${maxShards}))`, + 'Expected generated code for shardUrl was not found', + ), + ); + }); + + it('for all other urls', async () => { + const maxShards = 8; + await fsFixture(overlayFS)` + package.json: + { + "name": "bundle-sharding-test", + "@atlaspack/runtime-js": { + "domainSharding": { + "maxShards": ${maxShards} + } + } + } + + src/index.js: + async function fn() { + const a = await import('./a.js'); + const b = await import('./b.js'); + console.log('a', a, b); + } + fn(); + + src/a.js: + export const a = async () => { + const b = await import('./b'); + return b + 'A'; + } + src/b.js: + export const b = 'B'; + + yarn.lock: + `; + + const bundleGraph = await bundle('src/index.js', {inputFS: overlayFS}); + + const mainBundle = bundleGraph + .getBundles() + .find((b) => b.name === 'index.js'); + const commonBundle = bundleGraph + .getBundles() + .find((b) => b.displayName === 'b.[hash].js'); + + assert(commonBundle, 'Unable to locate the shared bundle'); + + const commonFileName = path.basename(commonBundle?.filePath ?? ''); + + if (!mainBundle) return assert(mainBundle); + + const code = await overlayFS.readFile(mainBundle.filePath, 'utf-8'); + assert.ok( + code.includes( + `require("e480067c5bab431e")(require("5091f5df3a0c51b6").shardUrl(require("5e2c91749d676db2").getBundleURL('d8wEr') + "${commonFileName}", ${maxShards})`, + ), + 'Expected generated code for shardUrl was not found', + ); + }); + }); +}); diff --git a/packages/core/integration-tests/test/glob.js b/packages/core/integration-tests/test/glob.js index 81f15f3b1..cd7832fd3 100644 --- a/packages/core/integration-tests/test/glob.js +++ b/packages/core/integration-tests/test/glob.js @@ -82,7 +82,7 @@ describe('glob', function () { assertBundles(b, [ { name: 'index.js', - assets: ['index.js', '*.js', 'bundle-url.js', 'bundle-url-common.js'], + assets: ['index.js', '*.js', 'bundle-url.js'], }, { type: 'txt', @@ -117,7 +117,6 @@ describe('glob', function () { 'index.js', '*.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -241,7 +240,6 @@ describe('glob', function () { '*.js', '*.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'index.js', 'js-loader.js', diff --git a/packages/core/integration-tests/test/html.js b/packages/core/integration-tests/test/html.js index b9aa70f56..cf1373b1d 100644 --- a/packages/core/integration-tests/test/html.js +++ b/packages/core/integration-tests/test/html.js @@ -485,7 +485,6 @@ describe('html', function () { assets: [ 'index.css', 'bundle-url.js', - 'bundle-url-common.js', 'css-loader.js', 'hmr-runtime.js', ], @@ -1876,7 +1875,6 @@ describe('html', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'index.js', 'index.js', @@ -2210,7 +2208,6 @@ describe('html', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'index.js', 'js-loader.js', @@ -2234,7 +2231,6 @@ describe('html', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'index.js', 'js-loader.js', @@ -2306,7 +2302,6 @@ describe('html', function () { 'a.js', 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -2316,7 +2311,6 @@ describe('html', function () { 'b.js', 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -2587,7 +2581,6 @@ describe('html', function () { assets: [ 'a.js', 'bundle-url.js', - 'bundle-url-common.js', 'esmodule-helpers.js', 'get-worker-url.js', 'index.js', diff --git a/packages/core/integration-tests/test/javascript.js b/packages/core/integration-tests/test/javascript.js index b028be9c5..d86f77f79 100644 --- a/packages/core/integration-tests/test/javascript.js +++ b/packages/core/integration-tests/test/javascript.js @@ -422,13 +422,7 @@ describe('javascript', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, { assets: ['local.js'], @@ -670,7 +664,6 @@ describe('javascript', function () { 'index.js', 'bar.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'foo.js', @@ -708,13 +701,7 @@ describe('javascript', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, { assets: ['local.js', 'esmodule-helpers.js'], @@ -740,7 +727,6 @@ describe('javascript', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -770,13 +756,7 @@ describe('javascript', function () { }, { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, ]); @@ -809,7 +789,6 @@ describe('javascript', function () { 'index.js', 'c.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'bundle-manifest.js', @@ -837,7 +816,6 @@ describe('javascript', function () { 'index.js', 'common.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -864,20 +842,13 @@ describe('javascript', function () { }, { name: 'b.js', - assets: [ - 'b.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['b.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, { name: 'a.js', assets: [ 'a.js', 'bundle-url.js', - 'bundle-url-common.js', 'common.js', 'cacheLoader.js', 'esmodule-helpers.js', @@ -901,7 +872,6 @@ describe('javascript', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'esmodule-helpers.js', @@ -936,7 +906,6 @@ describe('javascript', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -965,7 +934,7 @@ describe('javascript', function () { assertBundles(b, [ { name: 'index.js', - assets: ['index.js', 'bundle-url.js', 'bundle-url-common.js'], + assets: ['index.js', 'bundle-url.js'], }, { type: 'txt', @@ -995,12 +964,7 @@ describe('javascript', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'esmodule-helpers.js', - ], + assets: ['index.js', 'bundle-url.js', 'esmodule-helpers.js'], }, { type: 'txt', @@ -1033,12 +997,7 @@ describe('javascript', function () { assertBundles(b, [ { name: 'cjs.js', - assets: [ - 'cjs.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'esmodule-helpers.js', - ], + assets: ['cjs.js', 'bundle-url.js', 'esmodule-helpers.js'], }, { type: 'txt', @@ -1148,7 +1107,7 @@ describe('javascript', function () { assertBundles(b, [ { name: 'index.js', - assets: ['index.js', 'bundle-url.js', 'bundle-url-common.js'], + assets: ['index.js', 'bundle-url.js'], }, { type: 'txt', @@ -2714,7 +2673,6 @@ describe('javascript', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'esmodule-helpers.js', 'js-loader.js', @@ -2797,13 +2755,7 @@ describe('javascript', function () { assertBundles(b, [ { name: 'ts.js', - assets: [ - 'ts.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['ts.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, { assets: ['async.js'], @@ -2824,7 +2776,6 @@ describe('javascript', function () { assets: [ 'ts-interop.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -2854,7 +2805,6 @@ describe('javascript', function () { assets: [ 'ts-interop-arrow.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -2882,7 +2832,6 @@ describe('javascript', function () { assets: [ 'rollup.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -2921,7 +2870,6 @@ describe('javascript', function () { assets: [ 'resolve-chain.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -2945,7 +2893,6 @@ describe('javascript', function () { assets: [ 'atlaspack.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -3103,7 +3050,6 @@ describe('javascript', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'child.js', 'entry2.js', @@ -3125,7 +3071,6 @@ describe('javascript', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'dep.js', 'js-loader.js', @@ -3173,7 +3118,6 @@ describe('javascript', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'get-dep.js', 'js-loader.js', @@ -3236,7 +3180,6 @@ describe('javascript', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'index.js', 'js-loader.js', @@ -3261,7 +3204,6 @@ describe('javascript', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'esmodule-helpers.js', @@ -3295,7 +3237,6 @@ describe('javascript', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'esmodule-helpers.js', @@ -3366,7 +3307,6 @@ describe('javascript', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'esmodule-helpers.js', @@ -3377,7 +3317,6 @@ describe('javascript', function () { assets: [ 'other-entry.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -3820,13 +3759,7 @@ describe('javascript', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, { assets: ['async1.js', 'shared.js', 'esmodule-helpers.js'], @@ -3854,7 +3787,6 @@ describe('javascript', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'bundle-manifest.js', @@ -3941,7 +3873,6 @@ describe('javascript', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'esmodule-helpers.js', @@ -4284,7 +4215,6 @@ describe('javascript', function () { 'other.js', 'esmodule-helpers.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -4356,7 +4286,6 @@ describe('javascript', function () { 'dynamic-url.js', 'esmodule-helpers.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -4469,7 +4398,6 @@ describe('javascript', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'entry-a.js', 'js-loader.js', @@ -4480,7 +4408,6 @@ describe('javascript', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'entry-b.js', 'js-loader.js', diff --git a/packages/core/integration-tests/test/lazy-compile.js b/packages/core/integration-tests/test/lazy-compile.js index 5e1f08e20..8ce06959d 100644 --- a/packages/core/integration-tests/test/lazy-compile.js +++ b/packages/core/integration-tests/test/lazy-compile.js @@ -90,13 +90,7 @@ describe.v2('lazy compile', function () { // `parallel-lazy-1` which wasn't requested. assertBundles(result.bundleGraph, [ { - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, { assets: ['lazy-1.js', 'esmodule-helpers.js'], @@ -174,13 +168,7 @@ describe.v2('lazy compile', function () { assertBundles(result.bundleGraph, [ { name: /^index.*/, - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, { // This will be a placeholder, but that info isn't available in the BundleGraph @@ -245,13 +233,7 @@ describe.v2('lazy compile', function () { assertBundles(result.bundleGraph, [ { name: /^index.*/, - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, { assets: ['lazy-1.js', 'esmodule-helpers.js'], diff --git a/packages/core/integration-tests/test/rust.js b/packages/core/integration-tests/test/rust.js index ea88ef68f..3b499e44a 100644 --- a/packages/core/integration-tests/test/rust.js +++ b/packages/core/integration-tests/test/rust.js @@ -28,7 +28,6 @@ describe.skip('rust', function () { assets: [ 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'index.js', 'wasm-loader.js', ], @@ -66,7 +65,6 @@ describe.skip('rust', function () { assets: [ 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'index.js', 'wasm-loader.js', ], @@ -103,7 +101,6 @@ describe.skip('rust', function () { assets: [ 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'index.js', 'wasm-loader.js', ], @@ -134,7 +131,6 @@ describe.skip('rust', function () { assets: [ 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'index.js', 'wasm-loader.js', ], @@ -168,7 +164,6 @@ describe.skip('rust', function () { assets: [ 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'index.js', 'wasm-loader.js', ], diff --git a/packages/core/integration-tests/test/scope-hoisting.js b/packages/core/integration-tests/test/scope-hoisting.js index a4f5c3395..d34d63b50 100644 --- a/packages/core/integration-tests/test/scope-hoisting.js +++ b/packages/core/integration-tests/test/scope-hoisting.js @@ -2379,7 +2379,6 @@ describe('scope hoisting', function () { 'bar.js', 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -4360,7 +4359,7 @@ describe('scope hoisting', function () { assertBundles(b, [ { type: 'js', - assets: ['a.js', 'b.js', 'bundle-url.js', 'bundle-url-common.js'], + assets: ['a.js', 'b.js', 'bundle-url.js'], }, { type: 'txt', @@ -5638,7 +5637,6 @@ describe('scope hoisting', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'dep.js', 'js-loader.js', @@ -5666,7 +5664,6 @@ describe('scope hoisting', function () { 'index.js', 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -5707,7 +5704,6 @@ describe('scope hoisting', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'get-dep-scope-hoisting.js', 'js-loader.js', @@ -5758,7 +5754,6 @@ describe('scope hoisting', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'scope-hoisting.js', 'js-loader.js', @@ -5811,7 +5806,6 @@ describe('scope hoisting', function () { assets: [ 'scope-hoisting.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -5840,7 +5834,6 @@ describe('scope hoisting', function () { assets: [ 'scope-hoisting.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -5850,7 +5843,6 @@ describe('scope hoisting', function () { assets: [ 'other-entry.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], diff --git a/packages/core/integration-tests/test/server.js b/packages/core/integration-tests/test/server.js index c2a5b1305..32c37d49b 100644 --- a/packages/core/integration-tests/test/server.js +++ b/packages/core/integration-tests/test/server.js @@ -587,7 +587,6 @@ describe.v2('server', function () { name: 'index.js', assets: [ 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'index.js', @@ -628,7 +627,6 @@ describe.v2('server', function () { name: 'index.js', assets: [ 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'css-loader.js', 'index.js', diff --git a/packages/core/integration-tests/test/svg.js b/packages/core/integration-tests/test/svg.js index 617af4311..a06d79967 100644 --- a/packages/core/integration-tests/test/svg.js +++ b/packages/core/integration-tests/test/svg.js @@ -257,7 +257,7 @@ describe('svg', function () { assertBundles(b, [ { - assets: ['index.js', 'bundle-url.js', 'bundle-url-common.js'], + assets: ['index.js', 'bundle-url.js'], }, { assets: ['circle.svg'], diff --git a/packages/core/integration-tests/test/typescript.js b/packages/core/integration-tests/test/typescript.js index fe4f7eaa0..2af46a883 100644 --- a/packages/core/integration-tests/test/typescript.js +++ b/packages/core/integration-tests/test/typescript.js @@ -111,12 +111,7 @@ describe('typescript', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.ts', - 'bundle-url.js', - 'bundle-url-common.js', - 'esmodule-helpers.js', - ], + assets: ['index.ts', 'bundle-url.js', 'esmodule-helpers.js'], }, { type: 'txt', diff --git a/packages/core/integration-tests/test/wasm.js b/packages/core/integration-tests/test/wasm.js index ea8ac5c35..fbb52adf0 100644 --- a/packages/core/integration-tests/test/wasm.js +++ b/packages/core/integration-tests/test/wasm.js @@ -33,7 +33,6 @@ describe.skip('wasm', function () { 'index.js', 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'wasm-loader.js', ], childBundles: [ @@ -68,7 +67,6 @@ describe.skip('wasm', function () { 'index.js', 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'wasm-loader.js', ], childBundles: [ @@ -102,7 +100,6 @@ describe.skip('wasm', function () { 'index.js', 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'js-loader.js', 'wasm-loader.js', ], diff --git a/packages/core/integration-tests/test/watcher.js b/packages/core/integration-tests/test/watcher.js index 41fa8bd55..309fc90c9 100644 --- a/packages/core/integration-tests/test/watcher.js +++ b/packages/core/integration-tests/test/watcher.js @@ -161,7 +161,6 @@ describe.v2('watcher', function () { 'common-dep.js', 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'js-loader.js', ], childBundles: [ @@ -198,13 +197,7 @@ describe.v2('watcher', function () { bundle = await nextBundle(b); await assertBundleTree(bundle, { name: 'index.js', - assets: [ - 'index.js', - 'bundle-loader.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-loader.js', 'bundle-url.js', 'js-loader.js'], childBundles: [ { assets: ['a.js', 'common.js', 'common-dep.js'], @@ -278,7 +271,6 @@ describe.v2('watcher', function () { 'common-dep.js', 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'js-loader.js', ], childBundles: [ @@ -322,7 +314,6 @@ describe.v2('watcher', function () { 'common.js', 'bundle-loader.js', 'bundle-url.js', - 'bundle-url-common.js', 'js-loader.js', ], childBundles: [ @@ -445,13 +436,7 @@ describe.v2('watcher', function () { assertBundles(bundleGraph, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, {assets: ['local.js']}, ]); @@ -469,13 +454,7 @@ describe.v2('watcher', function () { assertBundles(bundleGraph, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'cacheLoader.js', - 'js-loader.js', - ], + assets: ['index.js', 'bundle-url.js', 'cacheLoader.js', 'js-loader.js'], }, {assets: ['local.js']}, {assets: ['other.js']}, diff --git a/packages/core/integration-tests/test/webextension.js b/packages/core/integration-tests/test/webextension.js index 55393236d..1fa6a8b92 100644 --- a/packages/core/integration-tests/test/webextension.js +++ b/packages/core/integration-tests/test/webextension.js @@ -123,12 +123,7 @@ describe.v2('webextension', function () { {assets: ['popup.html']}, {assets: ['popup.css']}, { - assets: [ - 'popup.js', - 'esmodule-helpers.js', - 'bundle-url.js', - 'bundle-url-common.js', - ], + assets: ['popup.js', 'esmodule-helpers.js', 'bundle-url.js'], }, {assets: ['side-panel.html']}, {assets: ['content-script.js']}, diff --git a/packages/core/integration-tests/test/workers.js b/packages/core/integration-tests/test/workers.js index 5df48b1e5..87f9fa8da 100644 --- a/packages/core/integration-tests/test/workers.js +++ b/packages/core/integration-tests/test/workers.js @@ -34,7 +34,6 @@ describe('atlaspack', function () { 'feature.js', 'get-worker-url.js', 'bundle-url.js', - 'bundle-url-common.js', ], }, { @@ -57,18 +56,12 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'get-worker-url.js', - ], + assets: ['index.js', 'bundle-url.js', 'get-worker-url.js'], }, { assets: [ 'worker.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -107,18 +100,12 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'get-worker-url.js', - ], + assets: ['index.js', 'bundle-url.js', 'get-worker-url.js'], }, { assets: [ 'worker.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -146,18 +133,12 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'index-nested.js', - assets: [ - 'index-nested.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'get-worker-url.js', - ], + assets: ['index-nested.js', 'bundle-url.js', 'get-worker-url.js'], }, { assets: [ 'worker-nested.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'cacheLoader.js', 'js-loader.js', @@ -167,7 +148,6 @@ describe('atlaspack', function () { assets: [ 'worker.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -200,7 +180,6 @@ describe('atlaspack', function () { assets: [ 'index-async.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'cacheLoader.js', 'js-loader.js', @@ -210,7 +189,6 @@ describe('atlaspack', function () { assets: [ 'worker.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', ], @@ -244,7 +222,6 @@ describe('atlaspack', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'workerHelpers.js', 'esmodule-helpers.js', @@ -254,7 +231,6 @@ describe('atlaspack', function () { assets: [ 'workerHelpers.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'esmodule-helpers.js', ], @@ -274,7 +250,6 @@ describe('atlaspack', function () { assets: [ 'import-meta.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'esmodule-helpers.js', ], @@ -283,7 +258,6 @@ describe('atlaspack', function () { assets: [ 'import-meta.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'esmodule-helpers.js', ], @@ -317,7 +291,6 @@ describe('atlaspack', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'bundle-manifest.js', ], @@ -383,7 +356,6 @@ describe('atlaspack', function () { assets: [ 'index.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'bundle-manifest.js', ], @@ -601,7 +573,6 @@ describe('atlaspack', function () { 'worker-client.js', 'feature.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', ], }, @@ -727,12 +698,7 @@ describe('atlaspack', function () { assertBundles(b, [ { type: 'js', - assets: [ - 'index-variable.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'get-worker-url.js', - ], + assets: ['index-variable.js', 'bundle-url.js', 'get-worker-url.js'], }, { type: 'js', @@ -755,12 +721,7 @@ describe('atlaspack', function () { assertBundles(b, [ { type: 'js', - assets: [ - 'index-external.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'get-worker-url.js', - ], + assets: ['index-external.js', 'bundle-url.js', 'get-worker-url.js'], }, { type: 'js', @@ -780,12 +741,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.js', - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - ], + assets: ['index.js', 'index.js', 'bundle-url.js'], }, { assets: ['worker-nested.js'], @@ -809,7 +765,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'module.js', - assets: ['module.js', 'bundle-url.js', 'bundle-url-common.js'], + assets: ['module.js', 'bundle-url.js'], }, { assets: ['module-worker.js'], @@ -842,7 +798,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'scope.js', - assets: ['bundle-url.js', 'bundle-url-common.js', 'scope.js'], + assets: ['bundle-url.js', 'scope.js'], }, { assets: ['module-worker.js'], @@ -951,7 +907,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'manifest.js', - assets: ['manifest.js', 'bundle-url.js', 'bundle-url-common.js'], + assets: ['manifest.js', 'bundle-url.js'], }, { assets: ['manifest-worker.js', 'service-worker.js'], @@ -984,7 +940,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'index.js', - assets: ['index.js', 'bundle-url.js', 'bundle-url-common.js'], + assets: ['index.js', 'bundle-url.js'], }, { assets: ['worker.js'], @@ -1111,12 +1067,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'get-worker-url.js', - ], + assets: ['index.js', 'bundle-url.js', 'get-worker-url.js'], }, { assets: ['worker.js', 'worker-dep.js'], @@ -1132,12 +1083,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'index.js', - 'bundle-url.js', - 'bundle-url-common.js', - 'get-worker-url.js', - ], + assets: ['index.js', 'bundle-url.js', 'get-worker-url.js'], }, { assets: ['worker.js'], @@ -1282,7 +1228,6 @@ describe('atlaspack', function () { 'index.js', 'lodash.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'bundle-manifest.js', 'esmodule-helpers.js', @@ -1292,7 +1237,6 @@ describe('atlaspack', function () { assets: [ 'worker-a.js', 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'bundle-manifest.js', ], @@ -1344,15 +1288,10 @@ describe('atlaspack', function () { 'lodash.js', 'esmodule-helpers.js', 'bundle-url.js', - 'bundle-url-common.js', ], }, { - assets: [ - 'bundle-manifest.js', - 'bundle-url.js', - 'bundle-url-common.js', - ], + assets: ['bundle-manifest.js', 'bundle-url.js'], }, { assets: ['worker.js', 'lodash.js', 'esmodule-helpers.js'], @@ -1416,7 +1355,6 @@ describe('atlaspack', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'get-worker-url.js', 'index.js', @@ -1428,7 +1366,6 @@ describe('atlaspack', function () { assets: [ 'bundle-manifest.js', 'bundle-url.js', - 'bundle-url-common.js', 'cacheLoader.js', 'js-loader.js', 'large.js', @@ -1470,17 +1407,11 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'index.js', - assets: [ - 'bundle-url.js', - 'bundle-url-common.js', - 'get-worker-url.js', - 'index.js', - ], + assets: ['bundle-url.js', 'get-worker-url.js', 'index.js'], }, { assets: [ 'bundle-url.js', - 'bundle-url-common.js', 'get-worker-url.js', 'worker1.js', 'worker2.js', diff --git a/packages/core/integration-tests/test/worklets.js b/packages/core/integration-tests/test/worklets.js index 90e03d08c..84f528f3c 100644 --- a/packages/core/integration-tests/test/worklets.js +++ b/packages/core/integration-tests/test/worklets.js @@ -52,7 +52,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'url-worklet.js', - assets: ['bundle-url.js', 'bundle-url-common.js', 'url-worklet.js'], + assets: ['bundle-url.js', 'url-worklet.js'], }, { type: 'js', @@ -98,12 +98,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'pipeline.js', - assets: [ - 'bundle-url.js', - 'bundle-url-common.js', - 'pipeline.js', - 'bundle-manifest.js', - ], + assets: ['bundle-url.js', 'pipeline.js', 'bundle-manifest.js'], }, { type: 'js', @@ -144,12 +139,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'url.js', - assets: [ - 'bundle-url.js', - 'bundle-url-common.js', - 'esmodule-helpers.js', - 'url.js', - ], + assets: ['bundle-url.js', 'esmodule-helpers.js', 'url.js'], }, { type: 'js', @@ -247,12 +237,7 @@ describe('atlaspack', function () { assertBundles(b, [ { name: 'worklet-pipeline.js', - assets: [ - 'bundle-url.js', - 'bundle-url-common.js', - 'bundle-manifest.js', - 'worklet-pipeline.js', - ], + assets: ['bundle-url.js', 'bundle-manifest.js', 'worklet-pipeline.js'], }, { type: 'js', diff --git a/packages/runtimes/js/package.json b/packages/runtimes/js/package.json index d82b33e51..9088c4539 100644 --- a/packages/runtimes/js/package.json +++ b/packages/runtimes/js/package.json @@ -17,6 +17,7 @@ }, "dependencies": { "@atlaspack/diagnostic": "2.12.0", + "@atlaspack/domain-sharding": "2.12.0", "@atlaspack/feature-flags": "2.12.0", "@atlaspack/plugin": "2.12.0", "@atlaspack/utils": "2.12.0", diff --git a/packages/runtimes/js/src/JSRuntime.js b/packages/runtimes/js/src/JSRuntime.js index c67c1732f..0c6c7f606 100644 --- a/packages/runtimes/js/src/JSRuntime.js +++ b/packages/runtimes/js/src/JSRuntime.js @@ -485,11 +485,23 @@ function getLoaderRuntime({ return `Promise.resolve(__parcel__require__("./" + ${relativePathExpr}))`; } - let absoluteUrlExpr = shouldUseRuntimeManifest(bundle, options) - ? `require('./helpers/bundle-manifest').resolve(${JSON.stringify( - to.publicId, - )})` - : getAbsoluteUrlExpr(relativePathExpr, bundle, to, shardingConfig); + let absoluteUrlExpr; + if (shouldUseRuntimeManifest(bundle, options)) { + let publicId = JSON.stringify(to.publicId); + absoluteUrlExpr = `require('./helpers/bundle-manifest').resolve(${publicId})`; + + if (shardingConfig) { + absoluteUrlExpr = `require('@atlaspack/domain-sharding').shardUrl(${absoluteUrlExpr}, ${shardingConfig.maxShards})`; + } + } else { + absoluteUrlExpr = getAbsoluteUrlExpr( + relativePathExpr, + bundle, + to, + shardingConfig, + ); + } + let code = `require(${JSON.stringify(loader)})(${absoluteUrlExpr})`; // In development, clear the require cache when an error occurs so the @@ -732,6 +744,9 @@ function getURLRuntime( } else { code += `let bundleURL = require('./helpers/bundle-url');\n`; code += `let url = bundleURL.getBundleURL('${from.publicId}') + ${relativePathExpr};`; + if (shardingConfig) { + code += `url = require('@atlaspack/domain-sharding').shardUrl(url, ${shardingConfig.maxShards});`; + } code += `module.exports = workerURL(url, bundleURL.getOrigin(url), ${String( from.env.outputFormat === 'esmodule', )});`; @@ -827,11 +842,13 @@ function getAbsoluteUrlExpr( return `new __parcel__URL__(${relativePathExpr}).toString()`; } - if (shardingConfig) { - return `require('./helpers/bundle-url-shards').getShardedBundleURL('${toBundle.name}', ${shardingConfig.maxShards}) + ${relativePathExpr}`; + const regularBundleUrl = `require('./helpers/bundle-url').getBundleURL('${fromBundle.publicId}') + ${relativePathExpr}`; + + if (!shardingConfig) { + return regularBundleUrl; } - return `require('./helpers/bundle-url').getBundleURL('${fromBundle.publicId}') + ${relativePathExpr}`; + return `require('@atlaspack/domain-sharding').shardUrl(${regularBundleUrl}, ${shardingConfig.maxShards})`; } function shouldUseRuntimeManifest( diff --git a/packages/runtimes/js/src/helpers/bundle-url-common.js b/packages/runtimes/js/src/helpers/bundle-url-common.js deleted file mode 100644 index 8a44855a8..000000000 --- a/packages/runtimes/js/src/helpers/bundle-url-common.js +++ /dev/null @@ -1,14 +0,0 @@ -/** Get the URL without the filename (last / segment) - * - * @param {string} url - * @returns {string} The URL with the file name removed - */ -function getBaseURL(url) { - return url.slice(0, url.lastIndexOf('/')) + '/'; -} - -const stackTraceUrlRegexp = - /(https?|file|ftp|(chrome|moz|safari-web)-extension):\/\/[^)\n]+/g; - -exports.getBaseURL = getBaseURL; -exports.stackTraceUrlRegexp = stackTraceUrlRegexp; diff --git a/packages/runtimes/js/src/helpers/bundle-url-shards.js b/packages/runtimes/js/src/helpers/bundle-url-shards.js deleted file mode 100644 index c9667bc11..000000000 --- a/packages/runtimes/js/src/helpers/bundle-url-shards.js +++ /dev/null @@ -1,99 +0,0 @@ -const {getBaseURL, stackTraceUrlRegexp} = require('./bundle-url-common'); - -const bundleURL = {}; - -/** - * Retrieves the sharded bundle URL based on the bundle name and the maximum number of shards. - * - * @param {string} bundleName - The file name of the requested bundle. - * @param {number} maxShards - The maximum number of domain shards available. - * @param {Error} inputError - An error object to extract the stack trace from - * (for testing purposes). - * @returns {string} The URL of the sharded bundle, without file name. - */ -function getShardedBundleURL(bundleName, maxShards, inputError) { - let value = bundleURL[bundleName]; - - if (value) { - return value; - } - - try { - throw inputError ?? new Error(); - } catch (err) { - var matches = ('' + err.stack).match(stackTraceUrlRegexp); - - if (!matches) { - return '/'; - } - - // The first stack frame will be this function. - // Use the 2nd one, which will be a runtime in the original bundle. - const stackUrl = matches[1]; - const baseUrl = getBaseURL(stackUrl); - - // Global variable is set by SSR servers when HTTP1.1 traffic is detected - if (!globalThis.__ATLASPACK_ENABLE_DOMAIN_SHARDS) { - bundleURL[bundleName] = baseUrl; - return baseUrl; - } - - const shardNumber = getDomainShardIndex(bundleName, maxShards); - const url = new URL(baseUrl); - - const shardedDomain = getShardedDomain(url.hostname, shardNumber); - url.hostname = shardedDomain; - - value = url.toString(); - - bundleURL[bundleName] = value; - return value; - } -} - -function getDomainShardIndex(str, maxShards) { - let shard = str.split('').reduce((a, b) => { - const n = (a << maxShards) - a + b.charCodeAt(0); - - // The value returned by << is 64 bit, the & operator coerces to 32, - // prevents overflow as we iterate. - return n & n; - }, 0); - - shard = shard % maxShards; - - // Make number positive - if (shard < 0) { - shard += maxShards; - } - - return shard; -} - -function getShardedDomain(domain, shard) { - let i = domain.indexOf('.'); - - // Domains like localhost have no . separators - if (i === -1) { - return `${removeTrailingShard(domain)}-${shard}`; - } - - // If this domain already has a shard number in it, strip it out before adding - // the new one - const firstSubdomain = removeTrailingShard(domain.slice(0, i)); - - return `${firstSubdomain}-${shard}${domain.slice(i)}`; -} - -const trailingShardRegex = /-\d+$/; - -function removeTrailingShard(subdomain) { - if (!trailingShardRegex.test(subdomain)) { - return subdomain; - } - - const shardIdx = subdomain.lastIndexOf('-'); - return subdomain.slice(0, shardIdx); -} - -exports.getShardedBundleURL = getShardedBundleURL; diff --git a/packages/runtimes/js/src/helpers/bundle-url.js b/packages/runtimes/js/src/helpers/bundle-url.js index bbd4161b3..359e189ad 100644 --- a/packages/runtimes/js/src/helpers/bundle-url.js +++ b/packages/runtimes/js/src/helpers/bundle-url.js @@ -1,4 +1,5 @@ -const {getBaseURL, stackTraceUrlRegexp} = require('./bundle-url-common'); +const stackTraceUrlRegexp = + /(https?|file|ftp|(chrome|moz|safari-web)-extension):\/\/[^)\n]+/g; const bundleURL = {}; @@ -7,22 +8,33 @@ const bundleURL = {}; * If the URL is not cached, it computes and stores it in the cache. * * @param {string} id - The identifier for the bundle. + * @param {Error?} inputError - An error object to extract the stack trace from + * (for testing purposes). * @returns {string} The URL of the bundle, without file name. */ -function getBundleURLCached(id) { +function getBundleURLCached(id, inputError) { let value = bundleURL[id]; if (!value) { - value = getBundleURL(); + value = getBundleURL(inputError); bundleURL[id] = value; } return value; } -function getBundleURL() { +/** Get the URL without the filename (last / segment) + * + * @param {string} url + * @returns {string} The URL with the file name removed + */ +function getBaseURL(url) { + return url.slice(0, url.lastIndexOf('/')) + '/'; +} + +function getBundleURL(inputError) { try { - throw new Error(); + throw inputError ?? new Error(); } catch (err) { var matches = ('' + err.stack).match(stackTraceUrlRegexp); if (matches) { @@ -43,5 +55,7 @@ function getOrigin(url) { return new URL(url).origin; } +// TODO: convert this file to ESM once HMR issues are resolved exports.getOrigin = getOrigin; exports.getBundleURL = getBundleURLCached; +exports.getBaseURL = getBaseURL; diff --git a/packages/runtimes/js/test/bundle-url-common.test.js b/packages/runtimes/js/test/bundle-url-common.test.js deleted file mode 100644 index ede2641d6..000000000 --- a/packages/runtimes/js/test/bundle-url-common.test.js +++ /dev/null @@ -1,29 +0,0 @@ -// @flow -import assert from 'assert'; - -// $FlowFixMe importing TypeScript -import {getBaseURL} from '../src/helpers/bundle-url-common'; - -describe('getBaseUrl', () => { - it('should return the URL with the filename removed', () => { - const testUrl = - 'https://bundle-shard-3.assets.example.com/assets/testBundle.123abc.js'; - - assert.equal( - getBaseURL(testUrl), - 'https://bundle-shard-3.assets.example.com/assets/', - ); - }); - - it('should handle domains with no .', () => { - const testUrl = 'http://localhost/assets/testBundle.123abc.js'; - - assert.equal(getBaseURL(testUrl), 'http://localhost/assets/'); - }); - - it('should handle domains with ports', () => { - const testUrl = 'http://localhost:8081/assets/testBundle.123abc.js'; - - assert.equal(getBaseURL(testUrl), 'http://localhost:8081/assets/'); - }); -}); diff --git a/packages/runtimes/js/test/bundle-url-shards.test.js b/packages/runtimes/js/test/bundle-url-shards.test.js deleted file mode 100644 index cfd6186ed..000000000 --- a/packages/runtimes/js/test/bundle-url-shards.test.js +++ /dev/null @@ -1,132 +0,0 @@ -// @flow -import assert from 'assert'; - -import {fsFixture, overlayFS, bundle} from '@atlaspack/test-utils'; - -// $FlowFixMe importing TypeScript -import {getShardedBundleURL} from '../src/helpers/bundle-url-shards'; - -const createErrorStack = (url) => { - // This error stack is copied from a local dev, with a bunch - // of lines trimmed off the end so it's not unnecessarily long - return ` -Error - at Object.getShardedBundleURL (http://localhost:8081/main-bundle.1a2fa8b7.js:15688:29) - at a7u9v.6d3ceb6ac67fea50 (${url}.1a2fa8b7.js:361466:46) - at newRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:71:24) - at localRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:84:35) - at 7H8wc.react-intl-next (http://localhost:8081/main-bundle.1a2fa8b7.js:279746:28) - at newRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:71:24) - at localRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:84:35) - at 1nL5S../manifest (http://localhost:8081/main-bundle.1a2fa8b7.js:279714:17) - at newRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:71:24) - at localRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:84:35) -`.trim(); -}; - -describe('bundle-url-shards helper', () => { - describe('getShardedBundleURL', () => { - beforeEach(() => { - // $FlowFixMe - delete globalThis.__ATLASPACK_ENABLE_DOMAIN_SHARDS; - }); - - it('should shard a URL if the global variable is set', () => { - const testBundle = 'test-bundle.123abc.js'; - - // $FlowFixMe - globalThis.__ATLASPACK_ENABLE_DOMAIN_SHARDS = true; - - const err = new Error(); - err.stack = createErrorStack( - 'https://bundle-shard.assets.example.com/assets/ParentBundle.cba321.js', - ); - - const result = getShardedBundleURL(testBundle, 5, err); - - assert.equal(result, 'https://bundle-shard-0.assets.example.com/assets/'); - }); - - it('should re-shard a domain that has already been sharded', () => { - const testBundle = 'TestBundle.1a2b3c.js'; - - // $FlowFixMe - globalThis.__ATLASPACK_ENABLE_DOMAIN_SHARDS = true; - - const err = new Error(); - err.stack = createErrorStack( - 'https://bundle-shard-1.assets.example.com/assets/ParentBundle.cba321.js', - ); - - const result = getShardedBundleURL(testBundle, 5, err); - - assert.equal(result, 'https://bundle-shard-4.assets.example.com/assets/'); - }); - - it('should not add a shard if the cookie is not present', () => { - const testBundle = 'UnshardedBundle.9z8x7y.js'; - - const err = new Error(); - err.stack = createErrorStack( - 'https://bundle-unsharded.assets.example.com/assets/ParentBundle.cba321.js', - ); - - const result = getShardedBundleURL(testBundle, 5, err); - - assert.equal( - result, - 'https://bundle-unsharded.assets.example.com/assets/', - ); - }); - }); - - describe('compiled into JS Runtime', () => { - it('should insert all arguments into compiled output', async () => { - const maxShards = 8; - await fsFixture(overlayFS)` - package.json: - { - "name": "bundle-sharding-test", - "@atlaspack/runtime-js": { - "domainSharding": { - "maxShards": ${maxShards} - } - } - } - - src/index.js: - async function fn() { - const a = await import('./a.js'); - const b = await import('./b.js'); - console.log('a', a, b); - } - fn(); - - src/a.js: - export const a = async () => { - const b = await import('./b'); - return b + 'A'; - } - src/b.js: - export const b = 'B'; - - yarn.lock: - `; - - const bundleGraph = await bundle('src/index.js', {inputFS: overlayFS}); - - const mainBundle = bundleGraph - .getBundles() - .find((b) => b.name === 'index.js'); - if (!mainBundle) return assert(mainBundle); - - const code = await overlayFS.readFile(mainBundle.filePath, 'utf-8'); - assert.ok( - code.includes( - `require("e3ed71d88565db").getShardedBundleURL('b.8575baaf.js', ${maxShards}) + "b.8575baaf.js"`, - ), - 'Expected generated code for getShardedBundleURL was not found', - ); - }); - }); -}); diff --git a/packages/runtimes/js/test/bundle-url.test.js b/packages/runtimes/js/test/bundle-url.test.js new file mode 100644 index 000000000..a48651e8f --- /dev/null +++ b/packages/runtimes/js/test/bundle-url.test.js @@ -0,0 +1,62 @@ +// @flow +import assert from 'assert'; + +import {getBaseURL, getBundleURL} from '../src/helpers/bundle-url'; + +const createErrorStack = (url) => { + // This error stack is copied from a local dev, with a bunch + // of lines trimmed off the end so it's not unnecessarily long + return ` +Error + at Object.getBundleURL (http://localhost:8081/main-bundle.1a2fa8b7.js:15688:29) + at Object.getBundleURLCached (http://localhost:8081/main-bundle.1a2fa8b7.js:15688:29) + at a7u9v.6d3ceb6ac67fea50 (${url}:361466:46) + at newRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:71:24) + at localRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:84:35) + at 7H8wc.react-intl-next (http://localhost:8081/main-bundle.1a2fa8b7.js:279746:28) + at newRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:71:24) + at localRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:84:35) + at 1nL5S../manifest (http://localhost:8081/main-bundle.1a2fa8b7.js:279714:17) + at newRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:71:24) + at localRequire (http://localhost:8081/main-bundle.1a2fa8b7.js:84:35) +`.trim(); +}; + +describe('getBaseUrl', () => { + it('should return the URL with the filename removed', () => { + const testUrl = + 'https://bundle-shard-3.assets.example.com/assets/testBundle.123abc.js'; + + assert.equal( + getBaseURL(testUrl), + 'https://bundle-shard-3.assets.example.com/assets/', + ); + }); + + it('should handle domains with no .', () => { + const testUrl = 'http://localhost/assets/testBundle.123abc.js'; + + assert.equal(getBaseURL(testUrl), 'http://localhost/assets/'); + }); + + it('should handle domains with ports', () => { + const testUrl = 'http://localhost:8081/assets/testBundle.123abc.js'; + + assert.equal(getBaseURL(testUrl), 'http://localhost:8081/assets/'); + }); +}); + +describe('getBundleURL', () => { + it('should return the URL of the bundle without the file name', () => { + const testUrl = + 'https://bundle-domain.assets.example.com/assets/testBundle.123abc.js'; + + const errorStack = createErrorStack(testUrl); + const error = new Error(); + error.stack = errorStack; + + const result = getBundleURL('test-asset', error); + + assert.equal(result, 'https://bundle-domain.assets.example.com/assets/'); + }); +}); diff --git a/packages/utils/domain-sharding/package.json b/packages/utils/domain-sharding/package.json new file mode 100644 index 000000000..e915fc903 --- /dev/null +++ b/packages/utils/domain-sharding/package.json @@ -0,0 +1,6 @@ +{ + "name": "@atlaspack/domain-sharding", + "version": "2.12.0", + "source": "src/index.js", + "main": "lib/index.js" +} diff --git a/packages/utils/domain-sharding/src/index.js b/packages/utils/domain-sharding/src/index.js new file mode 100644 index 000000000..b10394b4b --- /dev/null +++ b/packages/utils/domain-sharding/src/index.js @@ -0,0 +1,135 @@ +let globalKeyName = '__ATLASPACK_ENABLE_DOMAIN_SHARDS'; + +/** + * Extracts the file name from a static asset path. + * Will throw if the path doesn't have segments or ends in a trailing slash. + * + * @param {string} pathname + * @returns {string} + */ +function getFilenameFromUrlPath(pathname) { + let lastSlashIdx = pathname.lastIndexOf('/'); + + if (lastSlashIdx === -1 || lastSlashIdx === pathname.length - 1) { + throw new Error( + `Expected an absolute URL with a file name, unable to apply sharding.`, + ); + } + + // Add 1 to skip over the / itself + return pathname.slice(lastSlashIdx + 1); +} + +/** + * Generates a bounded numeric hash in [0, maxShards) + * + * @param {string} str + * @param {number} maxShards + * @returns {number} + */ +function getDomainShardIndex(str, maxShards) { + let shard = str.split('').reduce((a, b) => { + let n = (a << maxShards) - a + b.charCodeAt(0); + + // The value returned by << is 64 bit, the & operator coerces to 32, + // prevents overflow as we iterate. + return n & n; + }, 0); + + shard = shard % maxShards; + + // Make number positive + if (shard < 0) { + shard += maxShards; + } + + return shard; +} + +let trailingShardRegex = /-\d+$/; + +/** + * @param {string} subdomain + */ +function removeTrailingShard(subdomain) { + if (!trailingShardRegex.test(subdomain)) { + return subdomain; + } + + let shardIdx = subdomain.lastIndexOf('-'); + return subdomain.slice(0, shardIdx); +} + +/** + * Given a shard number, inserts that shard in the expected pattern within the + * domain + * + * @param {string} domain + * @param {number} shard + */ +function applyShardToDomain(domain, shard) { + let i = domain.indexOf('.'); + + // Domains like localhost have no . separators + if (i === -1) { + return `${removeTrailingShard(domain)}-${shard}`; + } + + // If this domain already has a shard number in it, strip it + // out before adding the new one + let firstSubdomain = removeTrailingShard(domain.slice(0, i)); + + return `${firstSubdomain}-${shard}${domain.slice(i)}`; +} + +/** + * Takes an absolute URL and applies a shard to the top level subdomain. + * The shard number is based on a hash of the file name, which is + * the content after the last / in the URL. + * + * Unlike `shardUrl`, this function will always apply sharding, without any + * conditional logic. + * + * @param {string} url + * @param {number} maxShards + * @returns {string} + */ + +function shardUrlUnchecked(url, maxShards) { + let parsedUrl = new URL(url); + + let fileName = getFilenameFromUrlPath(parsedUrl.pathname); + let shardNumber = getDomainShardIndex(fileName, maxShards); + + parsedUrl.hostname = applyShardToDomain(parsedUrl.hostname, shardNumber); + + return parsedUrl.toString(); +} + +/** + * Takes an absolute URL and applies a shard to the top level subdomain. + * The shard number is based on a hash of the file name, which is + * the content after the last / in the URL. + * + * This function only applies the sharding if the + * __ATLASPACK_ENABLE_DOMAIN_SHARDS global variable has been set to true + * + * @param {string} url + * @param {number} maxShards + * @returns {string} + */ +function shardUrl(url, maxShards) { + // Global variable is set by SSR servers when HTTP1.1 traffic is detected + if (!globalThis[globalKeyName]) { + return url; + } + + return shardUrlUnchecked(url, maxShards); +} + +// TODO: convert this file to ESM once HMR issues are resolved +exports.shardUrl = shardUrl; +exports.shardUrlUnchecked = shardUrlUnchecked; +exports.getDomainShardIndex = getDomainShardIndex; +exports.applyShardToDomain = applyShardToDomain; +exports.domainShardingKey = globalKeyName; diff --git a/packages/utils/domain-sharding/test/index.test.js b/packages/utils/domain-sharding/test/index.test.js new file mode 100644 index 000000000..79b178d6e --- /dev/null +++ b/packages/utils/domain-sharding/test/index.test.js @@ -0,0 +1,79 @@ +// @flow +import assert from 'assert'; +import {shardUrlUnchecked, shardUrl, domainShardingKey} from '../src/index.js'; + +describe('domain sharding helpers', () => { + beforeEach(() => { + // $FlowFixMe + delete globalThis[domainShardingKey]; + }); + + describe('shardUrlUnchecked', () => { + it('should shard a URL', () => { + const testBundle = + 'https://bundle-shard.assets.example.com/assets/test-bundle.123abc.js'; + + const result = shardUrlUnchecked(testBundle, 5); + + assert.equal( + result, + 'https://bundle-shard-0.assets.example.com/assets/test-bundle.123abc.js', + ); + }); + + it('should re-shard a domain that has already been sharded', () => { + const testBundle = + 'https://bundle-shard-0.assets.example.com/assets/TestBundle.1a2b3c.js'; + + const result = shardUrlUnchecked(testBundle, 5); + + assert.equal( + result, + 'https://bundle-shard-4.assets.example.com/assets/TestBundle.1a2b3c.js', + ); + }); + + it('should handle domains with no .', () => { + const testBundle = 'http://localhost/assets/testBundle.123abc.js'; + + const result = shardUrlUnchecked(testBundle, 5); + + assert.equal(result, 'http://localhost-3/assets/testBundle.123abc.js'); + }); + + it('should handle domains with ports', () => { + const testBundle = 'http://localhost:8081/assets/testBundle.123abc.js'; + + const result = shardUrlUnchecked(testBundle, 5); + + assert.equal( + result, + 'http://localhost-3:8081/assets/testBundle.123abc.js', + ); + }); + }); + + describe('shardUrl', () => { + it('should add a shard if the window property is set', () => { + globalThis[domainShardingKey] = true; + const testBundle = + 'https://bundle-shard.assets.example.com/assets/test-bundle.123abc.js'; + + const result = shardUrl(testBundle, 5); + + assert.equal( + result, + 'https://bundle-shard-0.assets.example.com/assets/test-bundle.123abc.js', + ); + }); + + it('should not add a shard if the window property is not set', () => { + const testBundle = + 'https://bundle-shard.assets.example.com/assets/test-bundle.123abc.js'; + + const result = shardUrl(testBundle, 5); + + assert.equal(result, testBundle); + }); + }); +});