forked from rollup/rollup
/
index.js
115 lines (105 loc) · 3.21 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const assert = require('assert');
const { existsSync, readFileSync } = require('fs');
const { basename, resolve } = require('path');
const { rollup } = require('../../dist/rollup');
const { normaliseOutput, runTestSuiteWithSamples } = require('../utils.js');
const FORMATS = ['amd', 'cjs', 'system', 'es', 'iife', 'umd'];
runTestSuiteWithSamples('form', resolve(__dirname, 'samples'), (dir, config) => {
const isSingleFormatTest = existsSync(dir + '/_expected.js');
const itOrDescribe = isSingleFormatTest ? it : describe;
(config.skip ? itOrDescribe.skip : config.solo ? itOrDescribe.only : itOrDescribe)(
basename(dir) + ': ' + config.description,
() => {
let bundle;
const runRollupTest = async (inputFile, bundleFile, defaultFormat) => {
const warnings = [];
if (config.before) config.before();
try {
process.chdir(dir);
bundle =
bundle ||
(await rollup({
input: dir + '/main.js',
onwarn: warning => {
if (!(config.expectedWarnings && config.expectedWarnings.includes(warning.code))) {
warnings.push(warning);
}
},
strictDeprecations: true,
...(config.options || {})
}));
await generateAndTestBundle(
bundle,
{
exports: 'auto',
file: inputFile,
format: defaultFormat,
validate: true,
...((config.options || {}).output || {})
},
bundleFile,
config
);
} finally {
if (config.after) config.after();
}
if (warnings.length > 0) {
const codes = new Set();
for (const { code } of warnings) {
codes.add(code);
}
throw new Error(
`Unexpected warnings (${[...codes].join(', ')}): \n${warnings
.map(({ message }) => `${message}\n\n`)
.join('')}` + 'If you expect warnings, list their codes in config.expectedWarnings'
);
}
};
if (isSingleFormatTest) {
return runRollupTest(dir + '/_actual.js', dir + '/_expected.js', 'es');
}
(config.formats || FORMATS).forEach(format =>
it('generates ' + format, () =>
runRollupTest(
dir + '/_actual/' + format + '.js',
dir + '/_expected/' + format + '.js',
format
)
)
);
}
);
});
async function generateAndTestBundle(bundle, outputOptions, expectedFile, { show }) {
await bundle.write(outputOptions);
const actualCode = normaliseOutput(readFileSync(outputOptions.file, 'utf8'));
let expectedCode;
let actualMap;
let expectedMap;
try {
expectedCode = normaliseOutput(readFileSync(expectedFile, 'utf8'));
} catch (err) {
expectedCode = 'missing file';
}
try {
actualMap = JSON.parse(readFileSync(outputOptions.file + '.map', 'utf8'));
actualMap.sourcesContent = actualMap.sourcesContent
? actualMap.sourcesContent.map(normaliseOutput)
: null;
} catch (err) {
assert.strictEqual(err.code, 'ENOENT');
}
try {
expectedMap = JSON.parse(readFileSync(expectedFile + '.map', 'utf8'));
expectedMap.sourcesContent = actualMap.sourcesContent
? expectedMap.sourcesContent.map(normaliseOutput)
: null;
} catch (err) {
assert.equal(err.code, 'ENOENT');
}
if (show) {
console.log(actualCode + '\n\n\n');
}
assert.strictEqual(actualCode, expectedCode);
assert.deepStrictEqual(actualMap, expectedMap);
}