I18n code breaks up internationalization into opCodes which are then stored in arrays. To make it easier to debug the codebase this PR adds `debug` property to the arrays which presents the data in human readable format. PR Close #38154
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
 | |
| /**
 | |
|  * @license
 | |
|  * Copyright Google LLC All Rights Reserved.
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| /** Template string function that can be used to strip indentation from a given string literal. */
 | |
| export function dedent(strings: TemplateStringsArray, ...values: any[]) {
 | |
|   let joinedString = '';
 | |
|   for (let i = 0; i < values.length; i++) {
 | |
|     joinedString += `${strings[i]}${values[i]}`;
 | |
|   }
 | |
|   joinedString += strings[strings.length - 1];
 | |
|   const lines = joinedString.split('\n');
 | |
|   while (isBlank(lines[0])) {
 | |
|     lines.shift();
 | |
|   }
 | |
|   while (isBlank(lines[lines.length - 1])) {
 | |
|     lines.pop();
 | |
|   }
 | |
|   let minWhitespacePrefix = lines.reduce(
 | |
|       (min, line) => Math.min(min, numOfWhiteSpaceLeadingChars(line)), Number.MAX_SAFE_INTEGER);
 | |
|   return lines.map((line) => line.substring(minWhitespacePrefix)).join('\n');
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Tests to see if the line is blank.
 | |
|  *
 | |
|  * A blank line is such which contains only whitespace.
 | |
|  * @param text string to test for blank-ness.
 | |
|  */
 | |
| function isBlank(text: string): boolean {
 | |
|   return /^\s*$/.test(text);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Returns number of whitespace leading characters.
 | |
|  *
 | |
|  * @param text
 | |
|  */
 | |
| function numOfWhiteSpaceLeadingChars(text: string): number {
 | |
|   return text.match(/^\s*/)![0].length;
 | |
| }
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Jasmine AsymmetricMatcher which can be used to assert `.debug` properties.
 | |
|  *
 | |
|  * ```
 | |
|  * expect(obj).toEqual({
 | |
|  *   create: debugMatch('someValue')
 | |
|  * })
 | |
|  * ```
 | |
|  *
 | |
|  * In the above example it will assert that `obj.create.debug === 'someValue'`.
 | |
|  *
 | |
|  * @param expected Expected value.
 | |
|  */
 | |
| export function debugMatch<T>(expected: T): any {
 | |
|   const matcher = function() {};
 | |
|   let actual: any = null;
 | |
| 
 | |
|   matcher.asymmetricMatch = function(objectWithDebug: any) {
 | |
|     return jasmine.matchersUtil.equals(actual = objectWithDebug.debug, expected);
 | |
|   };
 | |
|   matcher.jasmineToString = function() {
 | |
|     return `<${JSON.stringify(actual)} != ${JSON.stringify(expected)}>`;
 | |
|   };
 | |
|   return matcher;
 | |
| }
 |