-
Notifications
You must be signed in to change notification settings - Fork 414
/
Copy pathindex.ts
70 lines (58 loc) · 1.98 KB
/
index.ts
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
/**
* This file contains a Rollup loader for Linaria.
* It uses the transform.ts function to generate class names from source code,
* returns transformed code without template literals and attaches generated source maps
*/
import { createFilter } from '@rollup/pluginutils';
import { transform, slugify, Result } from '@linaria/babel-preset';
import type { PluginOptions, Preprocessor } from '@linaria/babel-preset';
type RollupPluginOptions = {
include?: string | string[];
exclude?: string | string[];
sourceMap?: boolean;
preprocessor?: Preprocessor;
} & Partial<PluginOptions>;
export default function linaria({
include,
exclude,
sourceMap,
preprocessor,
...rest
}: RollupPluginOptions = {}) {
const filter = createFilter(include, exclude);
const cssLookup: { [key: string]: string } = {};
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
): { code: string; map: Result['sourceMap'] } | undefined {
// Do not transform ignored and generated files
if (!filter(id) || id in cssLookup) return;
const result = transform(code, {
filename: id,
preprocessor,
pluginOptions: rest,
});
if (!result.cssText) return;
let { cssText } = result;
const slug = slugify(cssText);
const filename = `@linaria:${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 };
},
};
}