Skip to content

Commit

Permalink
feat(@formatjs/cli): add a check for duplicated keys in different fil…
Browse files Browse the repository at this point in the history
…es (#1711)
  • Loading branch information
santialbo committed Jun 10, 2020
1 parent e0ecea6 commit b6c720e
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 8 deletions.
41 changes: 33 additions & 8 deletions packages/cli/src/extract.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import {ExtractionResult, OptionsSchema} from 'babel-plugin-react-intl';
import {
ExtractionResult,
OptionsSchema,
ExtractedMessageDescriptor,
} from 'babel-plugin-react-intl';
import * as babel from '@babel/core';
import {warn, getStdinAsString} from './console_utils';
import {outputJSONSync} from 'fs-extra';
Expand Down Expand Up @@ -138,23 +142,44 @@ export default async function extractAndWrite(
files: readonly string[],
opts: ExtractCLIOptions
) {
const {outFile, ...extractOpts} = opts;
const {outFile, throws, ...extractOpts} = opts;
if (outFile) {
extractOpts.messagesDir = undefined;
}
const extractionResults = await extract(files, extractOpts);
const printMessagesToStdout = extractOpts.messagesDir == null && !outFile;
const extractedMessages = extractionResults
.map(m => m.messages)
.filter(Boolean)
.reduce((all, messages) => [...all, ...messages], []);
const extractedMessages = new Map<string, ExtractedMessageDescriptor>();
for (const {messages} of extractionResults) {
for (const message of messages ?? []) {
const {id, description, defaultMessage} = message;
if (extractedMessages.has(id)) {
const existing = extractedMessages.get(id)!;
if (
description !== existing.description ||
defaultMessage !== existing.defaultMessage
) {
const error = new Error(
`[React Intl] Duplicate message id: "${id}", ` +
'but the `description` and/or `defaultMessage` are different.'
);
if (throws) {
throw error;
} else {
warn(error.message);
}
}
}
extractedMessages.set(message.id, message);
}
}
const results = Array.from(extractedMessages.values());
if (outFile) {
outputJSONSync(outFile, extractedMessages, {
outputJSONSync(outFile, results, {
spaces: 2,
});
}
if (printMessagesToStdout) {
process.stdout.write(JSON.stringify(extractedMessages, null, 2));
process.stdout.write(JSON.stringify(results, null, 2));
process.stdout.write('\n');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,15 @@ Options:
"
`;
exports[`duplicated descriptor ids shows warning 1`] = `
Array [
Object {
"defaultMessage": "Bar",
"id": "foo",
},
]
`;
exports[`ignore -> stdout 1`] = `
Array [
Object {
Expand Down
10 changes: 10 additions & 0 deletions packages/cli/tests/extract/integration_tests/duplicated/file1.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import React from 'react';
import {FormattedMessage} from 'react-intl';

export function Foo() {
return (
<p>
<FormattedMessage id="foo" defaultMessage="Foo" />
</p>
);
}
10 changes: 10 additions & 0 deletions packages/cli/tests/extract/integration_tests/duplicated/file2.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import React from 'react';
import {FormattedMessage} from 'react-intl';

export function Bar() {
return (
<p>
<FormattedMessage id="foo" defaultMessage="Bar" />
</p>
);
}
16 changes: 16 additions & 0 deletions packages/cli/tests/extract/integration_tests/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,3 +97,19 @@ test('ignore -> stdout', async () => {
expect(JSON.parse(jsResult.stdout)).toMatchSnapshot();
expect(jsResult.stderr).toBe('');
}, 20000);

test('duplicated descriptor ids shows warning', async () => {
const {stderr, stdout} = await exec(
`${BIN_PATH} extract ${path.join(__dirname, 'duplicated/*.tsx')}`
);
expect(JSON.parse(stdout)).toMatchSnapshot();
expect(stderr).toContain('Duplicate message id: "foo"');
}, 20000);

test('duplicated descriptor ids throws', async () => {
expect(async () => {
await exec(
`${BIN_PATH} extract --throws ${path.join(__dirname, 'duplicated/*.tsx')}`
);
}).rejects.toThrowError('Duplicate message id: "foo"');
}, 20000);

0 comments on commit b6c720e

Please sign in to comment.