refactor(RegExpWrapper): remove the facade (#10512)
This commit is contained in:
parent
b4613ab2d2
commit
83e2d3d1cb
|
@ -9,12 +9,12 @@
|
||||||
import {Pipe, PipeTransform} from '@angular/core';
|
import {Pipe, PipeTransform} from '@angular/core';
|
||||||
|
|
||||||
import {NumberFormatStyle, NumberFormatter} from '../facade/intl';
|
import {NumberFormatStyle, NumberFormatter} from '../facade/intl';
|
||||||
import {NumberWrapper, RegExpWrapper, Type, isBlank, isNumber, isPresent, isString} from '../facade/lang';
|
import {NumberWrapper, Type, isBlank, isNumber, isPresent, isString} from '../facade/lang';
|
||||||
|
|
||||||
import {InvalidPipeArgumentException} from './invalid_pipe_argument_exception';
|
import {InvalidPipeArgumentException} from './invalid_pipe_argument_exception';
|
||||||
|
|
||||||
var defaultLocale: string = 'en-US';
|
var defaultLocale: string = 'en-US';
|
||||||
const _NUMBER_FORMAT_REGEXP = /^(\d+)?\.((\d+)(\-(\d+))?)?$/g;
|
const _NUMBER_FORMAT_REGEXP = /^(\d+)?\.((\d+)(\-(\d+))?)?$/;
|
||||||
|
|
||||||
function formatNumber(
|
function formatNumber(
|
||||||
pipe: Type, value: number | string, style: NumberFormatStyle, digits: string,
|
pipe: Type, value: number | string, style: NumberFormatStyle, digits: string,
|
||||||
|
@ -36,8 +36,8 @@ function formatNumber(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPresent(digits)) {
|
if (isPresent(digits)) {
|
||||||
var parts = RegExpWrapper.firstMatch(_NUMBER_FORMAT_REGEXP, digits);
|
var parts = digits.match(_NUMBER_FORMAT_REGEXP);
|
||||||
if (!parts) {
|
if (parts === null) {
|
||||||
throw new Error(`${digits} is not a valid digit info for number pipes`);
|
throw new Error(`${digits} is not a valid digit info for number pipes`);
|
||||||
}
|
}
|
||||||
if (isPresent(parts[1])) { // min integer digits
|
if (isPresent(parts[1])) { // min integer digits
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {Pipe, PipeTransform} from '@angular/core';
|
import {Pipe, PipeTransform} from '@angular/core';
|
||||||
import {RegExpWrapper, StringWrapper, isBlank, isFunction, isNumber, isString} from '../facade/lang';
|
import {StringWrapper, isBlank, isFunction, isNumber, isString} from '../facade/lang';
|
||||||
import {InvalidPipeArgumentException} from './invalid_pipe_argument_exception';
|
import {InvalidPipeArgumentException} from './invalid_pipe_argument_exception';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -61,7 +61,7 @@ export class ReplacePipe implements PipeTransform {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isFunction(replacement)) {
|
if (isFunction(replacement)) {
|
||||||
const rgxPattern = isString(pattern) ? RegExpWrapper.create(pattern) : pattern;
|
const rgxPattern = isString(pattern) ? new RegExp(pattern, 'g') : pattern;
|
||||||
|
|
||||||
return StringWrapper.replaceAllMapped(
|
return StringWrapper.replaceAllMapped(
|
||||||
input, rgxPattern, <(m: string[]) => string>replacement);
|
input, rgxPattern, <(m: string[]) => string>replacement);
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
import {ddescribe, describe, it, iit, xit, expect, beforeEach, afterEach, inject,} from '@angular/core/testing/testing_internal';
|
import {ddescribe, describe, it, iit, xit, expect, beforeEach, afterEach, inject,} from '@angular/core/testing/testing_internal';
|
||||||
|
|
||||||
import {ReplacePipe} from '@angular/common';
|
import {ReplacePipe} from '@angular/common';
|
||||||
import {RegExpWrapper, StringJoiner} from '../../src/facade/lang';
|
import {StringJoiner} from '../../src/facade/lang';
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
describe('ReplacePipe', () => {
|
describe('ReplacePipe', () => {
|
||||||
|
@ -45,9 +45,9 @@ export function main() {
|
||||||
it('should return a new string with the pattern replaced', () => {
|
it('should return a new string with the pattern replaced', () => {
|
||||||
var result1 = pipe.transform(str, 'Douglas', 'Hugh');
|
var result1 = pipe.transform(str, 'Douglas', 'Hugh');
|
||||||
|
|
||||||
var result2 = pipe.transform(str, RegExpWrapper.create('a'), '_');
|
var result2 = pipe.transform(str, /a/g, '_');
|
||||||
|
|
||||||
var result3 = pipe.transform(str, RegExpWrapper.create('a', 'i'), '_');
|
var result3 = pipe.transform(str, /a/gi, '_');
|
||||||
|
|
||||||
var f = ((x: any) => { return 'Adams!'; });
|
var f = ((x: any) => { return 'Adams!'; });
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
import {ANY_STATE, FILL_STYLE_FLAG} from '../../core_private';
|
import {ANY_STATE, FILL_STYLE_FLAG} from '../../core_private';
|
||||||
import {CompileAnimationAnimateMetadata, CompileAnimationEntryMetadata, CompileAnimationGroupMetadata, CompileAnimationKeyframesSequenceMetadata, CompileAnimationMetadata, CompileAnimationSequenceMetadata, CompileAnimationStateDeclarationMetadata, CompileAnimationStateTransitionMetadata, CompileAnimationStyleMetadata, CompileAnimationWithStepsMetadata} from '../compile_metadata';
|
import {CompileAnimationAnimateMetadata, CompileAnimationEntryMetadata, CompileAnimationGroupMetadata, CompileAnimationKeyframesSequenceMetadata, CompileAnimationMetadata, CompileAnimationSequenceMetadata, CompileAnimationStateDeclarationMetadata, CompileAnimationStateTransitionMetadata, CompileAnimationStyleMetadata, CompileAnimationWithStepsMetadata} from '../compile_metadata';
|
||||||
import {ListWrapper, StringMapWrapper} from '../facade/collection';
|
import {ListWrapper, StringMapWrapper} from '../facade/collection';
|
||||||
import {NumberWrapper, RegExpWrapper, isArray, isBlank, isPresent, isString, isStringMap} from '../facade/lang';
|
import {NumberWrapper, isArray, isBlank, isPresent, isString, isStringMap} from '../facade/lang';
|
||||||
import {Math} from '../facade/math';
|
import {Math} from '../facade/math';
|
||||||
import {ParseError} from '../parse_util';
|
import {ParseError} from '../parse_util';
|
||||||
|
|
||||||
|
@ -465,13 +465,13 @@ function _fillAnimationAstStartingKeyframes(
|
||||||
|
|
||||||
function _parseTimeExpression(
|
function _parseTimeExpression(
|
||||||
exp: string | number, errors: AnimationParseError[]): _AnimationTimings {
|
exp: string | number, errors: AnimationParseError[]): _AnimationTimings {
|
||||||
var regex = /^([\.\d]+)(m?s)(?:\s+([\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?/gi;
|
var regex = /^([\.\d]+)(m?s)(?:\s+([\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?/i;
|
||||||
var duration: number;
|
var duration: number;
|
||||||
var delay: number = 0;
|
var delay: number = 0;
|
||||||
var easing: string = null;
|
var easing: string = null;
|
||||||
if (isString(exp)) {
|
if (isString(exp)) {
|
||||||
var matches = RegExpWrapper.firstMatch(regex, <string>exp);
|
const matches = exp.match(regex);
|
||||||
if (!isPresent(matches)) {
|
if (matches === null) {
|
||||||
errors.push(new AnimationParseError(`The provided timing value "${exp}" is invalid.`));
|
errors.push(new AnimationParseError(`The provided timing value "${exp}" is invalid.`));
|
||||||
return new _AnimationTimings(0, 0, null);
|
return new _AnimationTimings(0, 0, null);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import {ChangeDetectionStrategy, SchemaMetadata, ViewEncapsulation} from '@angul
|
||||||
import {LifecycleHooks, reflector} from '../core_private';
|
import {LifecycleHooks, reflector} from '../core_private';
|
||||||
import {ListWrapper, StringMapWrapper} from './facade/collection';
|
import {ListWrapper, StringMapWrapper} from './facade/collection';
|
||||||
import {BaseException, unimplemented} from './facade/exceptions';
|
import {BaseException, unimplemented} from './facade/exceptions';
|
||||||
import {RegExpWrapper, Type, isBlank, isPresent, isStringMap, normalizeBlank, normalizeBool} from './facade/lang';
|
import {Type, isBlank, isPresent, isStringMap, normalizeBlank, normalizeBool} from './facade/lang';
|
||||||
|
|
||||||
import {CssSelector} from './selector';
|
import {CssSelector} from './selector';
|
||||||
import {getUrlScheme} from './url_resolver';
|
import {getUrlScheme} from './url_resolver';
|
||||||
|
@ -23,7 +23,7 @@ import {sanitizeIdentifier, splitAtColon} from './util';
|
||||||
// group 1: "prop" from "[prop]"
|
// group 1: "prop" from "[prop]"
|
||||||
// group 2: "event" from "(event)"
|
// group 2: "event" from "(event)"
|
||||||
// group 3: "@trigger" from "@trigger"
|
// group 3: "@trigger" from "@trigger"
|
||||||
const HOST_REG_EXP = /^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))|(\@[-\w]+)$/g;
|
const HOST_REG_EXP = /^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))|(\@[-\w]+)$/;
|
||||||
const UNDEFINED = new Object();
|
const UNDEFINED = new Object();
|
||||||
|
|
||||||
export abstract class CompileMetadataWithIdentifier {
|
export abstract class CompileMetadataWithIdentifier {
|
||||||
|
@ -434,8 +434,8 @@ export class CompileDirectiveMetadata implements CompileMetadataWithIdentifier {
|
||||||
var hostAttributes: {[key: string]: string} = {};
|
var hostAttributes: {[key: string]: string} = {};
|
||||||
if (isPresent(host)) {
|
if (isPresent(host)) {
|
||||||
StringMapWrapper.forEach(host, (value: string, key: string) => {
|
StringMapWrapper.forEach(host, (value: string, key: string) => {
|
||||||
var matches = RegExpWrapper.firstMatch(HOST_REG_EXP, key);
|
const matches = key.match(HOST_REG_EXP);
|
||||||
if (isBlank(matches)) {
|
if (matches === null) {
|
||||||
hostAttributes[key] = value;
|
hostAttributes[key] = value;
|
||||||
} else if (isPresent(matches[1])) {
|
} else if (isPresent(matches[1])) {
|
||||||
hostProperties[matches[1]] = value;
|
hostProperties[matches[1]] = value;
|
||||||
|
|
|
@ -11,7 +11,7 @@ import {Injectable} from '@angular/core';
|
||||||
import * as chars from '../chars';
|
import * as chars from '../chars';
|
||||||
import {ListWrapper} from '../facade/collection';
|
import {ListWrapper} from '../facade/collection';
|
||||||
import {BaseException} from '../facade/exceptions';
|
import {BaseException} from '../facade/exceptions';
|
||||||
import {RegExpWrapper, StringWrapper, escapeRegExp, isBlank, isPresent} from '../facade/lang';
|
import {StringWrapper, escapeRegExp, isBlank, isPresent} from '../facade/lang';
|
||||||
import {DEFAULT_INTERPOLATION_CONFIG, InterpolationConfig} from '../html_parser/interpolation_config';
|
import {DEFAULT_INTERPOLATION_CONFIG, InterpolationConfig} from '../html_parser/interpolation_config';
|
||||||
|
|
||||||
import {AST, ASTWithSource, AstVisitor, Binary, BindingPipe, Chain, Conditional, EmptyExpr, FunctionCall, ImplicitReceiver, Interpolation, KeyedRead, KeyedWrite, LiteralArray, LiteralMap, LiteralPrimitive, MethodCall, ParseSpan, ParserError, PrefixNot, PropertyRead, PropertyWrite, Quote, SafeMethodCall, SafePropertyRead, TemplateBinding} from './ast';
|
import {AST, ASTWithSource, AstVisitor, Binary, BindingPipe, Chain, Conditional, EmptyExpr, FunctionCall, ImplicitReceiver, Interpolation, KeyedRead, KeyedWrite, LiteralArray, LiteralMap, LiteralPrimitive, MethodCall, ParseSpan, ParserError, PrefixNot, PropertyRead, PropertyWrite, Quote, SafeMethodCall, SafePropertyRead, TemplateBinding} from './ast';
|
||||||
|
@ -29,8 +29,8 @@ export class TemplateBindingParseResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
function _createInterpolateRegExp(config: InterpolationConfig): RegExp {
|
function _createInterpolateRegExp(config: InterpolationConfig): RegExp {
|
||||||
const regexp = escapeRegExp(config.start) + '([\\s\\S]*?)' + escapeRegExp(config.end);
|
const pattern = escapeRegExp(config.start) + '([\\s\\S]*?)' + escapeRegExp(config.end);
|
||||||
return RegExpWrapper.create(regexp, 'g');
|
return new RegExp(pattern, 'g');
|
||||||
}
|
}
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
import {BaseException} from '@angular/core';
|
import {BaseException} from '@angular/core';
|
||||||
|
|
||||||
import {RegExpWrapper, StringWrapper, evalExpression, isBlank, isPresent, isString} from '../facade/lang';
|
import {StringWrapper, evalExpression, isBlank, isPresent, isString} from '../facade/lang';
|
||||||
|
|
||||||
import {EmitterVisitorContext, OutputEmitter} from './abstract_emitter';
|
import {EmitterVisitorContext, OutputEmitter} from './abstract_emitter';
|
||||||
import {AbstractJsEmitterVisitor} from './abstract_js_emitter';
|
import {AbstractJsEmitterVisitor} from './abstract_js_emitter';
|
||||||
|
|
|
@ -9,11 +9,11 @@
|
||||||
import {Injectable} from '@angular/core';
|
import {Injectable} from '@angular/core';
|
||||||
|
|
||||||
import {BaseException} from '../facade/exceptions';
|
import {BaseException} from '../facade/exceptions';
|
||||||
import {Math, RegExpWrapper, isBlank, isPresent} from '../facade/lang';
|
import {Math, isBlank, isPresent} from '../facade/lang';
|
||||||
|
|
||||||
|
|
||||||
// asset:<package-name>/<realm>/<path-to-module>
|
// asset:<package-name>/<realm>/<path-to-module>
|
||||||
var _ASSET_URL_RE = /asset:([^\/]+)\/([^\/]+)\/(.+)/g;
|
var _ASSET_URL_RE = /asset:([^\/]+)\/([^\/]+)\/(.+)/;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface that defines how import statements should be generated.
|
* Interface that defines how import statements should be generated.
|
||||||
|
@ -26,8 +26,8 @@ export abstract class ImportGenerator {
|
||||||
|
|
||||||
export class AssetUrl {
|
export class AssetUrl {
|
||||||
static parse(url: string, allowNonMatching: boolean = true): AssetUrl {
|
static parse(url: string, allowNonMatching: boolean = true): AssetUrl {
|
||||||
var match = RegExpWrapper.firstMatch(_ASSET_URL_RE, url);
|
const match = url.match(_ASSET_URL_RE);
|
||||||
if (isPresent(match)) {
|
if (match !== null) {
|
||||||
return new AssetUrl(match[1], match[2], match[3]);
|
return new AssetUrl(match[1], match[2], match[3]);
|
||||||
}
|
}
|
||||||
if (allowNonMatching) {
|
if (allowNonMatching) {
|
||||||
|
|
|
@ -8,17 +8,18 @@
|
||||||
|
|
||||||
import {ListWrapper} from './facade/collection';
|
import {ListWrapper} from './facade/collection';
|
||||||
import {BaseException} from './facade/exceptions';
|
import {BaseException} from './facade/exceptions';
|
||||||
import {RegExpMatcherWrapper, RegExpWrapper, StringWrapper, isBlank, isPresent} from './facade/lang';
|
import {StringWrapper, isBlank, isPresent} from './facade/lang';
|
||||||
|
|
||||||
const _EMPTY_ATTR_VALUE = '';
|
const _EMPTY_ATTR_VALUE = '';
|
||||||
|
|
||||||
const _SELECTOR_REGEXP = RegExpWrapper.create(
|
const _SELECTOR_REGEXP = new RegExp(
|
||||||
'(\\:not\\()|' + //":not("
|
'(\\:not\\()|' + //":not("
|
||||||
'([-\\w]+)|' + // "tag"
|
'([-\\w]+)|' + // "tag"
|
||||||
'(?:\\.([-\\w]+))|' + // ".class"
|
'(?:\\.([-\\w]+))|' + // ".class"
|
||||||
'(?:\\[([-\\w*]+)(?:=([^\\]]*))?\\])|' + // "[name]", "[name=value]" or "[name*=value]"
|
'(?:\\[([-\\w*]+)(?:=([^\\]]*))?\\])|' + // "[name]", "[name=value]" or "[name*=value]"
|
||||||
'(\\))|' + // ")"
|
'(\\))|' + // ")"
|
||||||
'(\\s*,\\s*)'); // ","
|
'(\\s*,\\s*)', // ","
|
||||||
|
'g');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A css selector contains an element name,
|
* A css selector contains an element name,
|
||||||
|
@ -41,11 +42,11 @@ export class CssSelector {
|
||||||
res.push(cssSel);
|
res.push(cssSel);
|
||||||
};
|
};
|
||||||
var cssSelector = new CssSelector();
|
var cssSelector = new CssSelector();
|
||||||
var matcher = RegExpWrapper.matcher(_SELECTOR_REGEXP, selector);
|
|
||||||
var match: string[];
|
var match: string[];
|
||||||
var current = cssSelector;
|
var current = cssSelector;
|
||||||
var inNot = false;
|
var inNot = false;
|
||||||
while (isPresent(match = RegExpMatcherWrapper.next(matcher))) {
|
_SELECTOR_REGEXP.lastIndex = 0;
|
||||||
|
while (isPresent(match = _SELECTOR_REGEXP.exec(selector))) {
|
||||||
if (isPresent(match[1])) {
|
if (isPresent(match[1])) {
|
||||||
if (inNot) {
|
if (inNot) {
|
||||||
throw new BaseException('Nesting :not is not allowed in a selector');
|
throw new BaseException('Nesting :not is not allowed in a selector');
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {ListWrapper} from './facade/collection';
|
import {ListWrapper} from './facade/collection';
|
||||||
import {RegExpMatcherWrapper, RegExpWrapper, StringWrapper, isBlank, isPresent} from './facade/lang';
|
import {StringWrapper, isBlank, isPresent} from './facade/lang';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This file is a port of shadowCSS from webcomponents.js to TypeScript.
|
* This file is a port of shadowCSS from webcomponents.js to TypeScript.
|
||||||
|
@ -244,9 +244,9 @@ export class ShadowCss {
|
||||||
**/
|
**/
|
||||||
private _extractUnscopedRulesFromCssText(cssText: string): string {
|
private _extractUnscopedRulesFromCssText(cssText: string): string {
|
||||||
// Difference with webcomponents.js: does not handle comments
|
// Difference with webcomponents.js: does not handle comments
|
||||||
var r = '', m: any /** TODO #9100 */;
|
var r = '', m: RegExpExecArray;
|
||||||
var matcher = RegExpWrapper.matcher(_cssContentUnscopedRuleRe, cssText);
|
_cssContentUnscopedRuleRe.lastIndex = 0;
|
||||||
while (isPresent(m = RegExpMatcherWrapper.next(matcher))) {
|
while ((m = _cssContentUnscopedRuleRe.exec(cssText)) !== null) {
|
||||||
var rule = m[0];
|
var rule = m[0];
|
||||||
rule = StringWrapper.replace(rule, m[2], '');
|
rule = StringWrapper.replace(rule, m[2], '');
|
||||||
rule = StringWrapper.replace(rule, m[1], m[3]);
|
rule = StringWrapper.replace(rule, m[1], m[3]);
|
||||||
|
@ -362,7 +362,7 @@ export class ShadowCss {
|
||||||
|
|
||||||
private _selectorNeedsScoping(selector: string, scopeSelector: string): boolean {
|
private _selectorNeedsScoping(selector: string, scopeSelector: string): boolean {
|
||||||
var re = this._makeScopeMatcher(scopeSelector);
|
var re = this._makeScopeMatcher(scopeSelector);
|
||||||
return !isPresent(RegExpWrapper.firstMatch(re, selector));
|
return !re.test(selector);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _makeScopeMatcher(scopeSelector: string): RegExp {
|
private _makeScopeMatcher(scopeSelector: string): RegExp {
|
||||||
|
@ -370,7 +370,7 @@ export class ShadowCss {
|
||||||
var rre = /\]/g;
|
var rre = /\]/g;
|
||||||
scopeSelector = StringWrapper.replaceAll(scopeSelector, lre, '\\[');
|
scopeSelector = StringWrapper.replaceAll(scopeSelector, lre, '\\[');
|
||||||
scopeSelector = StringWrapper.replaceAll(scopeSelector, rre, '\\]');
|
scopeSelector = StringWrapper.replaceAll(scopeSelector, rre, '\\]');
|
||||||
return RegExpWrapper.create('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');
|
return new RegExp('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');
|
||||||
}
|
}
|
||||||
|
|
||||||
private _applySelectorScope(selector: string, scopeSelector: string, hostSelector: string):
|
private _applySelectorScope(selector: string, scopeSelector: string, hostSelector: string):
|
||||||
|
@ -382,7 +382,7 @@ export class ShadowCss {
|
||||||
// scope via name and [is=name]
|
// scope via name and [is=name]
|
||||||
private _applySimpleSelectorScope(selector: string, scopeSelector: string, hostSelector: string):
|
private _applySimpleSelectorScope(selector: string, scopeSelector: string, hostSelector: string):
|
||||||
string {
|
string {
|
||||||
if (isPresent(RegExpWrapper.firstMatch(_polyfillHostRe, selector))) {
|
if (_polyfillHostRe.test(selector)) {
|
||||||
var replaceBy = this.strictStyling ? `[${hostSelector}]` : scopeSelector;
|
var replaceBy = this.strictStyling ? `[${hostSelector}]` : scopeSelector;
|
||||||
selector = StringWrapper.replace(selector, _polyfillHostNoCombinator, replaceBy);
|
selector = StringWrapper.replace(selector, _polyfillHostNoCombinator, replaceBy);
|
||||||
return StringWrapper.replaceAll(selector, _polyfillHostRe, replaceBy + ' ');
|
return StringWrapper.replaceAll(selector, _polyfillHostRe, replaceBy + ' ');
|
||||||
|
@ -407,9 +407,8 @@ export class ShadowCss {
|
||||||
var t = StringWrapper.replaceAll(p.trim(), _polyfillHostRe, '');
|
var t = StringWrapper.replaceAll(p.trim(), _polyfillHostRe, '');
|
||||||
if (t.length > 0 && !ListWrapper.contains(splits, t) &&
|
if (t.length > 0 && !ListWrapper.contains(splits, t) &&
|
||||||
!StringWrapper.contains(t, attrName)) {
|
!StringWrapper.contains(t, attrName)) {
|
||||||
var re = /([^:]*)(:*)(.*)/g;
|
const m = t.match(/([^:]*)(:*)(.*)/);
|
||||||
var m = RegExpWrapper.firstMatch(re, t);
|
if (m !== null) {
|
||||||
if (isPresent(m)) {
|
|
||||||
p = m[1] + attrName + m[2] + m[3];
|
p = m[1] + attrName + m[2] + m[3];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -437,8 +436,8 @@ var _polyfillHostContext = '-shadowcsscontext';
|
||||||
var _parenSuffix = ')(?:\\((' +
|
var _parenSuffix = ')(?:\\((' +
|
||||||
'(?:\\([^)(]*\\)|[^)(]*)+?' +
|
'(?:\\([^)(]*\\)|[^)(]*)+?' +
|
||||||
')\\))?([^,{]*)';
|
')\\))?([^,{]*)';
|
||||||
var _cssColonHostRe = RegExpWrapper.create('(' + _polyfillHost + _parenSuffix, 'im');
|
var _cssColonHostRe = new RegExp('(' + _polyfillHost + _parenSuffix, 'gim');
|
||||||
var _cssColonHostContextRe = RegExpWrapper.create('(' + _polyfillHostContext + _parenSuffix, 'im');
|
var _cssColonHostContextRe = new RegExp('(' + _polyfillHostContext + _parenSuffix, 'gim');
|
||||||
var _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';
|
var _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';
|
||||||
var _shadowDOMSelectorsRe = [
|
var _shadowDOMSelectorsRe = [
|
||||||
/::shadow/g, /::content/g,
|
/::shadow/g, /::content/g,
|
||||||
|
@ -451,7 +450,7 @@ var _shadowDOMSelectorsRe = [
|
||||||
];
|
];
|
||||||
var _shadowDeepSelectors = /(?:>>>)|(?:\/deep\/)/g;
|
var _shadowDeepSelectors = /(?:>>>)|(?:\/deep\/)/g;
|
||||||
var _selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
|
var _selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
|
||||||
var _polyfillHostRe = RegExpWrapper.create(_polyfillHost, 'im');
|
var _polyfillHostRe = new RegExp(_polyfillHost, 'im');
|
||||||
var _colonHostRe = /:host/gim;
|
var _colonHostRe = /:host/gim;
|
||||||
var _colonHostContextRe = /:host-context/gim;
|
var _colonHostContextRe = /:host-context/gim;
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
// Some of the code comes from WebComponents.JS
|
// Some of the code comes from WebComponents.JS
|
||||||
// https://github.com/webcomponents/webcomponentsjs/blob/master/src/HTMLImports/path.js
|
// https://github.com/webcomponents/webcomponentsjs/blob/master/src/HTMLImports/path.js
|
||||||
|
|
||||||
import {RegExpWrapper, StringWrapper, isBlank, isPresent} from './facade/lang';
|
import {StringWrapper, isBlank, isPresent} from './facade/lang';
|
||||||
|
|
||||||
import {UrlResolver} from './url_resolver';
|
import {UrlResolver} from './url_resolver';
|
||||||
|
|
||||||
|
@ -19,8 +19,8 @@ export class StyleWithImports {
|
||||||
|
|
||||||
export function isStyleUrlResolvable(url: string): boolean {
|
export function isStyleUrlResolvable(url: string): boolean {
|
||||||
if (isBlank(url) || url.length === 0 || url[0] == '/') return false;
|
if (isBlank(url) || url.length === 0 || url[0] == '/') return false;
|
||||||
var schemeMatch = RegExpWrapper.firstMatch(_urlWithSchemaRe, url);
|
const schemeMatch = url.match(_urlWithSchemaRe);
|
||||||
return isBlank(schemeMatch) || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset';
|
return schemeMatch === null || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,6 +43,4 @@ export function extractStyleUrls(
|
||||||
}
|
}
|
||||||
|
|
||||||
var _cssImportRe = /@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g;
|
var _cssImportRe = /@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g;
|
||||||
// TODO: can't use /^[^:/?#.]+:/g due to clang-format bug:
|
var _urlWithSchemaRe = /^([^:/?#]+):/;
|
||||||
// https://github.com/angular/angular/issues/4596
|
|
||||||
var _urlWithSchemaRe = /^([a-zA-Z\-\+\.]+):/g;
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {Inject, Injectable, OpaqueToken, Optional, SchemaMetadata, SecurityConte
|
||||||
import {Console, MAX_INTERPOLATION_VALUES} from '../../core_private';
|
import {Console, MAX_INTERPOLATION_VALUES} from '../../core_private';
|
||||||
|
|
||||||
import {ListWrapper, StringMapWrapper, SetWrapper,} from '../facade/collection';
|
import {ListWrapper, StringMapWrapper, SetWrapper,} from '../facade/collection';
|
||||||
import {RegExpWrapper, isPresent, isBlank} from '../facade/lang';
|
import {isPresent, isBlank} from '../facade/lang';
|
||||||
import {BaseException} from '../facade/exceptions';
|
import {BaseException} from '../facade/exceptions';
|
||||||
import {EmptyExpr, AST, Interpolation, ASTWithSource, TemplateBinding, RecursiveAstVisitor, BindingPipe, ParserError} from '../expression_parser/ast';
|
import {EmptyExpr, AST, Interpolation, ASTWithSource, TemplateBinding, RecursiveAstVisitor, BindingPipe, ParserError} from '../expression_parser/ast';
|
||||||
import {Parser} from '../expression_parser/parser';
|
import {Parser} from '../expression_parser/parser';
|
||||||
|
@ -42,7 +42,7 @@ import {ProviderElementContext, ProviderViewContext} from '../provider_analyzer'
|
||||||
// Group 10 = identifier inside []
|
// Group 10 = identifier inside []
|
||||||
// Group 11 = identifier inside ()
|
// Group 11 = identifier inside ()
|
||||||
const BIND_NAME_REGEXP =
|
const BIND_NAME_REGEXP =
|
||||||
/^(?:(?:(?:(bind-)|(var-)|(let-)|(ref-|#)|(on-)|(bindon-)|(animate-|@))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/g;
|
/^(?:(?:(?:(bind-)|(var-)|(let-)|(ref-|#)|(on-)|(bindon-)|(animate-|@))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/;
|
||||||
|
|
||||||
const TEMPLATE_ELEMENT = 'template';
|
const TEMPLATE_ELEMENT = 'template';
|
||||||
const TEMPLATE_ATTR = 'template';
|
const TEMPLATE_ATTR = 'template';
|
||||||
|
@ -488,9 +488,9 @@ class TemplateParseVisitor implements html.Visitor {
|
||||||
targetRefs: ElementOrDirectiveRef[], targetVars: VariableAst[]): boolean {
|
targetRefs: ElementOrDirectiveRef[], targetVars: VariableAst[]): boolean {
|
||||||
const attrName = this._normalizeAttributeName(attr.name);
|
const attrName = this._normalizeAttributeName(attr.name);
|
||||||
const attrValue = attr.value;
|
const attrValue = attr.value;
|
||||||
const bindParts = RegExpWrapper.firstMatch(BIND_NAME_REGEXP, attrName);
|
const bindParts = attrName.match(BIND_NAME_REGEXP);
|
||||||
let hasBinding = false;
|
let hasBinding = false;
|
||||||
if (isPresent(bindParts)) {
|
if (bindParts !== null) {
|
||||||
hasBinding = true;
|
hasBinding = true;
|
||||||
if (isPresent(bindParts[1])) { // match: bind-prop
|
if (isPresent(bindParts[1])) { // match: bind-prop
|
||||||
this._parsePropertyOrAnimation(
|
this._parsePropertyOrAnimation(
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
import {Inject, Injectable, PACKAGE_ROOT_URL} from '@angular/core';
|
import {Inject, Injectable, PACKAGE_ROOT_URL} from '@angular/core';
|
||||||
|
|
||||||
import {StringWrapper, isPresent, isBlank, RegExpWrapper,} from './facade/lang';
|
import {StringWrapper, isBlank, isPresent} from './facade/lang';
|
||||||
|
|
||||||
|
|
||||||
const _ASSET_SCHEME = 'asset:';
|
const _ASSET_SCHEME = 'asset:';
|
||||||
|
@ -211,7 +211,7 @@ function _buildFromEncodedParts(
|
||||||
* @type {!RegExp}
|
* @type {!RegExp}
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
var _splitRe = RegExpWrapper.create(
|
var _splitRe = new RegExp(
|
||||||
'^' +
|
'^' +
|
||||||
'(?:' +
|
'(?:' +
|
||||||
'([^:/?#.]+)' + // scheme - ignore special characters
|
'([^:/?#.]+)' + // scheme - ignore special characters
|
||||||
|
@ -260,7 +260,7 @@ enum _ComponentIndex {
|
||||||
* arbitrary strings may still look like path names.
|
* arbitrary strings may still look like path names.
|
||||||
*/
|
*/
|
||||||
function _split(uri: string): Array<string|any> {
|
function _split(uri: string): Array<string|any> {
|
||||||
return RegExpWrapper.firstMatch(_splitRe, uri);
|
return uri.match(_splitRe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
import {describe, beforeEach, it, expect, ddescribe, iit,} from '@angular/core/testing/testing_internal';
|
import {describe, beforeEach, it, expect, ddescribe, iit,} from '@angular/core/testing/testing_internal';
|
||||||
import {ShadowCss, processRules, CssRule} from '@angular/compiler/src/shadow_css';
|
import {ShadowCss, processRules, CssRule} from '@angular/compiler/src/shadow_css';
|
||||||
|
|
||||||
import {RegExpWrapper, StringWrapper, isPresent} from '../src/facade/lang';
|
import {StringWrapper, isPresent} from '../src/facade/lang';
|
||||||
import {normalizeCSS} from '@angular/platform-browser/testing/browser_util';
|
import {normalizeCSS} from '@angular/platform-browser/testing/browser_util';
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
|
|
|
@ -198,7 +198,7 @@ function dateFormatter(format: string, date: Date, locale: string): string {
|
||||||
if (datePartsFormatterCache.has(format)) {
|
if (datePartsFormatterCache.has(format)) {
|
||||||
parts = datePartsFormatterCache.get(format);
|
parts = datePartsFormatterCache.get(format);
|
||||||
} else {
|
} else {
|
||||||
var matchs = DATE_FORMATS_SPLIT.exec(format);
|
const matches = DATE_FORMATS_SPLIT.exec(format);
|
||||||
|
|
||||||
while (format) {
|
while (format) {
|
||||||
match = DATE_FORMATS_SPLIT.exec(format);
|
match = DATE_FORMATS_SPLIT.exec(format);
|
||||||
|
|
|
@ -312,50 +312,6 @@ export class NumberWrapper {
|
||||||
|
|
||||||
export var RegExp = _global.RegExp;
|
export var RegExp = _global.RegExp;
|
||||||
|
|
||||||
export class RegExpWrapper {
|
|
||||||
static create(regExpStr: string, flags: string = ''): RegExp {
|
|
||||||
flags = flags.replace(/g/g, '');
|
|
||||||
return new _global.RegExp(regExpStr, flags + 'g');
|
|
||||||
}
|
|
||||||
static firstMatch(regExp: RegExp, input: string): RegExpExecArray {
|
|
||||||
// Reset multimatch regex state
|
|
||||||
regExp.lastIndex = 0;
|
|
||||||
return regExp.exec(input);
|
|
||||||
}
|
|
||||||
static test(regExp: RegExp, input: string): boolean {
|
|
||||||
regExp.lastIndex = 0;
|
|
||||||
return regExp.test(input);
|
|
||||||
}
|
|
||||||
static matcher(regExp: RegExp, input: string): {re: RegExp; input: string} {
|
|
||||||
// Reset regex state for the case
|
|
||||||
// someone did not loop over all matches
|
|
||||||
// last time.
|
|
||||||
regExp.lastIndex = 0;
|
|
||||||
return {re: regExp, input: input};
|
|
||||||
}
|
|
||||||
static replaceAll(regExp: RegExp, input: string, replace: Function): string {
|
|
||||||
let c = regExp.exec(input);
|
|
||||||
let res = '';
|
|
||||||
regExp.lastIndex = 0;
|
|
||||||
let prev = 0;
|
|
||||||
while (c) {
|
|
||||||
res += input.substring(prev, c.index);
|
|
||||||
res += replace(c);
|
|
||||||
prev = c.index + c[0].length;
|
|
||||||
regExp.lastIndex = prev;
|
|
||||||
c = regExp.exec(input);
|
|
||||||
}
|
|
||||||
res += input.substring(prev);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class RegExpMatcherWrapper {
|
|
||||||
static next(matcher: {re: RegExp; input: string}): RegExpExecArray {
|
|
||||||
return matcher.re.exec(matcher.input);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class FunctionWrapper {
|
export class FunctionWrapper {
|
||||||
static apply(fn: Function, posArgs: any): any { return fn.apply(null, posArgs); }
|
static apply(fn: Function, posArgs: any): any { return fn.apply(null, posArgs); }
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {NumberWrapper, RegExpMatcherWrapper, RegExpWrapper, StringWrapper, escapeRegExp, hasConstructor, isPresent, isPromise, resolveEnumToken} from '../src/lang';
|
import {NumberWrapper, StringWrapper, escapeRegExp, hasConstructor, isPresent, isPromise, resolveEnumToken} from '../src/lang';
|
||||||
|
|
||||||
enum UsefulEnum {
|
enum UsefulEnum {
|
||||||
MyToken,
|
MyToken,
|
||||||
|
@ -18,42 +18,11 @@ class MySubclass extends MySuperclass {}
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
describe('RegExp', () => {
|
describe('RegExp', () => {
|
||||||
it('should expose the index for each match', () => {
|
|
||||||
var re = /(!)/g;
|
|
||||||
var matcher = RegExpWrapper.matcher(re, '0!23!567!!');
|
|
||||||
var indexes: number[] = [];
|
|
||||||
var m: any /** TODO #9100 */;
|
|
||||||
|
|
||||||
while (isPresent(m = RegExpMatcherWrapper.next(matcher))) {
|
|
||||||
indexes.push(m.index);
|
|
||||||
expect(m[0]).toEqual('!');
|
|
||||||
expect(m[1]).toEqual('!');
|
|
||||||
expect(m.length).toBe(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
expect(indexes).toEqual([1, 4, 8, 9]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reset before it is reused', () => {
|
|
||||||
var re = /^['"]/g;
|
|
||||||
var str = '\'';
|
|
||||||
expect(RegExpWrapper.test(re, str)).toEqual(true);
|
|
||||||
// If not reset, the second attempt to test results in false
|
|
||||||
expect(RegExpWrapper.test(re, str)).toEqual(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should implement replace all', () => {
|
|
||||||
let re = /(\d)+/g;
|
|
||||||
let m =
|
|
||||||
RegExpWrapper.replaceAll(re, 'a1b2c', (match: any /** TODO #9100 */) => `!${match[1]}!`);
|
|
||||||
expect(m).toEqual('a!1!b!2!c');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should escape regexp', () => {
|
it('should escape regexp', () => {
|
||||||
expect(RegExpWrapper.firstMatch(new RegExp(escapeRegExp('b')), 'abc')).toBeTruthy();
|
expect(new RegExp(escapeRegExp('b')).exec('abc')).toBeTruthy();
|
||||||
expect(RegExpWrapper.firstMatch(new RegExp(escapeRegExp('b')), 'adc')).toBeFalsy();
|
expect(new RegExp(escapeRegExp('b')).exec('adc')).toBeFalsy();
|
||||||
expect(RegExpWrapper.firstMatch(new RegExp(escapeRegExp('a.b')), 'a.b')).toBeTruthy();
|
expect(new RegExp(escapeRegExp('a.b')).exec('a.b')).toBeTruthy();
|
||||||
expect(RegExpWrapper.firstMatch(new RegExp(escapeRegExp('axb')), 'a.b')).toBeFalsy();
|
expect(new RegExp(escapeRegExp('a.b')).exec('axb')).toBeFalsy();
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {Inject, Injectable, OpaqueToken, RenderComponentType, Renderer, RootRend
|
||||||
|
|
||||||
import {StringMapWrapper} from '../facade/collection';
|
import {StringMapWrapper} from '../facade/collection';
|
||||||
import {BaseException} from '../facade/exceptions';
|
import {BaseException} from '../facade/exceptions';
|
||||||
import {Json, RegExpWrapper, StringWrapper, isArray, isBlank, isPresent, isString, stringify} from '../facade/lang';
|
import {Json, StringWrapper, isArray, isBlank, isPresent, isString, stringify} from '../facade/lang';
|
||||||
|
|
||||||
import {DomSharedStylesHost} from './shared_styles_host';
|
import {DomSharedStylesHost} from './shared_styles_host';
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ const NAMESPACE_URIS = {
|
||||||
'xhtml': 'http://www.w3.org/1999/xhtml'
|
'xhtml': 'http://www.w3.org/1999/xhtml'
|
||||||
};
|
};
|
||||||
const TEMPLATE_COMMENT_TEXT = 'template bindings={}';
|
const TEMPLATE_COMMENT_TEXT = 'template bindings={}';
|
||||||
var TEMPLATE_BINDINGS_EXP = /^template bindings=(.*)$/g;
|
var TEMPLATE_BINDINGS_EXP = /^template bindings=(.*)$/;
|
||||||
|
|
||||||
export abstract class DomRootRenderer implements RootRenderer {
|
export abstract class DomRootRenderer implements RootRenderer {
|
||||||
protected registeredComponents: Map<string, DomRenderer> = new Map<string, DomRenderer>();
|
protected registeredComponents: Map<string, DomRenderer> = new Map<string, DomRenderer>();
|
||||||
|
@ -197,9 +197,8 @@ export class DomRenderer implements Renderer {
|
||||||
setBindingDebugInfo(renderElement: any, propertyName: string, propertyValue: string): void {
|
setBindingDebugInfo(renderElement: any, propertyName: string, propertyValue: string): void {
|
||||||
var dashCasedPropertyName = camelCaseToDashCase(propertyName);
|
var dashCasedPropertyName = camelCaseToDashCase(propertyName);
|
||||||
if (getDOM().isCommentNode(renderElement)) {
|
if (getDOM().isCommentNode(renderElement)) {
|
||||||
var existingBindings = RegExpWrapper.firstMatch(
|
const existingBindings = StringWrapper.replaceAll(getDOM().getText(renderElement), /\n/g, '')
|
||||||
TEMPLATE_BINDINGS_EXP,
|
.match(TEMPLATE_BINDINGS_EXP);
|
||||||
StringWrapper.replaceAll(getDOM().getText(renderElement), /\n/g, ''));
|
|
||||||
var parsedBindings = Json.parse(existingBindings[1]);
|
var parsedBindings = Json.parse(existingBindings[1]);
|
||||||
(parsedBindings as any /** TODO #9100 */)[dashCasedPropertyName] = propertyValue;
|
(parsedBindings as any /** TODO #9100 */)[dashCasedPropertyName] = propertyValue;
|
||||||
getDOM().setText(
|
getDOM().setText(
|
||||||
|
@ -298,12 +297,12 @@ function _flattenStyles(compId: string, styles: Array<any|any[]>, target: string
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
var NS_PREFIX_RE = /^:([^:]+):(.+)/g;
|
const NS_PREFIX_RE = /^:([^:]+):(.+)$/;
|
||||||
|
|
||||||
function splitNamespace(name: string): string[] {
|
function splitNamespace(name: string): string[] {
|
||||||
if (name[0] != ':') {
|
if (name[0] != ':') {
|
||||||
return [null, name];
|
return [null, name];
|
||||||
}
|
}
|
||||||
let match = RegExpWrapper.firstMatch(NS_PREFIX_RE, name);
|
const match = name.match(NS_PREFIX_RE);
|
||||||
return [match[1], match[2]];
|
return [match[1], match[2]];
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,7 +86,7 @@ export function sanitizeStyle(value: string): string {
|
||||||
|
|
||||||
// Single url(...) values are supported, but only for URLs that sanitize cleanly. See above for
|
// Single url(...) values are supported, but only for URLs that sanitize cleanly. See above for
|
||||||
// reasoning behind this.
|
// reasoning behind this.
|
||||||
let urlMatch = URL_RE.exec(value);
|
const urlMatch = value.match(URL_RE);
|
||||||
if ((urlMatch && sanitizeUrl(urlMatch[1]) === urlMatch[1]) ||
|
if ((urlMatch && sanitizeUrl(urlMatch[1]) === urlMatch[1]) ||
|
||||||
value.match(SAFE_STYLE_VALUE) && hasBalancedQuotes(value)) {
|
value.match(SAFE_STYLE_VALUE) && hasBalancedQuotes(value)) {
|
||||||
return value; // Safe style values.
|
return value; // Safe style values.
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
import {getDOM} from '../src/dom/dom_adapter';
|
import {getDOM} from '../src/dom/dom_adapter';
|
||||||
import {ListWrapper} from '../src/facade/collection';
|
import {ListWrapper} from '../src/facade/collection';
|
||||||
import {RegExp, RegExpWrapper, StringWrapper, global, isPresent, isString} from '../src/facade/lang';
|
import {RegExp, StringWrapper, global, isPresent, isString} from '../src/facade/lang';
|
||||||
|
|
||||||
export class BrowserDetection {
|
export class BrowserDetection {
|
||||||
private _overrideUa: string;
|
private _overrideUa: string;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
import {StringMapWrapper} from '../../facade/collection';
|
import {StringMapWrapper} from '../../facade/collection';
|
||||||
import {BaseException} from '../../facade/exceptions';
|
import {BaseException} from '../../facade/exceptions';
|
||||||
import {RegExpWrapper, StringWrapper, isBlank, isPresent} from '../../facade/lang';
|
import {StringWrapper, isBlank, isPresent} from '../../facade/lang';
|
||||||
import {RootUrl, Url, convertUrlParamsToArray} from '../../url_parser';
|
import {RootUrl, Url, convertUrlParamsToArray} from '../../url_parser';
|
||||||
import {TouchMap, normalizeString} from '../../utils';
|
import {TouchMap, normalizeString} from '../../utils';
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ class StaticPathSegment implements PathSegment {
|
||||||
* a matching `Instruction`.
|
* a matching `Instruction`.
|
||||||
*/
|
*/
|
||||||
class DynamicPathSegment implements PathSegment {
|
class DynamicPathSegment implements PathSegment {
|
||||||
static paramMatcher = /^:([^\/]+)$/g;
|
static paramMatcher = /^:([^\/]+)$/;
|
||||||
specificity = '1';
|
specificity = '1';
|
||||||
hash = ':';
|
hash = ':';
|
||||||
constructor(public name: string) {}
|
constructor(public name: string) {}
|
||||||
|
@ -80,7 +80,7 @@ class DynamicPathSegment implements PathSegment {
|
||||||
* be provided to a matching `Instruction`.
|
* be provided to a matching `Instruction`.
|
||||||
*/
|
*/
|
||||||
class StarPathSegment implements PathSegment {
|
class StarPathSegment implements PathSegment {
|
||||||
static wildcardMatcher = /^\*([^\/]+)$/g;
|
static wildcardMatcher = /^\*([^\/]+)$/;
|
||||||
specificity = '0';
|
specificity = '0';
|
||||||
hash = '*';
|
hash = '*';
|
||||||
constructor(public name: string) {}
|
constructor(public name: string) {}
|
||||||
|
@ -211,12 +211,11 @@ export class ParamRoutePath implements RoutePath {
|
||||||
|
|
||||||
var limit = segmentStrings.length - 1;
|
var limit = segmentStrings.length - 1;
|
||||||
for (var i = 0; i <= limit; i++) {
|
for (var i = 0; i <= limit; i++) {
|
||||||
var segment = segmentStrings[i], match: any /** TODO #9100 */;
|
var segment = segmentStrings[i], match: RegExpMatchArray;
|
||||||
|
|
||||||
if (isPresent(match = RegExpWrapper.firstMatch(DynamicPathSegment.paramMatcher, segment))) {
|
if (isPresent(match = segment.match(DynamicPathSegment.paramMatcher))) {
|
||||||
this._segments.push(new DynamicPathSegment(match[1]));
|
this._segments.push(new DynamicPathSegment(match[1]));
|
||||||
} else if (isPresent(
|
} else if (isPresent(match = segment.match(StarPathSegment.wildcardMatcher))) {
|
||||||
match = RegExpWrapper.firstMatch(StarPathSegment.wildcardMatcher, segment))) {
|
|
||||||
this._segments.push(new StarPathSegment(match[1]));
|
this._segments.push(new StarPathSegment(match[1]));
|
||||||
} else if (segment == '...') {
|
} else if (segment == '...') {
|
||||||
if (i < limit) {
|
if (i < limit) {
|
||||||
|
@ -272,13 +271,13 @@ export class ParamRoutePath implements RoutePath {
|
||||||
throw new BaseException(
|
throw new BaseException(
|
||||||
`Path "${path}" should not include "#". Use "HashLocationStrategy" instead.`);
|
`Path "${path}" should not include "#". Use "HashLocationStrategy" instead.`);
|
||||||
}
|
}
|
||||||
var illegalCharacter = RegExpWrapper.firstMatch(ParamRoutePath.RESERVED_CHARS, path);
|
const illegalCharacter = path.match(ParamRoutePath.RESERVED_CHARS);
|
||||||
if (isPresent(illegalCharacter)) {
|
if (isPresent(illegalCharacter)) {
|
||||||
throw new BaseException(
|
throw new BaseException(
|
||||||
`Path "${path}" contains "${illegalCharacter[0]}" which is not allowed in a route config.`);
|
`Path "${path}" contains "${illegalCharacter[0]}" which is not allowed in a route config.`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static RESERVED_CHARS = RegExpWrapper.create('//|\\(|\\)|;|\\?|=');
|
static RESERVED_CHARS = new RegExp('//|\\(|\\)|;|\\?|=');
|
||||||
}
|
}
|
||||||
|
|
||||||
let REGEXP_PERCENT = /%/g;
|
let REGEXP_PERCENT = /%/g;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
import {BaseException} from '@angular/core';
|
import {BaseException} from '@angular/core';
|
||||||
|
|
||||||
import {RegExpMatcherWrapper, RegExpWrapper, isBlank} from '../../facade/lang';
|
import {isBlank} from '../../facade/lang';
|
||||||
import {Url} from '../../url_parser';
|
import {Url} from '../../url_parser';
|
||||||
|
|
||||||
import {GeneratedUrl, MatchedUrl, RoutePath} from './route_path';
|
import {GeneratedUrl, MatchedUrl, RoutePath} from './route_path';
|
||||||
|
@ -20,10 +20,8 @@ function computeNumberOfRegexGroups(regex: string): number {
|
||||||
// cleverly compute regex groups by appending an alternative empty matching
|
// cleverly compute regex groups by appending an alternative empty matching
|
||||||
// pattern and match against an empty string, the resulting match still
|
// pattern and match against an empty string, the resulting match still
|
||||||
// receives all the other groups
|
// receives all the other groups
|
||||||
var test_regex = RegExpWrapper.create(regex + '|');
|
var testRegex = new RegExp(regex + '|');
|
||||||
var matcher = RegExpWrapper.matcher(test_regex, '');
|
return testRegex.exec('').length;
|
||||||
var match = RegExpMatcherWrapper.next(matcher);
|
|
||||||
return match.length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class RegexRoutePath implements RoutePath {
|
export class RegexRoutePath implements RoutePath {
|
||||||
|
@ -37,7 +35,7 @@ export class RegexRoutePath implements RoutePath {
|
||||||
private _reString: string, private _serializer: RegexSerializer,
|
private _reString: string, private _serializer: RegexSerializer,
|
||||||
private _groupNames?: Array<string>) {
|
private _groupNames?: Array<string>) {
|
||||||
this.hash = this._reString;
|
this.hash = this._reString;
|
||||||
this._regex = RegExpWrapper.create(this._reString);
|
this._regex = new RegExp(this._reString);
|
||||||
if (this._groupNames != null) {
|
if (this._groupNames != null) {
|
||||||
var groups = computeNumberOfRegexGroups(this._reString);
|
var groups = computeNumberOfRegexGroups(this._reString);
|
||||||
if (groups != _groupNames.length) {
|
if (groups != _groupNames.length) {
|
||||||
|
@ -52,8 +50,7 @@ each matching group and a name for the complete match as its first element of re
|
||||||
matchUrl(url: Url): MatchedUrl {
|
matchUrl(url: Url): MatchedUrl {
|
||||||
var urlPath = url.toString();
|
var urlPath = url.toString();
|
||||||
var params: {[key: string]: string} = {};
|
var params: {[key: string]: string} = {};
|
||||||
var matcher = RegExpWrapper.matcher(this._regex, urlPath);
|
var match = urlPath.match(this._regex);
|
||||||
var match = RegExpMatcherWrapper.next(matcher);
|
|
||||||
|
|
||||||
if (isBlank(match)) {
|
if (isBlank(match)) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
import {StringMapWrapper} from '../src/facade/collection';
|
import {StringMapWrapper} from '../src/facade/collection';
|
||||||
import {BaseException} from '../src/facade/exceptions';
|
import {BaseException} from '../src/facade/exceptions';
|
||||||
import {RegExpWrapper, isBlank, isPresent} from '../src/facade/lang';
|
import {isBlank, isPresent} from '../src/facade/lang';
|
||||||
|
|
||||||
export function convertUrlParamsToArray(urlParams: {[key: string]: any}): string[] {
|
export function convertUrlParamsToArray(urlParams: {[key: string]: any}): string[] {
|
||||||
var paramsArray: any[] /** TODO #9100 */ = [];
|
var paramsArray: any[] /** TODO #9100 */ = [];
|
||||||
|
@ -89,15 +89,15 @@ export function pathSegmentsToUrl(pathSegments: string[]): Url {
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
var SEGMENT_RE = RegExpWrapper.create('^[^\\/\\(\\)\\?;=&#]+');
|
const SEGMENT_RE = /^[^\/\(\)\?;=&#]+/;
|
||||||
function matchUrlSegment(str: string): string {
|
function matchUrlSegment(str: string): string {
|
||||||
var match = RegExpWrapper.firstMatch(SEGMENT_RE, str);
|
const match = str.match(SEGMENT_RE);
|
||||||
return isPresent(match) ? match[0] : '';
|
return match !== null ? match[0] : '';
|
||||||
}
|
}
|
||||||
var QUERY_PARAM_VALUE_RE = RegExpWrapper.create('^[^\\(\\)\\?;&#]+');
|
const QUERY_PARAM_VALUE_RE = /^[^\(\)\?;&#]+/;
|
||||||
function matchUrlQueryParamValue(str: string): string {
|
function matchUrlQueryParamValue(str: string): string {
|
||||||
var match = RegExpWrapper.firstMatch(QUERY_PARAM_VALUE_RE, str);
|
var match = str.match(QUERY_PARAM_VALUE_RE);
|
||||||
return isPresent(match) ? match[0] : '';
|
return match !== null ? match[0] : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
export class UrlParser {
|
export class UrlParser {
|
||||||
|
|
|
@ -257,21 +257,21 @@ function pairs<T>(obj: {[key: string]: T}): Pair<string, T>[] {
|
||||||
const SEGMENT_RE = /^[^\/\(\)\?;=&#]+/;
|
const SEGMENT_RE = /^[^\/\(\)\?;=&#]+/;
|
||||||
function matchSegments(str: string): string {
|
function matchSegments(str: string): string {
|
||||||
SEGMENT_RE.lastIndex = 0;
|
SEGMENT_RE.lastIndex = 0;
|
||||||
const match = SEGMENT_RE.exec(str);
|
const match = str.match(SEGMENT_RE);
|
||||||
return match ? match[0] : '';
|
return match ? match[0] : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
const QUERY_PARAM_RE = /^[^=\?&#]+/;
|
const QUERY_PARAM_RE = /^[^=\?&#]+/;
|
||||||
function matchQueryParams(str: string): string {
|
function matchQueryParams(str: string): string {
|
||||||
QUERY_PARAM_RE.lastIndex = 0;
|
QUERY_PARAM_RE.lastIndex = 0;
|
||||||
const match = SEGMENT_RE.exec(str);
|
const match = str.match(SEGMENT_RE);
|
||||||
return match ? match[0] : '';
|
return match ? match[0] : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
const QUERY_PARAM_VALUE_RE = /^[^\?&#]+/;
|
const QUERY_PARAM_VALUE_RE = /^[^\?&#]+/;
|
||||||
function matchUrlQueryParamValue(str: string): string {
|
function matchUrlQueryParamValue(str: string): string {
|
||||||
QUERY_PARAM_VALUE_RE.lastIndex = 0;
|
QUERY_PARAM_VALUE_RE.lastIndex = 0;
|
||||||
const match = QUERY_PARAM_VALUE_RE.exec(str);
|
const match = str.match(QUERY_PARAM_VALUE_RE);
|
||||||
return match ? match[0] : '';
|
return match ? match[0] : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {OpaqueToken} from '@angular/core/src/di';
|
||||||
import {PromiseWrapper, TimerWrapper} from '@angular/facade/src/async';
|
import {PromiseWrapper, TimerWrapper} from '@angular/facade/src/async';
|
||||||
import {ListWrapper, StringMapWrapper} from '@angular/facade/src/collection';
|
import {ListWrapper, StringMapWrapper} from '@angular/facade/src/collection';
|
||||||
import {BaseException, WrappedException} from '@angular/facade/src/exceptions';
|
import {BaseException, WrappedException} from '@angular/facade/src/exceptions';
|
||||||
import {Math, NumberWrapper, RegExpWrapper, StringWrapper, isBlank, isPresent} from '@angular/facade/src/lang';
|
import {Math, NumberWrapper, StringWrapper, isBlank, isPresent} from '@angular/facade/src/lang';
|
||||||
|
|
||||||
import {Options} from '../common_options';
|
import {Options} from '../common_options';
|
||||||
import {Metric} from '../metric';
|
import {Metric} from '../metric';
|
||||||
|
@ -245,7 +245,7 @@ export class PerflogMetric extends Metric {
|
||||||
var ph = event['ph'];
|
var ph = event['ph'];
|
||||||
var name = event['name'];
|
var name = event['name'];
|
||||||
var microIterations = 1;
|
var microIterations = 1;
|
||||||
var microIterationsMatch = RegExpWrapper.firstMatch(_MICRO_ITERATIONS_REGEX, name);
|
var microIterationsMatch = name.match(_MICRO_ITERATIONS_REGEX);
|
||||||
if (isPresent(microIterationsMatch)) {
|
if (isPresent(microIterationsMatch)) {
|
||||||
name = microIterationsMatch[1];
|
name = microIterationsMatch[1];
|
||||||
microIterations = NumberWrapper.parseInt(microIterationsMatch[2], 10);
|
microIterations = NumberWrapper.parseInt(microIterationsMatch[2], 10);
|
||||||
|
@ -379,7 +379,7 @@ export class PerflogMetric extends Metric {
|
||||||
private _markName(index) { return `${_MARK_NAME_PREFIX}${index}`; }
|
private _markName(index) { return `${_MARK_NAME_PREFIX}${index}`; }
|
||||||
}
|
}
|
||||||
|
|
||||||
var _MICRO_ITERATIONS_REGEX = /(.+)\*(\d+)$/g;
|
var _MICRO_ITERATIONS_REGEX = /(.+)\*(\d+)$/;
|
||||||
|
|
||||||
var _MAX_RETRY_COUNT = 20;
|
var _MAX_RETRY_COUNT = 20;
|
||||||
var _MARK_NAME_PREFIX = 'benchpress';
|
var _MARK_NAME_PREFIX = 'benchpress';
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
import {ListWrapper, StringMapWrapper} from '@angular/facade/src/collection';
|
import {ListWrapper, StringMapWrapper} from '@angular/facade/src/collection';
|
||||||
import {BaseException, WrappedException} from '@angular/facade/src/exceptions';
|
import {BaseException, WrappedException} from '@angular/facade/src/exceptions';
|
||||||
import {Json, NumberWrapper, RegExpWrapper, StringWrapper, isBlank, isPresent} from '@angular/facade/src/lang';
|
import {Json, NumberWrapper, StringWrapper, isBlank, isPresent} from '@angular/facade/src/lang';
|
||||||
|
|
||||||
import {Options} from '../common_options';
|
import {Options} from '../common_options';
|
||||||
import {WebDriverAdapter} from '../web_driver_adapter';
|
import {WebDriverAdapter} from '../web_driver_adapter';
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {BaseException, WrappedException} from '@angular/facade/src/exceptions';
|
import {BaseException, WrappedException} from '@angular/facade/src/exceptions';
|
||||||
import {Json, RegExpWrapper, StringWrapper, isBlank, isPresent} from '@angular/facade/src/lang';
|
import {Json, StringWrapper, isBlank, isPresent} from '@angular/facade/src/lang';
|
||||||
|
|
||||||
import {WebDriverAdapter} from '../web_driver_adapter';
|
import {WebDriverAdapter} from '../web_driver_adapter';
|
||||||
import {PerfLogFeatures, WebDriverExtension} from '../web_driver_extension';
|
import {PerfLogFeatures, WebDriverExtension} from '../web_driver_extension';
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
import {AsyncTestCompleter, afterEach, beforeEach, ddescribe, describe, expect, iit, inject, it, xit} from '@angular/core/testing/testing_internal';
|
import {AsyncTestCompleter, afterEach, beforeEach, ddescribe, describe, expect, iit, inject, it, xit} from '@angular/core/testing/testing_internal';
|
||||||
import {PromiseWrapper} from '@angular/facade/src/async';
|
import {PromiseWrapper} from '@angular/facade/src/async';
|
||||||
import {DateWrapper, Json, RegExpWrapper, isPresent} from '@angular/facade/src/lang';
|
import {DateWrapper, Json, isPresent} from '@angular/facade/src/lang';
|
||||||
import {MeasureValues, Options, ReflectiveInjector, SampleDescription} from 'benchpress/common';
|
import {MeasureValues, Options, ReflectiveInjector, SampleDescription} from 'benchpress/common';
|
||||||
import {JsonFileReporter} from 'benchpress/src/reporter/json_file_reporter';
|
import {JsonFileReporter} from 'benchpress/src/reporter/json_file_reporter';
|
||||||
|
|
||||||
|
@ -44,8 +44,8 @@ export function main() {
|
||||||
.reportSample(
|
.reportSample(
|
||||||
[mv(0, 0, {'a': 3, 'b': 6})],
|
[mv(0, 0, {'a': 3, 'b': 6})],
|
||||||
[mv(0, 0, {'a': 3, 'b': 6}), mv(1, 1, {'a': 5, 'b': 9})]);
|
[mv(0, 0, {'a': 3, 'b': 6}), mv(1, 1, {'a': 5, 'b': 9})]);
|
||||||
var regExp = /somePath\/someId_\d+\.json/g;
|
var regExp = /somePath\/someId_\d+\.json/;
|
||||||
expect(isPresent(RegExpWrapper.firstMatch(regExp, loggedFile['filename']))).toBe(true);
|
expect(isPresent(loggedFile['filename'].match(regExp))).toBe(true);
|
||||||
var parsedContent = Json.parse(loggedFile['content']);
|
var parsedContent = Json.parse(loggedFile['content']);
|
||||||
expect(parsedContent).toEqual({
|
expect(parsedContent).toEqual({
|
||||||
'description':
|
'description':
|
||||||
|
|
|
@ -23,10 +23,10 @@ describe('sourcemaps', function() {
|
||||||
// so that the browser logs can be read out!
|
// so that the browser logs can be read out!
|
||||||
browser.executeScript('1+1');
|
browser.executeScript('1+1');
|
||||||
browser.manage().logs().get('browser').then(function(logs) {
|
browser.manage().logs().get('browser').then(function(logs) {
|
||||||
var errorLine: any /** TODO #9100 */ = null;
|
var errorLine: number = null;
|
||||||
var errorColumn: any /** TODO #9100 */ = null;
|
var errorColumn: number = null;
|
||||||
logs.forEach(function(log) {
|
logs.forEach(function(log) {
|
||||||
var match = /\.createError\s+\(.+:(\d+):(\d+)/m.exec(log.message);
|
const match = log.message.match(/\.createError\s+\(.+:(\d+):(\d+)/m);
|
||||||
if (match) {
|
if (match) {
|
||||||
errorLine = parseInt(match[1]);
|
errorLine = parseInt(match[1]);
|
||||||
errorColumn = parseInt(match[2]);
|
errorColumn = parseInt(match[2]);
|
||||||
|
|
|
@ -18,14 +18,14 @@ import {
|
||||||
} from '@angular/common';
|
} from '@angular/common';
|
||||||
import {Component, Directive, Host} from '@angular/core';
|
import {Component, Directive, Host} from '@angular/core';
|
||||||
|
|
||||||
import {RegExpWrapper, print, isPresent} from '@angular/core/src/facade/lang';
|
import {print, isPresent} from '@angular/core/src/facade/lang';
|
||||||
import {AbstractControl} from '@angular/common';
|
import {AbstractControl} from '@angular/common';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Custom validator.
|
* Custom validator.
|
||||||
*/
|
*/
|
||||||
function creditCardValidator(c: AbstractControl): {[key: string]: boolean} {
|
function creditCardValidator(c: AbstractControl): {[key: string]: boolean} {
|
||||||
if (isPresent(c.value) && RegExpWrapper.test(/^\d{16}$/g, c.value)) {
|
if (isPresent(c.value) && /^\d{16}$/.test(c.value)) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
return {"invalidCreditCard": true};
|
return {"invalidCreditCard": true};
|
||||||
|
|
|
@ -19,7 +19,7 @@ import {
|
||||||
NgForm
|
NgForm
|
||||||
} from '@angular/common';
|
} from '@angular/common';
|
||||||
|
|
||||||
import {RegExpWrapper, print, isPresent} from '@angular/core/src/facade/lang';
|
import {print, isPresent} from '@angular/core/src/facade/lang';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A domain model we are binding the form controls to.
|
* A domain model we are binding the form controls to.
|
||||||
|
@ -40,7 +40,7 @@ class CheckoutModel {
|
||||||
* Custom validator.
|
* Custom validator.
|
||||||
*/
|
*/
|
||||||
function creditCardValidator(c: any /** TODO #9100 */): {[key: string]: boolean} {
|
function creditCardValidator(c: any /** TODO #9100 */): {[key: string]: boolean} {
|
||||||
if (isPresent(c.value) && RegExpWrapper.test(/^\d{16}$/g, c.value)) {
|
if (isPresent(c.value) && /^\d{16}$/.test(c.value)) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
return {"invalidCreditCard": true};
|
return {"invalidCreditCard": true};
|
||||||
|
|
Loading…
Reference in New Issue