UNPKG

100 kBJavaScriptView Raw
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 * Base class which provides primitive for the DirectiveSymbol and
9 * PipeSymbol. It contains some functionality common between these classes.
10 *
11 * @export
12 * @class Symbol
13 */
14var Symbol = (function () {
15 /**
16 * Creates an instance of Symbol.
17 *
18 * @param {ts.Program} _program
19 * @param {StaticSymbol} _symbol
20 *
21 * @memberOf Symbol
22 */
23 function Symbol(_program, _symbol) {
24 this._program = _program;
25 this._symbol = _symbol;
26 }
27 /**
28 * Gets the ts.node which corresponds to the controller of the DirectiveSymbol
29 * or the implementation of the pipe.
30 *
31 * @returns {(ts.ClassDeclaration | undefined)}
32 *
33 * @memberOf Symbol
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 * The wrapped `StaticSymbol` from `@angular/compiler`.
52 *
53 * @readonly
54 *
55 * @memberOf Symbol
56 */
57 get: function () {
58 return this._symbol;
59 },
60 enumerable: true,
61 configurable: true
62 });
63 return Symbol;
64}());
65
66var ProviderSymbol = (function () {
67 function ProviderSymbol(program, provider, metadataResolver) {
68 this.program = program;
69 this.provider = provider;
70 this.metadataResolver = metadataResolver;
71 }
72 /**
73 * Returns the provider metadata.
74 */
75 ProviderSymbol.prototype.getMetadata = function () {
76 return this.provider;
77 };
78 /**
79 * Returns the list of dependencies for given provider.
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
91var __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 * A wrapper around the pipe symbol.
103 *
104 * @export
105 * @class PipeSymbol
106 * @extends {Symbol}
107 */
108var PipeSymbol = (function (_super) {
109 __extends(PipeSymbol, _super);
110 /**
111 * Creates an instance of PipeSymbol.
112 *
113 * @param {Program} program
114 * @param {StaticSymbol} symbol
115 * @param {PipeResolver} resolver
116 * @param {ContextSymbols} projectSymbols
117 *
118 * @memberOf PipeSymbol
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 * Returns the module where the wrapped pipe was defined.
129 *
130 * @returns {(CompileNgModuleMetadata | undefined)}
131 *
132 * @memberOf PipeSymbol
133 */
134 PipeSymbol.prototype.getModule = function () {
135 return this.projectSymbols.getAnalyzedModules()
136 .ngModuleByPipeOrDirective.get(this.symbol);
137 };
138 /**
139 * Returns the pipe metadata.
140 *
141 * @returns {Pipe}
142 *
143 * @memberOf PipeSymbol
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 * @license
166 * Copyright Google Inc. All Rights Reserved.
167 *
168 * Use of this source code is governed by an MIT-style license that can be
169 * found in the LICENSE file at https://angular.io/license
170 */
171/**
172 * @license
173 * Copyright Google Inc. All Rights Reserved.
174 *
175 * Use of this source code is governed by an MIT-style license that can be
176 * found in the LICENSE file at https://angular.io/license
177 */ var $EOF = 0;
178var $TAB = 9;
179var $LF = 10;
180var $VTAB = 11;
181var $FF = 12;
182var $CR = 13;
183var $SPACE = 32;
184var $BANG = 33;
185var $DQ = 34;
186var $HASH = 35;
187var $$ = 36;
188var $PERCENT = 37;
189var $AMPERSAND = 38;
190var $SQ = 39;
191var $LPAREN = 40;
192var $RPAREN = 41;
193var $STAR = 42;
194var $PLUS = 43;
195var $COMMA = 44;
196var $MINUS = 45;
197var $PERIOD = 46;
198var $SLASH = 47;
199var $COLON = 58;
200var $SEMICOLON = 59;
201
202var $EQ = 61;
203var $GT = 62;
204var $QUESTION = 63;
205var $0 = 48;
206var $9 = 57;
207var $A = 65;
208
209
210
211var $Z = 90;
212var $LBRACKET = 91;
213var $BACKSLASH = 92;
214var $RBRACKET = 93;
215var $CARET = 94;
216var $_ = 95;
217var $a = 97;
218
219
220
221
222
223
224
225
226var $z = 122;
227var $LBRACE = 123;
228
229var $RBRACE = 125;
230var $NBSP = 160;
231var $PIPE = 124;
232var $TILDA = 126;
233var $AT = 64;
234
235function isWhitespace(code) {
236 return (code >= $TAB && code <= $SPACE) || (code == $NBSP);
237}
238function isDigit(code) {
239 return $0 <= code && code <= $9;
240}
241function isAsciiLetter(code) {
242 return code >= $a && code <= $z || code >= $A && code <= $Z;
243}
244
245var 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}());
257var ParseSourceFile = (function () {
258 function ParseSourceFile(content, url) {
259 this.content = content;
260 this.url = url;
261 }
262 return ParseSourceFile;
263}());
264var 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}());
276var ParseErrorLevel;
277(function (ParseErrorLevel) {
278 ParseErrorLevel[ParseErrorLevel["WARNING"] = 0] = "WARNING";
279 ParseErrorLevel[ParseErrorLevel["FATAL"] = 1] = "FATAL";
280})(ParseErrorLevel || (ParseErrorLevel = {}));
281var 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/* tslint:disable */
333/**
334 * @license
335 * Copyright Google Inc. All Rights Reserved.
336 *
337 * Use of this source code is governed by an MIT-style license that can be
338 * found in the LICENSE file at https://angular.io/license
339 */
340var 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 = {}));
353var 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 = {}));
370var LexedCssResult = (function () {
371 function LexedCssResult(error, token) {
372 this.error = error;
373 this.token = token;
374 }
375 return LexedCssResult;
376}());
377function generateErrorMessage(input, message, errorValue, index, row, column) {
378 return message + " at column " + row + ":" + column + " in expression [" +
379 findProblemCode(input, errorValue, index, column) + ']';
380}
381function 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}
398var 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}());
409var 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}());
418var 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}());
426function _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}
437var 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 /** @internal */
447 this._currentMode = CssLexerMode.BLOCK;
448 /** @internal */
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 // just incase the inner scan method returned an error
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 // TODO (matsko): implement array traversal for lookup here
525 isMatchingType = next.type == CssTokenType.Number || next.type == CssTokenType.Identifier;
526 }
527 else {
528 isMatchingType = next.type == type;
529 }
530 // before throwing the error we need to bring back the former
531 // mode so that the parser can recover...
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 /** @internal */
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 // even if comments are not tracked we still lex the
567 // comment so we can move the pointer forward
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 // something like url(cool)
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}());
757function isCharMatch(target, previous, code) {
758 return code == target && previous != $BACKSLASH;
759}
760function isCommentStart(code, next) {
761 return code == $SLASH && next == $STAR;
762}
763function isCommentEnd(code, next) {
764 return code == $STAR && next == $SLASH;
765}
766function isStringStart(code, next) {
767 var target = code;
768 if (target == $BACKSLASH) {
769 target = next;
770 }
771 return target == $DQ || target == $SQ;
772}
773function 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}
781function isIdentifierPart(target) {
782 return isAsciiLetter(target) || target == $BACKSLASH || target == $MINUS ||
783 target == $_ || isDigit(target);
784}
785function isValidPseudoSelectorCharacter(code) {
786 switch (code) {
787 case $LPAREN:
788 case $RPAREN:
789 return true;
790 default:
791 return false;
792 }
793}
794function isValidKeyframeBlockCharacter(code) {
795 return code == $PERCENT;
796}
797function isValidAttributeSelectorCharacter(code) {
798 // value^*|$~=something
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}
811function isValidSelectorCharacter(code) {
812 // selector [ key = value ]
813 // IDENT C IDENT C IDENT C
814 // #id, .class, *+~>
815 // tag:PSEUDO
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}
833function isValidStyleBlockCharacter(code) {
834 // key:value;
835 // key:calc(something ... )
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}
852function isValidMediaQueryRuleCharacter(code) {
853 // (min-width: 7.5em) and (orientation: landscape)
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}
865function isValidAtRuleCharacter(code) {
866 // @document url(http://www.w3.org/page?something=on#hash),
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}
888function 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}
903function isValidBlockCharacter(code) {
904 // @something { }
905 // IDENT
906 return code == $AT;
907}
908function 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}
936function charCode(input, index) {
937 return index >= input.length ? $EOF : input.charCodeAt(index);
938}
939function charStr(code) {
940 return String.fromCharCode(code);
941}
942function 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/* tslint:disable */
955/**
956 * @license
957 * Copyright Google Inc. All Rights Reserved.
958 *
959 * Use of this source code is governed by an MIT-style license that can be
960 * found in the LICENSE file at https://angular.io/license
961 */
962var __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})();
972var 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 = {}));
987var 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}());
1003var 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));
1014var 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));
1021var 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));
1037var 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));
1047var 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));
1059var 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));
1074var 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));
1084var 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));
1097var 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));
1110var 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));
1123var 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));
1136var 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));
1143var 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));
1156var 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));
1171var 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));
1186var 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 a style block is different from a standard block because it contains
1198 css prop:value definitions. A regular block can contain a list of Ast entries.
1199 */
1200var 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));
1212var 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));
1224var 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));
1237var 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));
1250function 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/* tslint:disable */
1261var __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 * @license
1273 * Copyright Google Inc. All Rights Reserved.
1274 *
1275 * Use of this source code is governed by an MIT-style license that can be
1276 * found in the LICENSE file at https://angular.io/license
1277 */
1278var SPACE_OPERATOR = ' ';
1279var SLASH_CHARACTER = '/';
1280var GT_CHARACTER = '>';
1281var TRIPLE_GT_OPERATOR_STR = '>>>';
1282var DEEP_OPERATOR_STR = '/deep/';
1283var EOF_DELIM_FLAG = 1;
1284var RBRACE_DELIM_FLAG = 2;
1285var LBRACE_DELIM_FLAG = 4;
1286var COMMA_DELIM_FLAG = 8;
1287var COLON_DELIM_FLAG = 16;
1288var SEMICOLON_DELIM_FLAG = 32;
1289var NEWLINE_DELIM_FLAG = 64;
1290var RPAREN_DELIM_FLAG = 128;
1291var LPAREN_DELIM_FLAG = 256;
1292var SPACE_DELIM_FLAG = 512;
1293function _pseudoSelectorSupportsInnerSelectors(name) {
1294 return ['not', 'host', 'host-context'].indexOf(name) >= 0;
1295}
1296function 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}
1307function 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}
1330function characterContainsDelimiter(code, delimiters) {
1331 return (getDelimFromCharacter(code) & delimiters) > 0;
1332}
1333var ParsedCssResult = (function () {
1334 function ParsedCssResult(errors, ast) {
1335 this.errors = errors;
1336 this.ast = ast;
1337 }
1338 return ParsedCssResult;
1339}());
1340var CssParser = (function () {
1341 function CssParser() {
1342 this._errors = [];
1343 }
1344 /**
1345 * @param css the CSS code that will be parsed
1346 * @param url the name of the CSS file containing the CSS source code
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 /** @internal */
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 // we collect the last token like so incase there was an
1372 // EOF token that was emitted sometime during the lexing
1373 span = this._generateSourceSpan(firstRule, this._lastToken);
1374 }
1375 return new CssStyleSheetAst(span, results);
1376 };
1377 /** @internal */
1378 CssParser.prototype._getSourceContent = function () { return this._scanner ? this._scanner.input : ''; };
1379 /** @internal */
1380 CssParser.prototype._extractSourceContent = function (start, end) {
1381 return this._getSourceContent().substring(start, end + 1);
1382 };
1383 /** @internal */
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 // the data here is invalid, however, if and when this does
1394 // occur, any other errors associated with this will be collected
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 /** @internal */
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 /** @internal */
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 /** @internal */
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 // keyframes only have one identifier name
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 // we do not track the whitespace after the mediaQuery predicate ends
1496 // so we have to calculate the end string value on our own
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 // we do not track the whitespace after this block rule predicate ends
1512 // so we have to calculate the end string value on our own
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 // if a custom @rule { ... } is used it should still tokenize the insides
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 /** @internal */
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 /** @internal */
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 /** @internal */
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 /** @internal */
1598 CssParser.prototype._getScannerIndex = function () { return this._scanner.index; };
1599 /** @internal */
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 /** @internal */
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 /** @internal */
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 /** @internal */
1642 CssParser.prototype._parseKeyframeLabel = function (delimiters) {
1643 this._scanner.setMode(CssLexerMode.KEYFRAME_BLOCK);
1644 return mergeTokens(this._collectUntilDelim(delimiters));
1645 };
1646 /** @internal */
1647 CssParser.prototype._parsePseudoSelector = function (delimiters) {
1648 var start = this._getScannerIndex();
1649 delimiters &= ~COMMA_DELIM_FLAG;
1650 // we keep the original value since we may use it to recurse when :not, :host are used
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 // host, host-context, lang, not, nth-child are all identifiers
1660 var pseudoSelectorToken = this._consume(CssTokenType.Identifier);
1661 var pseudoSelectorName = pseudoSelectorToken.strValue;
1662 tokens.push(pseudoSelectorToken);
1663 // host(), lang(), nth-child(), etc...
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 // :host(innerSelector(s)), :not(selector), etc...
1669 if (_pseudoSelectorSupportsInnerSelectors(pseudoSelectorName)) {
1670 var innerDelims = startingDelims | LPAREN_DELIM_FLAG | RPAREN_DELIM_FLAG;
1671 if (pseudoSelectorName == 'not') {
1672 // the inner selector inside of :not(...) can only be one
1673 // CSS selector (no commas allowed) ... This is according
1674 // to the CSS specification
1675 innerDelims |= COMMA_DELIM_FLAG;
1676 }
1677 // :host(a, b, c) {
1678 this._parseSelectors(innerDelims).forEach(function (selector, index) {
1679 innerSelectors.push(selector);
1680 });
1681 }
1682 else {
1683 // this branch is for things like "en-us, 2k + 1, etc..."
1684 // which all end up in pseudoSelectors like :lang, :nth-child, etc..
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 /** @internal */
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 // we set the mode after the scan because attribute mode does not
1722 // allow attribute [] values. And this also will catch any errors
1723 // if an extra "[" is used inside.
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 // we set the mode early because attribute mode does not
1732 // allow attribute [] values
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 // this happens if the selector is not directly followed by
1755 // a comma or curly brace without a space in between
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 // /deep/ operator
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 // >>> operator
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 // so long as there is an operator then we can have an
1798 // ending value that is beyond the selector value ...
1799 // otherwise it's just a bunch of trailing whitespace
1800 if (operator) {
1801 end = operator.index;
1802 }
1803 }
1804 this._scanner.consumeWhitespace();
1805 var strValue = this._extractSourceContent(start, end);
1806 // if we do come across one or more spaces inside of
1807 // the operators loop then an empty space is still a
1808 // valid operator to use if something else was not found
1809 if (operator == null && operatorScanCount > 0 && this._scanner.peek != $LBRACE) {
1810 operator = lastOperatorToken;
1811 }
1812 // please note that `endToken` is reassigned multiple times below
1813 // so please do not optimize the if statements into if/elseif
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 /** @internal */
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 /** @internal */
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 /** @internal */
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 /** @internal */
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 /** @internal */
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 /** @internal */
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 // the colon value separates the prop from the style.
1947 // there are a few cases as to what could happen if it
1948 // is missing
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 // this will throw the error
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 // this means we've reached the end of the definition and/or block
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 /** @internal */
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 /** @internal */
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}());
2001var 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
2015var parseCss = function (text) {
2016 var parser = new CssParser();
2017 return parser.parse(text, '').ast;
2018};
2019
2020var __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 * This class represents the individual directives and wrapps
2032 * their `StaticSymbol`s produced by the `@angular/compiler`.
2033 *
2034 * @export
2035 * @class DirectiveSymbol
2036 * @extends {Symbol}
2037 */
2038var DirectiveSymbol = (function (_super) {
2039 __extends$1(DirectiveSymbol, _super);
2040 /**
2041 * Creates an instance of DirectiveSymbol.
2042 *
2043 * @param {Program} program
2044 * @param {StaticSymbol} symbol
2045 * @param {CompileMetadataResolver} metadataResolver
2046 * @param {DirectiveNormalizer} directiveNormalizer
2047 * @param {DirectiveResolver} resolver
2048 * @param {StaticReflector} reflector
2049 * @param {ResourceResolver} resourceResolver
2050 * @param {ContextSymbols} projectSymbols
2051 *
2052 * @memberOf DirectiveSymbol
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 * Returns the non-resolved metadata for given directive.
2067 * If it is a component, this means that the external templates
2068 * and styles won't be read from the drive. Also, the paths to
2069 * external metadata won't be resolved.
2070 *
2071 * @returns {CompileDirectiveMetadata}
2072 *
2073 * @memberOf DirectiveSymbol
2074 */
2075 DirectiveSymbol.prototype.getNonResolvedMetadata = function () {
2076 return this.metadataResolver.getNonNormalizedDirectiveMetadata(this.symbol).metadata;
2077 };
2078 // TODO: use the normalizer's cache in order to prevent repetative I/O operations
2079 /**
2080 * Returns the normalized and resolved metadata for given directive or component.
2081 * For components, all the external templates and styles will be read and
2082 * set as values of the returned `CompileTemplateMetadata` properties.
2083 *
2084 * @returns {CompileTemplateMetadata}
2085 *
2086 * @memberOf DirectiveSymbol
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 // Required because otherwise the normalizer gets confused.
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 * Returns the module where the given directive has been declared.
2115 *
2116 * @returns {(CompileNgModuleMetadata | undefined)}
2117 *
2118 * @memberOf DirectiveSymbol
2119 */
2120 DirectiveSymbol.prototype.getModule = function () {
2121 return this.projectSymbols
2122 .getAnalyzedModules().ngModuleByPipeOrDirective.get(this.symbol);
2123 };
2124 /**
2125 * Returns the ASTs of all styles of the target directive.
2126 *
2127 * @returns {CssAst[]}
2128 *
2129 * @memberOf DirectiveSymbol
2130 */
2131 DirectiveSymbol.prototype.getStyleAsts = function () {
2132 return this.getResolvedMetadata()
2133 .styles.map(function (s) { return parseCss(s); });
2134 };
2135 /**
2136 * Returns the context into which the template of given
2137 * component is going to be compiled.
2138 *
2139 * @returns {DirectiveContext}
2140 *
2141 * @memberOf DirectiveSymbol
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 * Returns the compiled template of the target component.
2160 *
2161 * @returns {TemplateAstResult}
2162 *
2163 * @memberOf DirectiveSymbol
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 * Returns if the target directive is a component.
2223 *
2224 * @returns {boolean}
2225 *
2226 * @memberOf DirectiveSymbol
2227 */
2228 DirectiveSymbol.prototype.isComponent = function () {
2229 return !!this.getResolvedMetadata().template;
2230 };
2231 return DirectiveSymbol;
2232}(Symbol));
2233
2234var __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})();
2244var 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 * Returns the summary of this context.
2281 *
2282 * @returns {(CompileNgModuleSummary | undefined)}
2283 *
2284 * @memberOf ModuleSymbol
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 * Creates a proxy which provides us access to the symbols
2318 * defined in given context (could be lazy loaded module or the root module).
2319 *
2320 * @export
2321 * @class ProjectSymbols
2322 */
2323var ProjectSymbols = (function () {
2324 /**
2325 * Creates an instance of ProjectSymbols.
2326 *
2327 * @param {ts.Program} program
2328 * @param {ResourceResolver} resourceResolver
2329 *
2330 * @memberOf ProjectSymbols
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 * Returns the metadata associated to this module.
2341 *
2342 * @returns {ModuleSymbol[]}
2343 *
2344 * @memberOf ProjectSymbols
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 * Returns all the directives available in the context.
2361 *
2362 * @returns {DirectiveSymbol[]}
2363 *
2364 * @memberOf ProjectSymbols
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 * Returns all the pipes available in this module.
2374 *
2375 * @returns {PipeSymbol[]}
2376 *
2377 * @memberOf ProjectSymbols
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 * Returns all the providers available in this module.
2387 *
2388 * @returns {ProviderSymbol[]}
2389 *
2390 * @memberOf ProjectSymbols
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 * Updates the program which has impact over the loaded symbols.
2407 * In case the `update` method is called with program different from
2408 * the current one, all the internal caches will be cleared.
2409 *
2410 * @param {ts.Program} program
2411 *
2412 * @memberOf ProjectSymbols
2413 */
2414 ProjectSymbols.prototype.updateProgram = function (program) {
2415 if (program !== this.program) {
2416 this.program = program;
2417 this.validate();
2418 }
2419 };
2420 /**
2421 * Returns directive based on `ClassDeclaration` node and a filename.
2422 *
2423 * @param {ts.ClassDeclaration} declaration
2424 * @param {string} fileName
2425 *
2426 * @memberOf DirectiveSymbol
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 /** @internal */
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 // The strict null check gets confused here
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
2496exports.ProjectSymbols = ProjectSymbols;
2497exports.ModuleSymbol = ModuleSymbol;
2498exports.ProviderSymbol = ProviderSymbol;
2499exports.DirectiveSymbol = DirectiveSymbol;
2500exports.PipeSymbol = PipeSymbol;
2501exports.Symbol = Symbol;
2502
2503Object.defineProperty(exports, '__esModule', { value: true });
2504
2505})));