Skip to content

Commit 8be9f98

Browse files
committed
revert reverted changes
1 parent 0a65e17 commit 8be9f98

File tree

6 files changed

+55
-7
lines changed

6 files changed

+55
-7
lines changed

src/dev/i18n/integrate_locale_files.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { mockMakeDirAsync, mockWriteFileAsync } from './integrate_locale_files.t
2121

2222
import path from 'path';
2323
import { integrateLocaleFiles, verifyMessages } from './integrate_locale_files';
24-
// @ts-ignore
24+
// @ts-expect-error
2525
import { normalizePath } from './utils';
2626

2727
const localePath = path.resolve(__dirname, '__fixtures__', 'integrate_locale_files', 'fr.json');
@@ -36,6 +36,7 @@ const defaultIntegrateOptions = {
3636
sourceFileName: localePath,
3737
dryRun: false,
3838
ignoreIncompatible: false,
39+
ignoreMalformed: false,
3940
ignoreMissing: false,
4041
ignoreUnused: false,
4142
config: {

src/dev/i18n/integrate_locale_files.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ import {
3131
normalizePath,
3232
readFileAsync,
3333
writeFileAsync,
34-
// @ts-ignore
34+
verifyICUMessage,
35+
// @ts-expect-error
3536
} from './utils';
3637

3738
import { I18nConfig } from './config';
@@ -41,6 +42,7 @@ export interface IntegrateOptions {
4142
sourceFileName: string;
4243
targetFileName?: string;
4344
dryRun: boolean;
45+
ignoreMalformed: boolean;
4446
ignoreIncompatible: boolean;
4547
ignoreUnused: boolean;
4648
ignoreMissing: boolean;
@@ -105,6 +107,23 @@ export function verifyMessages(
105107
}
106108
}
107109

110+
for (const messageId of localizedMessagesIds) {
111+
const defaultMessage = defaultMessagesMap.get(messageId);
112+
if (defaultMessage) {
113+
try {
114+
const message = localizedMessagesMap.get(messageId)!;
115+
verifyICUMessage(message);
116+
} catch (err) {
117+
if (options.ignoreMalformed) {
118+
localizedMessagesMap.delete(messageId);
119+
options.log.warning(`Malformed translation ignored (${messageId}): ${err}`);
120+
} else {
121+
errorMessage += `\nMalformed translation (${messageId}): ${err}\n`;
122+
}
123+
}
124+
}
125+
}
126+
108127
if (errorMessage) {
109128
throw createFailError(errorMessage);
110129
}

src/dev/i18n/tasks/check_compatibility.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ import { integrateLocaleFiles, I18nConfig } from '..';
2222

2323
export interface I18nFlags {
2424
fix: boolean;
25+
ignoreMalformed: boolean;
2526
ignoreIncompatible: boolean;
2627
ignoreUnused: boolean;
2728
ignoreMissing: boolean;
2829
}
2930

3031
export function checkCompatibility(config: I18nConfig, flags: I18nFlags, log: ToolingLog) {
31-
const { fix, ignoreIncompatible, ignoreUnused, ignoreMissing } = flags;
32+
const { fix, ignoreIncompatible, ignoreUnused, ignoreMalformed, ignoreMissing } = flags;
3233
return config.translations.map((translationsPath) => ({
3334
task: async ({ messages }: { messages: Map<string, { message: string }> }) => {
3435
// If `fix` is set we should try apply all possible fixes and override translations file.
@@ -37,6 +38,7 @@ export function checkCompatibility(config: I18nConfig, flags: I18nFlags, log: To
3738
ignoreIncompatible: fix || ignoreIncompatible,
3839
ignoreUnused: fix || ignoreUnused,
3940
ignoreMissing: fix || ignoreMissing,
41+
ignoreMalformed: fix || ignoreMalformed,
4042
sourceFileName: translationsPath,
4143
targetFileName: fix ? translationsPath : undefined,
4244
config,

src/dev/i18n/utils.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,28 @@ export function checkValuesProperty(prefixedValuesKeys, defaultMessage, messageI
208208
}
209209
}
210210

211+
/**
212+
* Verifies valid ICU message.
213+
* @param message ICU message.
214+
* @param messageId ICU message id
215+
* @returns {undefined}
216+
*/
217+
export function verifyICUMessage(message) {
218+
try {
219+
parser.parse(message);
220+
} catch (error) {
221+
if (error.name === 'SyntaxError') {
222+
const errorWithContext = createParserErrorMessage(message, {
223+
loc: {
224+
line: error.location.start.line,
225+
column: error.location.start.column - 1,
226+
},
227+
message: error.message,
228+
});
229+
throw errorWithContext;
230+
}
231+
}
232+
}
211233
/**
212234
* Extracts value references from the ICU message.
213235
* @param message ICU message.

src/dev/run_i18n_check.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ run(
3636
async ({
3737
flags: {
3838
'ignore-incompatible': ignoreIncompatible,
39+
'ignore-malformed': ignoreMalformed,
3940
'ignore-missing': ignoreMissing,
4041
'ignore-unused': ignoreUnused,
4142
'include-config': includeConfig,
@@ -48,12 +49,13 @@ run(
4849
fix &&
4950
(ignoreIncompatible !== undefined ||
5051
ignoreUnused !== undefined ||
52+
ignoreMalformed !== undefined ||
5153
ignoreMissing !== undefined)
5254
) {
5355
throw createFailError(
5456
`${chalk.white.bgRed(
5557
' I18N ERROR '
56-
)} none of the --ignore-incompatible, --ignore-unused or --ignore-missing is allowed when --fix is set.`
58+
)} none of the --ignore-incompatible, --ignore-malformed, --ignore-unused or --ignore-missing is allowed when --fix is set.`
5759
);
5860
}
5961

@@ -99,6 +101,7 @@ run(
99101
checkCompatibility(
100102
config,
101103
{
104+
ignoreMalformed: !!ignoreMalformed,
102105
ignoreIncompatible: !!ignoreIncompatible,
103106
ignoreUnused: !!ignoreUnused,
104107
ignoreMissing: !!ignoreMissing,

src/dev/run_i18n_integrate.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ run(
3131
'ignore-incompatible': ignoreIncompatible = false,
3232
'ignore-missing': ignoreMissing = false,
3333
'ignore-unused': ignoreUnused = false,
34+
'ignore-malformed': ignoreMalformed = false,
3435
'include-config': includeConfig,
3536
path,
3637
source,
@@ -66,12 +67,13 @@ run(
6667
typeof ignoreIncompatible !== 'boolean' ||
6768
typeof ignoreUnused !== 'boolean' ||
6869
typeof ignoreMissing !== 'boolean' ||
70+
typeof ignoreMalformed !== 'boolean' ||
6971
typeof dryRun !== 'boolean'
7072
) {
7173
throw createFailError(
7274
`${chalk.white.bgRed(
7375
' I18N ERROR '
74-
)} --ignore-incompatible, --ignore-unused, --ignore-missing, and --dry-run can't have values`
76+
)} --ignore-incompatible, --ignore-unused, --ignore-malformed, --ignore-missing, and --dry-run can't have values`
7577
);
7678
}
7779

@@ -97,6 +99,7 @@ run(
9799
ignoreIncompatible,
98100
ignoreUnused,
99101
ignoreMissing,
102+
ignoreMalformed,
100103
config,
101104
log,
102105
});
@@ -108,7 +111,6 @@ run(
108111
const reporter = new ErrorReporter();
109112
const messages: Map<string, { message: string }> = new Map();
110113
await list.run({ messages, reporter });
111-
process.exitCode = 0;
112114
} catch (error) {
113115
process.exitCode = 1;
114116
if (error instanceof ErrorReporter) {
@@ -118,7 +120,6 @@ run(
118120
log.error(error);
119121
}
120122
}
121-
process.exit();
122123
},
123124
{
124125
flags: {

0 commit comments

Comments
 (0)