@parcel/utils 2.0.0-nightly.148 → 2.0.0-nightly.1481
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 +37626 -318
- package/lib/index.js.map +1 -0
- package/package.json +47 -20
- package/src/DefaultMap.js +1 -1
- package/src/PromiseQueue.js +16 -12
- package/src/alternatives.js +145 -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 +35 -15
- package/src/config.js +132 -45
- 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 +51 -10
- package/src/hash.js +49 -0
- package/src/http-server.js +29 -19
- package/src/index.js +68 -22
- 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 +102 -30
- package/src/progress-message.js +22 -0
- package/src/relativeBundlePath.js +8 -13
- package/src/replaceBundleReferences.js +85 -41
- package/src/schema.js +100 -44
- package/src/shared-buffer.js +23 -0
- package/src/sourcemap.js +138 -0
- package/src/stream.js +31 -1
- package/src/urlJoin.js +3 -1
- package/test/DefaultMap.test.js +7 -4
- package/test/collection.test.js +13 -1
- 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/escape-markdown.js +0 -15
- 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/escape-markdown.js +0 -10
- 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/escapeMarkdown.test.js +0 -29
- package/test/input/sourcemap/referenced.js +0 -7
- package/test/loadSourceMapUrl.test.js +0 -37
package/src/path.js
CHANGED
|
@@ -1,16 +1,48 @@
|
|
|
1
1
|
// @flow strict-local
|
|
2
|
-
|
|
3
2
|
import type {FilePath} from '@parcel/types';
|
|
4
3
|
import path from 'path';
|
|
5
4
|
|
|
6
|
-
const
|
|
5
|
+
const ABSOLUTE_PATH_REGEX = /^([a-zA-Z]:){0,1}[\\/]+/;
|
|
6
|
+
const SEPARATOR_REGEX = /[\\]+/g;
|
|
7
|
+
|
|
8
|
+
export function isAbsolute(filepath: string): boolean {
|
|
9
|
+
return ABSOLUTE_PATH_REGEX.test(filepath);
|
|
10
|
+
}
|
|
7
11
|
|
|
8
12
|
export function normalizeSeparators(filePath: FilePath): FilePath {
|
|
9
|
-
|
|
13
|
+
return filePath.replace(SEPARATOR_REGEX, '/');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type PathOptions = {
|
|
17
|
+
noLeadingDotSlash?: boolean,
|
|
18
|
+
...
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export function normalizePath(
|
|
22
|
+
filePath: FilePath,
|
|
23
|
+
leadingDotSlash: boolean = true,
|
|
24
|
+
): FilePath {
|
|
25
|
+
if (
|
|
26
|
+
leadingDotSlash &&
|
|
27
|
+
(filePath[0] !== '.' ||
|
|
28
|
+
(filePath[1] !== '.' && filePath[1] !== '/' && filePath[1] !== '\\')) &&
|
|
29
|
+
!path.isAbsolute(filePath)
|
|
30
|
+
) {
|
|
31
|
+
return normalizeSeparators('./' + filePath);
|
|
32
|
+
} else {
|
|
33
|
+
return normalizeSeparators(filePath);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
10
36
|
|
|
11
|
-
|
|
12
|
-
|
|
37
|
+
export function relativePath(
|
|
38
|
+
from: string,
|
|
39
|
+
to: string,
|
|
40
|
+
leadingDotSlash: boolean = true,
|
|
41
|
+
): FilePath {
|
|
42
|
+
// Fast path
|
|
43
|
+
if (to.startsWith(from + '/')) {
|
|
44
|
+
return (leadingDotSlash ? './' : '') + to.slice(from.length + 1);
|
|
13
45
|
}
|
|
14
46
|
|
|
15
|
-
return
|
|
47
|
+
return normalizePath(path.relative(from, to), leadingDotSlash);
|
|
16
48
|
}
|
package/src/prettyDiagnostic.js
CHANGED
|
@@ -1,66 +1,138 @@
|
|
|
1
1
|
// @flow strict-local
|
|
2
2
|
import type {Diagnostic} from '@parcel/diagnostic';
|
|
3
|
+
import type {PluginOptions} from '@parcel/types';
|
|
3
4
|
|
|
4
5
|
import formatCodeFrame from '@parcel/codeframe';
|
|
5
|
-
import
|
|
6
|
-
import
|
|
6
|
+
import _mdAnsi from '@parcel/markdown-ansi';
|
|
7
|
+
import _chalk from 'chalk';
|
|
7
8
|
import path from 'path';
|
|
9
|
+
// $FlowFixMe
|
|
10
|
+
import _terminalLink from 'terminal-link';
|
|
11
|
+
|
|
12
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
13
|
+
// $FlowFixMe
|
|
14
|
+
import snarkdown from 'snarkdown';
|
|
15
|
+
/* eslint-enable import/no-extraneous-dependencies */
|
|
16
|
+
|
|
17
|
+
export type FormattedCodeFrame = {|
|
|
18
|
+
location: string,
|
|
19
|
+
code: string,
|
|
20
|
+
|};
|
|
8
21
|
|
|
9
22
|
export type AnsiDiagnosticResult = {|
|
|
10
23
|
message: string,
|
|
11
24
|
stack: string,
|
|
25
|
+
/** A formatted string containing all code frames, including their file locations. */
|
|
12
26
|
codeframe: string,
|
|
27
|
+
/** A list of code frames with highlighted code and file locations separately. */
|
|
28
|
+
frames: Array<FormattedCodeFrame>,
|
|
13
29
|
hints: Array<string>,
|
|
30
|
+
documentation: string,
|
|
14
31
|
|};
|
|
15
32
|
|
|
16
|
-
export default function prettyDiagnostic(
|
|
33
|
+
export default async function prettyDiagnostic(
|
|
17
34
|
diagnostic: Diagnostic,
|
|
18
|
-
|
|
35
|
+
options?: PluginOptions,
|
|
36
|
+
terminalWidth?: number,
|
|
37
|
+
format: 'ansi' | 'html' = 'ansi',
|
|
38
|
+
): Promise<AnsiDiagnosticResult> {
|
|
19
39
|
let {
|
|
20
40
|
origin,
|
|
21
41
|
message,
|
|
22
42
|
stack,
|
|
23
|
-
|
|
43
|
+
codeFrames,
|
|
24
44
|
hints,
|
|
25
|
-
filePath,
|
|
26
|
-
language,
|
|
27
45
|
skipFormatting,
|
|
46
|
+
documentationURL,
|
|
28
47
|
} = diagnostic;
|
|
29
48
|
|
|
49
|
+
const md = format === 'ansi' ? _mdAnsi : snarkdown;
|
|
50
|
+
const terminalLink =
|
|
51
|
+
format === 'ansi'
|
|
52
|
+
? _terminalLink
|
|
53
|
+
: // eslint-disable-next-line no-unused-vars
|
|
54
|
+
(text, url, _) => `<a href="${url}">${text}</a>`;
|
|
55
|
+
const chalk =
|
|
56
|
+
format === 'ansi'
|
|
57
|
+
? _chalk
|
|
58
|
+
: {
|
|
59
|
+
gray: {
|
|
60
|
+
underline: v =>
|
|
61
|
+
`<span style="color: grey; text-decoration: underline;">${v}</span>`,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
|
|
30
65
|
let result = {
|
|
31
66
|
message:
|
|
32
|
-
|
|
33
|
-
(skipFormatting ? message :
|
|
34
|
-
stack:
|
|
67
|
+
md(`**${origin ?? 'unknown'}**: `) +
|
|
68
|
+
(skipFormatting ? message : md(message)),
|
|
69
|
+
stack: '',
|
|
35
70
|
codeframe: '',
|
|
71
|
+
frames: [],
|
|
36
72
|
hints: [],
|
|
73
|
+
documentation: '',
|
|
37
74
|
};
|
|
38
75
|
|
|
39
|
-
if (
|
|
40
|
-
let
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
76
|
+
if (codeFrames != null) {
|
|
77
|
+
for (let codeFrame of codeFrames) {
|
|
78
|
+
let filePath = codeFrame.filePath;
|
|
79
|
+
if (filePath != null && options && !path.isAbsolute(filePath)) {
|
|
80
|
+
filePath = path.join(options.projectRoot, filePath);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
let highlights = codeFrame.codeHighlights;
|
|
84
|
+
let code = codeFrame.code;
|
|
85
|
+
if (code == null && options && filePath != null) {
|
|
86
|
+
code = await options.inputFS.readFile(filePath, 'utf8');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
let formattedCodeFrame = '';
|
|
90
|
+
if (code != null) {
|
|
91
|
+
formattedCodeFrame = formatCodeFrame(code, highlights, {
|
|
92
|
+
useColor: true,
|
|
93
|
+
syntaxHighlighting: true,
|
|
94
|
+
language:
|
|
95
|
+
// $FlowFixMe sketchy null checks do not matter here...
|
|
96
|
+
codeFrame.language ||
|
|
97
|
+
(filePath != null ? path.extname(filePath).substr(1) : undefined),
|
|
98
|
+
terminalWidth,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
51
101
|
|
|
52
|
-
|
|
53
|
-
typeof filePath !== 'string'
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
102
|
+
let location;
|
|
103
|
+
if (typeof filePath !== 'string') {
|
|
104
|
+
location = '';
|
|
105
|
+
} else if (highlights.length === 0) {
|
|
106
|
+
location = filePath;
|
|
107
|
+
} else {
|
|
108
|
+
location = `${filePath}:${highlights[0].start.line}:${highlights[0].start.column}`;
|
|
109
|
+
}
|
|
110
|
+
result.codeframe += location ? chalk.gray.underline(location) + '\n' : '';
|
|
111
|
+
result.codeframe += formattedCodeFrame;
|
|
112
|
+
if (codeFrame !== codeFrames[codeFrames.length - 1]) {
|
|
113
|
+
result.codeframe += '\n\n';
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
result.frames.push({
|
|
117
|
+
location,
|
|
118
|
+
code: formattedCodeFrame,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (stack != null) {
|
|
124
|
+
result.stack = stack;
|
|
59
125
|
}
|
|
60
126
|
|
|
61
127
|
if (Array.isArray(hints) && hints.length) {
|
|
62
128
|
result.hints = hints.map(h => {
|
|
63
|
-
return
|
|
129
|
+
return md(h);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (documentationURL != null) {
|
|
134
|
+
result.documentation = terminalLink('Learn more', documentationURL, {
|
|
135
|
+
fallback: (text, url) => `${text}: ${url}`,
|
|
64
136
|
});
|
|
65
137
|
}
|
|
66
138
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// @flow strict-local
|
|
2
|
+
import type {BuildProgressEvent} from '@parcel/types';
|
|
3
|
+
|
|
4
|
+
import path from 'path';
|
|
5
|
+
|
|
6
|
+
export function getProgressMessage(event: BuildProgressEvent): ?string {
|
|
7
|
+
switch (event.phase) {
|
|
8
|
+
case 'transforming':
|
|
9
|
+
return `Building ${path.basename(event.filePath)}...`;
|
|
10
|
+
|
|
11
|
+
case 'bundling':
|
|
12
|
+
return 'Bundling...';
|
|
13
|
+
|
|
14
|
+
case 'packaging':
|
|
15
|
+
return `Packaging ${event.bundle.displayName}...`;
|
|
16
|
+
|
|
17
|
+
case 'optimizing':
|
|
18
|
+
return `Optimizing ${event.bundle.displayName}...`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
// @flow strict-local
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type {FilePath, NamedBundle} from '@parcel/types';
|
|
4
4
|
|
|
5
5
|
import path from 'path';
|
|
6
|
-
import
|
|
6
|
+
import {relativePath} from './path';
|
|
7
7
|
|
|
8
8
|
export function relativeBundlePath(
|
|
9
|
-
from:
|
|
10
|
-
to:
|
|
9
|
+
from: NamedBundle,
|
|
10
|
+
to: NamedBundle,
|
|
11
11
|
opts: {|leadingDotSlash: boolean|} = {leadingDotSlash: true},
|
|
12
|
-
) {
|
|
13
|
-
let
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
if (opts.leadingDotSlash && p[0] !== '.') {
|
|
17
|
-
p = './' + p;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return p;
|
|
12
|
+
): FilePath {
|
|
13
|
+
let fromPath = path.join(from.target.distDir, from.name);
|
|
14
|
+
let toPath = path.join(to.target.distDir, to.name);
|
|
15
|
+
return relativePath(path.dirname(fromPath), toPath, opts.leadingDotSlash);
|
|
21
16
|
}
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
// @flow strict-local
|
|
2
2
|
|
|
3
3
|
import type SourceMap from '@parcel/source-map';
|
|
4
|
-
import type {
|
|
4
|
+
import type {
|
|
5
|
+
Async,
|
|
6
|
+
Blob,
|
|
7
|
+
Bundle,
|
|
8
|
+
BundleGraph,
|
|
9
|
+
Dependency,
|
|
10
|
+
NamedBundle,
|
|
11
|
+
} from '@parcel/types';
|
|
5
12
|
|
|
6
13
|
import {Readable} from 'stream';
|
|
7
14
|
import nullthrows from 'nullthrows';
|
|
15
|
+
import invariant from 'assert';
|
|
8
16
|
import URL from 'url';
|
|
9
|
-
import {bufferStream, relativeBundlePath, urlJoin} from '
|
|
17
|
+
import {bufferStream, relativeBundlePath, urlJoin} from './';
|
|
10
18
|
|
|
11
19
|
type ReplacementMap = Map<
|
|
12
20
|
string /* dependency id */,
|
|
@@ -15,7 +23,7 @@ type ReplacementMap = Map<
|
|
|
15
23
|
|
|
16
24
|
/*
|
|
17
25
|
* Replaces references to dependency ids for URL dependencies with:
|
|
18
|
-
* - in the case of an unresolvable url dependency, the original
|
|
26
|
+
* - in the case of an unresolvable url dependency, the original specifier.
|
|
19
27
|
* These are external requests that Parcel did not bundle.
|
|
20
28
|
* - in the case of a reference to another bundle, the relative url to that
|
|
21
29
|
* bundle from the current bundle.
|
|
@@ -25,44 +33,55 @@ export function replaceURLReferences({
|
|
|
25
33
|
bundleGraph,
|
|
26
34
|
contents,
|
|
27
35
|
map,
|
|
36
|
+
getReplacement = s => s,
|
|
28
37
|
relative = true,
|
|
29
38
|
}: {|
|
|
30
|
-
bundle:
|
|
31
|
-
bundleGraph: BundleGraph
|
|
39
|
+
bundle: NamedBundle,
|
|
40
|
+
bundleGraph: BundleGraph<NamedBundle>,
|
|
32
41
|
contents: string,
|
|
33
42
|
relative?: boolean,
|
|
34
43
|
map?: ?SourceMap,
|
|
44
|
+
getReplacement?: string => string,
|
|
35
45
|
|}): {|+contents: string, +map: ?SourceMap|} {
|
|
36
46
|
let replacements = new Map();
|
|
47
|
+
let urlDependencies = [];
|
|
48
|
+
bundle.traverse(node => {
|
|
49
|
+
if (node.type === 'dependency' && node.value.specifierType === 'url') {
|
|
50
|
+
urlDependencies.push(node.value);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
37
53
|
|
|
38
|
-
for (let dependency of
|
|
39
|
-
if (
|
|
54
|
+
for (let dependency of urlDependencies) {
|
|
55
|
+
if (dependency.specifierType !== 'url') {
|
|
40
56
|
continue;
|
|
41
57
|
}
|
|
42
58
|
|
|
43
|
-
let
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
59
|
+
let placeholder = dependency.meta?.placeholder ?? dependency.id;
|
|
60
|
+
invariant(typeof placeholder === 'string');
|
|
61
|
+
|
|
62
|
+
let resolved = bundleGraph.getReferencedBundle(dependency, bundle);
|
|
63
|
+
if (resolved == null) {
|
|
64
|
+
replacements.set(placeholder, {
|
|
65
|
+
from: placeholder,
|
|
66
|
+
to: getReplacement(dependency.specifier),
|
|
48
67
|
});
|
|
49
68
|
continue;
|
|
50
69
|
}
|
|
51
70
|
|
|
52
|
-
|
|
53
|
-
if (entryBundle.isInline) {
|
|
71
|
+
if (resolved.bundleBehavior === 'inline') {
|
|
54
72
|
// If a bundle is inline, it should be replaced with inline contents,
|
|
55
73
|
// not a URL.
|
|
56
74
|
continue;
|
|
57
75
|
}
|
|
58
76
|
|
|
59
77
|
replacements.set(
|
|
60
|
-
|
|
78
|
+
placeholder,
|
|
61
79
|
getURLReplacement({
|
|
62
80
|
dependency,
|
|
63
81
|
fromBundle: bundle,
|
|
64
|
-
toBundle:
|
|
82
|
+
toBundle: resolved,
|
|
65
83
|
relative,
|
|
84
|
+
getReplacement,
|
|
66
85
|
}),
|
|
67
86
|
);
|
|
68
87
|
}
|
|
@@ -83,7 +102,7 @@ export async function replaceInlineReferences({
|
|
|
83
102
|
getInlineBundleContents,
|
|
84
103
|
}: {|
|
|
85
104
|
bundle: Bundle,
|
|
86
|
-
bundleGraph: BundleGraph
|
|
105
|
+
bundleGraph: BundleGraph<NamedBundle>,
|
|
87
106
|
contents: string,
|
|
88
107
|
getInlineReplacement: (
|
|
89
108
|
Dependency,
|
|
@@ -92,20 +111,22 @@ export async function replaceInlineReferences({
|
|
|
92
111
|
) => {|from: string, to: string|},
|
|
93
112
|
getInlineBundleContents: (
|
|
94
113
|
Bundle,
|
|
95
|
-
BundleGraph
|
|
96
|
-
) => Async<{|contents: Blob
|
|
114
|
+
BundleGraph<NamedBundle>,
|
|
115
|
+
) => Async<{|contents: Blob|}>,
|
|
97
116
|
map?: ?SourceMap,
|
|
98
117
|
|}): Promise<{|+contents: string, +map: ?SourceMap|}> {
|
|
99
118
|
let replacements = new Map();
|
|
100
119
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (
|
|
104
|
-
|
|
120
|
+
let dependencies = [];
|
|
121
|
+
bundle.traverse(node => {
|
|
122
|
+
if (node.type === 'dependency') {
|
|
123
|
+
dependencies.push(node.value);
|
|
105
124
|
}
|
|
125
|
+
});
|
|
106
126
|
|
|
107
|
-
|
|
108
|
-
|
|
127
|
+
for (let dependency of dependencies) {
|
|
128
|
+
let entryBundle = bundleGraph.getReferencedBundle(dependency, bundle);
|
|
129
|
+
if (entryBundle?.bundleBehavior !== 'inline') {
|
|
109
130
|
continue;
|
|
110
131
|
}
|
|
111
132
|
|
|
@@ -113,15 +134,18 @@ export async function replaceInlineReferences({
|
|
|
113
134
|
entryBundle,
|
|
114
135
|
bundleGraph,
|
|
115
136
|
);
|
|
116
|
-
let packagedContents = (
|
|
117
|
-
|
|
118
|
-
|
|
137
|
+
let packagedContents = (
|
|
138
|
+
packagedBundle.contents instanceof Readable
|
|
139
|
+
? await bufferStream(packagedBundle.contents)
|
|
140
|
+
: packagedBundle.contents
|
|
119
141
|
).toString();
|
|
120
142
|
|
|
121
143
|
let inlineType = nullthrows(entryBundle.getMainEntry()).meta.inlineType;
|
|
122
144
|
if (inlineType == null || inlineType === 'string') {
|
|
145
|
+
let placeholder = dependency.meta?.placeholder ?? dependency.id;
|
|
146
|
+
invariant(typeof placeholder === 'string');
|
|
123
147
|
replacements.set(
|
|
124
|
-
|
|
148
|
+
placeholder,
|
|
125
149
|
getInlineReplacement(dependency, inlineType, packagedContents),
|
|
126
150
|
);
|
|
127
151
|
}
|
|
@@ -130,32 +154,52 @@ export async function replaceInlineReferences({
|
|
|
130
154
|
return performReplacement(replacements, contents, map);
|
|
131
155
|
}
|
|
132
156
|
|
|
133
|
-
function getURLReplacement({
|
|
157
|
+
export function getURLReplacement({
|
|
134
158
|
dependency,
|
|
135
159
|
fromBundle,
|
|
136
160
|
toBundle,
|
|
137
161
|
relative,
|
|
162
|
+
getReplacement,
|
|
138
163
|
}: {|
|
|
139
164
|
dependency: Dependency,
|
|
140
|
-
fromBundle:
|
|
141
|
-
toBundle:
|
|
165
|
+
fromBundle: NamedBundle,
|
|
166
|
+
toBundle: NamedBundle,
|
|
142
167
|
relative: boolean,
|
|
143
|
-
|
|
144
|
-
|
|
168
|
+
getReplacement?: string => string,
|
|
169
|
+
|}): {|from: string, to: string|} {
|
|
145
170
|
let to;
|
|
171
|
+
|
|
172
|
+
let orig = URL.parse(dependency.specifier);
|
|
173
|
+
|
|
146
174
|
if (relative) {
|
|
147
|
-
|
|
148
|
-
|
|
175
|
+
to = URL.format({
|
|
176
|
+
pathname: relativeBundlePath(fromBundle, toBundle, {
|
|
177
|
+
leadingDotSlash: false,
|
|
178
|
+
}),
|
|
179
|
+
hash: orig.hash,
|
|
149
180
|
});
|
|
150
|
-
|
|
181
|
+
|
|
182
|
+
// If the resulting path includes a colon character and doesn't start with a ./ or ../
|
|
183
|
+
// we need to add one so that the first part before the colon isn't parsed as a URL protocol.
|
|
184
|
+
if (to.includes(':') && !to.startsWith('./') && !to.startsWith('../')) {
|
|
185
|
+
to = './' + to;
|
|
186
|
+
}
|
|
151
187
|
} else {
|
|
152
|
-
|
|
153
|
-
|
|
188
|
+
to = urlJoin(
|
|
189
|
+
toBundle.target.publicUrl,
|
|
190
|
+
URL.format({
|
|
191
|
+
pathname: nullthrows(toBundle.name),
|
|
192
|
+
hash: orig.hash,
|
|
193
|
+
}),
|
|
194
|
+
);
|
|
154
195
|
}
|
|
155
196
|
|
|
197
|
+
let placeholder = dependency.meta?.placeholder ?? dependency.id;
|
|
198
|
+
invariant(typeof placeholder === 'string');
|
|
199
|
+
|
|
156
200
|
return {
|
|
157
|
-
from:
|
|
158
|
-
to,
|
|
201
|
+
from: placeholder,
|
|
202
|
+
to: getReplacement ? getReplacement(to) : to,
|
|
159
203
|
};
|
|
160
204
|
}
|
|
161
205
|
|