@parcel/utils 2.0.0 → 2.2.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 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
- config = parse(configContent);
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 (!resolved || resolved.bundleBehavior === 'inline') {
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;
@@ -142,7 +142,11 @@ async function replaceInlineReferences({
142
142
  let inlineType = (0, _nullthrows().default)(entryBundle.getMainEntry()).meta.inlineType;
143
143
 
144
144
  if (inlineType == null || inlineType === 'string') {
145
- replacements.set(dependency.id, getInlineReplacement(dependency, inlineType, packagedContents));
145
+ var _dependency$meta$plac2, _dependency$meta2;
146
+
147
+ let placeholder = (_dependency$meta$plac2 = (_dependency$meta2 = dependency.meta) === null || _dependency$meta2 === void 0 ? void 0 : _dependency$meta2.placeholder) !== null && _dependency$meta$plac2 !== void 0 ? _dependency$meta$plac2 : dependency.id;
148
+ (0, _assert().default)(typeof placeholder === 'string');
149
+ replacements.set(placeholder, getInlineReplacement(dependency, inlineType, packagedContents));
146
150
  }
147
151
  }
148
152
 
@@ -155,7 +159,7 @@ function getURLReplacement({
155
159
  toBundle,
156
160
  relative
157
161
  }) {
158
- var _dependency$meta$plac2, _dependency$meta2;
162
+ var _dependency$meta$plac3, _dependency$meta3;
159
163
 
160
164
  let to;
161
165
 
@@ -180,7 +184,7 @@ function getURLReplacement({
180
184
  }));
181
185
  }
182
186
 
183
- let placeholder = (_dependency$meta$plac2 = (_dependency$meta2 = dependency.meta) === null || _dependency$meta2 === void 0 ? void 0 : _dependency$meta2.placeholder) !== null && _dependency$meta$plac2 !== void 0 ? _dependency$meta$plac2 : dependency.id;
187
+ let placeholder = (_dependency$meta$plac3 = (_dependency$meta3 = dependency.meta) === null || _dependency$meta3 === void 0 ? void 0 : _dependency$meta3.placeholder) !== null && _dependency$meta$plac3 !== void 0 ? _dependency$meta$plac3 : dependency.id;
184
188
  (0, _assert().default)(typeof placeholder === 'string');
185
189
  return {
186
190
  from: placeholder,
@@ -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.0",
3
+ "version": "2.2.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.0",
25
- "@parcel/diagnostic": "^2.0.0",
26
- "@parcel/hash": "^2.0.0",
27
- "@parcel/logger": "^2.0.0",
28
- "@parcel/markdown-ansi": "^2.0.0",
24
+ "@parcel/codeframe": "^2.2.0",
25
+ "@parcel/diagnostic": "^2.2.0",
26
+ "@parcel/hash": "^2.2.0",
27
+ "@parcel/logger": "^2.2.0",
28
+ "@parcel/markdown-ansi": "^2.2.0",
29
29
  "@parcel/source-map": "^2.0.0",
30
30
  "ansi-html-community": "0.0.8",
31
31
  "chalk": "^4.1.0",
@@ -37,7 +37,7 @@
37
37
  "json5": "^1.0.1",
38
38
  "lru-cache": "^6.0.0",
39
39
  "micromatch": "^4.0.4",
40
- "node-forge": "^0.10.0",
40
+ "node-forge": "^1.2.1",
41
41
  "nullthrows": "^1.1.1",
42
42
  "open": "^7.0.3",
43
43
  "terminal-link": "^2.1.1"
@@ -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
- "gitHead": "84da50ae6943bff9741e2fc76d2f4968074cbbd6"
49
+ "browser": {
50
+ "./src/generateCertificate.js": false,
51
+ "./src/http-server.js": false,
52
+ "./src/openInBrowser.js": false
53
+ },
54
+ "gitHead": "4745cd3023f8d5a5adcf9e565d5b82d1418dc262"
50
55
  }
package/src/blob.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  import type {Blob} from '@parcel/types';
4
4
 
5
+ import {Buffer} from 'buffer';
5
6
  import {bufferStream} from './';
6
7
  import {Readable} from 'stream';
7
8
 
package/src/collection.js CHANGED
@@ -6,14 +6,14 @@ export function unique<T>(array: Array<T>): Array<T> {
6
6
 
7
7
  export function objectSortedEntries(obj: {
8
8
  +[string]: mixed,
9
- ...,
9
+ ...
10
10
  }): Array<[string, mixed]> {
11
11
  return Object.entries(obj).sort(([keyA], [keyB]) => keyA.localeCompare(keyB));
12
12
  }
13
13
 
14
14
  export function objectSortedEntriesDeep(object: {
15
15
  +[string]: mixed,
16
- ...,
16
+ ...
17
17
  }): Array<[string, mixed]> {
18
18
  let sortedEntries = objectSortedEntries(object);
19
19
  for (let i = 0; i < sortedEntries.length; i++) {
@@ -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
- config = parse(configContent);
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/debounce.js CHANGED
@@ -6,7 +6,7 @@ export default function debounce<TArgs: Array<mixed>>(
6
6
  ): (...args: TArgs) => void {
7
7
  let timeout;
8
8
 
9
- return function(...args: TArgs) {
9
+ return function (...args: TArgs) {
10
10
  if (timeout) {
11
11
  clearTimeout(timeout);
12
12
  }
@@ -14,10 +14,7 @@ export default function getExisting(
14
14
  return {
15
15
  source,
16
16
  minified: fs.existsSync(minifiedPath)
17
- ? fs
18
- .readFileSync(minifiedPath, 'utf8')
19
- .trim()
20
- .replace(/;$/, '')
17
+ ? fs.readFileSync(minifiedPath, 'utf8').trim().replace(/;$/, '')
21
18
  : source,
22
19
  };
23
20
  }
package/src/hash.js CHANGED
@@ -16,7 +16,7 @@ export function hashStream(stream: Readable): Promise<string> {
16
16
  .on('data', chunk => {
17
17
  hash.writeBuffer(chunk);
18
18
  })
19
- .on('end', function() {
19
+ .on('end', function () {
20
20
  resolve(hash.finish());
21
21
  })
22
22
  .on('error', err => {
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 (!resolved || resolved.bundleBehavior === 'inline') {
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;
@@ -131,15 +131,18 @@ export async function replaceInlineReferences({
131
131
  entryBundle,
132
132
  bundleGraph,
133
133
  );
134
- let packagedContents = (packagedBundle.contents instanceof Readable
135
- ? await bufferStream(packagedBundle.contents)
136
- : packagedBundle.contents
134
+ let packagedContents = (
135
+ packagedBundle.contents instanceof Readable
136
+ ? await bufferStream(packagedBundle.contents)
137
+ : packagedBundle.contents
137
138
  ).toString();
138
139
 
139
140
  let inlineType = nullthrows(entryBundle.getMainEntry()).meta.inlineType;
140
141
  if (inlineType == null || inlineType === 'string') {
142
+ let placeholder = dependency.meta?.placeholder ?? dependency.id;
143
+ invariant(typeof placeholder === 'string');
141
144
  replacements.set(
142
- dependency.id,
145
+ placeholder,
143
146
  getInlineReplacement(dependency, inlineType, packagedContents),
144
147
  );
145
148
  }
package/src/schema.js CHANGED
@@ -378,7 +378,7 @@ export function fuzzySearch(
378
378
  return result.map(([v]) => v);
379
379
  }
380
380
 
381
- validateSchema.diagnostic = function(
381
+ validateSchema.diagnostic = function (
382
382
  schema: SchemaEntity,
383
383
  data: {|
384
384
  ...
@@ -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 CHANGED
@@ -5,7 +5,8 @@ import SourceMap from '@parcel/source-map';
5
5
  import path from 'path';
6
6
  import {normalizeSeparators, isAbsolute} from './path';
7
7
 
8
- export const SOURCEMAP_RE: RegExp = /(?:\/\*|\/\/)\s*[@#]\s*sourceMappingURL\s*=\s*([^\s*]+)(?:\s*\*\/)?\s*$/;
8
+ export const SOURCEMAP_RE: RegExp =
9
+ /(?:\/\*|\/\/)\s*[@#]\s*sourceMappingURL\s*=\s*([^\s*]+)(?:\s*\*\/)?\s*$/;
9
10
  const DATA_URL_RE = /^data:[^;]+(?:;charset=[^;]+)?;base64,(.*)/;
10
11
  export const SOURCEMAP_EXTENSIONS: Set<string> = new Set<string>([
11
12
  'css',
@@ -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(k => k, [
9
- [1, 3],
10
- [2, 27],
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,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
+ });
@@ -0,0 +1,3 @@
1
+ {
2
+ "hoge": "fuga"
3
+ }
File without changes
File without changes
@@ -34,7 +34,7 @@ describe('throttle', () => {
34
34
 
35
35
  it('preserves the `this` when throttled functions are invoked', () => {
36
36
  let result;
37
- let throttled = throttle(function() {
37
+ let throttled = throttle(function () {
38
38
  result = this.bar;
39
39
  }, 100);
40
40
 
package/src/.babelrc DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "presets": ["@parcel/babel-preset"]
3
- }