art-template 4.12.1 → 4.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,11 @@
1
1
  'use strict';
2
2
 
3
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
8
+
3
9
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4
10
 
5
11
  var esTokenizer = require('./es-tokenizer');
@@ -48,12 +54,11 @@ var FROM = '$$from';
48
54
  var OPTIONS = '$$options';
49
55
 
50
56
  var has = function has(object, key) {
51
- return object.hasOwnProperty(key);
57
+ return Object.hasOwnProperty.call(object, key);
52
58
  };
53
59
  var stringify = JSON.stringify;
54
60
 
55
61
  var Compiler = function () {
56
-
57
62
  /**
58
63
  * 模板编译器
59
64
  * @param {Object} options
@@ -85,13 +90,13 @@ var Compiler = function () {
85
90
  this.CONTEXT_MAP = {};
86
91
 
87
92
  // 忽略的变量名单
88
- this.ignore = [DATA, IMPORTS, OPTIONS].concat(options.ignore);
93
+ this.ignore = [DATA, IMPORTS, OPTIONS].concat(_toConsumableArray(options.ignore));
89
94
 
90
95
  // 按需编译到模板渲染函数的内置变量
91
- this.internal = (_internal = {}, _internal[OUT] = '\'\'', _internal[LINE] = '[0,0]', _internal[BLOCKS] = 'arguments[1]||{}', _internal[FROM] = 'null', _internal[PRINT] = 'function(){var s=\'\'.concat.apply(\'\',arguments);' + OUT + '+=s;return s}', _internal[INCLUDE] = 'function(src,data){var s=' + OPTIONS + '.include(src,data||' + DATA + ',arguments[2]||' + BLOCKS + ',' + OPTIONS + ');' + OUT + '+=s;return s}', _internal[EXTEND] = 'function(from){' + FROM + '=from}', _internal[SLICE] = 'function(c,p,s){p=' + OUT + ';' + OUT + '=\'\';c();s=' + OUT + ';' + OUT + '=p+s;return s}', _internal[BLOCK] = 'function(){var a=arguments,s;if(typeof a[0]===\'function\'){return ' + SLICE + '(a[0])}else if(' + FROM + '){' + BLOCKS + '[a[0]]=' + SLICE + '(a[1])}else{s=' + BLOCKS + '[a[0]];if(typeof s===\'string\'){' + OUT + '+=s}else{s=' + SLICE + '(a[1])}return s}}', _internal);
96
+ this.internal = (_internal = {}, _defineProperty(_internal, OUT, '\'\''), _defineProperty(_internal, LINE, '[0,0]'), _defineProperty(_internal, BLOCKS, 'arguments[1]||{}'), _defineProperty(_internal, FROM, 'null'), _defineProperty(_internal, PRINT, 'function(){var s=\'\'.concat.apply(\'\',arguments);' + OUT + '+=s;return s}'), _defineProperty(_internal, INCLUDE, 'function(src,data){var s=' + OPTIONS + '.include(src,data||' + DATA + ',arguments[2]||' + BLOCKS + ',' + OPTIONS + ');' + OUT + '+=s;return s}'), _defineProperty(_internal, EXTEND, 'function(from){' + FROM + '=from}'), _defineProperty(_internal, SLICE, 'function(c,p,s){p=' + OUT + ';' + OUT + '=\'\';c();s=' + OUT + ';' + OUT + '=p+s;return s}'), _defineProperty(_internal, BLOCK, 'function(){var a=arguments,s;if(typeof a[0]===\'function\'){return ' + SLICE + '(a[0])}else if(' + FROM + '){if(!' + BLOCKS + '[a[0]]){' + BLOCKS + '[a[0]]=' + SLICE + '(a[1])}else{' + OUT + '+=' + BLOCKS + '[a[0]]}}else{s=' + BLOCKS + '[a[0]];if(typeof s===\'string\'){' + OUT + '+=s}else{s=' + SLICE + '(a[1])}return s}}'), _internal);
92
97
 
93
98
  // 内置函数依赖关系声明
94
- this.dependencies = (_dependencies = {}, _dependencies[PRINT] = [OUT], _dependencies[INCLUDE] = [OUT, OPTIONS, DATA, BLOCKS], _dependencies[EXTEND] = [FROM, /*[*/INCLUDE /*]*/], _dependencies[BLOCK] = [SLICE, FROM, OUT, BLOCKS], _dependencies);
99
+ this.dependencies = (_dependencies = {}, _defineProperty(_dependencies, PRINT, [OUT]), _defineProperty(_dependencies, INCLUDE, [OUT, OPTIONS, DATA, BLOCKS]), _defineProperty(_dependencies, EXTEND, [FROM, /*[*/INCLUDE /*]*/]), _defineProperty(_dependencies, BLOCK, [SLICE, FROM, OUT, BLOCKS]), _dependencies);
95
100
 
