1 | (function (global, factory) {
|
2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/compiler'), require('@angular/compiler-cli'), require('typescript')) :
|
3 | typeof define === 'function' && define.amd ? define(['exports', '@angular/core', '@angular/compiler', '@angular/compiler-cli', 'typescript'], factory) :
|
4 | (factory((global.ngast = global.ngast || {}),global._angular_core,global._angular_compiler,global._angular_compilerCli,global.ts));
|
5 | }(this, (function (exports,_angular_core,_angular_compiler,_angular_compilerCli,ts) { 'use strict';
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | var Symbol = (function () {
|
15 | |
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | function Symbol(_program, _symbol) {
|
24 | this._program = _program;
|
25 | this._symbol = _symbol;
|
26 | }
|
27 | |
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 | Symbol.prototype.getNode = function () {
|
36 | var _this = this;
|
37 | var program = this._program.getSourceFile(this._symbol.filePath);
|
38 | var findNode = function (node) {
|
39 | if (node.kind === ts.SyntaxKind.ClassDeclaration &&
|
40 | (node.name || { text: undefined }).text === _this._symbol.name) {
|
41 | return node;
|
42 | }
|
43 | else {
|
44 | return ts.forEachChild(node, findNode);
|
45 | }
|
46 | };
|
47 | return findNode(program);
|
48 | };
|
49 | Object.defineProperty(Symbol.prototype, "symbol", {
|
50 | |
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 | get: function () {
|
58 | return this._symbol;
|
59 | },
|
60 | enumerable: true,
|
61 | configurable: true
|
62 | });
|
63 | return Symbol;
|
64 | }());
|
65 |
|
66 | var ProviderSymbol = (function () {
|
67 | function ProviderSymbol(program, provider, metadataResolver) {
|
68 | this.program = program;
|
69 | this.provider = provider;
|
70 | this.metadataResolver = metadataResolver;
|
71 | }
|
72 | |
73 |
|
74 |
|
75 | ProviderSymbol.prototype.getMetadata = function () {
|
76 | return this.provider;
|
77 | };
|
78 | |
79 |
|
80 |
|
81 | ProviderSymbol.prototype.getDependencies = function () {
|
82 | var _this = this;
|
83 | return (this.provider.deps || []).map(function (d) {
|
84 | var meta = new _angular_compiler.ProviderMeta(d.token.identifier.reference, d);
|
85 | return new ProviderSymbol(_this.program, _this.metadataResolver.getProviderMetadata(meta), _this.metadataResolver);
|
86 | });
|
87 | };
|
88 | return ProviderSymbol;
|
89 | }());
|
90 |
|
91 | var __extends = (undefined && undefined.__extends) || (function () {
|
92 | var extendStatics = Object.setPrototypeOf ||
|
93 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
94 | function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
95 | return function (d, b) {
|
96 | extendStatics(d, b);
|
97 | function __() { this.constructor = d; }
|
98 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
99 | };
|
100 | })();
|
101 |
|
102 |
|
103 |
|
104 |
|
105 |
|
106 |
|
107 |
|
108 | var PipeSymbol = (function (_super) {
|
109 | __extends(PipeSymbol, _super);
|
110 | |
111 |
|
112 |
|
113 |
|
114 |
|
115 |
|
116 |
|
117 |
|
118 |
|
119 |
|
120 | function PipeSymbol(program, symbol, resolver, metadataResolver, projectSymbols) {
|
121 | var _this = _super.call(this, program, symbol) || this;
|
122 | _this.resolver = resolver;
|
123 | _this.metadataResolver = metadataResolver;
|
124 | _this.projectSymbols = projectSymbols;
|
125 | return _this;
|
126 | }
|
127 | |
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 |
|
134 | PipeSymbol.prototype.getModule = function () {
|
135 | return this.projectSymbols.getAnalyzedModules()
|
136 | .ngModuleByPipeOrDirective.get(this.symbol);
|
137 | };
|
138 | |
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 | PipeSymbol.prototype.getMetadata = function () {
|
146 | return this.resolver.resolve(_angular_core.resolveForwardRef(this.symbol));
|
147 | };
|
148 | PipeSymbol.prototype.getDependencies = function () {
|
149 | var _this = this;
|
150 | var summary = this.metadataResolver.getInjectableSummary(this.symbol);
|
151 | if (!summary) {
|
152 | return [];
|
153 | }
|
154 | else {
|
155 | return (summary.type.diDeps || []).map(function (d) {
|
156 | var meta = new _angular_compiler.ProviderMeta(d.token.identifier.reference, d);
|
157 | return new ProviderSymbol(_this._program, _this.metadataResolver.getProviderMetadata(meta), _this.metadataResolver);
|
158 | });
|
159 | }
|
160 | };
|
161 | return PipeSymbol;
|
162 | }(Symbol));
|
163 |
|
164 |
|
165 |
|
166 |
|
167 |
|
168 |
|
169 |
|
170 |
|
171 |
|
172 |
|
173 |
|
174 |
|
175 |
|
176 |
|
177 | var $EOF = 0;
|
178 | var $TAB = 9;
|
179 | var $LF = 10;
|
180 | var $VTAB = 11;
|
181 | var $FF = 12;
|
182 | var $CR = 13;
|
183 | var $SPACE = 32;
|
184 | var $BANG = 33;
|
185 | var $DQ = 34;
|
186 | var $HASH = 35;
|
187 | var $$ = 36;
|
188 | var $PERCENT = 37;
|
189 | var $AMPERSAND = 38;
|
190 | var $SQ = 39;
|
191 | var $LPAREN = 40;
|
192 | var $RPAREN = 41;
|
193 | var $STAR = 42;
|
194 | var $PLUS = 43;
|
195 | var $COMMA = 44;
|
196 | var $MINUS = 45;
|
197 | var $PERIOD = 46;
|
198 | var $SLASH = 47;
|
199 | var $COLON = 58;
|
200 | var $SEMICOLON = 59;
|
201 |
|
202 | var $EQ = 61;
|
203 | var $GT = 62;
|
204 | var $QUESTION = 63;
|
205 | var $0 = 48;
|
206 | var $9 = 57;
|
207 | var $A = 65;
|
208 |
|
209 |
|
210 |
|
211 | var $Z = 90;
|
212 | var $LBRACKET = 91;
|
213 | var $BACKSLASH = 92;
|
214 | var $RBRACKET = 93;
|
215 | var $CARET = 94;
|
216 | var $_ = 95;
|
217 | var $a = 97;
|
218 |
|
219 |
|
220 |
|
221 |
|
222 |
|
223 |
|
224 |
|
225 |
|
226 | var $z = 122;
|
227 | var $LBRACE = 123;
|
228 |
|
229 | var $RBRACE = 125;
|
230 | var $NBSP = 160;
|
231 | var $PIPE = 124;
|
232 | var $TILDA = 126;
|
233 | var $AT = 64;
|
234 |
|
235 | function isWhitespace(code) {
|
236 | return (code >= $TAB && code <= $SPACE) || (code == $NBSP);
|
237 | }
|
238 | function isDigit(code) {
|
239 | return $0 <= code && code <= $9;
|
240 | }
|
241 | function isAsciiLetter(code) {
|
242 | return code >= $a && code <= $z || code >= $A && code <= $Z;
|
243 | }
|
244 |
|
245 | var ParseLocation = (function () {
|
246 | function ParseLocation(file, offset, line, col) {
|
247 | this.file = file;
|
248 | this.offset = offset;
|
249 | this.line = line;
|
250 | this.col = col;
|
251 | }
|
252 | ParseLocation.prototype.toString = function () {
|
253 | return this.offset ? this.file.url + "@" + this.line + ":" + this.col : this.file.url;
|
254 | };
|
255 | return ParseLocation;
|
256 | }());
|
257 | var ParseSourceFile = (function () {
|
258 | function ParseSourceFile(content, url) {
|
259 | this.content = content;
|
260 | this.url = url;
|
261 | }
|
262 | return ParseSourceFile;
|
263 | }());
|
264 | var ParseSourceSpan = (function () {
|
265 | function ParseSourceSpan(start, end, details) {
|
266 | if (details === void 0) { details = null; }
|
267 | this.start = start;
|
268 | this.end = end;
|
269 | this.details = details;
|
270 | }
|
271 | ParseSourceSpan.prototype.toString = function () {
|
272 | return this.start.file.content.substring(this.start.offset, this.end.offset);
|
273 | };
|
274 | return ParseSourceSpan;
|
275 | }());
|
276 | var ParseErrorLevel;
|
277 | (function (ParseErrorLevel) {
|
278 | ParseErrorLevel[ParseErrorLevel["WARNING"] = 0] = "WARNING";
|
279 | ParseErrorLevel[ParseErrorLevel["FATAL"] = 1] = "FATAL";
|
280 | })(ParseErrorLevel || (ParseErrorLevel = {}));
|
281 | var ParseError = (function () {
|
282 | function ParseError(span, msg, level) {
|
283 | if (level === void 0) { level = ParseErrorLevel.FATAL; }
|
284 | this.span = span;
|
285 | this.msg = msg;
|
286 | this.level = level;
|
287 | }
|
288 | ParseError.prototype.toString = function () {
|
289 | var source = this.span.start.file.content;
|
290 | var ctxStart = this.span.start.offset;
|
291 | var contextStr = '';
|
292 | var details = '';
|
293 | if (ctxStart) {
|
294 | if (ctxStart > source.length - 1) {
|
295 | ctxStart = source.length - 1;
|
296 | }
|
297 | var ctxEnd = ctxStart;
|
298 | var ctxLen = 0;
|
299 | var ctxLines = 0;
|
300 | while (ctxLen < 100 && ctxStart > 0) {
|
301 | ctxStart--;
|
302 | ctxLen++;
|
303 | if (source[ctxStart] == '\n') {
|
304 | if (++ctxLines == 3) {
|
305 | break;
|
306 | }
|
307 | }
|
308 | }
|
309 | ctxLen = 0;
|
310 | ctxLines = 0;
|
311 | while (ctxLen < 100 && ctxEnd < source.length - 1) {
|
312 | ctxEnd++;
|
313 | ctxLen++;
|
314 | if (source[ctxEnd] == '\n') {
|
315 | if (++ctxLines == 3) {
|
316 | break;
|
317 | }
|
318 | }
|
319 | }
|
320 | var context = source.substring(ctxStart, this.span.start.offset) + '[ERROR ->]' +
|
321 | source.substring(this.span.start.offset, ctxEnd + 1);
|
322 | contextStr = " (\"" + context + "\")";
|
323 | }
|
324 | if (this.span.details) {
|
325 | details = ", " + this.span.details;
|
326 | }
|
327 | return "" + this.msg + contextStr + ": " + this.span.start + details;
|
328 | };
|
329 | return ParseError;
|
330 | }());
|
331 |
|
332 |
|
333 |
|
334 |
|
335 |
|
336 |
|
337 |
|
338 |
|
339 |
|
340 | var CssTokenType;
|
341 | (function (CssTokenType) {
|
342 | CssTokenType[CssTokenType["EOF"] = 0] = "EOF";
|
343 | CssTokenType[CssTokenType["String"] = 1] = "String";
|
344 | CssTokenType[CssTokenType["Comment"] = 2] = "Comment";
|
345 | CssTokenType[CssTokenType["Identifier"] = 3] = "Identifier";
|
346 | CssTokenType[CssTokenType["Number"] = 4] = "Number";
|
347 | CssTokenType[CssTokenType["IdentifierOrNumber"] = 5] = "IdentifierOrNumber";
|
348 | CssTokenType[CssTokenType["AtKeyword"] = 6] = "AtKeyword";
|
349 | CssTokenType[CssTokenType["Character"] = 7] = "Character";
|
350 | CssTokenType[CssTokenType["Whitespace"] = 8] = "Whitespace";
|
351 | CssTokenType[CssTokenType["Invalid"] = 9] = "Invalid";
|
352 | })(CssTokenType || (CssTokenType = {}));
|
353 | var CssLexerMode;
|
354 | (function (CssLexerMode) {
|
355 | CssLexerMode[CssLexerMode["ALL"] = 0] = "ALL";
|
356 | CssLexerMode[CssLexerMode["ALL_TRACK_WS"] = 1] = "ALL_TRACK_WS";
|
357 | CssLexerMode[CssLexerMode["SELECTOR"] = 2] = "SELECTOR";
|
358 | CssLexerMode[CssLexerMode["PSEUDO_SELECTOR"] = 3] = "PSEUDO_SELECTOR";
|
359 | CssLexerMode[CssLexerMode["PSEUDO_SELECTOR_WITH_ARGUMENTS"] = 4] = "PSEUDO_SELECTOR_WITH_ARGUMENTS";
|
360 | CssLexerMode[CssLexerMode["ATTRIBUTE_SELECTOR"] = 5] = "ATTRIBUTE_SELECTOR";
|
361 | CssLexerMode[CssLexerMode["AT_RULE_QUERY"] = 6] = "AT_RULE_QUERY";
|
362 | CssLexerMode[CssLexerMode["MEDIA_QUERY"] = 7] = "MEDIA_QUERY";
|
363 | CssLexerMode[CssLexerMode["BLOCK"] = 8] = "BLOCK";
|
364 | CssLexerMode[CssLexerMode["KEYFRAME_BLOCK"] = 9] = "KEYFRAME_BLOCK";
|
365 | CssLexerMode[CssLexerMode["STYLE_BLOCK"] = 10] = "STYLE_BLOCK";
|
366 | CssLexerMode[CssLexerMode["STYLE_VALUE"] = 11] = "STYLE_VALUE";
|
367 | CssLexerMode[CssLexerMode["STYLE_VALUE_FUNCTION"] = 12] = "STYLE_VALUE_FUNCTION";
|
368 | CssLexerMode[CssLexerMode["STYLE_CALC_FUNCTION"] = 13] = "STYLE_CALC_FUNCTION";
|
369 | })(CssLexerMode || (CssLexerMode = {}));
|
370 | var LexedCssResult = (function () {
|
371 | function LexedCssResult(error, token) {
|
372 | this.error = error;
|
373 | this.token = token;
|
374 | }
|
375 | return LexedCssResult;
|
376 | }());
|
377 | function generateErrorMessage(input, message, errorValue, index, row, column) {
|
378 | return message + " at column " + row + ":" + column + " in expression [" +
|
379 | findProblemCode(input, errorValue, index, column) + ']';
|
380 | }
|
381 | function findProblemCode(input, errorValue, index, column) {
|
382 | var endOfProblemLine = index;
|
383 | var current = charCode(input, index);
|
384 | while (current > 0 && !isNewline(current)) {
|
385 | current = charCode(input, ++endOfProblemLine);
|
386 | }
|
387 | var choppedString = input.substring(0, endOfProblemLine);
|
388 | var pointerPadding = '';
|
389 | for (var i = 0; i < column; i++) {
|
390 | pointerPadding += ' ';
|
391 | }
|
392 | var pointerString = '';
|
393 | for (var i = 0; i < errorValue.length; i++) {
|
394 | pointerString += '^';
|
395 | }
|
396 | return choppedString + '\n' + pointerPadding + pointerString + '\n';
|
397 | }
|
398 | var CssToken = (function () {
|
399 | function CssToken(index, column, line, type, strValue) {
|
400 | this.index = index;
|
401 | this.column = column;
|
402 | this.line = line;
|
403 | this.type = type;
|
404 | this.strValue = strValue;
|
405 | this.numValue = charCode(strValue, 0);
|
406 | }
|
407 | return CssToken;
|
408 | }());
|
409 | var CssLexer = (function () {
|
410 | function CssLexer() {
|
411 | }
|
412 | CssLexer.prototype.scan = function (text, trackComments) {
|
413 | if (trackComments === void 0) { trackComments = false; }
|
414 | return new CssScanner(text, trackComments);
|
415 | };
|
416 | return CssLexer;
|
417 | }());
|
418 | var CssScannerError = (function () {
|
419 | function CssScannerError(token, message) {
|
420 | this.token = token;
|
421 | this.rawMessage = message;
|
422 | }
|
423 | CssScannerError.prototype.toString = function () { return this.message; };
|
424 | return CssScannerError;
|
425 | }());
|
426 | function _trackWhitespace(mode) {
|
427 | switch (mode) {
|
428 | case CssLexerMode.SELECTOR:
|
429 | case CssLexerMode.PSEUDO_SELECTOR:
|
430 | case CssLexerMode.ALL_TRACK_WS:
|
431 | case CssLexerMode.STYLE_VALUE:
|
432 | return true;
|
433 | default:
|
434 | return false;
|
435 | }
|
436 | }
|
437 | var CssScanner = (function () {
|
438 | function CssScanner(input, _trackComments) {
|
439 | if (_trackComments === void 0) { _trackComments = false; }
|
440 | this.input = input;
|
441 | this._trackComments = _trackComments;
|
442 | this.length = 0;
|
443 | this.index = -1;
|
444 | this.column = -1;
|
445 | this.line = 0;
|
446 |
|
447 | this._currentMode = CssLexerMode.BLOCK;
|
448 |
|
449 | this._currentError = null;
|
450 | this.length = this.input.length;
|
451 | this.peekPeek = this.peekAt(0);
|
452 | this.advance();
|
453 | }
|
454 | CssScanner.prototype.getMode = function () { return this._currentMode; };
|
455 | CssScanner.prototype.setMode = function (mode) {
|
456 | if (this._currentMode != mode) {
|
457 | if (_trackWhitespace(this._currentMode) && !_trackWhitespace(mode)) {
|
458 | this.consumeWhitespace();
|
459 | }
|
460 | this._currentMode = mode;
|
461 | }
|
462 | };
|
463 | CssScanner.prototype.advance = function () {
|
464 | if (isNewline(this.peek)) {
|
465 | this.column = 0;
|
466 | this.line++;
|
467 | }
|
468 | else {
|
469 | this.column++;
|
470 | }
|
471 | this.index++;
|
472 | this.peek = this.peekPeek;
|
473 | this.peekPeek = this.peekAt(this.index + 1);
|
474 | };
|
475 | CssScanner.prototype.peekAt = function (index) {
|
476 | return index >= this.length ? $EOF : this.input.charCodeAt(index);
|
477 | };
|
478 | CssScanner.prototype.consumeEmptyStatements = function () {
|
479 | this.consumeWhitespace();
|
480 | while (this.peek == $SEMICOLON) {
|
481 | this.advance();
|
482 | this.consumeWhitespace();
|
483 | }
|
484 | };
|
485 | CssScanner.prototype.consumeWhitespace = function () {
|
486 | while (isWhitespace(this.peek) || isNewline(this.peek)) {
|
487 | this.advance();
|
488 | if (!this._trackComments && isCommentStart(this.peek, this.peekPeek)) {
|
489 | this.advance();
|
490 | this.advance();
|
491 | while (!isCommentEnd(this.peek, this.peekPeek)) {
|
492 | if (this.peek == $EOF) {
|
493 | this.error('Unterminated comment');
|
494 | }
|
495 | this.advance();
|
496 | }
|
497 | this.advance();
|
498 | this.advance();
|
499 | }
|
500 | }
|
501 | };
|
502 | CssScanner.prototype.consume = function (type, value) {
|
503 | if (value === void 0) { value = null; }
|
504 | var mode = this._currentMode;
|
505 | this.setMode(_trackWhitespace(mode) ? CssLexerMode.ALL_TRACK_WS : CssLexerMode.ALL);
|
506 | var previousIndex = this.index;
|
507 | var previousLine = this.line;
|
508 | var previousColumn = this.column;
|
509 | var next;
|
510 | var output = this.scan();
|
511 | if (output) {
|
512 |
|
513 | if (output.error) {
|
514 | this.setMode(mode);
|
515 | return output;
|
516 | }
|
517 | next = output.token;
|
518 | }
|
519 | if (!next) {
|
520 | next = new CssToken(this.index, this.column, this.line, CssTokenType.EOF, 'end of file');
|
521 | }
|
522 | var isMatchingType = false;
|
523 | if (type == CssTokenType.IdentifierOrNumber) {
|
524 |
|
525 | isMatchingType = next.type == CssTokenType.Number || next.type == CssTokenType.Identifier;
|
526 | }
|
527 | else {
|
528 | isMatchingType = next.type == type;
|
529 | }
|
530 |
|
531 |
|
532 | this.setMode(mode);
|
533 | var error = null;
|
534 | if (!isMatchingType || (value && value != next.strValue)) {
|
535 | var errorMessage = CssTokenType[next.type] + ' does not match expected ' +
|
536 | CssTokenType[type] + ' value';
|
537 | if (value) {
|
538 | errorMessage += ' ("' + next.strValue + '" should match "' + value + '")';
|
539 | }
|
540 | error = new CssScannerError(next, generateErrorMessage(this.input, errorMessage, next.strValue, previousIndex, previousLine, previousColumn));
|
541 | }
|
542 | return new LexedCssResult(error, next);
|
543 | };
|
544 | CssScanner.prototype.scan = function () {
|
545 | var trackWS = _trackWhitespace(this._currentMode);
|
546 | if (this.index == 0 && !trackWS) {
|
547 | this.consumeWhitespace();
|
548 | }
|
549 | var token = this._scan();
|
550 | if (token == null)
|
551 | return null;
|
552 | var error = this._currentError;
|
553 | this._currentError = null;
|
554 | if (!trackWS) {
|
555 | this.consumeWhitespace();
|
556 | }
|
557 | return new LexedCssResult(error, token);
|
558 | };
|
559 |
|
560 | CssScanner.prototype._scan = function () {
|
561 | var peek = this.peek;
|
562 | var peekPeek = this.peekPeek;
|
563 | if (peek == $EOF)
|
564 | return null;
|
565 | if (isCommentStart(peek, peekPeek)) {
|
566 |
|
567 |
|
568 | var commentToken = this.scanComment();
|
569 | if (this._trackComments) {
|
570 | return commentToken;
|
571 | }
|
572 | }
|
573 | if (_trackWhitespace(this._currentMode) && (isWhitespace(peek) || isNewline(peek))) {
|
574 | return this.scanWhitespace();
|
575 | }
|
576 | peek = this.peek;
|
577 | peekPeek = this.peekPeek;
|
578 | if (peek == $EOF)
|
579 | return null;
|
580 | if (isStringStart(peek, peekPeek)) {
|
581 | return this.scanString();
|
582 | }
|
583 |
|
584 | if (this._currentMode == CssLexerMode.STYLE_VALUE_FUNCTION) {
|
585 | return this.scanCssValueFunction();
|
586 | }
|
587 | var isModifier = peek == $PLUS || peek == $MINUS;
|
588 | var digitA = isModifier ? false : isDigit(peek);
|
589 | var digitB = isDigit(peekPeek);
|
590 | if (digitA || (isModifier && (peekPeek == $PERIOD || digitB)) ||
|
591 | (peek == $PERIOD && digitB)) {
|
592 | return this.scanNumber();
|
593 | }
|
594 | if (peek == $AT) {
|
595 | return this.scanAtExpression();
|
596 | }
|
597 | if (isIdentifierStart(peek, peekPeek)) {
|
598 | return this.scanIdentifier();
|
599 | }
|
600 | if (isValidCssCharacter(peek, this._currentMode)) {
|
601 | return this.scanCharacter();
|
602 | }
|
603 | return this.error("Unexpected character [" + String.fromCharCode(peek) + "]");
|
604 | };
|
605 | CssScanner.prototype.scanComment = function () {
|
606 | if (this.assertCondition(isCommentStart(this.peek, this.peekPeek), 'Expected comment start value')) {
|
607 | return null;
|
608 | }
|
609 | var start = this.index;
|
610 | var startingColumn = this.column;
|
611 | var startingLine = this.line;
|
612 | this.advance();
|
613 | this.advance();
|
614 | while (!isCommentEnd(this.peek, this.peekPeek)) {
|
615 | if (this.peek == $EOF) {
|
616 | this.error('Unterminated comment');
|
617 | }
|
618 | this.advance();
|
619 | }
|
620 | this.advance();
|
621 | this.advance();
|
622 | var str = this.input.substring(start, this.index);
|
623 | return new CssToken(start, startingColumn, startingLine, CssTokenType.Comment, str);
|
624 | };
|
625 | CssScanner.prototype.scanWhitespace = function () {
|
626 | var start = this.index;
|
627 | var startingColumn = this.column;
|
628 | var startingLine = this.line;
|
629 | while (isWhitespace(this.peek) && this.peek != $EOF) {
|
630 | this.advance();
|
631 | }
|
632 | var str = this.input.substring(start, this.index);
|
633 | return new CssToken(start, startingColumn, startingLine, CssTokenType.Whitespace, str);
|
634 | };
|
635 | CssScanner.prototype.scanString = function () {
|
636 | if (this.assertCondition(isStringStart(this.peek, this.peekPeek), 'Unexpected non-string starting value')) {
|
637 | return null;
|
638 | }
|
639 | var target = this.peek;
|
640 | var start = this.index;
|
641 | var startingColumn = this.column;
|
642 | var startingLine = this.line;
|
643 | var previous = target;
|
644 | this.advance();
|
645 | while (!isCharMatch(target, previous, this.peek)) {
|
646 | if (this.peek == $EOF || isNewline(this.peek)) {
|
647 | this.error('Unterminated quote');
|
648 | }
|
649 | previous = this.peek;
|
650 | this.advance();
|
651 | }
|
652 | if (this.assertCondition(this.peek == target, 'Unterminated quote')) {
|
653 | return null;
|
654 | }
|
655 | this.advance();
|
656 | var str = this.input.substring(start, this.index);
|
657 | return new CssToken(start, startingColumn, startingLine, CssTokenType.String, str);
|
658 | };
|
659 | CssScanner.prototype.scanNumber = function () {
|
660 | var start = this.index;
|
661 | var startingColumn = this.column;
|
662 | if (this.peek == $PLUS || this.peek == $MINUS) {
|
663 | this.advance();
|
664 | }
|
665 | var periodUsed = false;
|
666 | while (isDigit(this.peek) || this.peek == $PERIOD) {
|
667 | if (this.peek == $PERIOD) {
|
668 | if (periodUsed) {
|
669 | this.error('Unexpected use of a second period value');
|
670 | }
|
671 | periodUsed = true;
|
672 | }
|
673 | this.advance();
|
674 | }
|
675 | var strValue = this.input.substring(start, this.index);
|
676 | return new CssToken(start, startingColumn, this.line, CssTokenType.Number, strValue);
|
677 | };
|
678 | CssScanner.prototype.scanIdentifier = function () {
|
679 | if (this.assertCondition(isIdentifierStart(this.peek, this.peekPeek), 'Expected identifier starting value')) {
|
680 | return null;
|
681 | }
|
682 | var start = this.index;
|
683 | var startingColumn = this.column;
|
684 | while (isIdentifierPart(this.peek)) {
|
685 | this.advance();
|
686 | }
|
687 | var strValue = this.input.substring(start, this.index);
|
688 | return new CssToken(start, startingColumn, this.line, CssTokenType.Identifier, strValue);
|
689 | };
|
690 | CssScanner.prototype.scanCssValueFunction = function () {
|
691 | var start = this.index;
|
692 | var startingColumn = this.column;
|
693 | var parenBalance = 1;
|
694 | while (this.peek != $EOF && parenBalance > 0) {
|
695 | this.advance();
|
696 | if (this.peek == $LPAREN) {
|
697 | parenBalance++;
|
698 | }
|
699 | else if (this.peek == $RPAREN) {
|
700 | parenBalance--;
|
701 | }
|
702 | }
|
703 | var strValue = this.input.substring(start, this.index);
|
704 | return new CssToken(start, startingColumn, this.line, CssTokenType.Identifier, strValue);
|
705 | };
|
706 | CssScanner.prototype.scanCharacter = function () {
|
707 | var start = this.index;
|
708 | var startingColumn = this.column;
|
709 | if (this.assertCondition(isValidCssCharacter(this.peek, this._currentMode), charStr(this.peek) + ' is not a valid CSS character')) {
|
710 | return null;
|
711 | }
|
712 | var c = this.input.substring(start, start + 1);
|
713 | this.advance();
|
714 | return new CssToken(start, startingColumn, this.line, CssTokenType.Character, c);
|
715 | };
|
716 | CssScanner.prototype.scanAtExpression = function () {
|
717 | if (this.assertCondition(this.peek == $AT, 'Expected @ value')) {
|
718 | return null;
|
719 | }
|
720 | var start = this.index;
|
721 | var startingColumn = this.column;
|
722 | this.advance();
|
723 | if (isIdentifierStart(this.peek, this.peekPeek)) {
|
724 | var ident = this.scanIdentifier();
|
725 | var strValue = '@' + ident.strValue;
|
726 | return new CssToken(start, startingColumn, this.line, CssTokenType.AtKeyword, strValue);
|
727 | }
|
728 | else {
|
729 | return this.scanCharacter();
|
730 | }
|
731 | };
|
732 | CssScanner.prototype.assertCondition = function (status, errorMessage) {
|
733 | if (!status) {
|
734 | this.error(errorMessage);
|
735 | return true;
|
736 | }
|
737 | return false;
|
738 | };
|
739 | CssScanner.prototype.error = function (message, errorTokenValue, doNotAdvance) {
|
740 | if (errorTokenValue === void 0) { errorTokenValue = null; }
|
741 | if (doNotAdvance === void 0) { doNotAdvance = false; }
|
742 | var index = this.index;
|
743 | var column = this.column;
|
744 | var line = this.line;
|
745 | errorTokenValue =
|
746 | errorTokenValue ? errorTokenValue : String.fromCharCode(this.peek);
|
747 | var invalidToken = new CssToken(index, column, line, CssTokenType.Invalid, errorTokenValue);
|
748 | var errorMessage = generateErrorMessage(this.input, message, errorTokenValue, index, line, column);
|
749 | if (!doNotAdvance) {
|
750 | this.advance();
|
751 | }
|
752 | this._currentError = new CssScannerError(invalidToken, errorMessage);
|
753 | return invalidToken;
|
754 | };
|
755 | return CssScanner;
|
756 | }());
|
757 | function isCharMatch(target, previous, code) {
|
758 | return code == target && previous != $BACKSLASH;
|
759 | }
|
760 | function isCommentStart(code, next) {
|
761 | return code == $SLASH && next == $STAR;
|
762 | }
|
763 | function isCommentEnd(code, next) {
|
764 | return code == $STAR && next == $SLASH;
|
765 | }
|
766 | function isStringStart(code, next) {
|
767 | var target = code;
|
768 | if (target == $BACKSLASH) {
|
769 | target = next;
|
770 | }
|
771 | return target == $DQ || target == $SQ;
|
772 | }
|
773 | function isIdentifierStart(code, next) {
|
774 | var target = code;
|
775 | if (target == $MINUS) {
|
776 | target = next;
|
777 | }
|
778 | return isAsciiLetter(target) || target == $BACKSLASH || target == $MINUS ||
|
779 | target == $_;
|
780 | }
|
781 | function isIdentifierPart(target) {
|
782 | return isAsciiLetter(target) || target == $BACKSLASH || target == $MINUS ||
|
783 | target == $_ || isDigit(target);
|
784 | }
|
785 | function isValidPseudoSelectorCharacter(code) {
|
786 | switch (code) {
|
787 | case $LPAREN:
|
788 | case $RPAREN:
|
789 | return true;
|
790 | default:
|
791 | return false;
|
792 | }
|
793 | }
|
794 | function isValidKeyframeBlockCharacter(code) {
|
795 | return code == $PERCENT;
|
796 | }
|
797 | function isValidAttributeSelectorCharacter(code) {
|
798 |
|
799 | switch (code) {
|
800 | case $$:
|
801 | case $PIPE:
|
802 | case $CARET:
|
803 | case $TILDA:
|
804 | case $STAR:
|
805 | case $EQ:
|
806 | return true;
|
807 | default:
|
808 | return false;
|
809 | }
|
810 | }
|
811 | function isValidSelectorCharacter(code) {
|
812 |
|
813 |
|
814 |
|
815 |
|
816 | switch (code) {
|
817 | case $HASH:
|
818 | case $PERIOD:
|
819 | case $TILDA:
|
820 | case $STAR:
|
821 | case $PLUS:
|
822 | case $GT:
|
823 | case $COLON:
|
824 | case $PIPE:
|
825 | case $COMMA:
|
826 | case $LBRACKET:
|
827 | case $RBRACKET:
|
828 | return true;
|
829 | default:
|
830 | return false;
|
831 | }
|
832 | }
|
833 | function isValidStyleBlockCharacter(code) {
|
834 |
|
835 |
|
836 | switch (code) {
|
837 | case $HASH:
|
838 | case $SEMICOLON:
|
839 | case $COLON:
|
840 | case $PERCENT:
|
841 | case $SLASH:
|
842 | case $BACKSLASH:
|
843 | case $BANG:
|
844 | case $PERIOD:
|
845 | case $LPAREN:
|
846 | case $RPAREN:
|
847 | return true;
|
848 | default:
|
849 | return false;
|
850 | }
|
851 | }
|
852 | function isValidMediaQueryRuleCharacter(code) {
|
853 |
|
854 | switch (code) {
|
855 | case $LPAREN:
|
856 | case $RPAREN:
|
857 | case $COLON:
|
858 | case $PERCENT:
|
859 | case $PERIOD:
|
860 | return true;
|
861 | default:
|
862 | return false;
|
863 | }
|
864 | }
|
865 | function isValidAtRuleCharacter(code) {
|
866 |
|
867 | switch (code) {
|
868 | case $LPAREN:
|
869 | case $RPAREN:
|
870 | case $COLON:
|
871 | case $PERCENT:
|
872 | case $PERIOD:
|
873 | case $SLASH:
|
874 | case $BACKSLASH:
|
875 | case $HASH:
|
876 | case $EQ:
|
877 | case $QUESTION:
|
878 | case $AMPERSAND:
|
879 | case $STAR:
|
880 | case $COMMA:
|
881 | case $MINUS:
|
882 | case $PLUS:
|
883 | return true;
|
884 | default:
|
885 | return false;
|
886 | }
|
887 | }
|
888 | function isValidStyleFunctionCharacter(code) {
|
889 | switch (code) {
|
890 | case $PERIOD:
|
891 | case $MINUS:
|
892 | case $PLUS:
|
893 | case $STAR:
|
894 | case $SLASH:
|
895 | case $LPAREN:
|
896 | case $RPAREN:
|
897 | case $COMMA:
|
898 | return true;
|
899 | default:
|
900 | return false;
|
901 | }
|
902 | }
|
903 | function isValidBlockCharacter(code) {
|
904 |
|
905 |
|
906 | return code == $AT;
|
907 | }
|
908 | function isValidCssCharacter(code, mode) {
|
909 | switch (mode) {
|
910 | case CssLexerMode.ALL:
|
911 | case CssLexerMode.ALL_TRACK_WS:
|
912 | return true;
|
913 | case CssLexerMode.SELECTOR:
|
914 | return isValidSelectorCharacter(code);
|
915 | case CssLexerMode.PSEUDO_SELECTOR_WITH_ARGUMENTS:
|
916 | return isValidPseudoSelectorCharacter(code);
|
917 | case CssLexerMode.ATTRIBUTE_SELECTOR:
|
918 | return isValidAttributeSelectorCharacter(code);
|
919 | case CssLexerMode.MEDIA_QUERY:
|
920 | return isValidMediaQueryRuleCharacter(code);
|
921 | case CssLexerMode.AT_RULE_QUERY:
|
922 | return isValidAtRuleCharacter(code);
|
923 | case CssLexerMode.KEYFRAME_BLOCK:
|
924 | return isValidKeyframeBlockCharacter(code);
|
925 | case CssLexerMode.STYLE_BLOCK:
|
926 | case CssLexerMode.STYLE_VALUE:
|
927 | return isValidStyleBlockCharacter(code);
|
928 | case CssLexerMode.STYLE_CALC_FUNCTION:
|
929 | return isValidStyleFunctionCharacter(code);
|
930 | case CssLexerMode.BLOCK:
|
931 | return isValidBlockCharacter(code);
|
932 | default:
|
933 | return false;
|
934 | }
|
935 | }
|
936 | function charCode(input, index) {
|
937 | return index >= input.length ? $EOF : input.charCodeAt(index);
|
938 | }
|
939 | function charStr(code) {
|
940 | return String.fromCharCode(code);
|
941 | }
|
942 | function isNewline(code) {
|
943 | switch (code) {
|
944 | case $FF:
|
945 | case $CR:
|
946 | case $LF:
|
947 | case $VTAB:
|
948 | return true;
|
949 | default:
|
950 | return false;
|
951 | }
|
952 | }
|
953 |
|
954 |
|
955 |
|
956 |
|
957 |
|
958 |
|
959 |
|
960 |
|
961 |
|
962 | var __extends$3 = (undefined && undefined.__extends) || (function () {
|
963 | var extendStatics = Object.setPrototypeOf ||
|
964 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
965 | function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
966 | return function (d, b) {
|
967 | extendStatics(d, b);
|
968 | function __() { this.constructor = d; }
|
969 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
970 | };
|
971 | })();
|
972 | var BlockType;
|
973 | (function (BlockType) {
|
974 | BlockType[BlockType["Import"] = 0] = "Import";
|
975 | BlockType[BlockType["Charset"] = 1] = "Charset";
|
976 | BlockType[BlockType["Namespace"] = 2] = "Namespace";
|
977 | BlockType[BlockType["Supports"] = 3] = "Supports";
|
978 | BlockType[BlockType["Keyframes"] = 4] = "Keyframes";
|
979 | BlockType[BlockType["MediaQuery"] = 5] = "MediaQuery";
|
980 | BlockType[BlockType["Selector"] = 6] = "Selector";
|
981 | BlockType[BlockType["FontFace"] = 7] = "FontFace";
|
982 | BlockType[BlockType["Page"] = 8] = "Page";
|
983 | BlockType[BlockType["Document"] = 9] = "Document";
|
984 | BlockType[BlockType["Viewport"] = 10] = "Viewport";
|
985 | BlockType[BlockType["Unsupported"] = 11] = "Unsupported";
|
986 | })(BlockType || (BlockType = {}));
|
987 | var CssAst = (function () {
|
988 | function CssAst(location) {
|
989 | this.location = location;
|
990 | }
|
991 | Object.defineProperty(CssAst.prototype, "start", {
|
992 | get: function () { return this.location.start; },
|
993 | enumerable: true,
|
994 | configurable: true
|
995 | });
|
996 | Object.defineProperty(CssAst.prototype, "end", {
|
997 | get: function () { return this.location.end; },
|
998 | enumerable: true,
|
999 | configurable: true
|
1000 | });
|
1001 | return CssAst;
|
1002 | }());
|
1003 | var CssStyleValueAst = (function (_super) {
|
1004 | __extends$3(CssStyleValueAst, _super);
|
1005 | function CssStyleValueAst(location, tokens, strValue) {
|
1006 | var _this = _super.call(this, location) || this;
|
1007 | _this.tokens = tokens;
|
1008 | _this.strValue = strValue;
|
1009 | return _this;
|
1010 | }
|
1011 | CssStyleValueAst.prototype.visit = function (visitor, context) { return visitor.visitCssValue(this); };
|
1012 | return CssStyleValueAst;
|
1013 | }(CssAst));
|
1014 | var CssRuleAst = (function (_super) {
|
1015 | __extends$3(CssRuleAst, _super);
|
1016 | function CssRuleAst(location) {
|
1017 | return _super.call(this, location) || this;
|
1018 | }
|
1019 | return CssRuleAst;
|
1020 | }(CssAst));
|
1021 | var CssBlockRuleAst = (function (_super) {
|
1022 | __extends$3(CssBlockRuleAst, _super);
|
1023 | function CssBlockRuleAst(location, type, block, name) {
|
1024 | if (name === void 0) { name = null; }
|
1025 | var _this = _super.call(this, location) || this;
|
1026 | _this.location = location;
|
1027 | _this.type = type;
|
1028 | _this.block = block;
|
1029 | _this.name = name;
|
1030 | return _this;
|
1031 | }
|
1032 | CssBlockRuleAst.prototype.visit = function (visitor, context) {
|
1033 | return visitor.visitCssBlock(this.block, context);
|
1034 | };
|
1035 | return CssBlockRuleAst;
|
1036 | }(CssRuleAst));
|
1037 | var CssKeyframeRuleAst = (function (_super) {
|
1038 | __extends$3(CssKeyframeRuleAst, _super);
|
1039 | function CssKeyframeRuleAst(location, name, block) {
|
1040 | return _super.call(this, location, BlockType.Keyframes, block, name) || this;
|
1041 | }
|
1042 | CssKeyframeRuleAst.prototype.visit = function (visitor, context) {
|
1043 | return visitor.visitCssKeyframeRule(this, context);
|
1044 | };
|
1045 | return CssKeyframeRuleAst;
|
1046 | }(CssBlockRuleAst));
|
1047 | var CssKeyframeDefinitionAst = (function (_super) {
|
1048 | __extends$3(CssKeyframeDefinitionAst, _super);
|
1049 | function CssKeyframeDefinitionAst(location, steps, block) {
|
1050 | var _this = _super.call(this, location, BlockType.Keyframes, block, mergeTokens(steps, ',')) || this;
|
1051 | _this.steps = steps;
|
1052 | return _this;
|
1053 | }
|
1054 | CssKeyframeDefinitionAst.prototype.visit = function (visitor, context) {
|
1055 | return visitor.visitCssKeyframeDefinition(this, context);
|
1056 | };
|
1057 | return CssKeyframeDefinitionAst;
|
1058 | }(CssBlockRuleAst));
|
1059 | var CssBlockDefinitionRuleAst = (function (_super) {
|
1060 | __extends$3(CssBlockDefinitionRuleAst, _super);
|
1061 | function CssBlockDefinitionRuleAst(location, strValue, type, query, block) {
|
1062 | var _this = _super.call(this, location, type, block) || this;
|
1063 | _this.strValue = strValue;
|
1064 | _this.query = query;
|
1065 | var firstCssToken = query.tokens[0];
|
1066 | _this.name = new CssToken(firstCssToken.index, firstCssToken.column, firstCssToken.line, CssTokenType.Identifier, _this.strValue);
|
1067 | return _this;
|
1068 | }
|
1069 | CssBlockDefinitionRuleAst.prototype.visit = function (visitor, context) {
|
1070 | return visitor.visitCssBlock(this.block, context);
|
1071 | };
|
1072 | return CssBlockDefinitionRuleAst;
|
1073 | }(CssBlockRuleAst));
|
1074 | var CssMediaQueryRuleAst = (function (_super) {
|
1075 | __extends$3(CssMediaQueryRuleAst, _super);
|
1076 | function CssMediaQueryRuleAst(location, strValue, query, block) {
|
1077 | return _super.call(this, location, strValue, BlockType.MediaQuery, query, block) || this;
|
1078 | }
|
1079 | CssMediaQueryRuleAst.prototype.visit = function (visitor, context) {
|
1080 | return visitor.visitCssMediaQueryRule(this, context);
|
1081 | };
|
1082 | return CssMediaQueryRuleAst;
|
1083 | }(CssBlockDefinitionRuleAst));
|
1084 | var CssAtRulePredicateAst = (function (_super) {
|
1085 | __extends$3(CssAtRulePredicateAst, _super);
|
1086 | function CssAtRulePredicateAst(location, strValue, tokens) {
|
1087 | var _this = _super.call(this, location) || this;
|
1088 | _this.strValue = strValue;
|
1089 | _this.tokens = tokens;
|
1090 | return _this;
|
1091 | }
|
1092 | CssAtRulePredicateAst.prototype.visit = function (visitor, context) {
|
1093 | return visitor.visitCssAtRulePredicate(this, context);
|
1094 | };
|
1095 | return CssAtRulePredicateAst;
|
1096 | }(CssAst));
|
1097 | var CssInlineRuleAst = (function (_super) {
|
1098 | __extends$3(CssInlineRuleAst, _super);
|
1099 | function CssInlineRuleAst(location, type, value) {
|
1100 | var _this = _super.call(this, location) || this;
|
1101 | _this.type = type;
|
1102 | _this.value = value;
|
1103 | return _this;
|
1104 | }
|
1105 | CssInlineRuleAst.prototype.visit = function (visitor, context) {
|
1106 | return visitor.visitCssInlineRule(this, context);
|
1107 | };
|
1108 | return CssInlineRuleAst;
|
1109 | }(CssRuleAst));
|
1110 | var CssSelectorRuleAst = (function (_super) {
|
1111 | __extends$3(CssSelectorRuleAst, _super);
|
1112 | function CssSelectorRuleAst(location, selectors, block) {
|
1113 | var _this = _super.call(this, location, BlockType.Selector, block) || this;
|
1114 | _this.selectors = selectors;
|
1115 | _this.strValue = selectors.map(function (selector) { return selector.strValue; }).join(',');
|
1116 | return _this;
|
1117 | }
|
1118 | CssSelectorRuleAst.prototype.visit = function (visitor, context) {
|
1119 | return visitor.visitCssSelectorRule(this, context);
|
1120 | };
|
1121 | return CssSelectorRuleAst;
|
1122 | }(CssBlockRuleAst));
|
1123 | var CssDefinitionAst = (function (_super) {
|
1124 | __extends$3(CssDefinitionAst, _super);
|
1125 | function CssDefinitionAst(location, property, value) {
|
1126 | var _this = _super.call(this, location) || this;
|
1127 | _this.property = property;
|
1128 | _this.value = value;
|
1129 | return _this;
|
1130 | }
|
1131 | CssDefinitionAst.prototype.visit = function (visitor, context) {
|
1132 | return visitor.visitCssDefinition(this, context);
|
1133 | };
|
1134 | return CssDefinitionAst;
|
1135 | }(CssAst));
|
1136 | var CssSelectorPartAst = (function (_super) {
|
1137 | __extends$3(CssSelectorPartAst, _super);
|
1138 | function CssSelectorPartAst(location) {
|
1139 | return _super.call(this, location) || this;
|
1140 | }
|
1141 | return CssSelectorPartAst;
|
1142 | }(CssAst));
|
1143 | var CssSelectorAst = (function (_super) {
|
1144 | __extends$3(CssSelectorAst, _super);
|
1145 | function CssSelectorAst(location, selectorParts) {
|
1146 | var _this = _super.call(this, location) || this;
|
1147 | _this.selectorParts = selectorParts;
|
1148 | _this.strValue = selectorParts.map(function (part) { return part.strValue; }).join('');
|
1149 | return _this;
|
1150 | }
|
1151 | CssSelectorAst.prototype.visit = function (visitor, context) {
|
1152 | return visitor.visitCssSelector(this, context);
|
1153 | };
|
1154 | return CssSelectorAst;
|
1155 | }(CssSelectorPartAst));
|
1156 | var CssSimpleSelectorAst = (function (_super) {
|
1157 | __extends$3(CssSimpleSelectorAst, _super);
|
1158 | function CssSimpleSelectorAst(location, tokens, strValue, pseudoSelectors, operator) {
|
1159 | var _this = _super.call(this, location) || this;
|
1160 | _this.tokens = tokens;
|
1161 | _this.strValue = strValue;
|
1162 | _this.pseudoSelectors = pseudoSelectors;
|
1163 | _this.operator = operator;
|
1164 | return _this;
|
1165 | }
|
1166 | CssSimpleSelectorAst.prototype.visit = function (visitor, context) {
|
1167 | return visitor.visitCssSimpleSelector(this, context);
|
1168 | };
|
1169 | return CssSimpleSelectorAst;
|
1170 | }(CssSelectorPartAst));
|
1171 | var CssPseudoSelectorAst = (function (_super) {
|
1172 | __extends$3(CssPseudoSelectorAst, _super);
|
1173 | function CssPseudoSelectorAst(location, strValue, name, tokens, innerSelectors) {
|
1174 | var _this = _super.call(this, location) || this;
|
1175 | _this.strValue = strValue;
|
1176 | _this.name = name;
|
1177 | _this.tokens = tokens;
|
1178 | _this.innerSelectors = innerSelectors;
|
1179 | return _this;
|
1180 | }
|
1181 | CssPseudoSelectorAst.prototype.visit = function (visitor, context) {
|
1182 | return visitor.visitCssPseudoSelector(this, context);
|
1183 | };
|
1184 | return CssPseudoSelectorAst;
|
1185 | }(CssSelectorPartAst));
|
1186 | var CssBlockAst = (function (_super) {
|
1187 | __extends$3(CssBlockAst, _super);
|
1188 | function CssBlockAst(location, entries) {
|
1189 | var _this = _super.call(this, location) || this;
|
1190 | _this.entries = entries;
|
1191 | return _this;
|
1192 | }
|
1193 | CssBlockAst.prototype.visit = function (visitor, context) { return visitor.visitCssBlock(this, context); };
|
1194 | return CssBlockAst;
|
1195 | }(CssAst));
|
1196 |
|
1197 |
|
1198 |
|
1199 |
|
1200 | var CssStylesBlockAst = (function (_super) {
|
1201 | __extends$3(CssStylesBlockAst, _super);
|
1202 | function CssStylesBlockAst(location, definitions) {
|
1203 | var _this = _super.call(this, location, definitions) || this;
|
1204 | _this.definitions = definitions;
|
1205 | return _this;
|
1206 | }
|
1207 | CssStylesBlockAst.prototype.visit = function (visitor, context) {
|
1208 | return visitor.visitCssStylesBlock(this, context);
|
1209 | };
|
1210 | return CssStylesBlockAst;
|
1211 | }(CssBlockAst));
|
1212 | var CssStyleSheetAst = (function (_super) {
|
1213 | __extends$3(CssStyleSheetAst, _super);
|
1214 | function CssStyleSheetAst(location, rules) {
|
1215 | var _this = _super.call(this, location) || this;
|
1216 | _this.rules = rules;
|
1217 | return _this;
|
1218 | }
|
1219 | CssStyleSheetAst.prototype.visit = function (visitor, context) {
|
1220 | return visitor.visitCssStyleSheet(this, context);
|
1221 | };
|
1222 | return CssStyleSheetAst;
|
1223 | }(CssAst));
|
1224 | var CssUnknownRuleAst = (function (_super) {
|
1225 | __extends$3(CssUnknownRuleAst, _super);
|
1226 | function CssUnknownRuleAst(location, ruleName, tokens) {
|
1227 | var _this = _super.call(this, location) || this;
|
1228 | _this.ruleName = ruleName;
|
1229 | _this.tokens = tokens;
|
1230 | return _this;
|
1231 | }
|
1232 | CssUnknownRuleAst.prototype.visit = function (visitor, context) {
|
1233 | return visitor.visitCssUnknownRule(this, context);
|
1234 | };
|
1235 | return CssUnknownRuleAst;
|
1236 | }(CssRuleAst));
|
1237 | var CssUnknownTokenListAst = (function (_super) {
|
1238 | __extends$3(CssUnknownTokenListAst, _super);
|
1239 | function CssUnknownTokenListAst(location, name, tokens) {
|
1240 | var _this = _super.call(this, location) || this;
|
1241 | _this.name = name;
|
1242 | _this.tokens = tokens;
|
1243 | return _this;
|
1244 | }
|
1245 | CssUnknownTokenListAst.prototype.visit = function (visitor, context) {
|
1246 | return visitor.visitCssUnknownTokenList(this, context);
|
1247 | };
|
1248 | return CssUnknownTokenListAst;
|
1249 | }(CssRuleAst));
|
1250 | function mergeTokens(tokens, separator) {
|
1251 | if (separator === void 0) { separator = ''; }
|
1252 | var mainToken = tokens[0];
|
1253 | var str = mainToken.strValue;
|
1254 | for (var i = 1; i < tokens.length; i++) {
|
1255 | str += separator + tokens[i].strValue;
|
1256 | }
|
1257 | return new CssToken(mainToken.index, mainToken.column, mainToken.line, mainToken.type, str);
|
1258 | }
|
1259 |
|
1260 |
|
1261 | var __extends$2 = (undefined && undefined.__extends) || (function () {
|
1262 | var extendStatics = Object.setPrototypeOf ||
|
1263 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
1264 | function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
1265 | return function (d, b) {
|
1266 | extendStatics(d, b);
|
1267 | function __() { this.constructor = d; }
|
1268 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
1269 | };
|
1270 | })();
|
1271 |
|
1272 |
|
1273 |
|
1274 |
|
1275 |
|
1276 |
|
1277 |
|
1278 | var SPACE_OPERATOR = ' ';
|
1279 | var SLASH_CHARACTER = '/';
|
1280 | var GT_CHARACTER = '>';
|
1281 | var TRIPLE_GT_OPERATOR_STR = '>>>';
|
1282 | var DEEP_OPERATOR_STR = '/deep/';
|
1283 | var EOF_DELIM_FLAG = 1;
|
1284 | var RBRACE_DELIM_FLAG = 2;
|
1285 | var LBRACE_DELIM_FLAG = 4;
|
1286 | var COMMA_DELIM_FLAG = 8;
|
1287 | var COLON_DELIM_FLAG = 16;
|
1288 | var SEMICOLON_DELIM_FLAG = 32;
|
1289 | var NEWLINE_DELIM_FLAG = 64;
|
1290 | var RPAREN_DELIM_FLAG = 128;
|
1291 | var LPAREN_DELIM_FLAG = 256;
|
1292 | var SPACE_DELIM_FLAG = 512;
|
1293 | function _pseudoSelectorSupportsInnerSelectors(name) {
|
1294 | return ['not', 'host', 'host-context'].indexOf(name) >= 0;
|
1295 | }
|
1296 | function isSelectorOperatorCharacter(code) {
|
1297 | switch (code) {
|
1298 | case $SLASH:
|
1299 | case $TILDA:
|
1300 | case $PLUS:
|
1301 | case $GT:
|
1302 | return true;
|
1303 | default:
|
1304 | return isWhitespace(code);
|
1305 | }
|
1306 | }
|
1307 | function getDelimFromCharacter(code) {
|
1308 | switch (code) {
|
1309 | case $EOF:
|
1310 | return EOF_DELIM_FLAG;
|
1311 | case $COMMA:
|
1312 | return COMMA_DELIM_FLAG;
|
1313 | case $COLON:
|
1314 | return COLON_DELIM_FLAG;
|
1315 | case $SEMICOLON:
|
1316 | return SEMICOLON_DELIM_FLAG;
|
1317 | case $RBRACE:
|
1318 | return RBRACE_DELIM_FLAG;
|
1319 | case $LBRACE:
|
1320 | return LBRACE_DELIM_FLAG;
|
1321 | case $RPAREN:
|
1322 | return RPAREN_DELIM_FLAG;
|
1323 | case $SPACE:
|
1324 | case $TAB:
|
1325 | return SPACE_DELIM_FLAG;
|
1326 | default:
|
1327 | return isNewline(code) ? NEWLINE_DELIM_FLAG : 0;
|
1328 | }
|
1329 | }
|
1330 | function characterContainsDelimiter(code, delimiters) {
|
1331 | return (getDelimFromCharacter(code) & delimiters) > 0;
|
1332 | }
|
1333 | var ParsedCssResult = (function () {
|
1334 | function ParsedCssResult(errors, ast) {
|
1335 | this.errors = errors;
|
1336 | this.ast = ast;
|
1337 | }
|
1338 | return ParsedCssResult;
|
1339 | }());
|
1340 | var CssParser = (function () {
|
1341 | function CssParser() {
|
1342 | this._errors = [];
|
1343 | }
|
1344 | |
1345 |
|
1346 |
|
1347 |
|
1348 | CssParser.prototype.parse = function (css, url) {
|
1349 | var lexer = new CssLexer();
|
1350 | this._file = new ParseSourceFile(css, url);
|
1351 | this._scanner = lexer.scan(css, false);
|
1352 | var ast = this._parseStyleSheet(EOF_DELIM_FLAG);
|
1353 | var errors = this._errors;
|
1354 | this._errors = [];
|
1355 | var result = new ParsedCssResult(errors, ast);
|
1356 | this._file = null;
|
1357 | this._scanner = null;
|
1358 | return result;
|
1359 | };
|
1360 |
|
1361 | CssParser.prototype._parseStyleSheet = function (delimiters) {
|
1362 | var results = [];
|
1363 | this._scanner.consumeEmptyStatements();
|
1364 | while (this._scanner.peek != $EOF) {
|
1365 | this._scanner.setMode(CssLexerMode.BLOCK);
|
1366 | results.push(this._parseRule(delimiters));
|
1367 | }
|
1368 | var span = null;
|
1369 | if (results.length > 0) {
|
1370 | var firstRule = results[0];
|
1371 |
|
1372 |
|
1373 | span = this._generateSourceSpan(firstRule, this._lastToken);
|
1374 | }
|
1375 | return new CssStyleSheetAst(span, results);
|
1376 | };
|
1377 |
|
1378 | CssParser.prototype._getSourceContent = function () { return this._scanner ? this._scanner.input : ''; };
|
1379 |
|
1380 | CssParser.prototype._extractSourceContent = function (start, end) {
|
1381 | return this._getSourceContent().substring(start, end + 1);
|
1382 | };
|
1383 |
|
1384 | CssParser.prototype._generateSourceSpan = function (start, end) {
|
1385 | if (end === void 0) { end = null; }
|
1386 | var startLoc;
|
1387 | if (start instanceof CssAst) {
|
1388 | startLoc = start.location.start;
|
1389 | }
|
1390 | else {
|
1391 | var token = start;
|
1392 | if (!token) {
|
1393 |
|
1394 |
|
1395 | token = this._lastToken;
|
1396 | }
|
1397 | startLoc = new ParseLocation(this._file, token.index, token.line, token.column);
|
1398 | }
|
1399 | if (!end) {
|
1400 | end = this._lastToken;
|
1401 | }
|
1402 | var endLine;
|
1403 | var endColumn;
|
1404 | var endIndex;
|
1405 | if (end instanceof CssAst) {
|
1406 | endLine = end.location.end.line;
|
1407 | endColumn = end.location.end.col;
|
1408 | endIndex = end.location.end.offset;
|
1409 | }
|
1410 | else if (end instanceof CssToken) {
|
1411 | endLine = end.line;
|
1412 | endColumn = end.column;
|
1413 | endIndex = end.index;
|
1414 | }
|
1415 | var endLoc = new ParseLocation(this._file, endIndex, endLine, endColumn);
|
1416 | return new ParseSourceSpan(startLoc, endLoc);
|
1417 | };
|
1418 |
|
1419 | CssParser.prototype._resolveBlockType = function (token) {
|
1420 | switch (token.strValue) {
|
1421 | case '@-o-keyframes':
|
1422 | case '@-moz-keyframes':
|
1423 | case '@-webkit-keyframes':
|
1424 | case '@keyframes':
|
1425 | return BlockType.Keyframes;
|
1426 | case '@charset':
|
1427 | return BlockType.Charset;
|
1428 | case '@import':
|
1429 | return BlockType.Import;
|
1430 | case '@namespace':
|
1431 | return BlockType.Namespace;
|
1432 | case '@page':
|
1433 | return BlockType.Page;
|
1434 | case '@document':
|
1435 | return BlockType.Document;
|
1436 | case '@media':
|
1437 | return BlockType.MediaQuery;
|
1438 | case '@font-face':
|
1439 | return BlockType.FontFace;
|
1440 | case '@viewport':
|
1441 | return BlockType.Viewport;
|
1442 | case '@supports':
|
1443 | return BlockType.Supports;
|
1444 | default:
|
1445 | return BlockType.Unsupported;
|
1446 | }
|
1447 | };
|
1448 |
|
1449 | CssParser.prototype._parseRule = function (delimiters) {
|
1450 | if (this._scanner.peek == $AT) {
|
1451 | return this._parseAtRule(delimiters);
|
1452 | }
|
1453 | return this._parseSelectorRule(delimiters);
|
1454 | };
|
1455 |
|
1456 | CssParser.prototype._parseAtRule = function (delimiters) {
|
1457 | var start = this._getScannerIndex();
|
1458 | this._scanner.setMode(CssLexerMode.BLOCK);
|
1459 | var token = this._scan();
|
1460 | var startToken = token;
|
1461 | this._assertCondition(token.type == CssTokenType.AtKeyword, "The CSS Rule " + token.strValue + " is not a valid [@] rule.", token);
|
1462 | var block;
|
1463 | var type = this._resolveBlockType(token);
|
1464 | var span;
|
1465 | var tokens;
|
1466 | var endToken;
|
1467 | var end;
|
1468 | var strValue;
|
1469 | var query;
|
1470 | switch (type) {
|
1471 | case BlockType.Charset:
|
1472 | case BlockType.Namespace:
|
1473 | case BlockType.Import:
|
1474 | var value = this._parseValue(delimiters);
|
1475 | this._scanner.setMode(CssLexerMode.BLOCK);
|
1476 | this._scanner.consumeEmptyStatements();
|
1477 | span = this._generateSourceSpan(startToken, value);
|
1478 | return new CssInlineRuleAst(span, type, value);
|
1479 | case BlockType.Viewport:
|
1480 | case BlockType.FontFace:
|
1481 | block = this._parseStyleBlock(delimiters);
|
1482 | span = this._generateSourceSpan(startToken, block);
|
1483 | return new CssBlockRuleAst(span, type, block);
|
1484 | case BlockType.Keyframes:
|
1485 | tokens = this._collectUntilDelim(delimiters | RBRACE_DELIM_FLAG | LBRACE_DELIM_FLAG);
|
1486 |
|
1487 | var name_1 = tokens[0];
|
1488 | block = this._parseKeyframeBlock(delimiters);
|
1489 | span = this._generateSourceSpan(startToken, block);
|
1490 | return new CssKeyframeRuleAst(span, name_1, block);
|
1491 | case BlockType.MediaQuery:
|
1492 | this._scanner.setMode(CssLexerMode.MEDIA_QUERY);
|
1493 | tokens = this._collectUntilDelim(delimiters | RBRACE_DELIM_FLAG | LBRACE_DELIM_FLAG);
|
1494 | endToken = tokens[tokens.length - 1];
|
1495 |
|
1496 |
|
1497 | end = endToken.index + endToken.strValue.length - 1;
|
1498 | strValue = this._extractSourceContent(start, end);
|
1499 | span = this._generateSourceSpan(startToken, endToken);
|
1500 | query = new CssAtRulePredicateAst(span, strValue, tokens);
|
1501 | block = this._parseBlock(delimiters);
|
1502 | strValue = this._extractSourceContent(start, this._getScannerIndex() - 1);
|
1503 | span = this._generateSourceSpan(startToken, block);
|
1504 | return new CssMediaQueryRuleAst(span, strValue, query, block);
|
1505 | case BlockType.Document:
|
1506 | case BlockType.Supports:
|
1507 | case BlockType.Page:
|
1508 | this._scanner.setMode(CssLexerMode.AT_RULE_QUERY);
|
1509 | tokens = this._collectUntilDelim(delimiters | RBRACE_DELIM_FLAG | LBRACE_DELIM_FLAG);
|
1510 | endToken = tokens[tokens.length - 1];
|
1511 |
|
1512 |
|
1513 | end = endToken.index + endToken.strValue.length - 1;
|
1514 | strValue = this._extractSourceContent(start, end);
|
1515 | span = this._generateSourceSpan(startToken, tokens[tokens.length - 1]);
|
1516 | query = new CssAtRulePredicateAst(span, strValue, tokens);
|
1517 | block = this._parseBlock(delimiters);
|
1518 | strValue = this._extractSourceContent(start, block.end.offset);
|
1519 | span = this._generateSourceSpan(startToken, block);
|
1520 | return new CssBlockDefinitionRuleAst(span, strValue, type, query, block);
|
1521 |
|
1522 | default:
|
1523 | var listOfTokens_1 = [];
|
1524 | var tokenName = token.strValue;
|
1525 | this._scanner.setMode(CssLexerMode.ALL);
|
1526 | this._error(generateErrorMessage(this._getSourceContent(), "The CSS \"at\" rule \"" + tokenName + "\" is not allowed to used here", token.strValue, token.index, token.line, token.column), token);
|
1527 | this._collectUntilDelim(delimiters | LBRACE_DELIM_FLAG | SEMICOLON_DELIM_FLAG)
|
1528 | .forEach(function (token) { listOfTokens_1.push(token); });
|
1529 | if (this._scanner.peek == $LBRACE) {
|
1530 | listOfTokens_1.push(this._consume(CssTokenType.Character, '{'));
|
1531 | this._collectUntilDelim(delimiters | RBRACE_DELIM_FLAG | LBRACE_DELIM_FLAG)
|
1532 | .forEach(function (token) { listOfTokens_1.push(token); });
|
1533 | listOfTokens_1.push(this._consume(CssTokenType.Character, '}'));
|
1534 | }
|
1535 | endToken = listOfTokens_1[listOfTokens_1.length - 1];
|
1536 | span = this._generateSourceSpan(startToken, endToken);
|
1537 | return new CssUnknownRuleAst(span, tokenName, listOfTokens_1);
|
1538 | }
|
1539 | };
|
1540 |
|
1541 | CssParser.prototype._parseSelectorRule = function (delimiters) {
|
1542 | var start = this._getScannerIndex();
|
1543 | var selectors = this._parseSelectors(delimiters);
|
1544 | var block = this._parseStyleBlock(delimiters);
|
1545 | var ruleAst;
|
1546 | var span;
|
1547 | var startSelector = selectors[0];
|
1548 | if (block) {
|
1549 | var span = this._generateSourceSpan(startSelector, block);
|
1550 | ruleAst = new CssSelectorRuleAst(span, selectors, block);
|
1551 | }
|
1552 | else {
|
1553 | var name = this._extractSourceContent(start, this._getScannerIndex() - 1);
|
1554 | var innerTokens = [];
|
1555 | selectors.forEach(function (selector) {
|
1556 | selector.selectorParts.forEach(function (part) {
|
1557 | part.tokens.forEach(function (token) { innerTokens.push(token); });
|
1558 | });
|
1559 | });
|
1560 | var endToken = innerTokens[innerTokens.length - 1];
|
1561 | span = this._generateSourceSpan(startSelector, endToken);
|
1562 | ruleAst = new CssUnknownTokenListAst(span, name, innerTokens);
|
1563 | }
|
1564 | this._scanner.setMode(CssLexerMode.BLOCK);
|
1565 | this._scanner.consumeEmptyStatements();
|
1566 | return ruleAst;
|
1567 | };
|
1568 |
|
1569 | CssParser.prototype._parseSelectors = function (delimiters) {
|
1570 | delimiters |= LBRACE_DELIM_FLAG | SEMICOLON_DELIM_FLAG;
|
1571 | var selectors = [];
|
1572 | var isParsingSelectors = true;
|
1573 | while (isParsingSelectors) {
|
1574 | selectors.push(this._parseSelector(delimiters));
|
1575 | isParsingSelectors = !characterContainsDelimiter(this._scanner.peek, delimiters);
|
1576 | if (isParsingSelectors) {
|
1577 | this._consume(CssTokenType.Character, ',');
|
1578 | isParsingSelectors = !characterContainsDelimiter(this._scanner.peek, delimiters);
|
1579 | if (isParsingSelectors) {
|
1580 | this._scanner.consumeWhitespace();
|
1581 | }
|
1582 | }
|
1583 | }
|
1584 | return selectors;
|
1585 | };
|
1586 |
|
1587 | CssParser.prototype._scan = function () {
|
1588 | var output = this._scanner.scan();
|
1589 | var token = output.token;
|
1590 | var error = output.error;
|
1591 | if (error) {
|
1592 | this._error(error.rawMessage, token);
|
1593 | }
|
1594 | this._lastToken = token;
|
1595 | return token;
|
1596 | };
|
1597 |
|
1598 | CssParser.prototype._getScannerIndex = function () { return this._scanner.index; };
|
1599 |
|
1600 | CssParser.prototype._consume = function (type, value) {
|
1601 | if (value === void 0) { value = null; }
|
1602 | var output = this._scanner.consume(type, value);
|
1603 | var token = output.token;
|
1604 | var error = output.error;
|
1605 | if (error) {
|
1606 | this._error(error.rawMessage, token);
|
1607 | }
|
1608 | this._lastToken = token;
|
1609 | return token;
|
1610 | };
|
1611 |
|
1612 | CssParser.prototype._parseKeyframeBlock = function (delimiters) {
|
1613 | delimiters |= RBRACE_DELIM_FLAG;
|
1614 | this._scanner.setMode(CssLexerMode.KEYFRAME_BLOCK);
|
1615 | var startToken = this._consume(CssTokenType.Character, '{');
|
1616 | var definitions = [];
|
1617 | while (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
1618 | definitions.push(this._parseKeyframeDefinition(delimiters));
|
1619 | }
|
1620 | var endToken = this._consume(CssTokenType.Character, '}');
|
1621 | var span = this._generateSourceSpan(startToken, endToken);
|
1622 | return new CssBlockAst(span, definitions);
|
1623 | };
|
1624 |
|
1625 | CssParser.prototype._parseKeyframeDefinition = function (delimiters) {
|
1626 | var start = this._getScannerIndex();
|
1627 | var stepTokens = [];
|
1628 | delimiters |= LBRACE_DELIM_FLAG;
|
1629 | while (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
1630 | stepTokens.push(this._parseKeyframeLabel(delimiters | COMMA_DELIM_FLAG));
|
1631 | if (this._scanner.peek != $LBRACE) {
|
1632 | this._consume(CssTokenType.Character, ',');
|
1633 | }
|
1634 | }
|
1635 | var stylesBlock = this._parseStyleBlock(delimiters | RBRACE_DELIM_FLAG);
|
1636 | var span = this._generateSourceSpan(stepTokens[0], stylesBlock);
|
1637 | var ast = new CssKeyframeDefinitionAst(span, stepTokens, stylesBlock);
|
1638 | this._scanner.setMode(CssLexerMode.BLOCK);
|
1639 | return ast;
|
1640 | };
|
1641 |
|
1642 | CssParser.prototype._parseKeyframeLabel = function (delimiters) {
|
1643 | this._scanner.setMode(CssLexerMode.KEYFRAME_BLOCK);
|
1644 | return mergeTokens(this._collectUntilDelim(delimiters));
|
1645 | };
|
1646 |
|
1647 | CssParser.prototype._parsePseudoSelector = function (delimiters) {
|
1648 | var start = this._getScannerIndex();
|
1649 | delimiters &= ~COMMA_DELIM_FLAG;
|
1650 |
|
1651 | var startingDelims = delimiters;
|
1652 | var startToken = this._consume(CssTokenType.Character, ':');
|
1653 | var tokens = [startToken];
|
1654 | if (this._scanner.peek == $COLON) {
|
1655 | tokens.push(this._consume(CssTokenType.Character, ':'));
|
1656 | }
|
1657 | var innerSelectors = [];
|
1658 | this._scanner.setMode(CssLexerMode.PSEUDO_SELECTOR);
|
1659 |
|
1660 | var pseudoSelectorToken = this._consume(CssTokenType.Identifier);
|
1661 | var pseudoSelectorName = pseudoSelectorToken.strValue;
|
1662 | tokens.push(pseudoSelectorToken);
|
1663 |
|
1664 | if (this._scanner.peek == $LPAREN) {
|
1665 | this._scanner.setMode(CssLexerMode.PSEUDO_SELECTOR_WITH_ARGUMENTS);
|
1666 | var openParenToken = this._consume(CssTokenType.Character, '(');
|
1667 | tokens.push(openParenToken);
|
1668 |
|
1669 | if (_pseudoSelectorSupportsInnerSelectors(pseudoSelectorName)) {
|
1670 | var innerDelims = startingDelims | LPAREN_DELIM_FLAG | RPAREN_DELIM_FLAG;
|
1671 | if (pseudoSelectorName == 'not') {
|
1672 |
|
1673 |
|
1674 |
|
1675 | innerDelims |= COMMA_DELIM_FLAG;
|
1676 | }
|
1677 |
|
1678 | this._parseSelectors(innerDelims).forEach(function (selector, index) {
|
1679 | innerSelectors.push(selector);
|
1680 | });
|
1681 | }
|
1682 | else {
|
1683 |
|
1684 |
|
1685 | var innerValueDelims = delimiters | LBRACE_DELIM_FLAG | COLON_DELIM_FLAG |
|
1686 | RPAREN_DELIM_FLAG | LPAREN_DELIM_FLAG;
|
1687 | while (!characterContainsDelimiter(this._scanner.peek, innerValueDelims)) {
|
1688 | var token = this._scan();
|
1689 | tokens.push(token);
|
1690 | }
|
1691 | }
|
1692 | var closeParenToken = this._consume(CssTokenType.Character, ')');
|
1693 | tokens.push(closeParenToken);
|
1694 | }
|
1695 | var end = this._getScannerIndex() - 1;
|
1696 | var strValue = this._extractSourceContent(start, end);
|
1697 | var endToken = tokens[tokens.length - 1];
|
1698 | var span = this._generateSourceSpan(startToken, endToken);
|
1699 | return new CssPseudoSelectorAst(span, strValue, pseudoSelectorName, tokens, innerSelectors);
|
1700 | };
|
1701 |
|
1702 | CssParser.prototype._parseSimpleSelector = function (delimiters) {
|
1703 | var start = this._getScannerIndex();
|
1704 | delimiters |= COMMA_DELIM_FLAG;
|
1705 | this._scanner.setMode(CssLexerMode.SELECTOR);
|
1706 | var selectorCssTokens = [];
|
1707 | var pseudoSelectors = [];
|
1708 | var previousToken;
|
1709 | var selectorPartDelimiters = delimiters | SPACE_DELIM_FLAG;
|
1710 | var loopOverSelector = !characterContainsDelimiter(this._scanner.peek, selectorPartDelimiters);
|
1711 | var hasAttributeError = false;
|
1712 | while (loopOverSelector) {
|
1713 | var peek = this._scanner.peek;
|
1714 | switch (peek) {
|
1715 | case $COLON:
|
1716 | var innerPseudo = this._parsePseudoSelector(delimiters);
|
1717 | pseudoSelectors.push(innerPseudo);
|
1718 | this._scanner.setMode(CssLexerMode.SELECTOR);
|
1719 | break;
|
1720 | case $LBRACKET:
|
1721 |
|
1722 |
|
1723 |
|
1724 | selectorCssTokens.push(this._scan());
|
1725 | this._scanner.setMode(CssLexerMode.ATTRIBUTE_SELECTOR);
|
1726 | break;
|
1727 | case $RBRACKET:
|
1728 | if (this._scanner.getMode() != CssLexerMode.ATTRIBUTE_SELECTOR) {
|
1729 | hasAttributeError = true;
|
1730 | }
|
1731 |
|
1732 |
|
1733 | this._scanner.setMode(CssLexerMode.SELECTOR);
|
1734 | selectorCssTokens.push(this._scan());
|
1735 | break;
|
1736 | default:
|
1737 | if (isSelectorOperatorCharacter(peek)) {
|
1738 | loopOverSelector = false;
|
1739 | continue;
|
1740 | }
|
1741 | var token = this._scan();
|
1742 | previousToken = token;
|
1743 | selectorCssTokens.push(token);
|
1744 | break;
|
1745 | }
|
1746 | loopOverSelector = !characterContainsDelimiter(this._scanner.peek, selectorPartDelimiters);
|
1747 | }
|
1748 | hasAttributeError =
|
1749 | hasAttributeError || this._scanner.getMode() == CssLexerMode.ATTRIBUTE_SELECTOR;
|
1750 | if (hasAttributeError) {
|
1751 | this._error("Unbalanced CSS attribute selector at column " + previousToken.line + ":" + previousToken.column, previousToken);
|
1752 | }
|
1753 | var end = this._getScannerIndex() - 1;
|
1754 |
|
1755 |
|
1756 | if (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
1757 | var operator = null;
|
1758 | var operatorScanCount = 0;
|
1759 | var lastOperatorToken = null;
|
1760 | while (operator == null && !characterContainsDelimiter(this._scanner.peek, delimiters) &&
|
1761 | isSelectorOperatorCharacter(this._scanner.peek)) {
|
1762 | var token = this._scan();
|
1763 | var tokenOperator = token.strValue;
|
1764 | operatorScanCount++;
|
1765 | lastOperatorToken = token;
|
1766 | if (tokenOperator != SPACE_OPERATOR) {
|
1767 | switch (tokenOperator) {
|
1768 | case SLASH_CHARACTER:
|
1769 |
|
1770 | var deepToken = this._consume(CssTokenType.Identifier);
|
1771 | var deepSlash = this._consume(CssTokenType.Character);
|
1772 | var index = lastOperatorToken.index;
|
1773 | var line = lastOperatorToken.line;
|
1774 | var column = lastOperatorToken.column;
|
1775 | if (deepToken && deepToken.strValue.toLowerCase() == 'deep' &&
|
1776 | deepSlash.strValue == SLASH_CHARACTER) {
|
1777 | token = new CssToken(lastOperatorToken.index, lastOperatorToken.column, lastOperatorToken.line, CssTokenType.Identifier, DEEP_OPERATOR_STR);
|
1778 | }
|
1779 | else {
|
1780 | var text = SLASH_CHARACTER + deepToken.strValue + deepSlash.strValue;
|
1781 | this._error(generateErrorMessage(this._getSourceContent(), text + " is an invalid CSS operator", text, index, line, column), lastOperatorToken);
|
1782 | token = new CssToken(index, column, line, CssTokenType.Invalid, text);
|
1783 | }
|
1784 | break;
|
1785 | case GT_CHARACTER:
|
1786 |
|
1787 | if (this._scanner.peek == $GT && this._scanner.peekPeek == $GT) {
|
1788 | this._consume(CssTokenType.Character, GT_CHARACTER);
|
1789 | this._consume(CssTokenType.Character, GT_CHARACTER);
|
1790 | token = new CssToken(lastOperatorToken.index, lastOperatorToken.column, lastOperatorToken.line, CssTokenType.Identifier, TRIPLE_GT_OPERATOR_STR);
|
1791 | }
|
1792 | break;
|
1793 | }
|
1794 | operator = token;
|
1795 | }
|
1796 | }
|
1797 |
|
1798 |
|
1799 |
|
1800 | if (operator) {
|
1801 | end = operator.index;
|
1802 | }
|
1803 | }
|
1804 | this._scanner.consumeWhitespace();
|
1805 | var strValue = this._extractSourceContent(start, end);
|
1806 |
|
1807 |
|
1808 |
|
1809 | if (operator == null && operatorScanCount > 0 && this._scanner.peek != $LBRACE) {
|
1810 | operator = lastOperatorToken;
|
1811 | }
|
1812 |
|
1813 |
|
1814 | var startTokenOrAst = null;
|
1815 | var endTokenOrAst = null;
|
1816 | if (selectorCssTokens.length > 0) {
|
1817 | startTokenOrAst = startTokenOrAst || selectorCssTokens[0];
|
1818 | endTokenOrAst = selectorCssTokens[selectorCssTokens.length - 1];
|
1819 | }
|
1820 | if (pseudoSelectors.length > 0) {
|
1821 | startTokenOrAst = startTokenOrAst || pseudoSelectors[0];
|
1822 | endTokenOrAst = pseudoSelectors[pseudoSelectors.length - 1];
|
1823 | }
|
1824 | if (operator) {
|
1825 | startTokenOrAst = startTokenOrAst || operator;
|
1826 | endTokenOrAst = operator;
|
1827 | }
|
1828 | var span = this._generateSourceSpan(startTokenOrAst, endTokenOrAst);
|
1829 | return new CssSimpleSelectorAst(span, selectorCssTokens, strValue, pseudoSelectors, operator);
|
1830 | };
|
1831 |
|
1832 | CssParser.prototype._parseSelector = function (delimiters) {
|
1833 | delimiters |= COMMA_DELIM_FLAG;
|
1834 | this._scanner.setMode(CssLexerMode.SELECTOR);
|
1835 | var simpleSelectors = [];
|
1836 | while (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
1837 | simpleSelectors.push(this._parseSimpleSelector(delimiters));
|
1838 | this._scanner.consumeWhitespace();
|
1839 | }
|
1840 | var firstSelector = simpleSelectors[0];
|
1841 | var lastSelector = simpleSelectors[simpleSelectors.length - 1];
|
1842 | var span = this._generateSourceSpan(firstSelector, lastSelector);
|
1843 | return new CssSelectorAst(span, simpleSelectors);
|
1844 | };
|
1845 |
|
1846 | CssParser.prototype._parseValue = function (delimiters) {
|
1847 | delimiters |= RBRACE_DELIM_FLAG | SEMICOLON_DELIM_FLAG | NEWLINE_DELIM_FLAG;
|
1848 | this._scanner.setMode(CssLexerMode.STYLE_VALUE);
|
1849 | var start = this._getScannerIndex();
|
1850 | var tokens = [];
|
1851 | var wsStr = '';
|
1852 | var previous;
|
1853 | while (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
1854 | var token;
|
1855 | if (previous && previous.type == CssTokenType.Identifier &&
|
1856 | this._scanner.peek == $LPAREN) {
|
1857 | token = this._consume(CssTokenType.Character, '(');
|
1858 | tokens.push(token);
|
1859 | this._scanner.setMode(CssLexerMode.STYLE_VALUE_FUNCTION);
|
1860 | token = this._scan();
|
1861 | tokens.push(token);
|
1862 | this._scanner.setMode(CssLexerMode.STYLE_VALUE);
|
1863 | token = this._consume(CssTokenType.Character, ')');
|
1864 | tokens.push(token);
|
1865 | }
|
1866 | else {
|
1867 | token = this._scan();
|
1868 | if (token.type == CssTokenType.Whitespace) {
|
1869 | wsStr += token.strValue;
|
1870 | }
|
1871 | else {
|
1872 | wsStr = '';
|
1873 | tokens.push(token);
|
1874 | }
|
1875 | }
|
1876 | previous = token;
|
1877 | }
|
1878 | var end = this._getScannerIndex() - 1;
|
1879 | this._scanner.consumeWhitespace();
|
1880 | var code = this._scanner.peek;
|
1881 | if (code == $SEMICOLON) {
|
1882 | this._consume(CssTokenType.Character, ';');
|
1883 | }
|
1884 | else if (code != $RBRACE) {
|
1885 | this._error(generateErrorMessage(this._getSourceContent(), "The CSS key/value definition did not end with a semicolon", previous.strValue, previous.index, previous.line, previous.column), previous);
|
1886 | }
|
1887 | var strValue = this._extractSourceContent(start, end);
|
1888 | var startToken = tokens[0];
|
1889 | var endToken = tokens[tokens.length - 1];
|
1890 | var span = this._generateSourceSpan(startToken, endToken);
|
1891 | return new CssStyleValueAst(span, tokens, strValue);
|
1892 | };
|
1893 |
|
1894 | CssParser.prototype._collectUntilDelim = function (delimiters, assertType) {
|
1895 | if (assertType === void 0) { assertType = null; }
|
1896 | var tokens = [];
|
1897 | while (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
1898 | var val = assertType ? this._consume(assertType) : this._scan();
|
1899 | tokens.push(val);
|
1900 | }
|
1901 | return tokens;
|
1902 | };
|
1903 |
|
1904 | CssParser.prototype._parseBlock = function (delimiters) {
|
1905 | delimiters |= RBRACE_DELIM_FLAG;
|
1906 | this._scanner.setMode(CssLexerMode.BLOCK);
|
1907 | var startToken = this._consume(CssTokenType.Character, '{');
|
1908 | this._scanner.consumeEmptyStatements();
|
1909 | var results = [];
|
1910 | while (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
1911 | results.push(this._parseRule(delimiters));
|
1912 | }
|
1913 | var endToken = this._consume(CssTokenType.Character, '}');
|
1914 | this._scanner.setMode(CssLexerMode.BLOCK);
|
1915 | this._scanner.consumeEmptyStatements();
|
1916 | var span = this._generateSourceSpan(startToken, endToken);
|
1917 | return new CssBlockAst(span, results);
|
1918 | };
|
1919 |
|
1920 | CssParser.prototype._parseStyleBlock = function (delimiters) {
|
1921 | delimiters |= RBRACE_DELIM_FLAG | LBRACE_DELIM_FLAG;
|
1922 | this._scanner.setMode(CssLexerMode.STYLE_BLOCK);
|
1923 | var startToken = this._consume(CssTokenType.Character, '{');
|
1924 | if (startToken.numValue != $LBRACE) {
|
1925 | return null;
|
1926 | }
|
1927 | var definitions = [];
|
1928 | this._scanner.consumeEmptyStatements();
|
1929 | while (!characterContainsDelimiter(this._scanner.peek, delimiters)) {
|
1930 | definitions.push(this._parseDefinition(delimiters));
|
1931 | this._scanner.consumeEmptyStatements();
|
1932 | }
|
1933 | var endToken = this._consume(CssTokenType.Character, '}');
|
1934 | this._scanner.setMode(CssLexerMode.STYLE_BLOCK);
|
1935 | this._scanner.consumeEmptyStatements();
|
1936 | var span = this._generateSourceSpan(startToken, endToken);
|
1937 | return new CssStylesBlockAst(span, definitions);
|
1938 | };
|
1939 |
|
1940 | CssParser.prototype._parseDefinition = function (delimiters) {
|
1941 | this._scanner.setMode(CssLexerMode.STYLE_BLOCK);
|
1942 | var prop = this._consume(CssTokenType.Identifier);
|
1943 | var parseValue = false;
|
1944 | var value = null;
|
1945 | var endToken = prop;
|
1946 |
|
1947 |
|
1948 |
|
1949 | switch (this._scanner.peek) {
|
1950 | case $SEMICOLON:
|
1951 | case $RBRACE:
|
1952 | case $EOF:
|
1953 | parseValue = false;
|
1954 | break;
|
1955 | default:
|
1956 | var propStr = [prop.strValue];
|
1957 | if (this._scanner.peek != $COLON) {
|
1958 |
|
1959 | var nextValue = this._consume(CssTokenType.Character, ':');
|
1960 | propStr.push(nextValue.strValue);
|
1961 | var remainingTokens = this._collectUntilDelim(delimiters | COLON_DELIM_FLAG | SEMICOLON_DELIM_FLAG, CssTokenType.Identifier);
|
1962 | if (remainingTokens.length > 0) {
|
1963 | remainingTokens.forEach(function (token) { propStr.push(token.strValue); });
|
1964 | }
|
1965 | endToken = prop =
|
1966 | new CssToken(prop.index, prop.column, prop.line, prop.type, propStr.join(' '));
|
1967 | }
|
1968 |
|
1969 | if (this._scanner.peek == $COLON) {
|
1970 | this._consume(CssTokenType.Character, ':');
|
1971 | parseValue = true;
|
1972 | }
|
1973 | break;
|
1974 | }
|
1975 | if (parseValue) {
|
1976 | value = this._parseValue(delimiters);
|
1977 | endToken = value;
|
1978 | }
|
1979 | else {
|
1980 | this._error(generateErrorMessage(this._getSourceContent(), "The CSS property was not paired with a style value", prop.strValue, prop.index, prop.line, prop.column), prop);
|
1981 | }
|
1982 | var span = this._generateSourceSpan(prop, endToken);
|
1983 | return new CssDefinitionAst(span, prop, value);
|
1984 | };
|
1985 |
|
1986 | CssParser.prototype._assertCondition = function (status, errorMessage, problemToken) {
|
1987 | if (!status) {
|
1988 | this._error(errorMessage, problemToken);
|
1989 | return true;
|
1990 | }
|
1991 | return false;
|
1992 | };
|
1993 |
|
1994 | CssParser.prototype._error = function (message, problemToken) {
|
1995 | var length = problemToken.strValue.length;
|
1996 | var error = CssParseError.create(this._file, 0, problemToken.line, problemToken.column, length, message);
|
1997 | this._errors.push(error);
|
1998 | };
|
1999 | return CssParser;
|
2000 | }());
|
2001 | var CssParseError = (function (_super) {
|
2002 | __extends$2(CssParseError, _super);
|
2003 | function CssParseError(span, message) {
|
2004 | return _super.call(this, span, message) || this;
|
2005 | }
|
2006 | CssParseError.create = function (file, offset, line, col, length, errMsg) {
|
2007 | var start = new ParseLocation(file, offset, line, col);
|
2008 | var end = new ParseLocation(file, offset, line, col + length);
|
2009 | var span = new ParseSourceSpan(start, end);
|
2010 | return new CssParseError(span, 'CSS Parse Error: ' + errMsg);
|
2011 | };
|
2012 | return CssParseError;
|
2013 | }(ParseError));
|
2014 |
|
2015 | var parseCss = function (text) {
|
2016 | var parser = new CssParser();
|
2017 | return parser.parse(text, '').ast;
|
2018 | };
|
2019 |
|
2020 | var __extends$1 = (undefined && undefined.__extends) || (function () {
|
2021 | var extendStatics = Object.setPrototypeOf ||
|
2022 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
2023 | function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
2024 | return function (d, b) {
|
2025 | extendStatics(d, b);
|
2026 | function __() { this.constructor = d; }
|
2027 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
2028 | };
|
2029 | })();
|
2030 |
|
2031 |
|
2032 |
|
2033 |
|
2034 |
|
2035 |
|
2036 |
|
2037 |
|
2038 | var DirectiveSymbol = (function (_super) {
|
2039 | __extends$1(DirectiveSymbol, _super);
|
2040 | |
2041 |
|
2042 |
|
2043 |
|
2044 |
|
2045 |
|
2046 |
|
2047 |
|
2048 |
|
2049 |
|
2050 |
|
2051 |
|
2052 |
|
2053 |
|
2054 | function DirectiveSymbol(program, symbol, metadataResolver, directiveNormalizer, resolver, reflector, resourceResolver, projectSymbols) {
|
2055 | var _this = _super.call(this, program, symbol) || this;
|
2056 | _this.metadataResolver = metadataResolver;
|
2057 | _this.directiveNormalizer = directiveNormalizer;
|
2058 | _this.resolver = resolver;
|
2059 | _this.reflector = reflector;
|
2060 | _this.resourceResolver = resourceResolver;
|
2061 | _this.projectSymbols = projectSymbols;
|
2062 | _this.urlResolver = new _angular_compiler.UrlResolver();
|
2063 | return _this;
|
2064 | }
|
2065 | |
2066 |
|
2067 |
|
2068 |
|
2069 |
|
2070 |
|
2071 |
|
2072 |
|
2073 |
|
2074 |
|
2075 | DirectiveSymbol.prototype.getNonResolvedMetadata = function () {
|
2076 | return this.metadataResolver.getNonNormalizedDirectiveMetadata(this.symbol).metadata;
|
2077 | };
|
2078 |
|
2079 | |
2080 |
|
2081 |
|
2082 |
|
2083 |
|
2084 |
|
2085 |
|
2086 |
|
2087 |
|
2088 | DirectiveSymbol.prototype.getResolvedMetadata = function () {
|
2089 | var _this = this;
|
2090 | var metadata = this.metadataResolver.getNonNormalizedDirectiveMetadata(this.symbol);
|
2091 | var componentType = _angular_core.resolveForwardRef(this.symbol);
|
2092 | var componentUrl = _angular_compiler.componentModuleUrl(this.reflector, componentType, metadata);
|
2093 | var templateMetadata = metadata.metadata.template;
|
2094 |
|
2095 | if (!templateMetadata.template) {
|
2096 | templateMetadata.templateUrl = this.urlResolver.resolve(componentUrl, templateMetadata.templateUrl);
|
2097 | templateMetadata.template = this.resourceResolver.getSync(templateMetadata.templateUrl);
|
2098 | }
|
2099 | var currentMetadata = this.directiveNormalizer.normalizeTemplateSync(Object.assign(templateMetadata, {
|
2100 | ngModuleType: this.getModule().type.reference,
|
2101 | moduleUrl: componentUrl,
|
2102 | componentType: componentType
|
2103 | }));
|
2104 | if (templateMetadata.templateUrl) {
|
2105 | currentMetadata.template = this.resourceResolver.getSync(templateMetadata.templateUrl);
|
2106 | currentMetadata.templateUrl = templateMetadata.templateUrl;
|
2107 | }
|
2108 | currentMetadata.styles = currentMetadata.styles.concat(currentMetadata.styleUrls.map(function (path) {
|
2109 | return _this.resourceResolver.getSync(path);
|
2110 | }));
|
2111 | return currentMetadata;
|
2112 | };
|
2113 | |
2114 |
|
2115 |
|
2116 |
|
2117 |
|
2118 |
|
2119 |
|
2120 | DirectiveSymbol.prototype.getModule = function () {
|
2121 | return this.projectSymbols
|
2122 | .getAnalyzedModules().ngModuleByPipeOrDirective.get(this.symbol);
|
2123 | };
|
2124 | |
2125 |
|
2126 |
|
2127 |
|
2128 |
|
2129 |
|
2130 |
|
2131 | DirectiveSymbol.prototype.getStyleAsts = function () {
|
2132 | return this.getResolvedMetadata()
|
2133 | .styles.map(function (s) { return parseCss(s); });
|
2134 | };
|
2135 | |
2136 |
|
2137 |
|
2138 |
|
2139 |
|
2140 |
|
2141 |
|
2142 |
|
2143 | DirectiveSymbol.prototype.getDirectiveContext = function () {
|
2144 | var _this = this;
|
2145 | var analyzedModules = this.projectSymbols.getAnalyzedModules();
|
2146 | var ngModule = analyzedModules.ngModuleByPipeOrDirective.get(this.symbol);
|
2147 | if (!ngModule) {
|
2148 | throw new Error('Cannot find module associated with the directive ' + this.symbol.name);
|
2149 | }
|
2150 | var resolvedDirectives = ngModule.transitiveModule.directives.map(function (d) { return _this.metadataResolver.getNonNormalizedDirectiveMetadata(d.reference); });
|
2151 | var directives = resolvedDirectives.filter(function (d) { return d !== null; }).map(function (d) { return d.metadata.toSummary(); });
|
2152 | var pipes = ngModule.transitiveModule.pipes.map(function (p) { return _this.metadataResolver.getOrLoadPipeMetadata(p.reference).toSummary(); });
|
2153 | var schemas = ngModule.schemas;
|
2154 | return {
|
2155 | pipes: pipes, directives: directives, schemas: schemas
|
2156 | };
|
2157 | };
|
2158 | |
2159 |
|
2160 |
|
2161 |
|
2162 |
|
2163 |
|
2164 |
|
2165 | DirectiveSymbol.prototype.getTemplateAst = function () {
|
2166 | var result;
|
2167 | try {
|
2168 | var resolvedMetadata = this.metadataResolver.getNonNormalizedDirectiveMetadata(this.symbol);
|
2169 | var dirMetadata = this.getResolvedMetadata();
|
2170 | var source = dirMetadata.template;
|
2171 | var metadata = resolvedMetadata && resolvedMetadata.metadata;
|
2172 | if (metadata) {
|
2173 | var rawHtmlParser = new _angular_compiler.HtmlParser();
|
2174 | var htmlParser = new _angular_compiler.I18NHtmlParser(rawHtmlParser);
|
2175 | var expressionParser = new _angular_compiler.Parser(new _angular_compiler.Lexer());
|
2176 | var parser = void 0;
|
2177 | parser = new _angular_compiler.TemplateParser(new _angular_compiler.CompilerConfig, expressionParser, new _angular_compiler.DomElementSchemaRegistry(), htmlParser, undefined, []);
|
2178 | var htmlResult = htmlParser.parse(source, '');
|
2179 | var _a = this.getDirectiveContext(), directives = _a.directives, pipes = _a.pipes, schemas = _a.schemas;
|
2180 | var parseResult = parser.tryParseHtml(htmlResult, metadata, directives, pipes, schemas);
|
2181 | result = {
|
2182 | templateAst: parseResult.templateAst,
|
2183 | parseErrors: parseResult.errors,
|
2184 | errors: []
|
2185 | };
|
2186 | }
|
2187 | else {
|
2188 | result = { errors: [{ message: 'Cannot find metadata for the directive' }] };
|
2189 | }
|
2190 | }
|
2191 | catch (e) {
|
2192 | result = { errors: [{ message: e.message }] };
|
2193 | }
|
2194 | return result;
|
2195 | };
|
2196 | DirectiveSymbol.prototype.getDependencies = function () {
|
2197 | var _this = this;
|
2198 | var summary = this.metadataResolver.getInjectableSummary(this.symbol);
|
2199 | if (!summary) {
|
2200 | return [];
|
2201 | }
|
2202 | else {
|
2203 | return (summary.type.diDeps || []).map(function (d) {
|
2204 | var meta = new _angular_compiler.ProviderMeta(d.token.identifier.reference, d);
|
2205 | return new ProviderSymbol(_this._program, _this.metadataResolver.getProviderMetadata(meta), _this.metadataResolver);
|
2206 | });
|
2207 | }
|
2208 | };
|
2209 | DirectiveSymbol.prototype.getProviders = function () {
|
2210 | var _this = this;
|
2211 | return (this.getNonResolvedMetadata().providers || []).map(function (d) {
|
2212 | return new ProviderSymbol(_this._program, d, _this.metadataResolver);
|
2213 | });
|
2214 | };
|
2215 | DirectiveSymbol.prototype.getViewProviders = function () {
|
2216 | var _this = this;
|
2217 | return (this.getNonResolvedMetadata().viewProviders || []).map(function (d) {
|
2218 | return new ProviderSymbol(_this._program, d, _this.metadataResolver);
|
2219 | });
|
2220 | };
|
2221 | |
2222 |
|
2223 |
|
2224 |
|
2225 |
|
2226 |
|
2227 |
|
2228 | DirectiveSymbol.prototype.isComponent = function () {
|
2229 | return !!this.getResolvedMetadata().template;
|
2230 | };
|
2231 | return DirectiveSymbol;
|
2232 | }(Symbol));
|
2233 |
|
2234 | var __extends$4 = (undefined && undefined.__extends) || (function () {
|
2235 | var extendStatics = Object.setPrototypeOf ||
|
2236 | ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
2237 | function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
2238 | return function (d, b) {
|
2239 | extendStatics(d, b);
|
2240 | function __() { this.constructor = d; }
|
2241 | d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
2242 | };
|
2243 | })();
|
2244 | var ModuleSymbol = (function (_super) {
|
2245 | __extends$4(ModuleSymbol, _super);
|
2246 | function ModuleSymbol(program, symbol, metadataResolver, directiveNormalizer, resolver, pipeResolver, reflector, resourceResolver, projectSymbols) {
|
2247 | var _this = _super.call(this, program, symbol) || this;
|
2248 | _this.metadataResolver = metadataResolver;
|
2249 | _this.directiveNormalizer = directiveNormalizer;
|
2250 | _this.resolver = resolver;
|
2251 | _this.pipeResolver = pipeResolver;
|
2252 | _this.reflector = reflector;
|
2253 | _this.resourceResolver = resourceResolver;
|
2254 | _this.projectSymbols = projectSymbols;
|
2255 | _this.module = _this.metadataResolver.getNgModuleMetadata(symbol);
|
2256 | return _this;
|
2257 | }
|
2258 | ModuleSymbol.prototype.getBootstrapComponents = function () {
|
2259 | return this.getWrapperDirectives(this.module.bootstrapComponents);
|
2260 | };
|
2261 | ModuleSymbol.prototype.getDeclaredDirectives = function () {
|
2262 | return this.getWrapperDirectives(this.module.declaredDirectives);
|
2263 | };
|
2264 | ModuleSymbol.prototype.getExportedDirectives = function () {
|
2265 | return this.getWrapperDirectives(this.module.exportedDirectives);
|
2266 | };
|
2267 | ModuleSymbol.prototype.getExportedPipes = function () {
|
2268 | return this.getWrappedPipes(this.module.exportedPipes);
|
2269 | };
|
2270 | ModuleSymbol.prototype.getDeclaredPipes = function () {
|
2271 | return this.getWrappedPipes(this.module.declaredPipes);
|
2272 | };
|
2273 | ModuleSymbol.prototype.getImportedModules = function () {
|
2274 | return this.getWrappedModules(this.module.importedModules);
|
2275 | };
|
2276 | ModuleSymbol.prototype.getExportedModules = function () {
|
2277 | return this.getWrappedModules(this.module.exportedModules);
|
2278 | };
|
2279 | |
2280 |
|
2281 |
|
2282 |
|
2283 |
|
2284 |
|
2285 |
|
2286 | ModuleSymbol.prototype.getModuleSummary = function () {
|
2287 | return this.metadataResolver.getNgModuleSummary(this.symbol);
|
2288 | };
|
2289 | ModuleSymbol.prototype.getProviders = function () {
|
2290 | var _this = this;
|
2291 | return this.module.providers.map(function (p) {
|
2292 | return new ProviderSymbol(_this._program, p, _this.metadataResolver);
|
2293 | });
|
2294 | };
|
2295 | ModuleSymbol.prototype.getWrappedModules = function (modules) {
|
2296 | var _this = this;
|
2297 | return modules.map(function (s) {
|
2298 | return new ModuleSymbol(_this._program, s.type.reference, _this.metadataResolver, _this.directiveNormalizer, _this.resolver, _this.pipeResolver, _this.reflector, _this.resourceResolver, _this.projectSymbols);
|
2299 | });
|
2300 | };
|
2301 | ModuleSymbol.prototype.getWrappedPipes = function (pipes) {
|
2302 | var _this = this;
|
2303 | return pipes.map(function (i) {
|
2304 | return new PipeSymbol(_this._program, i.reference, _this.pipeResolver, _this.metadataResolver, _this.projectSymbols);
|
2305 | });
|
2306 | };
|
2307 | ModuleSymbol.prototype.getWrapperDirectives = function (dirs) {
|
2308 | var _this = this;
|
2309 | return dirs.map(function (i) {
|
2310 | return new DirectiveSymbol(_this._program, i.reference, _this.metadataResolver, _this.directiveNormalizer, _this.resolver, _this.reflector, _this.resourceResolver, _this.projectSymbols);
|
2311 | });
|
2312 | };
|
2313 | return ModuleSymbol;
|
2314 | }(Symbol));
|
2315 |
|
2316 |
|
2317 |
|
2318 |
|
2319 |
|
2320 |
|
2321 |
|
2322 |
|
2323 | var ProjectSymbols = (function () {
|
2324 | |
2325 |
|
2326 |
|
2327 |
|
2328 |
|
2329 |
|
2330 |
|
2331 |
|
2332 | function ProjectSymbols(program, resourceResolver, errorReporter) {
|
2333 | this.program = program;
|
2334 | this.resourceResolver = resourceResolver;
|
2335 | this.errorReporter = errorReporter;
|
2336 | this.options = this.program.getCompilerOptions();
|
2337 | this.init();
|
2338 | }
|
2339 | |
2340 |
|
2341 |
|
2342 |
|
2343 |
|
2344 |
|
2345 |
|
2346 | ProjectSymbols.prototype.getModules = function () {
|
2347 | var _this = this;
|
2348 | this.validate();
|
2349 | var resultMap = new Map();
|
2350 | this.getAnalyzedModules()
|
2351 | .ngModules
|
2352 | .forEach(function (m, s) {
|
2353 | resultMap.set(m.type.reference, m);
|
2354 | });
|
2355 | var result = [];
|
2356 | resultMap.forEach(function (v) { return result.push(new ModuleSymbol(_this.program, v.type.reference, _this.metadataResolver, _this.directiveNormalizer, _this.directiveResolver, _this.pipeResolver, _this.reflector, _this.resourceResolver, _this)); });
|
2357 | return result;
|
2358 | };
|
2359 | |
2360 |
|
2361 |
|
2362 |
|
2363 |
|
2364 |
|
2365 |
|
2366 | ProjectSymbols.prototype.getDirectives = function () {
|
2367 | var _this = this;
|
2368 | return this.extractProgramSymbols()
|
2369 | .filter(function (symbol) { return _this.metadataResolver.isDirective(symbol); })
|
2370 | .map(function (symbol) { return new DirectiveSymbol(_this.program, symbol, _this.metadataResolver, _this.directiveNormalizer, _this.directiveResolver, _this.reflector, _this.resourceResolver, _this); });
|
2371 | };
|
2372 | |
2373 |
|
2374 |
|
2375 |
|
2376 |
|
2377 |
|
2378 |
|
2379 | ProjectSymbols.prototype.getPipes = function () {
|
2380 | var _this = this;
|
2381 | return this.extractProgramSymbols()
|
2382 | .filter(function (v) { return _this.metadataResolver.isPipe(v); })
|
2383 | .map(function (p) { return new PipeSymbol(_this.program, p, _this.pipeResolver, _this.metadataResolver, _this); });
|
2384 | };
|
2385 | |
2386 |
|
2387 |
|
2388 |
|
2389 |
|
2390 |
|
2391 |
|
2392 | ProjectSymbols.prototype.getProviders = function () {
|
2393 | var resultSet = new Map();
|
2394 | this.getModules().forEach(function (m) {
|
2395 | m.getProviders().forEach(function (p) { return resultSet.set(p.getMetadata(), p); });
|
2396 | });
|
2397 | this.getDirectives().forEach(function (d) {
|
2398 | d.getProviders().forEach(function (p) { return resultSet.set(p.getMetadata(), p); });
|
2399 | d.getViewProviders().forEach(function (p) { return resultSet.set(p.getMetadata(), p); });
|
2400 | });
|
2401 | var finalResult = [];
|
2402 | resultSet.forEach(function (v) { return finalResult.push(v); });
|
2403 | return finalResult;
|
2404 | };
|
2405 | |
2406 |
|
2407 |
|
2408 |
|
2409 |
|
2410 |
|
2411 |
|
2412 |
|
2413 |
|
2414 | ProjectSymbols.prototype.updateProgram = function (program) {
|
2415 | if (program !== this.program) {
|
2416 | this.program = program;
|
2417 | this.validate();
|
2418 | }
|
2419 | };
|
2420 | |
2421 |
|
2422 |
|
2423 |
|
2424 |
|
2425 |
|
2426 |
|
2427 |
|
2428 | ProjectSymbols.prototype.getDirectiveFromNode = function (declaration, fileName) {
|
2429 | var sourceFile = this.program.getSourceFile(fileName);
|
2430 | return new DirectiveSymbol(this.program, this.reflector.getStaticSymbol(sourceFile.fileName, declaration.name.text), this.metadataResolver, this.directiveNormalizer, this.directiveResolver, this.reflector, this.resourceResolver, this);
|
2431 | };
|
2432 |
|
2433 | ProjectSymbols.prototype.getAnalyzedModules = function () {
|
2434 | var analyzedModules = this.analyzedModules;
|
2435 | if (!analyzedModules) {
|
2436 | var analyzeHost = { isSourceFile: function (filePath) { return true; } };
|
2437 | var programSymbols = _angular_compiler.extractProgramSymbols(this.staticSymbolResolver, this.program.getSourceFiles().map(function (sf) { return sf.fileName; }), analyzeHost);
|
2438 | analyzedModules = this.analyzedModules =
|
2439 | _angular_compiler.analyzeNgModules(programSymbols, analyzeHost, this.metadataResolver);
|
2440 | }
|
2441 | return analyzedModules;
|
2442 | };
|
2443 | ProjectSymbols.prototype.extractProgramSymbols = function () {
|
2444 | return _angular_compiler.extractProgramSymbols(this.staticSymbolResolver, this.program.getSourceFiles().map(function (sf) { return sf.fileName; }), {
|
2445 | isSourceFile: function () { return true; }
|
2446 | });
|
2447 | };
|
2448 | ProjectSymbols.prototype.validate = function () {
|
2449 | var program = this.program;
|
2450 | if (this.lastProgram !== program) {
|
2451 | this.clearCaches();
|
2452 | this.lastProgram = program;
|
2453 | this.init();
|
2454 | }
|
2455 | };
|
2456 | ProjectSymbols.prototype.clearCaches = function () {
|
2457 | this.metadataResolver.clearCache();
|
2458 | this.directiveNormalizer.clearCache();
|
2459 | };
|
2460 | ProjectSymbols.prototype.init = function () {
|
2461 | var staticSymbolCache = new _angular_compiler.StaticSymbolCache();
|
2462 | var summaryResolver = new _angular_compiler.AotSummaryResolver({
|
2463 | loadSummary: function (filePath) { return ''; },
|
2464 | isSourceFile: function (sourceFilePath) { return true; },
|
2465 | getOutputFileName: function () { return ''; }
|
2466 | }, staticSymbolCache);
|
2467 | var parser = new _angular_compiler.HtmlParser();
|
2468 | var config = new _angular_compiler.CompilerConfig({
|
2469 | defaultEncapsulation: _angular_core.ViewEncapsulation.Emulated,
|
2470 | useJit: false
|
2471 | });
|
2472 | var defaultDir = this.program.getCurrentDirectory();
|
2473 | this.options.baseUrl = this.options.baseUrl || defaultDir;
|
2474 | this.options.basePath = this.options.basePath || defaultDir;
|
2475 | this.options.genDir = this.options.genDir || defaultDir;
|
2476 | this.staticResolverHost = new _angular_compilerCli.CompilerHost(this.program, this.options, new _angular_compilerCli.NodeCompilerHostContext());
|
2477 | this.staticSymbolResolver = new _angular_compiler.StaticSymbolResolver(
|
2478 |
|
2479 | this.staticResolverHost, staticSymbolCache, summaryResolver, this.errorReporter);
|
2480 | this.summaryResolver = new _angular_compiler.AotSummaryResolver({
|
2481 | loadSummary: function (filePath) { return null; },
|
2482 | isSourceFile: function (sourceFilePath) { return true; },
|
2483 | getOutputFileName: function (sourceFilePath) { return null; }
|
2484 | }, staticSymbolCache);
|
2485 | this.reflector = new _angular_compiler.StaticReflector(this.summaryResolver, this.staticSymbolResolver, [], [], this.errorReporter);
|
2486 | var ngModuleResolver = new _angular_compiler.NgModuleResolver(this.reflector);
|
2487 | this.directiveResolver = new _angular_compiler.DirectiveResolver(this.reflector);
|
2488 | this.pipeResolver = new _angular_compiler.PipeResolver(this.reflector);
|
2489 | this.urlResolver = _angular_compiler.createOfflineCompileUrlResolver();
|
2490 | this.directiveNormalizer = new _angular_compiler.DirectiveNormalizer(this.resourceResolver, this.urlResolver, parser, config);
|
2491 | this.metadataResolver = new _angular_compiler.CompileMetadataResolver(new _angular_compiler.CompilerConfig(), ngModuleResolver, this.directiveResolver, this.pipeResolver, summaryResolver, new _angular_compiler.DomElementSchemaRegistry(), this.directiveNormalizer, new _angular_core.ɵConsole(), staticSymbolCache, this.reflector);
|
2492 | };
|
2493 | return ProjectSymbols;
|
2494 | }());
|
2495 |
|
2496 | exports.ProjectSymbols = ProjectSymbols;
|
2497 | exports.ModuleSymbol = ModuleSymbol;
|
2498 | exports.ProviderSymbol = ProviderSymbol;
|
2499 | exports.DirectiveSymbol = DirectiveSymbol;
|
2500 | exports.PipeSymbol = PipeSymbol;
|
2501 | exports.Symbol = Symbol;
|
2502 |
|
2503 | Object.defineProperty(exports, '__esModule', { value: true });
|
2504 |
|
2505 | })));
|