Add support for extracting array of strings in ServiceParser + tests
This commit is contained in:
		| @@ -10,19 +10,41 @@ export class ServiceParser implements ParserInterface { | |||||||
| 			return results; | 			return results; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		const methodPattern: string = '(?:get|instant)\\s*\\\(\\s*([\'"`])([^\\1\\r\\n]+)\\1'; | 		const methodRegExp: RegExp = new RegExp(/(?:get|instant)\s*\(\s*(\[?([\'"`])([^\1\r\n]+)\2\]?)/); | ||||||
| 		const regExp: RegExp = new RegExp(`${translateServiceVar}\.${methodPattern}`, 'g'); | 		const regExp: RegExp = new RegExp(`${translateServiceVar}\.${methodRegExp.source}`, 'g'); | ||||||
|  |  | ||||||
| 		let matches; | 		let matches; | ||||||
| 		while (matches = regExp.exec(contents)) { | 		while (matches = regExp.exec(contents)) { | ||||||
| 			results.push(matches[2]); | 			if (this._stringContainsArray(matches[1])) { | ||||||
|  | 				results.push(...this._stringToArray(matches[1])); | ||||||
|  | 			} else { | ||||||
|  | 				results.push(matches[3]); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		return results; | 		return results; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Extract name of TranslateService variable for use in patterns | 	 * Checks if string contains an array | ||||||
|  | 	 */ | ||||||
|  | 	protected _stringContainsArray(input: string): boolean { | ||||||
|  | 		return input.startsWith('[') && input.endsWith(']'); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Converts string to array | ||||||
|  | 	 */ | ||||||
|  | 	protected _stringToArray(input: string): string[] { | ||||||
|  | 		if (this._stringContainsArray(input)) { | ||||||
|  | 			return eval(input); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return []; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * Extracts name of TranslateService variable for use in patterns | ||||||
| 	 */ | 	 */ | ||||||
| 	protected _extractTranslateServiceVar(contents: string): string { | 	protected _extractTranslateServiceVar(contents: string): string { | ||||||
| 		const matches = contents.match(/([a-z0-9_]+)\s*:\s*TranslateService/i); | 		const matches = contents.match(/([a-z0-9_]+)\s*:\s*TranslateService/i); | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ describe('ServiceParser', () => { | |||||||
| 		expect(messages).to.equal('_translateService'); | 		expect(messages).to.equal('_translateService'); | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
| 	it('should extract string passed to translateService.get()', () => { | 	it('should extract strings in TranslateService\'s get() method', () => { | ||||||
| 		const contents = ` | 		const contents = ` | ||||||
| 			@Component({ }) | 			@Component({ }) | ||||||
| 			export class AppComponent { | 			export class AppComponent { | ||||||
| @@ -47,7 +47,7 @@ describe('ServiceParser', () => { | |||||||
| 		expect(messages).to.deep.equal(['Hello World']); | 		expect(messages).to.deep.equal(['Hello World']); | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
| 	it('should extract string passed to translateService.instant()', () => { | 	it('should extract strings in TranslateService\'s instant() method', () => { | ||||||
| 		const contents = ` | 		const contents = ` | ||||||
| 			@Component({ }) | 			@Component({ }) | ||||||
| 			export class AppComponent { | 			export class AppComponent { | ||||||
| @@ -60,7 +60,33 @@ describe('ServiceParser', () => { | |||||||
| 		expect(messages).to.deep.equal(['Hello World']); | 		expect(messages).to.deep.equal(['Hello World']); | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
| 	it('should not extract string passed to get() or instant() methods of other services', () => { | 	it('should extract array of strings in TranslateService\'s get() method', () => { | ||||||
|  | 		const contents = ` | ||||||
|  | 			@Component({ }) | ||||||
|  | 			export class AppComponent { | ||||||
|  | 				public constructor(protected _translateService: TranslateService) { } | ||||||
|  | 				public test() { | ||||||
|  | 					this._translateService.get(['Hello', 'World']); | ||||||
|  | 				} | ||||||
|  | 		`; | ||||||
|  | 		const messages = parser.process(componentFilename, contents); | ||||||
|  | 		expect(messages).to.deep.equal(['Hello', 'World']); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should extract array of strings in TranslateService\'s instant() method', () => { | ||||||
|  | 		const contents = ` | ||||||
|  | 			@Component({ }) | ||||||
|  | 			export class AppComponent { | ||||||
|  | 				public constructor(protected _translateService: TranslateService) { } | ||||||
|  | 				public test() { | ||||||
|  | 					this._translateService.instant(['Hello', 'World']); | ||||||
|  | 				} | ||||||
|  | 		`; | ||||||
|  | 		const messages = parser.process(componentFilename, contents); | ||||||
|  | 		expect(messages).to.deep.equal(['Hello', 'World']); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
|  | 	it('should not extract strings in get()/instant() methods of other services', () => { | ||||||
| 		const contents = ` | 		const contents = ` | ||||||
| 			@Component({ }) | 			@Component({ }) | ||||||
| 			export class AppComponent { | 			export class AppComponent { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user