1 | const fs = require('fs');
|
2 | const path = require('path');
|
3 | const { compile } = require('./compiler.js');
|
4 |
|
5 | const extensions = ['.svelte', '.html'];
|
6 | let compileOptions = {};
|
7 |
|
8 | function capitalise(name) {
|
9 | return name[0].toUpperCase() + name.slice(1);
|
10 | }
|
11 |
|
12 | function register(options = {}) {
|
13 | if (options.extensions) {
|
14 | extensions.forEach(deregisterExtension);
|
15 | options.extensions.forEach(registerExtension);
|
16 | }
|
17 |
|
18 | compileOptions = Object.assign({}, options);
|
19 | delete compileOptions.extensions;
|
20 | }
|
21 |
|
22 | function deregisterExtension(extension) {
|
23 | delete require.extensions[extension];
|
24 | }
|
25 |
|
26 | function registerExtension(extension) {
|
27 | require.extensions[extension] = function(module, filename) {
|
28 | const name = path.parse(filename).name
|
29 | .replace(/^\d/, '_$&')
|
30 | .replace(/[^a-zA-Z0-9_$]/g, '');
|
31 |
|
32 | const options = Object.assign({}, compileOptions, {
|
33 | filename,
|
34 | name: capitalise(name),
|
35 | generate: 'ssr',
|
36 | format: 'cjs'
|
37 | });
|
38 |
|
39 | const { js, warnings } = compile(fs.readFileSync(filename, 'utf-8'), options);
|
40 |
|
41 | if (options.dev) {
|
42 | warnings.forEach(warning => {
|
43 | console.warn(`\nSvelte Warning in ${warning.filename}:`);
|
44 | console.warn(warning.message);
|
45 | console.warn(warning.frame);
|
46 | })
|
47 | }
|
48 |
|
49 | return module._compile(js.code, filename);
|
50 | };
|
51 | }
|
52 |
|
53 | registerExtension('.svelte');
|
54 | registerExtension('.html');
|
55 |
|
56 | module.exports = register;
|