-
Notifications
You must be signed in to change notification settings - Fork 72
/
Copy pathindex.js
55 lines (43 loc) · 1.67 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
const { basename, extname, posix } = require('path');
const { compile, preprocess } = require('svelte');
const { getOptions } = require('loader-utils');
const { statSync, utimesSync, writeFileSync } = require('fs');
const { tmpdir } = require('os');
function sanitize(input) {
return basename(input).
replace(extname(input), '').
replace(/[^a-zA-Z_$0-9]+/g, '_').
replace(/^_/, '').
replace(/_$/, '').
replace(/^(\d)/, '_$1');
}
function capitalize(str) {
return str[0].toUpperCase() + str.slice(1);
}
module.exports = function(source, map) {
this.cacheable();
const options = Object.assign({}, this.options, getOptions(this));
const callback = this.async();
options.filename = this.resourcePath;
options.format = this.version === 1 ? options.format || 'cjs' : 'es';
options.shared =
options.format === 'es' && 'svelte/shared.js';
if (options.emitCss) options.css = false;
if (!options.name) options.name = capitalize(sanitize(options.filename));
preprocess(source, options).then(processed => {
let { code, map, css, cssMap, ast } = compile(processed.toString(), options);
if (options.emitCss && css) {
const tmpFile = posix.join(tmpdir(), 'svelte-' + ast.hash + '.css');
css += '\n/*# sourceMappingURL=' + cssMap.toUrl() + '*/';
code = code + `\nrequire('${tmpFile}');\n`;
writeFileSync(tmpFile, css);
const { atime, mtime } = statSync(tmpFile);
utimesSync(tmpFile, new Date(atime.getTime() - 99999), new Date(mtime.getTime() - 99999));
}
callback(null, code, map);
}, err => callback(err)).catch(err => {
// wrap error to provide correct
// context when logging to console
callback(new Error(`${err.name}: ${err.toString()}`));
});
};