forked from callstack/linaria
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rollup.js
66 lines (53 loc) · 1.69 KB
/
rollup.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
/* @flow */
import type { PluginOptions } from './babel/utils/loadOptions';
import type { Preprocessor } from './transform';
const { createFilter } = require('rollup-pluginutils');
const transform = require('./transform');
const slugify = require('./slugify');
type RollupPluginOptions = {
include?: string | string[],
exclude?: string | string[],
sourceMap?: boolean,
preprocessor?: Preprocessor,
...$Shape<PluginOptions>,
};
module.exports = function linaria({
include,
exclude,
sourceMap,
preprocessor,
...rest
}: RollupPluginOptions = {}) {
const filter = createFilter(include, exclude);
const cssLookup = {};
return {
name: 'linaria',
load(id: string) {
return cssLookup[id];
},
/* eslint-disable-next-line consistent-return */
resolveId(importee: string) {
if (importee in cssLookup) return importee;
},
transform(code: string, id: string) {
if (!filter(id)) return;
const result = transform(code, {
filename: id,
preprocessor: ((preprocessor: any): Preprocessor),
pluginOptions: rest,
});
if (!result.cssText) return;
let { cssText } = result;
const slug = slugify(id);
const filename = `${id.replace(/\.js$/, '')}_${slug}.css`;
if (sourceMap && result.cssSourceMapText) {
const map = Buffer.from(result.cssSourceMapText).toString('base64');
cssText += `/*# sourceMappingURL=data:application/json;base64,${map}*/`;
}
cssLookup[filename] = cssText;
result.code += `\nimport ${JSON.stringify(filename)};\n`;
/* eslint-disable-next-line consistent-return */
return { code: result.code, map: result.sourceMap };
},
};
};