1 |
|
2 | import ParcelConfig from '../src/ParcelConfig';
|
3 | import assert from 'assert';
|
4 | import path from 'path';
|
5 | import sinon from 'sinon';
|
6 | import logger from '@parcel/logger';
|
7 | import {inputFS} from '@parcel/test-utils';
|
8 | import {NodePackageManager} from '@parcel/package-manager';
|
9 |
|
10 | const packageManager = new NodePackageManager(inputFS);
|
11 |
|
12 | describe('ParcelConfig', () => {
|
13 | describe('matchGlobMap', () => {
|
14 | let config = new ParcelConfig(
|
15 | {
|
16 | filePath: '.parcelrc',
|
17 | packagers: {
|
18 | '*.css': 'parcel-packager-css',
|
19 | '*.js': 'parcel-packager-js',
|
20 | },
|
21 | },
|
22 | packageManager,
|
23 | );
|
24 |
|
25 | it('should return null array if no glob matches', () => {
|
26 | let result = config.matchGlobMap('foo.wasm', config.packagers);
|
27 | assert.deepEqual(result, null);
|
28 | });
|
29 |
|
30 | it('should return a matching pipeline', () => {
|
31 | let result = config.matchGlobMap('foo.js', config.packagers);
|
32 | assert.deepEqual(result, 'parcel-packager-js');
|
33 | });
|
34 | });
|
35 |
|
36 | describe('matchGlobMapPipelines', () => {
|
37 | let config = new ParcelConfig(
|
38 | {
|
39 | filePath: '.parcelrc',
|
40 | transforms: {
|
41 | '*.jsx': ['parcel-transform-jsx', '...'],
|
42 | '*.{js,jsx}': ['parcel-transform-js'],
|
43 | },
|
44 | },
|
45 | packageManager,
|
46 | );
|
47 |
|
48 | it('should return an empty array if no pipeline matches', () => {
|
49 | let pipeline = config.matchGlobMapPipelines('foo.css', config.transforms);
|
50 | assert.deepEqual(pipeline, []);
|
51 | });
|
52 |
|
53 | it('should return a matching pipeline', () => {
|
54 | let pipeline = config.matchGlobMapPipelines('foo.js', config.transforms);
|
55 | assert.deepEqual(pipeline, ['parcel-transform-js']);
|
56 | });
|
57 |
|
58 | it('should merge pipelines with spread elements', () => {
|
59 | let pipeline = config.matchGlobMapPipelines('foo.jsx', config.transforms);
|
60 | assert.deepEqual(pipeline, [
|
61 | 'parcel-transform-jsx',
|
62 | 'parcel-transform-js',
|
63 | ]);
|
64 | });
|
65 | });
|
66 |
|
67 | describe('loadPlugin', () => {
|
68 | it('should warn if a plugin needs to specify an engines.parcel field in package.json', async () => {
|
69 | let config = new ParcelConfig(
|
70 | {
|
71 | filePath: path.join(__dirname, 'fixtures', 'plugins', '.parcelrc'),
|
72 | transforms: {
|
73 | '*.js': ['parcel-transformer-no-engines'],
|
74 | },
|
75 | },
|
76 | packageManager,
|
77 | );
|
78 |
|
79 | sinon.stub(logger, 'warn');
|
80 | let plugin = await config.loadPlugin('parcel-transformer-no-engines');
|
81 | assert(plugin);
|
82 | assert.equal(typeof plugin.transform, 'function');
|
83 | assert(logger.warn.calledOnce);
|
84 | assert.deepEqual(logger.warn.getCall(0).args[0], {
|
85 | origin: '@parcel/core',
|
86 | message:
|
87 | 'The plugin "parcel-transformer-no-engines" needs to specify a `package.json#engines.parcel` field with the supported Parcel version range.',
|
88 | });
|
89 | logger.warn.restore();
|
90 | });
|
91 |
|
92 | it('should error if a plugin specifies an invalid engines.parcel field in package.json', async () => {
|
93 | let config = new ParcelConfig(
|
94 | {
|
95 | filePath: path.join(__dirname, 'fixtures', 'plugins', '.parcelrc'),
|
96 | transforms: {
|
97 | '*.js': ['parcel-transformer-bad-engines'],
|
98 | },
|
99 | },
|
100 | packageManager,
|
101 | );
|
102 |
|
103 | let errored = false;
|
104 | try {
|
105 | await config.loadPlugin('parcel-transformer-bad-engines');
|
106 | } catch (err) {
|
107 | errored = true;
|
108 | let parcelVersion = require('../package.json').version;
|
109 | assert.equal(
|
110 | err.message,
|
111 | `The plugin "parcel-transformer-bad-engines" is not compatible with the current version of Parcel. Requires "5.x" but the current version is "${parcelVersion}".`,
|
112 | );
|
113 | }
|
114 |
|
115 | assert(errored, 'did not error');
|
116 | });
|
117 | });
|
118 | });
|