UNPKG

3.85 kBJavaScriptView Raw
1import Path from './path.js';
2
3export default {
4 /*
5 templates
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 modules
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 // code = '"use strict";\n' + before + after + code + '});';
114 // code = '"use strict";\n' + before + after + code + '}).catch(console.error);';
115 code = '"use strict";\n' + before + after + code + '}).catch(function (error) { return error; });';
116
117 return code;
118 }
119
120};