@parcel/utils 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/blob.js +14 -4
- package/lib/collection.js +14 -0
- package/lib/config.js +39 -2
- package/lib/index.js +20 -0
- package/lib/replaceBundleReferences.js +1 -1
- package/lib/shared-buffer.js +31 -0
- package/package.json +12 -7
- package/src/blob.js +1 -0
- package/src/collection.js +12 -0
- package/src/config.js +34 -2
- package/src/index.js +3 -0
- package/src/replaceBundleReferences.js +1 -1
- package/src/shared-buffer.js +24 -0
- package/test/config.test.js +50 -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/src/.babelrc +0 -3
package/lib/blob.js
CHANGED
|
@@ -6,6 +6,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.blobToBuffer = blobToBuffer;
|
|
7
7
|
exports.blobToString = blobToString;
|
|
8
8
|
|
|
9
|
+
function _buffer() {
|
|
10
|
+
const data = require("buffer");
|
|
11
|
+
|
|
12
|
+
_buffer = function () {
|
|
13
|
+
return data;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
|
|
9
19
|
var _ = require("./");
|
|
10
20
|
|
|
11
21
|
function _stream() {
|
|
@@ -21,17 +31,17 @@ function _stream() {
|
|
|
21
31
|
function blobToBuffer(blob) {
|
|
22
32
|
if (blob instanceof _stream().Readable) {
|
|
23
33
|
return (0, _.bufferStream)(blob);
|
|
24
|
-
} else if (blob instanceof Buffer) {
|
|
25
|
-
return Promise.resolve(Buffer.from(blob));
|
|
34
|
+
} else if (blob instanceof _buffer().Buffer) {
|
|
35
|
+
return Promise.resolve(_buffer().Buffer.from(blob));
|
|
26
36
|
} else {
|
|
27
|
-
return Promise.resolve(Buffer.from(blob, 'utf8'));
|
|
37
|
+
return Promise.resolve(_buffer().Buffer.from(blob, 'utf8'));
|
|
28
38
|
}
|
|
29
39
|
}
|
|
30
40
|
|
|
31
41
|
async function blobToString(blob) {
|
|
32
42
|
if (blob instanceof _stream().Readable) {
|
|
33
43
|
return (await (0, _.bufferStream)(blob)).toString();
|
|
34
|
-
} else if (blob instanceof Buffer) {
|
|
44
|
+
} else if (blob instanceof _buffer().Buffer) {
|
|
35
45
|
return blob.toString();
|
|
36
46
|
} else {
|
|
37
47
|
return blob;
|
package/lib/collection.js
CHANGED
|
@@ -7,6 +7,8 @@ exports.unique = unique;
|
|
|
7
7
|
exports.objectSortedEntries = objectSortedEntries;
|
|
8
8
|
exports.objectSortedEntriesDeep = objectSortedEntriesDeep;
|
|
9
9
|
exports.setDifference = setDifference;
|
|
10
|
+
exports.setIntersect = setIntersect;
|
|
11
|
+
exports.setUnion = setUnion;
|
|
10
12
|
|
|
11
13
|
function unique(array) {
|
|
12
14
|
return [...new Set(array)];
|
|
@@ -48,4 +50,16 @@ function setDifference(a, b) {
|
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
return difference;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function setIntersect(a, b) {
|
|
56
|
+
for (let entry of a) {
|
|
57
|
+
if (!b.has(entry)) {
|
|
58
|
+
a.delete(entry);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function setUnion(a, b) {
|
|
64
|
+
return new Set([...a, ...b]);
|
|
51
65
|
}
|
package/lib/config.js
CHANGED
|
@@ -7,6 +7,16 @@ exports.resolveConfig = resolveConfig;
|
|
|
7
7
|
exports.resolveConfigSync = resolveConfigSync;
|
|
8
8
|
exports.loadConfig = loadConfig;
|
|
9
9
|
|
|
10
|
+
function _diagnostic() {
|
|
11
|
+
const data = _interopRequireDefault(require("@parcel/diagnostic"));
|
|
12
|
+
|
|
13
|
+
_diagnostic = function () {
|
|
14
|
+
return data;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
return data;
|
|
18
|
+
}
|
|
19
|
+
|
|
10
20
|
function _path() {
|
|
11
21
|
const data = _interopRequireDefault(require("path"));
|
|
12
22
|
|
|
@@ -112,7 +122,6 @@ async function loadConfig(fs, filepath, filenames, projectRoot, opts) {
|
|
|
112
122
|
}
|
|
113
123
|
|
|
114
124
|
let configContent = await fs.readFile(configFile, 'utf8');
|
|
115
|
-
if (!configContent) return null;
|
|
116
125
|
let config;
|
|
117
126
|
|
|
118
127
|
if (parse === false) {
|
|
@@ -121,7 +130,35 @@ async function loadConfig(fs, filepath, filenames, projectRoot, opts) {
|
|
|
121
130
|
var _opts$parser;
|
|
122
131
|
|
|
123
132
|
let parse = (_opts$parser = opts === null || opts === void 0 ? void 0 : opts.parser) !== null && _opts$parser !== void 0 ? _opts$parser : getParser(extname);
|
|
124
|
-
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
config = parse(configContent);
|
|
136
|
+
} catch (e) {
|
|
137
|
+
if (extname !== '' && extname !== 'json') {
|
|
138
|
+
throw e;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
let pos = {
|
|
142
|
+
line: e.lineNumber,
|
|
143
|
+
column: e.columnNumber
|
|
144
|
+
};
|
|
145
|
+
throw new (_diagnostic().default)({
|
|
146
|
+
diagnostic: {
|
|
147
|
+
message: `Failed to parse ${_path().default.basename(configFile)}`,
|
|
148
|
+
origin: '@parcel/utils',
|
|
149
|
+
codeFrames: [{
|
|
150
|
+
language: 'json5',
|
|
151
|
+
filePath: configFile,
|
|
152
|
+
code: configContent,
|
|
153
|
+
codeHighlights: [{
|
|
154
|
+
start: pos,
|
|
155
|
+
end: pos,
|
|
156
|
+
message: e.message
|
|
157
|
+
}]
|
|
158
|
+
}]
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
125
162
|
}
|
|
126
163
|
|
|
127
164
|
let output = {
|
package/lib/index.js
CHANGED
|
@@ -171,6 +171,18 @@ Object.defineProperty(exports, "setDifference", {
|
|
|
171
171
|
return _collection.setDifference;
|
|
172
172
|
}
|
|
173
173
|
});
|
|
174
|
+
Object.defineProperty(exports, "setIntersect", {
|
|
175
|
+
enumerable: true,
|
|
176
|
+
get: function () {
|
|
177
|
+
return _collection.setIntersect;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
Object.defineProperty(exports, "setUnion", {
|
|
181
|
+
enumerable: true,
|
|
182
|
+
get: function () {
|
|
183
|
+
return _collection.setUnion;
|
|
184
|
+
}
|
|
185
|
+
});
|
|
174
186
|
Object.defineProperty(exports, "resolveConfig", {
|
|
175
187
|
enumerable: true,
|
|
176
188
|
get: function () {
|
|
@@ -249,6 +261,12 @@ Object.defineProperty(exports, "hashFile", {
|
|
|
249
261
|
return _hash.hashFile;
|
|
250
262
|
}
|
|
251
263
|
});
|
|
264
|
+
Object.defineProperty(exports, "SharedBuffer", {
|
|
265
|
+
enumerable: true,
|
|
266
|
+
get: function () {
|
|
267
|
+
return _sharedBuffer.SharedBuffer;
|
|
268
|
+
}
|
|
269
|
+
});
|
|
252
270
|
Object.defineProperty(exports, "createHTTPServer", {
|
|
253
271
|
enumerable: true,
|
|
254
272
|
get: function () {
|
|
@@ -430,6 +448,8 @@ var _glob = require("./glob");
|
|
|
430
448
|
|
|
431
449
|
var _hash = require("./hash");
|
|
432
450
|
|
|
451
|
+
var _sharedBuffer = require("./shared-buffer");
|
|
452
|
+
|
|
433
453
|
var _httpServer = require("./http-server");
|
|
434
454
|
|
|
435
455
|
var _path = require("./path");
|
|
@@ -92,7 +92,7 @@ function replaceURLReferences({
|
|
|
92
92
|
continue;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
if (
|
|
95
|
+
if (resolved.bundleBehavior === 'inline') {
|
|
96
96
|
// If a bundle is inline, it should be replaced with inline contents,
|
|
97
97
|
// not a URL.
|
|
98
98
|
continue;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SharedBuffer = void 0;
|
|
7
|
+
|
|
8
|
+
/* global MessageChannel:readonly */
|
|
9
|
+
let SharedBuffer; // $FlowFixMe[prop-missing]
|
|
10
|
+
|
|
11
|
+
exports.SharedBuffer = SharedBuffer;
|
|
12
|
+
|
|
13
|
+
if (process.browser) {
|
|
14
|
+
exports.SharedBuffer = SharedBuffer = ArrayBuffer; // Safari has removed the constructor
|
|
15
|
+
|
|
16
|
+
if (typeof SharedArrayBuffer !== 'undefined') {
|
|
17
|
+
let channel = new MessageChannel();
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
// Firefox might throw when sending the Buffer over a MessagePort
|
|
21
|
+
channel.port1.postMessage(new SharedArrayBuffer(0));
|
|
22
|
+
exports.SharedBuffer = SharedBuffer = SharedArrayBuffer;
|
|
23
|
+
} catch (_) {// NOOP
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
channel.port1.close();
|
|
27
|
+
channel.port2.close();
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
exports.SharedBuffer = SharedBuffer = SharedArrayBuffer;
|
|
31
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parcel/utils",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Blazing fast, zero configuration web application bundler",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@iarna/toml": "^2.2.0",
|
|
24
|
-
"@parcel/codeframe": "^2.0
|
|
25
|
-
"@parcel/diagnostic": "^2.0
|
|
26
|
-
"@parcel/hash": "^2.0
|
|
27
|
-
"@parcel/logger": "^2.0
|
|
28
|
-
"@parcel/markdown-ansi": "^2.0
|
|
24
|
+
"@parcel/codeframe": "^2.1.0",
|
|
25
|
+
"@parcel/diagnostic": "^2.1.0",
|
|
26
|
+
"@parcel/hash": "^2.1.0",
|
|
27
|
+
"@parcel/logger": "^2.1.0",
|
|
28
|
+
"@parcel/markdown-ansi": "^2.1.0",
|
|
29
29
|
"@parcel/source-map": "^2.0.0",
|
|
30
30
|
"ansi-html-community": "0.0.8",
|
|
31
31
|
"chalk": "^4.1.0",
|
|
@@ -46,5 +46,10 @@
|
|
|
46
46
|
"@babel/plugin-transform-flow-strip-types": "^7.2.0",
|
|
47
47
|
"random-int": "^1.0.0"
|
|
48
48
|
},
|
|
49
|
-
"
|
|
49
|
+
"browser": {
|
|
50
|
+
"./src/generateCertificate.js": false,
|
|
51
|
+
"./src/http-server.js": false,
|
|
52
|
+
"./src/openInBrowser.js": false
|
|
53
|
+
},
|
|
54
|
+
"gitHead": "5a80fbe4af8797d0aab248a66f5254f42f00e83e"
|
|
50
55
|
}
|
package/src/blob.js
CHANGED
package/src/collection.js
CHANGED
|
@@ -43,3 +43,15 @@ export function setDifference<T>(a: Set<T>, b: Set<T>): Set<T> {
|
|
|
43
43
|
}
|
|
44
44
|
return difference;
|
|
45
45
|
}
|
|
46
|
+
|
|
47
|
+
export function setIntersect<T>(a: Set<T>, b: Set<T>): void {
|
|
48
|
+
for (let entry of a) {
|
|
49
|
+
if (!b.has(entry)) {
|
|
50
|
+
a.delete(entry);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function setUnion<T>(a: Iterable<T>, b: Iterable<T>): Set<T> {
|
|
56
|
+
return new Set([...a, ...b]);
|
|
57
|
+
}
|
package/src/config.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import type {ConfigResult, File, FilePath} from '@parcel/types';
|
|
4
4
|
import type {FileSystem} from '@parcel/fs';
|
|
5
|
+
import ThrowableDiagnostic from '@parcel/diagnostic';
|
|
5
6
|
import path from 'path';
|
|
6
7
|
import clone from 'clone';
|
|
7
8
|
import {parse as json5} from 'json5';
|
|
@@ -82,14 +83,45 @@ export async function loadConfig(
|
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
let configContent = await fs.readFile(configFile, 'utf8');
|
|
85
|
-
if (!configContent) return null;
|
|
86
86
|
|
|
87
87
|
let config;
|
|
88
88
|
if (parse === false) {
|
|
89
89
|
config = configContent;
|
|
90
90
|
} else {
|
|
91
91
|
let parse = opts?.parser ?? getParser(extname);
|
|
92
|
-
|
|
92
|
+
try {
|
|
93
|
+
config = parse(configContent);
|
|
94
|
+
} catch (e) {
|
|
95
|
+
if (extname !== '' && extname !== 'json') {
|
|
96
|
+
throw e;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
let pos = {
|
|
100
|
+
line: e.lineNumber,
|
|
101
|
+
column: e.columnNumber,
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
throw new ThrowableDiagnostic({
|
|
105
|
+
diagnostic: {
|
|
106
|
+
message: `Failed to parse ${path.basename(configFile)}`,
|
|
107
|
+
origin: '@parcel/utils',
|
|
108
|
+
codeFrames: [
|
|
109
|
+
{
|
|
110
|
+
language: 'json5',
|
|
111
|
+
filePath: configFile,
|
|
112
|
+
code: configContent,
|
|
113
|
+
codeHighlights: [
|
|
114
|
+
{
|
|
115
|
+
start: pos,
|
|
116
|
+
end: pos,
|
|
117
|
+
message: e.message,
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
93
125
|
}
|
|
94
126
|
|
|
95
127
|
let output = {
|
package/src/index.js
CHANGED
|
@@ -35,12 +35,15 @@ export {
|
|
|
35
35
|
objectSortedEntries,
|
|
36
36
|
objectSortedEntriesDeep,
|
|
37
37
|
setDifference,
|
|
38
|
+
setIntersect,
|
|
39
|
+
setUnion,
|
|
38
40
|
} from './collection';
|
|
39
41
|
export {resolveConfig, resolveConfigSync, loadConfig} from './config';
|
|
40
42
|
export {DefaultMap, DefaultWeakMap} from './DefaultMap';
|
|
41
43
|
export {makeDeferredWithPromise} from './Deferred';
|
|
42
44
|
export {isGlob, isGlobMatch, globSync, glob} from './glob';
|
|
43
45
|
export {hashStream, hashObject, hashFile} from './hash';
|
|
46
|
+
export {SharedBuffer} from './shared-buffer';
|
|
44
47
|
export {fuzzySearch} from './schema';
|
|
45
48
|
export {createHTTPServer} from './http-server';
|
|
46
49
|
export {normalizePath, normalizeSeparators, relativePath} from './path';
|
|
@@ -66,7 +66,7 @@ export function replaceURLReferences({
|
|
|
66
66
|
continue;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
if (
|
|
69
|
+
if (resolved.bundleBehavior === 'inline') {
|
|
70
70
|
// If a bundle is inline, it should be replaced with inline contents,
|
|
71
71
|
// not a URL.
|
|
72
72
|
continue;
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
});
|
|
File without changes
|
|
File without changes
|
package/src/.babelrc
DELETED