UNPKG

3.76 kBJavaScriptView Raw
1// @flow
2import ParcelConfig from '../src/ParcelConfig';
3import assert from 'assert';
4import path from 'path';
5import sinon from 'sinon';
6import logger from '@parcel/logger';
7import {inputFS} from '@parcel/test-utils';
8import {NodePackageManager} from '@parcel/package-manager';
9
10const packageManager = new NodePackageManager(inputFS);
11
12describe('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});