96
101
  this.importContext(OUT);
97
102
 
@@ -117,332 +122,334 @@ var Compiler = function () {
117
122
 
118
123
  /**
119
124
  * 将模板代码转换成 tplToken 数组
120
- * @param {string} source
125
+ * @param {string} source
121
126
  * @return {Object[]}
122
127
  */
123
128
 
124
129
 
125
- Compiler.prototype.getTplTokens = function getTplTokens() {
126
- return tplTokenizer.apply(undefined, arguments);
127
- };
128
-
129
- /**
130
- * 将模板表达式转换成 esToken 数组
131
- * @param {string} source
132
- * @return {Object[]}
133
- */
134
-
135
-
136
- Compiler.prototype.getEsTokens = function getEsTokens(source) {
137
- return esTokenizer(source);
138
- };
139
-
140
- /**
141
- * 获取变量列表
142
- * @param {Object[]} esTokens
143
- * @return {string[]}
144
- */
145
-
146
-
147
- Compiler.prototype.getVariables = function getVariables(esTokens) {
148
- var ignore = false;
149
- return esTokens.filter(function (esToken) {
150
- return esToken.type !== 'whitespace' && esToken.type !== 'comment';
151
- }).filter(function (esToken) {
152
- if (esToken.type === 'name' && !ignore) {
153
- return true;
154
- }
155
-
156
- ignore = esToken.type === 'punctuator' && esToken.value === '.';
157
-
158
- return false;
159
- }).map(function (tooken) {
160
- return tooken.value;
161
- });
162
- };
163
-
164
- /**
165
- * 导入模板上下文
166
- * @param {string} name
167
- */
168
-
169
-
170
- Compiler.prototype.importContext = function importContext(name) {
171
- var _this2 = this;
172
-
173
- var value = '';
174
- var internal = this.internal;
175
- var dependencies = this.dependencies;
176
- var ignore = this.ignore;
177
- var context = this.context;
178
- var options = this.options;
179
- var imports = options.imports;
180
- var contextMap = this.CONTEXT_MAP;
130
+ _createClass(Compiler, [{
131
+ key: 'getTplTokens',
132
+ value: function getTplTokens() {
133
+ return tplTokenizer.apply(undefined, arguments);
134
+ }
181
135
 
182
- if (!has(contextMap, name) && ignore.indexOf(name) === -1) {
136
+ /**
137
+ * 将模板表达式转换成 esToken 数组
138
+ * @param {string} source
139
+ * @return {Object[]}
140
+ */
183
141
 
184
- if (has(internal, name)) {
185
- value = internal[name];
142
+ }, {
143
+ key: 'getEsTokens',
144
+ value: function getEsTokens(source) {
145
+ return esTokenizer(source);
146
+ }
186
147
 
187
- if (has(dependencies, name)) {
188
- dependencies[name].forEach(function (name) {
189
- return _this2.importContext(name);
190
- });
148
+ /**
149
+ * 获取变量列表
150
+ * @param {Object[]} esTokens
151
+ * @return {string[]}
152
+ */
153
+
154
+ }, {
155
+ key: 'getVariables',
156
+ value: function getVariables(esTokens) {
157
+ var ignore = false;
158
+ return esTokens.filter(function (esToken) {
159
+ return esToken.type !== 'whitespace' && esToken.type !== 'comment';
160
+ }).filter(function (esToken) {
161
+ if (esToken.type === 'name' && !ignore) {
162
+ return true;
191
163
  }
192
164
 
193
- // imports 继承了 Global,但是继承的属性不分配到顶级变量中,避免占用了模板内部的变量名称
194
- } else if (name === ESCAPE || name === EACH || has(imports, name)) {
195
- value = IMPORTS + '.' + name;
196
- } else {
197
- value = DATA + '.' + name;
198
- }
165
+ ignore = esToken.type === 'punctuator' && esToken.value === '.';
199
166
 
200
- contextMap[name] = value;
201
- context.push({
202
- name: name,
203
- value: value
167
+ return false;
168
+ }).map(function (tooken) {
169
+ return tooken.value;
204
170
  });
205
171
  }
206
- };
207
-
208
- /**
209
- * 解析字符串(HTML)直接输出语句
210
- * @param {Object} tplToken
211
- */
212
-
213
-
214
- Compiler.prototype.parseString = function parseString(tplToken) {
215
-
216
- var source = tplToken.value;
217
-
218
- if (!source) {
219
- return;
220
- }
221
-
222
- var code = OUT + '+=' + stringify(source);
223
- this.scripts.push({
224
- source: source,
225
- tplToken: tplToken,
226
- code: code
227
- });
228
- };
229
-
230
- /**
231
- * 解析逻辑表达式语句
232
- * @param {Object} tplToken
233
- */
234
172
 
173
+ /**
174
+ * 导入模板上下文
175
+ * @param {string} name
176
+ */
177
+
178
+ }, {
179
+ key: 'importContext',
180
+ value: function importContext(name) {
181
+ var _this2 = this;
182
+
183
+ var value = '';
184
+ var internal = this.internal;
185
+ var dependencies = this.dependencies;
186
+ var ignore = this.ignore;
187
+ var context = this.context;
188
+ var options = this.options;
189
+ var imports = options.imports;
190
+ var contextMap = this.CONTEXT_MAP;
191
+
192
+ if (!has(contextMap, name) && ignore.indexOf(name) === -1) {
193
+ if (has(internal, name)) {
194
+ value = internal[name];
195
+
196
+ if (has(dependencies, name)) {
197
+ dependencies[name].forEach(function (name) {
198
+ return _this2.importContext(name);
199
+ });
200
+ }
201
+
202
+ // imports 继承了 Global,但是继承的属性不分配到顶级变量中,避免占用了模板内部的变量名称
203
+ } else if (name === ESCAPE || name === EACH || has(imports, name)) {
204
+ value = IMPORTS + '.' + name;
205
+ } else {
206
+ value = DATA + '.' + name;
207
+ }
235
208
 
236
- Compiler.prototype.parseExpression = function parseExpression(tplToken) {
237
- var _this3 = this;
238
-
239
- var source = tplToken.value;
240
- var script = tplToken.script;
241
- var output = script.output;
242
- var escape = this.options.escape;
243
- var code = script.code;
244
-
245
- if (output) {
246
- if (escape === false || output === tplTokenizer.TYPE_RAW) {
247
- code = OUT + '+=' + script.code;
248
- } else {
249
- code = OUT + '+=' + ESCAPE + '(' + script.code + ')';
209
+ contextMap[name] = value;
210
+ context.push({
211
+ name: name,
212
+ value: value
213
+ });
250
214
  }
251
215
  }
252
216
 
253
- var esToken = this.getEsTokens(code);
254
- this.getVariables(esToken).forEach(function (name) {
255
- return _this3.importContext(name);
256
- });
217
+ /**
218
+ * 解析字符串(HTML)直接输出语句
219
+ * @param {Object} tplToken
220
+ */
257
221
 
258
- this.scripts.push({
259
- source: source,
260
- tplToken: tplToken,
261
- code: code
262
- });
263
- };
222
+ }, {
223
+ key: 'parseString',
224
+ value: function parseString(tplToken) {
225
+ var source = tplToken.value;
264
226
 
265
- /**
266
- * 检查解析后的模板语句是否存在语法错误
267
- * @param {string} script
268
- * @return {boolean}
269
- */
227
+ if (!source) {
228
+ return;
229
+ }
270
230
 
231
+ var code = OUT + '+=' + stringify(source);
232
+ this.scripts.push({
233
+ source: source,
234
+ tplToken: tplToken,
235
+ code: code
236
+ });
237
+ }
271
238
 
272
- Compiler.prototype.checkExpression = function checkExpression(script) {
239
+ /**
240
+ * 解析逻辑表达式语句
241
+ * @param {Object} tplToken
242
+ */
243
+
244
+ }, {
245
+ key: 'parseExpression',
246
+ value: function parseExpression(tplToken) {
247
+ var _this3 = this;
248
+
249
+ var source = tplToken.value;
250
+ var script = tplToken.script;
251
+ var output = script.output;
252
+ var escape = this.options.escape;
253
+ var code = script.code;
254
+
255
+ if (output) {
256
+ if (escape === false || output === tplTokenizer.TYPE_RAW) {
257
+ code = OUT + '+=' + script.code;
258
+ } else {
259
+ code = OUT + '+=' + ESCAPE + '(' + script.code + ')';
260
+ }
261
+ }
273
262
 
274
- // 没有闭合的块级模板语句规则
275
- // 基于正则规则来补全语法不能保证 100% 准确,
276
- // 但是在绝大多数情况下足以满足辅助开发调试的需要
277
- var rules = [
263
+ var esToken = this.getEsTokens(code);
264
+ this.getVariables(esToken).forEach(function (name) {
265
+ return _this3.importContext(name);
266
+ });
278
267
 
279
- // <% } %>
280
- // <% }else{ %>
281
- // <% }else if(a){ %>
282
- [/^\s*}[\w\W]*?{?[\s;]*$/, ''],
268
+ this.scripts.push({
269
+ source: source,
270
+ tplToken: tplToken,
271
+ code: code
272
+ });
273
+ }
283
274
 
284
- // <% fn(c,function(a,b){ %>
285
- // <% fn(c, a=>{ %>
286
- // <% fn(c,(a,b)=>{ %>
287
- [/(^[\w\W]*?\([\w\W]*?(?:=>|\([\w\W]*?\))\s*{[\s;]*$)/, '$1})'],
275
+ /**
276
+ * 检查解析后的模板语句是否存在语法错误
277
+ * @param {string} script
278
+ * @return {boolean}
279
+ */
280
+
281
+ }, {
282
+ key: 'checkExpression',
283
+ value: function checkExpression(script) {
284
+ // 没有闭合的块级模板语句规则
285
+ // 基于正则规则来补全语法不能保证 100% 准确,
286
+ // 但是在绝大多数情况下足以满足辅助开发调试的需要
287
+ var rules = [
288
+ // <% } %>
289
+ // <% }else{ %>
290
+ // <% }else if(a){ %>
291
+ [/^\s*}[\w\W]*?{?[\s;]*$/, ''],
292
+
293
+ // <% fn(c,function(a,b){ %>
294
+ // <% fn(c, a=>{ %>
295
+ // <% fn(c,(a,b)=>{ %>
296
+ [/(^[\w\W]*?\([\w\W]*?(?:=>|\([\w\W]*?\))\s*{[\s;]*$)/, '$1})'],
297
+
298
+ // <% if(a){ %>
299
+ // <% for(var i in d){ %>
300
+ [/(^[\w\W]*?\([\w\W]*?\)\s*{[\s;]*$)/, '$1}']];
288
301
 
289
- // <% if(a){ %>
290
- // <% for(var i in d){ %>
291
- [/(^[\w\W]*?\([\w\W]*?\)\s*{[\s;]*$)/, '$1}']];
302
+ var index = 0;
303
+ while (index < rules.length) {
304
+ if (rules[index][0].test(script)) {
305
+ var _script;
292
306
 
293
- var index = 0;
294
- while (index < rules.length) {
295
- if (rules[index][0].test(script)) {
296
- var _script;
307
+ script = (_script = script).replace.apply(_script, _toConsumableArray(rules[index]));
308
+ break;
309
+ }
310
+ index++;
311
+ }
297
312
 
298
- script = (_script = script).replace.apply(_script, rules[index]);
299
- break;
313
+ try {
314
+ new Function(script);
315
+ return true;
316
+ } catch (e) {
317
+ return false;
300
318
  }
301
- index++;
302
- };
303
-
304
- try {
305
- new Function(script);
306
- return true;
307
- } catch (e) {
308
- return false;
309
319
  }
310
- };
311
-
312
- /**
313
- * 编译
314
- * @return {function}
315
- */
316
-
317
320
 
318
- Compiler.prototype.build = function build() {
319
-
320
- var options = this.options;
321
- var context = this.context;
322
- var scripts = this.scripts;
323
- var stacks = this.stacks;
324
- var source = this.source;
325
- var filename = options.filename;
326
- var imports = options.imports;
327
- var mappings = [];
328
- var extendMode = has(this.CONTEXT_MAP, EXTEND);
329
-
330
- var offsetLine = 0;
331
-
332
- // Create SourceMap: mapping
333
- var mapping = function mapping(code, _ref) {
334
- var line = _ref.line,
335
- start = _ref.start;
336
-
337
- var node = {
338
- generated: {
339
- line: stacks.length + offsetLine + 1,
340
- column: 1
341
- },
342
- original: {
343
- line: line + 1,
344
- column: start + 1
345
- }
321
+ /**
322
+ * 编译
323
+ * @return {function}
324
+ */
325
+
326
+ }, {
327
+ key: 'build',
328
+ value: function build() {
329
+ var options = this.options;
330
+ var context = this.context;
331
+ var scripts = this.scripts;
332
+ var stacks = this.stacks;
333
+ var source = this.source;
334
+ var filename = options.filename;
335
+ var imports = options.imports;
336
+ var mappings = [];
337
+ var extendMode = has(this.CONTEXT_MAP, EXTEND);
338
+
339
+ var offsetLine = 0;
340
+
341
+ // Create SourceMap: mapping
342
+ var mapping = function mapping(code, _ref) {
343
+ var line = _ref.line,
344
+ start = _ref.start;
345
+
346
+ var node = {
347
+ generated: {
348
+ line: stacks.length + offsetLine + 1,
349
+ column: 1
350
+ },
351
+ original: {
352
+ line: line + 1,
353
+ column: start + 1
354
+ }
355
+ };
356
+
357
+ offsetLine += code.split(/\n/).length - 1;
358
+ return node;
346
359
  };
347
360
 
348
- offsetLine += code.split(/\n/).length - 1;
349
- return node;
350
- };
361
+ // Trim code
362
+ var trim = function trim(code) {
363
+ return code.replace(/^[\t ]+|[\t ]$/g, '');
364
+ };
351
365
 
352
- // Trim code
353
- var trim = function trim(code) {
354
- return code.replace(/^[\t ]+|[\t ]$/g, '');
355
- };
366
+ stacks.push('function(' + DATA + '){');
367
+ stacks.push('\'use strict\'');
368
+ stacks.push(DATA + '=' + DATA + '||{}');
369
+ stacks.push('var ' + context.map(function (_ref2) {
370
+ var name = _ref2.name,
371
+ value = _ref2.value;
372
+ return name + '=' + value;
373
+ }).join(','));
356
374
 
357
- stacks.push('function(' + DATA + '){');
358
- stacks.push('\'use strict\'');
359
- stacks.push(DATA + '=' + DATA + '||{}');
360
- stacks.push('var ' + context.map(function (_ref2) {
361
- var name = _ref2.name,
362
- value = _ref2.value;
363
- return name + '=' + value;
364
- }).join(','));
375
+ if (options.compileDebug) {
376
+ stacks.push('try{');
365
377
 
366
- if (options.compileDebug) {
378
+ scripts.forEach(function (script) {
379
+ if (script.tplToken.type === tplTokenizer.TYPE_EXPRESSION) {
380
+ stacks.push(LINE + '=[' + [script.tplToken.line, script.tplToken.start].join(',') + ']');
381
+ }
367
382
 
368
- stacks.push('try{');
383
+ mappings.push(mapping(script.code, script.tplToken));
384
+ stacks.push(trim(script.code));
385
+ });
369
386
 
370
- scripts.forEach(function (script) {
387
+ stacks.push('}catch(error){');
371
388
 
372
- if (script.tplToken.type === tplTokenizer.TYPE_EXPRESSION) {
373
- stacks.push(LINE + '=[' + [script.tplToken.line, script.tplToken.start].join(',') + ']');
374
- }
389
+ stacks.push('throw {' + ['name:\'RuntimeError\'', 'path:' + stringify(filename), 'message:error.message', 'line:' + LINE + '[0]+1', 'column:' + LINE + '[1]+1', 'source:' + stringify(source), 'stack:error.stack'].join(',') + '}');
375
390
 
376
- mappings.push(mapping(script.code, script.tplToken));
377
- stacks.push(trim(script.code));
378
- });
379
-
380
- stacks.push('}catch(error){');
391
+ stacks.push('}');
392
+ } else {
393
+ scripts.forEach(function (script) {
394
+ mappings.push(mapping(script.code, script.tplToken));
395
+ stacks.push(trim(script.code));
396
+ });
397
+ }
381
398
 
382
- stacks.push('throw {' + ['name:\'RuntimeError\'', 'path:' + stringify(filename), 'message:error.message', 'line:' + LINE + '[0]+1', 'column:' + LINE + '[1]+1', 'source:' + stringify(source), 'stack:error.stack'].join(',') + '}');
399
+ if (extendMode) {
400
+ stacks.push(OUT + '=\'\'');
401
+ stacks.push(INCLUDE + '(' + FROM + ',' + DATA + ',' + BLOCKS + ')');
402
+ }
383
403
 
404
+ stacks.push('return ' + OUT);
384
405
  stacks.push('}');
385
- } else {
386
- scripts.forEach(function (script) {
387
- mappings.push(mapping(script.code, script.tplToken));
388
- stacks.push(trim(script.code));
389
- });
390
- }
391
-
392
- if (extendMode) {
393
- stacks.push(OUT + '=\'\'');
394
- stacks.push(INCLUDE + '(' + FROM + ',' + DATA + ',' + BLOCKS + ')');
395
- }
396
-
397
- stacks.push('return ' + OUT);
398
- stacks.push('}');
399
406
 
400
- var renderCode = stacks.join('\n');
407
+ var renderCode = stacks.join('\n');
401
408
 
402
- try {
403
- var result = new Function(IMPORTS, OPTIONS, 'return ' + renderCode)(imports, options);
404
- result.mappings = mappings;
405
- result.sourcesContent = [source];
406
- return result;
407
- } catch (error) {
408
-
409
- var index = 0;
410
- var line = 0;
411
- var start = 0;
412
- var generated = void 0;
413
-
414
- while (index < scripts.length) {
415
- var current = scripts[index];
416
- if (!this.checkExpression(current.code)) {
417
- line = current.tplToken.line;
418
- start = current.tplToken.start;
419
- generated = current.code;
420
- break;
409
+ try {
410
+ var result = new Function(IMPORTS, OPTIONS, 'return ' + renderCode)(imports, options);
411
+ result.mappings = mappings;
412
+ result.sourcesContent = [source];
413
+ return result;
414
+ } catch (error) {
415
+ var index = 0;
416
+ var line = 0;
417
+ var start = 0;
418
+ var generated = void 0;
419
+
420
+ while (index < scripts.length) {
421
+ var current = scripts[index];
422
+ if (!this.checkExpression(current.code)) {
423
+ line = current.tplToken.line;
424
+ start = current.tplToken.start;
425
+ generated = current.code;
426
+ break;
427
+ }
428
+ index++;
421
429
  }
422
- index++;
423
- };
424
430
 
425
- throw {
426
- name: 'CompileError',
427
- path: filename,
428
- message: error.message,
429
- line: line + 1,
430
- column: start + 1,
431
- source: source,
432
- generated: generated,
433
- stack: error.stack
434
- };
431
+ throw {
432
+ name: 'CompileError',
433
+ path: filename,
434
+ message: error.message,
435
+ line: line + 1,
436
+ column: start + 1,
437
+ source: source,
438
+ generated: generated,
439
+ stack: error.stack
440
+ };
441
+ }
435
442
  }
436
- };
443
+ }]);
437
444
 
438
445
  return Compiler;
439
446
  }();
440
447
 
441
- ;
442
-
443
448
  /**
444
449
  * 模板内置常量
445
450
  */
451
+
452
+
446
453
  Compiler.CONSTS = {
447
454
  DATA: DATA,
448
455
  IMPORTS: IMPORTS,