1 | import Path from './path.js';
|
2 |
|
3 | export default {
|
4 | |
5 |
|
6 |
|
7 | innerHandler: function (character, index, string) {
|
8 | if (string[index-1] === '\\') return;
|
9 | if (character === '\'') return '\\\'';
|
10 | if (character === '\"') return '\\"';
|
11 | if (character === '\t') return '\\t';
|
12 | if (character === '\r') return '\\r';
|
13 | if (character === '\n') return '\\n';
|
14 | if (character === '\w') return '\\w';
|
15 | if (character === '\b') return '\\b';
|
16 | },
|
17 | updateString: function (value, index, string) {
|
18 | return string.slice(0, index) + value + string.slice(index+1);
|
19 | },
|
20 | updateIndex: function (value, index) {
|
21 | return index + value.length-1;
|
22 | },
|
23 | template: function (data) {
|
24 |
|
25 | var first = data.indexOf('`');
|
26 | var second = data.indexOf('`', first+1);
|
27 |
|
28 | if (first === -1 || second === -1) return data;
|
29 |
|
30 | var value;
|
31 | var ends = 0;
|
32 | var starts = 0;
|
33 | var string = data;
|
34 | var isInner = false;
|
35 |
|
36 | for (var index = 0; index < string.length; index++) {
|
37 | var character = string[index];
|
38 |
|
39 | if (character === '`' && string[index-1] !== '\\') {
|
40 |
|
41 | if (isInner) {
|
42 | ends++;
|
43 | value = '\'';
|
44 | isInner = false;
|
45 | string = this.updateString(value, index, string);
|
46 | index = this.updateIndex(value, index);
|
47 | } else {
|
48 | starts++;
|
49 | value = '\'';
|
50 | isInner = true;
|
51 | string = this.updateString(value, index, string);
|
52 | index = this.updateIndex(value, index);
|
53 | }
|
54 |
|
55 | } else if (isInner) {
|
56 |
|
57 | if (value = this.innerHandler(character, index, string)) {
|
58 | string = this.updateString(value, index, string);
|
59 | index = this.updateIndex(value, index);
|
60 | }
|
61 |
|
62 | }
|
63 |
|
64 | }
|
65 |
|
66 | string = string.replace(/\${(.*?)}/g, '\'+$1+\'');
|
67 |
|
68 | if (starts === ends) {
|
69 | return string;
|
70 | } else {
|
71 | throw new Error('import transformer missing backtick');
|
72 | }
|
73 |
|
74 | },
|
75 | |
76 |
|
77 |
|
78 | exp: /export\s+default\s*(var|let|const)?/,
|
79 | imps: /import(?:\s+(?:\*\s+as\s+)?\w+\s+from)?\s+(?:'|").*?(?:'|");?\n?/g,
|
80 | imp: /import(?:\s+(?:\*\s+as\s+)?(\w+)\s+from)?\s+(?:'|")(.*?)(?:'|");?\n?/,
|
81 | module: function (code, url) {
|
82 |
|
83 | var before = 'return Promise.all([\n';
|
84 | var after = ']).then(function ($MODULES) {\n';
|
85 | var parentImport = url.slice(0, url.lastIndexOf('/') + 1);
|
86 |
|
87 | var imps = code.match(this.imps) || [];
|
88 |
|
89 | for (var i = 0, l = imps.length; i < l; i++) {
|
90 | var imp = imps[i].match(this.imp);
|
91 |
|
92 | var rawImport = imp[0];
|
93 | var nameImport = imp[1];
|
94 | var pathImport = imp[2];
|
95 |
|
96 | if (pathImport.slice(0, 1) !== '/') {
|
97 | pathImport = Path.normalize(parentImport + '/' + pathImport);
|
98 | } else {
|
99 | pathImport = Path.normalize(pathImport);
|
100 | }
|
101 |
|
102 | before = before + '\t$LOADER.load("' + pathImport + '"),\n';
|
103 | after = after + 'var ' + nameImport + ' = $MODULES[' + i + '].default;\n';
|
104 |
|
105 | code = code.replace(rawImport, '');
|
106 | }
|
107 |
|
108 | if (this.exp.test(code)) {
|
109 | code = code.replace(this.exp, 'var $DEFAULT = ');
|
110 | code = code + '\n\nreturn { default: $DEFAULT };\n';
|
111 | }
|
112 |
|
113 |
|
114 |
|
115 | code = '"use strict";\n' + before + after + code + '}).catch(function (error) { return error; });';
|
116 |
|
117 | return code;
|
118 | }
|
119 |
|
120 | };
|