@parcel/utils 2.0.0-nightly.122 → 2.0.0-nightly.1221
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +6 -6
- package/lib/index.js +36742 -307
- package/lib/index.js.map +1 -0
- package/package.json +43 -20
- package/src/DefaultMap.js +1 -1
- package/src/PromiseQueue.js +16 -12
- package/src/alternatives.js +143 -0
- package/src/ansi-html.js +2 -2
- package/src/blob.js +2 -1
- package/src/bundle-url.js +1 -1
- package/src/collection.js +26 -14
- package/src/config.js +101 -36
- package/src/countLines.js +5 -2
- package/src/debounce.js +1 -1
- package/src/dependency-location.js +11 -6
- package/src/generateBuildMetrics.js +158 -0
- package/src/generateCertificate.js +1 -1
- package/src/getCertificate.js +1 -1
- package/src/getExisting.js +1 -4
- package/src/getModuleParts.js +23 -0
- package/src/getRootDir.js +1 -2
- package/src/glob.js +39 -10
- package/src/hash.js +34 -0
- package/src/http-server.js +29 -19
- package/src/index.js +55 -21
- package/src/is-url.js +1 -1
- package/src/isDirectoryInside.js +11 -0
- package/src/openInBrowser.js +64 -0
- package/src/path.js +38 -6
- package/src/prettyDiagnostic.js +70 -24
- package/src/progress-message.js +22 -0
- package/src/relativeBundlePath.js +8 -13
- package/src/replaceBundleReferences.js +85 -41
- package/src/schema.js +101 -44
- package/src/shared-buffer.js +24 -0
- package/src/sourcemap.js +135 -0
- package/src/stream.js +31 -1
- package/src/urlJoin.js +3 -1
- package/test/DefaultMap.test.js +7 -4
- package/test/config.test.js +98 -0
- package/test/input/config/.testrc +3 -0
- package/test/input/config/config.cjs +3 -0
- package/test/input/config/config.js +3 -0
- package/test/input/config/config.json +3 -0
- package/test/input/config/empty.json +0 -0
- package/test/input/config/empty.toml +0 -0
- package/test/input/sourcemap/referenced-min.js +2 -0
- package/test/input/sourcemap/referenced-min.js.map +6 -0
- package/test/input/sourcemap/source-root.js +2 -0
- package/test/input/sourcemap/source-root.js.map +7 -0
- package/test/replaceBundleReferences.test.js +268 -0
- package/test/sourcemap.test.js +207 -0
- package/test/throttle.test.js +1 -2
- package/test/urlJoin.test.js +37 -0
- package/lib/DefaultMap.js +0 -64
- package/lib/Deferred.js +0 -26
- package/lib/PromiseQueue.js +0 -133
- package/lib/TapStream.js +0 -41
- package/lib/ansi-html.js +0 -16
- package/lib/blob.js +0 -31
- package/lib/bundle-url.js +0 -43
- package/lib/collection.js +0 -62
- package/lib/config.js +0 -88
- package/lib/countLines.js +0 -18
- package/lib/debounce.js +0 -20
- package/lib/dependency-location.js +0 -21
- package/lib/escape-html.js +0 -24
- package/lib/generateBundleReport.js +0 -38
- package/lib/generateCertificate.js +0 -124
- package/lib/getCertificate.js +0 -19
- package/lib/getExisting.js +0 -23
- package/lib/getRootDir.js +0 -55
- package/lib/glob.js +0 -76
- package/lib/http-server.js +0 -64
- package/lib/is-url.js +0 -17
- package/lib/loadSourceMapUrl.js +0 -33
- package/lib/md5.js +0 -35
- package/lib/objectHash.js +0 -26
- package/lib/parseCSSImport.js +0 -16
- package/lib/path.js +0 -22
- package/lib/prettifyTime.js +0 -10
- package/lib/prettyDiagnostic.js +0 -57
- package/lib/promisify.js +0 -13
- package/lib/relativeBundlePath.js +0 -24
- package/lib/relativeUrl.js +0 -16
- package/lib/replaceBundleReferences.js +0 -151
- package/lib/resolve.js +0 -93
- package/lib/schema.js +0 -320
- package/lib/serializeObject.js +0 -28
- package/lib/stream.js +0 -51
- package/lib/throttle.js +0 -16
- package/lib/urlJoin.js +0 -27
- package/src/.babelrc +0 -3
- package/src/generateBundleReport.js +0 -51
- package/src/loadSourceMapUrl.js +0 -33
- package/src/md5.js +0 -44
- package/src/promisify.js +0 -13
- package/src/resolve.js +0 -135
- package/src/serializeObject.js +0 -22
- package/test/input/sourcemap/referenced.js +0 -7
- package/test/loadSourceMapUrl.test.js +0 -37
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// @flow
|
|
2
|
+
/* global MessageChannel:readonly */
|
|
3
|
+
|
|
4
|
+
export let SharedBuffer: Class<ArrayBuffer> | Class<SharedArrayBuffer>;
|
|
5
|
+
|
|
6
|
+
// $FlowFixMe[prop-missing]
|
|
7
|
+
if (process.browser) {
|
|
8
|
+
SharedBuffer = ArrayBuffer;
|
|
9
|
+
// Safari has removed the constructor
|
|
10
|
+
if (typeof SharedArrayBuffer !== 'undefined') {
|
|
11
|
+
let channel = new MessageChannel();
|
|
12
|
+
try {
|
|
13
|
+
// Firefox might throw when sending the Buffer over a MessagePort
|
|
14
|
+
channel.port1.postMessage(new SharedArrayBuffer(0));
|
|
15
|
+
SharedBuffer = SharedArrayBuffer;
|
|
16
|
+
} catch (_) {
|
|
17
|
+
// NOOP
|
|
18
|
+
}
|
|
19
|
+
channel.port1.close();
|
|
20
|
+
channel.port2.close();
|
|
21
|
+
}
|
|
22
|
+
} else {
|
|
23
|
+
SharedBuffer = SharedArrayBuffer;
|
|
24
|
+
}
|
package/src/sourcemap.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// @flow
|
|
2
|
+
import type {SourceLocation} from '@parcel/types';
|
|
3
|
+
import type {FileSystem} from '@parcel/fs';
|
|
4
|
+
import SourceMap from '@parcel/source-map';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import {normalizeSeparators, isAbsolute} from './path';
|
|
7
|
+
|
|
8
|
+
export const SOURCEMAP_RE: RegExp =
|
|
9
|
+
/(?:\/\*|\/\/)\s*[@#]\s*sourceMappingURL\s*=\s*([^\s*]+)(?:\s*\*\/)?\s*$/;
|
|
10
|
+
const DATA_URL_RE = /^data:[^;]+(?:;charset=[^;]+)?;base64,(.*)/;
|
|
11
|
+
export const SOURCEMAP_EXTENSIONS: Set<string> = new Set<string>([
|
|
12
|
+
'css',
|
|
13
|
+
'es',
|
|
14
|
+
'es6',
|
|
15
|
+
'js',
|
|
16
|
+
'jsx',
|
|
17
|
+
'mjs',
|
|
18
|
+
'ts',
|
|
19
|
+
'tsx',
|
|
20
|
+
]);
|
|
21
|
+
|
|
22
|
+
export function matchSourceMappingURL(
|
|
23
|
+
contents: string,
|
|
24
|
+
): null | RegExp$matchResult {
|
|
25
|
+
return contents.match(SOURCEMAP_RE);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function loadSourceMapUrl(
|
|
29
|
+
fs: FileSystem,
|
|
30
|
+
filename: string,
|
|
31
|
+
contents: string,
|
|
32
|
+
): Promise<?{|filename: string, map: any, url: string|}> {
|
|
33
|
+
let match = matchSourceMappingURL(contents);
|
|
34
|
+
if (match) {
|
|
35
|
+
let url = match[1].trim();
|
|
36
|
+
let dataURLMatch = url.match(DATA_URL_RE);
|
|
37
|
+
|
|
38
|
+
let mapFilePath;
|
|
39
|
+
if (dataURLMatch) {
|
|
40
|
+
mapFilePath = filename;
|
|
41
|
+
} else {
|
|
42
|
+
mapFilePath = url.replace(/^file:\/\//, '');
|
|
43
|
+
mapFilePath = isAbsolute(mapFilePath)
|
|
44
|
+
? mapFilePath
|
|
45
|
+
: path.join(path.dirname(filename), mapFilePath);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
url,
|
|
50
|
+
filename: mapFilePath,
|
|
51
|
+
map: JSON.parse(
|
|
52
|
+
dataURLMatch
|
|
53
|
+
? Buffer.from(dataURLMatch[1], 'base64').toString()
|
|
54
|
+
: await fs.readFile(mapFilePath, 'utf8'),
|
|
55
|
+
),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function loadSourceMap(
|
|
61
|
+
filename: string,
|
|
62
|
+
contents: string,
|
|
63
|
+
options: {fs: FileSystem, projectRoot: string, ...},
|
|
64
|
+
): Promise<?SourceMap> {
|
|
65
|
+
let foundMap = await loadSourceMapUrl(options.fs, filename, contents);
|
|
66
|
+
if (foundMap) {
|
|
67
|
+
let mapSourceRoot = path.dirname(filename);
|
|
68
|
+
if (
|
|
69
|
+
foundMap.map.sourceRoot &&
|
|
70
|
+
!normalizeSeparators(foundMap.map.sourceRoot).startsWith('/')
|
|
71
|
+
) {
|
|
72
|
+
mapSourceRoot = path.join(mapSourceRoot, foundMap.map.sourceRoot);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let sourcemapInstance = new SourceMap(options.projectRoot);
|
|
76
|
+
sourcemapInstance.addVLQMap({
|
|
77
|
+
...foundMap.map,
|
|
78
|
+
sources: foundMap.map.sources.map(s => {
|
|
79
|
+
return path.join(mapSourceRoot, s);
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
82
|
+
return sourcemapInstance;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function remapSourceLocation(
|
|
87
|
+
loc: SourceLocation,
|
|
88
|
+
originalMap: SourceMap,
|
|
89
|
+
): SourceLocation {
|
|
90
|
+
let {
|
|
91
|
+
filePath,
|
|
92
|
+
start: {line: startLine, column: startCol},
|
|
93
|
+
end: {line: endLine, column: endCol},
|
|
94
|
+
} = loc;
|
|
95
|
+
let lineDiff = endLine - startLine;
|
|
96
|
+
let colDiff = endCol - startCol;
|
|
97
|
+
let start = originalMap.findClosestMapping(startLine, startCol);
|
|
98
|
+
let end = originalMap.findClosestMapping(endLine, endCol);
|
|
99
|
+
|
|
100
|
+
if (start?.original) {
|
|
101
|
+
if (start.source) {
|
|
102
|
+
filePath = start.source;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
({line: startLine, column: startCol} = start.original);
|
|
106
|
+
startCol++; // source map columns are 0-based
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (end?.original) {
|
|
110
|
+
({line: endLine, column: endCol} = end.original);
|
|
111
|
+
endCol++;
|
|
112
|
+
|
|
113
|
+
if (endLine < startLine) {
|
|
114
|
+
endLine = startLine;
|
|
115
|
+
endCol = startCol;
|
|
116
|
+
} else if (endLine === startLine && endCol < startCol && lineDiff === 0) {
|
|
117
|
+
endCol = startCol + colDiff;
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
endLine = startLine;
|
|
121
|
+
endCol = startCol;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
filePath,
|
|
126
|
+
start: {
|
|
127
|
+
line: startLine,
|
|
128
|
+
column: startCol,
|
|
129
|
+
},
|
|
130
|
+
end: {
|
|
131
|
+
line: endLine,
|
|
132
|
+
column: endCol,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
package/src/stream.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @flow strict-local
|
|
2
2
|
|
|
3
|
-
import {Readable} from 'stream';
|
|
3
|
+
import {Readable, PassThrough} from 'stream';
|
|
4
4
|
import type {Blob} from '@parcel/types';
|
|
5
5
|
|
|
6
6
|
export function measureStreamLength(stream: Readable): Promise<number> {
|
|
@@ -42,3 +42,33 @@ export function blobToStream(blob: Blob): Readable {
|
|
|
42
42
|
|
|
43
43
|
return readableFromStringOrBuffer(blob);
|
|
44
44
|
}
|
|
45
|
+
|
|
46
|
+
export function streamFromPromise(promise: Promise<Blob>): Readable {
|
|
47
|
+
const stream = new PassThrough();
|
|
48
|
+
promise.then(blob => {
|
|
49
|
+
if (blob instanceof Readable) {
|
|
50
|
+
blob.pipe(stream);
|
|
51
|
+
} else {
|
|
52
|
+
stream.end(blob);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
return stream;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function fallbackStream(
|
|
60
|
+
stream: Readable,
|
|
61
|
+
fallback: () => Readable,
|
|
62
|
+
): Readable {
|
|
63
|
+
const res = new PassThrough();
|
|
64
|
+
stream.on('error', err => {
|
|
65
|
+
if (err.code === 'ENOENT') {
|
|
66
|
+
fallback().pipe(res);
|
|
67
|
+
} else {
|
|
68
|
+
res.emit('error', err);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
stream.pipe(res);
|
|
73
|
+
return res;
|
|
74
|
+
}
|
package/src/urlJoin.js
CHANGED
|
@@ -9,7 +9,9 @@ import path from 'path';
|
|
|
9
9
|
*/
|
|
10
10
|
export default function urlJoin(publicURL: string, assetPath: string): string {
|
|
11
11
|
const url = URL.parse(publicURL, false, true);
|
|
12
|
-
|
|
12
|
+
// Leading / ensures that paths with colons are not parsed as a protocol.
|
|
13
|
+
let p = assetPath.startsWith('/') ? assetPath : '/' + assetPath;
|
|
14
|
+
const assetUrl = URL.parse(p);
|
|
13
15
|
url.pathname = path.posix.join(url.pathname, assetUrl.pathname);
|
|
14
16
|
url.search = assetUrl.search;
|
|
15
17
|
url.hash = assetUrl.hash;
|
package/test/DefaultMap.test.js
CHANGED
|
@@ -5,10 +5,13 @@ import {DefaultMap} from '../src/DefaultMap';
|
|
|
5
5
|
|
|
6
6
|
describe('DefaultMap', () => {
|
|
7
7
|
it('constructs with entries just like Map', () => {
|
|
8
|
-
let map = new DefaultMap(
|
|
9
|
-
|
|
10
|
-
[
|
|
11
|
-
|
|
8
|
+
let map = new DefaultMap(
|
|
9
|
+
k => k,
|
|
10
|
+
[
|
|
11
|
+
[1, 3],
|
|
12
|
+
[2, 27],
|
|
13
|
+
],
|
|
14
|
+
);
|
|
12
15
|
assert.equal(map.get(1), 3);
|
|
13
16
|
assert.deepEqual(Array.from(map.entries()), [
|
|
14
17
|
[1, 3],
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// @flow strict-local
|
|
2
|
+
|
|
3
|
+
import assert from 'assert';
|
|
4
|
+
import {loadConfig} from '../src/config';
|
|
5
|
+
import {inputFS as fs} from '@parcel/test-utils';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
|
|
8
|
+
describe('loadConfig', () => {
|
|
9
|
+
it('load config with json', async () => {
|
|
10
|
+
assert.deepEqual(
|
|
11
|
+
(
|
|
12
|
+
await loadConfig(
|
|
13
|
+
fs,
|
|
14
|
+
path.join(__dirname, './input/config/config.json'),
|
|
15
|
+
['config.json'],
|
|
16
|
+
path.join(__dirname, './input/config/'),
|
|
17
|
+
)
|
|
18
|
+
)?.config,
|
|
19
|
+
{
|
|
20
|
+
hoge: 'fuga',
|
|
21
|
+
},
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it('should throw error with empty string json', async () => {
|
|
26
|
+
// $FlowFixMe[prop-missing]
|
|
27
|
+
await assert.rejects(async () => {
|
|
28
|
+
await loadConfig(
|
|
29
|
+
fs,
|
|
30
|
+
path.join(__dirname, './input/config/empty.json'),
|
|
31
|
+
['empty.json'],
|
|
32
|
+
path.join(__dirname, './input/config/'),
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('should load with empty string config toml', async () => {
|
|
38
|
+
assert.deepEqual(
|
|
39
|
+
(
|
|
40
|
+
await loadConfig(
|
|
41
|
+
fs,
|
|
42
|
+
path.join(__dirname, './input/config/empty.toml'),
|
|
43
|
+
['empty.toml'],
|
|
44
|
+
path.join(__dirname, './input/config/'),
|
|
45
|
+
)
|
|
46
|
+
)?.config,
|
|
47
|
+
{},
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('should load with js', async () => {
|
|
52
|
+
assert.deepEqual(
|
|
53
|
+
(
|
|
54
|
+
await loadConfig(
|
|
55
|
+
fs,
|
|
56
|
+
path.join(__dirname, './input/config/config.js'),
|
|
57
|
+
['config.js'],
|
|
58
|
+
path.join(__dirname, './input/config/'),
|
|
59
|
+
)
|
|
60
|
+
)?.config,
|
|
61
|
+
{
|
|
62
|
+
hoge: 'fuga',
|
|
63
|
+
},
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should load with cjs', async () => {
|
|
68
|
+
assert.deepEqual(
|
|
69
|
+
(
|
|
70
|
+
await loadConfig(
|
|
71
|
+
fs,
|
|
72
|
+
path.join(__dirname, './input/config/config.cjs'),
|
|
73
|
+
['config.cjs'],
|
|
74
|
+
path.join(__dirname, './input/config/'),
|
|
75
|
+
)
|
|
76
|
+
)?.config,
|
|
77
|
+
{
|
|
78
|
+
hoge: 'fuga',
|
|
79
|
+
},
|
|
80
|
+
);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('should load without an extension as json', async () => {
|
|
84
|
+
assert.deepEqual(
|
|
85
|
+
(
|
|
86
|
+
await loadConfig(
|
|
87
|
+
fs,
|
|
88
|
+
path.join(__dirname, './input/config/.testrc'),
|
|
89
|
+
['.testrc'],
|
|
90
|
+
path.join(__dirname, './input/config/'),
|
|
91
|
+
)
|
|
92
|
+
)?.config,
|
|
93
|
+
{
|
|
94
|
+
hoge: 'fuga',
|
|
95
|
+
},
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
// @flow strict-local
|
|
2
|
+
|
|
3
|
+
import type {NamedBundle, Dependency} from '@parcel/types';
|
|
4
|
+
|
|
5
|
+
import assert from 'assert';
|
|
6
|
+
import {getURLReplacement} from '../src/replaceBundleReferences';
|
|
7
|
+
|
|
8
|
+
describe('replace bundle references', () => {
|
|
9
|
+
it('Query params and named pipeline, relative', () => {
|
|
10
|
+
// $FlowFixMe
|
|
11
|
+
let fromBundle: NamedBundle = {
|
|
12
|
+
filePath: '/user/dist/reformat.html',
|
|
13
|
+
name: 'reformat.html',
|
|
14
|
+
// $FlowFixMe
|
|
15
|
+
target: {
|
|
16
|
+
distDir: '/user/dist',
|
|
17
|
+
publicUrl: '/',
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// $FlowFixMe
|
|
22
|
+
let toBundle: NamedBundle = {
|
|
23
|
+
filePath:
|
|
24
|
+
'/user/dist/image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
25
|
+
name: 'image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
26
|
+
// $FlowFixMe
|
|
27
|
+
target: {
|
|
28
|
+
distDir: '/user/dist',
|
|
29
|
+
publicUrl: '/',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// $FlowFixMe
|
|
34
|
+
let dependency: Dependency = {
|
|
35
|
+
id: '074b36596e3147e900a8ad17ceb5c90b',
|
|
36
|
+
specifier: 'url:./image.jpg?as=webp',
|
|
37
|
+
specifierType: 'esm',
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
let result = getURLReplacement({
|
|
41
|
+
dependency,
|
|
42
|
+
fromBundle,
|
|
43
|
+
toBundle,
|
|
44
|
+
relative: true,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
assert.equal(
|
|
48
|
+
result.to,
|
|
49
|
+
'image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
50
|
+
);
|
|
51
|
+
assert.equal(result.from, '074b36596e3147e900a8ad17ceb5c90b');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('Query params and named pipeline, absolute', () => {
|
|
55
|
+
// $FlowFixMe
|
|
56
|
+
let fromBundle: NamedBundle = {
|
|
57
|
+
filePath: '/user/dist/reformat.html',
|
|
58
|
+
name: 'reformat.html',
|
|
59
|
+
// $FlowFixMe
|
|
60
|
+
target: {
|
|
61
|
+
distDir: '/user/dist',
|
|
62
|
+
publicUrl: '/',
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// $FlowFixMe
|
|
67
|
+
let toBundle: NamedBundle = {
|
|
68
|
+
filePath:
|
|
69
|
+
'/user/dist/image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
70
|
+
name: 'image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
71
|
+
// $FlowFixMe
|
|
72
|
+
target: {
|
|
73
|
+
distDir: '/user/dist',
|
|
74
|
+
publicUrl: '/',
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// $FlowFixMe
|
|
79
|
+
let dependency: Dependency = {
|
|
80
|
+
id: '074b36596e3147e900a8ad17ceb5c90b',
|
|
81
|
+
specifier: 'url:./image.jpg?as=webp',
|
|
82
|
+
specifierType: 'esm',
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
let result = getURLReplacement({
|
|
86
|
+
dependency,
|
|
87
|
+
fromBundle,
|
|
88
|
+
toBundle,
|
|
89
|
+
relative: false,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
assert.equal(
|
|
93
|
+
result.to,
|
|
94
|
+
'/image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
95
|
+
);
|
|
96
|
+
assert.equal(result.from, '074b36596e3147e900a8ad17ceb5c90b');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('Custom Public URL', () => {
|
|
100
|
+
// $FlowFixMe
|
|
101
|
+
let fromBundle: NamedBundle = {
|
|
102
|
+
filePath: '/user/dist/reformat.html',
|
|
103
|
+
name: 'reformat.html',
|
|
104
|
+
// $FlowFixMe
|
|
105
|
+
target: {
|
|
106
|
+
distDir: '/user/dist',
|
|
107
|
+
publicUrl: 'https://test.com/static',
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
// $FlowFixMe
|
|
112
|
+
let toBundle: NamedBundle = {
|
|
113
|
+
filePath:
|
|
114
|
+
'/user/dist/image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
115
|
+
name: 'image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
116
|
+
// $FlowFixMe
|
|
117
|
+
target: {
|
|
118
|
+
distDir: '/user/dist',
|
|
119
|
+
publicUrl: 'https://test.com/static',
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
// $FlowFixMe
|
|
124
|
+
let dependency: Dependency = {
|
|
125
|
+
id: '074b36596e314797845a8ad17ceb5c9b',
|
|
126
|
+
specifier: './image.jpg',
|
|
127
|
+
specifierType: 'esm',
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
let result = getURLReplacement({
|
|
131
|
+
dependency,
|
|
132
|
+
fromBundle,
|
|
133
|
+
toBundle,
|
|
134
|
+
relative: false,
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
assert.equal(
|
|
138
|
+
result.to,
|
|
139
|
+
'https://test.com/static/image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
140
|
+
);
|
|
141
|
+
assert.equal(result.from, '074b36596e314797845a8ad17ceb5c9b');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('Relative with folders in between', () => {
|
|
145
|
+
// $FlowFixMe
|
|
146
|
+
let fromBundle: NamedBundle = {
|
|
147
|
+
filePath: '/user/dist/reformat.html',
|
|
148
|
+
name: 'reformat.html',
|
|
149
|
+
// $FlowFixMe
|
|
150
|
+
target: {
|
|
151
|
+
distDir: '/user/dist',
|
|
152
|
+
publicUrl: 'https://test.com/static',
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
// $FlowFixMe
|
|
157
|
+
let toBundle: NamedBundle = {
|
|
158
|
+
filePath:
|
|
159
|
+
'/user/dist/assets/image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
160
|
+
name: 'image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
161
|
+
// $FlowFixMe
|
|
162
|
+
target: {
|
|
163
|
+
distDir: '/user/dist/assets',
|
|
164
|
+
publicUrl: 'https://test.com/static',
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
// $FlowFixMe
|
|
169
|
+
let dependency: Dependency = {
|
|
170
|
+
id: '074b36596e3147e900a8ad17ceb5c90b',
|
|
171
|
+
specifier: 'url:./image.jpg?as=webp',
|
|
172
|
+
specifierType: 'esm',
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
let result = getURLReplacement({
|
|
176
|
+
dependency,
|
|
177
|
+
fromBundle,
|
|
178
|
+
toBundle,
|
|
179
|
+
relative: true,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
assert.equal(
|
|
183
|
+
result.to,
|
|
184
|
+
'assets/image.HASH_REF_87f9d66c16c2216ccc7e5664cf089305.webp',
|
|
185
|
+
);
|
|
186
|
+
assert.equal(result.from, '074b36596e3147e900a8ad17ceb5c90b');
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it('should work with bundle names with colons, relative', () => {
|
|
190
|
+
// $FlowFixMe
|
|
191
|
+
let fromBundle: NamedBundle = {
|
|
192
|
+
filePath: '/user/dist/reformat.html',
|
|
193
|
+
name: 'reformat.html',
|
|
194
|
+
// $FlowFixMe
|
|
195
|
+
target: {
|
|
196
|
+
distDir: '/user/dist',
|
|
197
|
+
publicUrl: '/',
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
// $FlowFixMe
|
|
202
|
+
let toBundle: NamedBundle = {
|
|
203
|
+
filePath: '/user/dist/a:b:c.html',
|
|
204
|
+
name: 'a:b:c.html',
|
|
205
|
+
// $FlowFixMe
|
|
206
|
+
target: {
|
|
207
|
+
distDir: '/user/dist',
|
|
208
|
+
publicUrl: '/',
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// $FlowFixMe
|
|
213
|
+
let dependency: Dependency = {
|
|
214
|
+
id: '074b36596e3147e900a8ad17ceb5c90b',
|
|
215
|
+
specifier: './a:b:c.html',
|
|
216
|
+
specifierType: 'esm',
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
let result = getURLReplacement({
|
|
220
|
+
dependency,
|
|
221
|
+
fromBundle,
|
|
222
|
+
toBundle,
|
|
223
|
+
relative: true,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
assert.equal(result.to, './a:b:c.html');
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it('should work with bundle names with colons, absolute', () => {
|
|
230
|
+
// $FlowFixMe
|
|
231
|
+
let fromBundle: NamedBundle = {
|
|
232
|
+
filePath: '/user/dist/reformat.html',
|
|
233
|
+
name: 'reformat.html',
|
|
234
|
+
// $FlowFixMe
|
|
235
|
+
target: {
|
|
236
|
+
distDir: '/user/dist',
|
|
237
|
+
publicUrl: '/',
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
// $FlowFixMe
|
|
242
|
+
let toBundle: NamedBundle = {
|
|
243
|
+
filePath: '/user/dist/a:b:c.html',
|
|
244
|
+
name: 'a:b:c.html',
|
|
245
|
+
// $FlowFixMe
|
|
246
|
+
target: {
|
|
247
|
+
distDir: '/user/dist',
|
|
248
|
+
publicUrl: '/',
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
// $FlowFixMe
|
|
253
|
+
let dependency: Dependency = {
|
|
254
|
+
id: '074b36596e3147e900a8ad17ceb5c90b',
|
|
255
|
+
specifier: './a:b:c.html',
|
|
256
|
+
specifierType: 'esm',
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
let result = getURLReplacement({
|
|
260
|
+
dependency,
|
|
261
|
+
fromBundle,
|
|
262
|
+
toBundle,
|
|
263
|
+
relative: false,
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
assert.equal(result.to, '/a:b:c.html');
|
|
267
|
+
});
|
|
268
|
+
});
|