diff --git a/README.md b/README.md index d37f3dd..13aad53 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # bs-react-intl-extractor Extracts messages for localization from [Reason] source files. -This assumes that you are using the [bs-react-intl] bindings for [react-intl]. +This assumes that you are using the [bs-react-intl] 2.x bindings for [react-intl]. [![NPM](https://nodei.co/npm/bs-react-intl-extractor-bin.png?compact=true)](https://nodei.co/npm/bs-react-intl-extractor-bin/) ![Build Status](https://github.com/cknitt/bs-react-intl-extractor/workflows/CI/badge.svg) ## Installation -Binaries for macOS and Linux can be installed via npm or yarn. For global installation, run +Binaries for macOS, Linux and Windows can be installed via npm or yarn. For global installation, run ```sh npm install -g bs-react-intl-extractor-bin @@ -47,7 +47,7 @@ The output (a JSON array of all extracted messages sorted by id) is written to s ] ``` -## Message Definition (bs-react-intl 2.x) +## Message Definition Formatted messages may be defined in your source files in one of the following ways: @@ -79,65 +79,9 @@ module Msg = { ``` You also can pass descriptions to the records with: -```reason -let foo = [@intl.description "Hello description"] {id: "message.hello", defaultMessage: "Hello"}; -``` - -## Message Definition (bs-react-intl 1.x) - -Formatted messages may be defined in your source files in one of the following ways: - -1. inline in `FormattedMessage` (see above) - -2. using `ReactIntl.defineMessages`: ```reason -let messages = - ReactIntl.defineMessages(. { - "hello": { - "id": "message.hello", - "defaultMessage": "Hello", - }, - "world": { - "id": "message.world", - "defaultMessage": "World", - }, - }); -``` - -or - -```reason -open ReactIntl; -... -let messages = - defineMessages(. { - "hello": { - "id": "message.hello", - "defaultMessage": "Hello", - }, - "world": { - "id": "message.world", - "defaultMessage": "World", - }, - }); -``` - -3. using the attribute `[@intl.messages]`: - -```reason -let messages = - [@intl.messages] - { - "hello": { - "id": "message.hello", - "defaultMessage": "Hello", - }, - "world": { - "id": "message.world", - "defaultMessage": "World", - }, - }; +let foo = [@intl.description "Hello description"] {id: "message.hello", defaultMessage: "Hello"}; ``` ## Building and Testing diff --git a/lib/ExtractionIterator.re b/lib/ExtractionIterator.re index c63ec19..9e7b5aa 100644 --- a/lib/ExtractionIterator.re +++ b/lib/ExtractionIterator.re @@ -38,25 +38,6 @@ let extractMessageFromRecord = (~description=?, callback, fields) => { Message.fromStringMap(~description?, map) |> Option.iter(callback); }; -let extractMessagesFromRecords = (callback, records) => - records - |> List.iter(field => - switch (field) { - | ( - {txt: Lident(_)}, - { - pexp_desc: - Pexp_extension(( - {txt: "bs.obj"}, - PStr([{pstr_desc: Pstr_eval({pexp_desc: Pexp_record(fields, _)}, _), pstr_loc: _}]), - )), - }, - ) => - extractMessageFromRecord(callback, fields) - | _ => () - } - ); - let hasIntlAttribute = (items: structure) => items |> List.exists(item => @@ -114,13 +95,6 @@ let matchesFormattedMessage = ident => | _ => false }; -let matchesDefineMessages = ident => - switch (ident) { - | Ldot(Lident("ReactIntl"), "defineMessages") - | Lident("defineMessages") => true - | _ => false - }; - let getIterator = callback => { ...default_iterator, @@ -137,39 +111,6 @@ let getIterator = callback => { | {pexp_desc: Pexp_apply({pexp_desc: Pexp_ident({txt, _})}, labels)} when matchesFormattedMessage(txt) => extractMessageFromLabels(callback, labels) - // Match (ReactIntl.)defineMessages - | { - pexp_desc: - Pexp_apply( - {pexp_desc: Pexp_ident({txt, _})}, - [ - ( - Asttypes.Nolabel, - { - pexp_desc: - Pexp_extension(( - {txt: "bs.obj"}, - PStr([{pstr_desc: Pstr_eval({pexp_desc: Pexp_record(fields, _)}, _), pstr_loc: _}]), - )), - }, - ), - ], - ), - } - when matchesDefineMessages(txt) => - extractMessagesFromRecords(callback, fields) - - // Match [@intl.messages] on objects - | { - pexp_desc: - Pexp_extension(( - {txt: "bs.obj"}, - PStr([{pstr_desc: Pstr_eval({pexp_desc: Pexp_record(fields, _)}, _), pstr_loc: _}]), - )), - pexp_attributes: [({txt: "intl.messages"}, _)], - } => - extractMessagesFromRecords(callback, fields) - | _ => () }; diff --git a/test/__snapshots__/Extract.372ae0d1.0.snapshot b/test/__snapshots__/Extract.372ae0d1.0.snapshot index 4dfec3b..1f5001e 100644 --- a/test/__snapshots__/Extract.372ae0d1.0.snapshot +++ b/test/__snapshots__/Extract.372ae0d1.0.snapshot @@ -1,10 +1,2 @@ Extract › partial -[ - { \"id\": \"test1.msg2.1\", \"defaultMessage\": \"This is message 2.1\" }, - { - \"id\": \"test1.msg2.2\", - \"defaultMessage\": \"This is message 2.2\", - \"description\": \"Description for message 2.2\" - }, - { \"id\": \"test2.msg1.1\", \"defaultMessage\": \"This is message 2.1.1\" } -] +[ { \"id\": \"test1.msg3.1\", \"defaultMessage\": \"This is message 3.1\" } ] diff --git a/test/__snapshots__/Extract.a27e9fd5.0.snapshot b/test/__snapshots__/Extract.a27e9fd5.0.snapshot index 7a3c93d..e77c662 100644 --- a/test/__snapshots__/Extract.a27e9fd5.0.snapshot +++ b/test/__snapshots__/Extract.a27e9fd5.0.snapshot @@ -9,24 +9,11 @@ Extract › full }, { \"id\": \"test1.msg1.4\", \"defaultMessage\": \"This is message 1.4\" }, { \"id\": \"test1.msg1.5\", \"defaultMessage\": \"This is message 1.5\" }, - { \"id\": \"test1.msg1.6\", \"defaultMessage\": \"This is message 1.6\" }, - { - \"id\": \"test1.msg1.7\", - \"defaultMessage\": \"This is message 1.7\", - \"description\": \"Description for message 1.7\" - }, { \"id\": \"test1.msg1.8\", \"defaultMessage\": \"This is message 1.8\" }, { \"id\": \"test1.msg1.9\", \"defaultMessage\": \"This is message 1.9\", \"description\": \"Description for message 1.9\" }, - { \"id\": \"test1.msg2.1\", \"defaultMessage\": \"This is message 2.1\" }, - { - \"id\": \"test1.msg2.2\", - \"defaultMessage\": \"This is message 2.2\", - \"description\": \"Description for message 2.2\" - }, - { \"id\": \"test1.msg3.1\", \"defaultMessage\": \"This is message 3.1\" }, - { \"id\": \"test2.msg1.1\", \"defaultMessage\": \"This is message 2.1.1\" } + { \"id\": \"test1.msg3.1\", \"defaultMessage\": \"This is message 3.1\" } ] diff --git a/test/__snapshots__/ReScript.18d405ea.0.snapshot b/test/__snapshots__/ReScript.18d405ea.0.snapshot index 19a51f7..add395a 100644 --- a/test/__snapshots__/ReScript.18d405ea.0.snapshot +++ b/test/__snapshots__/ReScript.18d405ea.0.snapshot @@ -9,23 +9,11 @@ ReScript › full }, { \"id\": \"test4.msg1.4\", \"defaultMessage\": \"This is message 1.4\" }, { \"id\": \"test4.msg1.5\", \"defaultMessage\": \"This is message 1.5\" }, - { \"id\": \"test4.msg1.6\", \"defaultMessage\": \"This is message 1.6\" }, - { - \"id\": \"test4.msg1.7\", - \"defaultMessage\": \"This is message 1.7\", - \"description\": \"Description for message 1.7\" - }, { \"id\": \"test4.msg1.8\", \"defaultMessage\": \"This is message 1.8\" }, { \"id\": \"test4.msg1.9\", \"defaultMessage\": \"This is message 1.9\", \"description\": \"Description for message 1.9\" }, - { \"id\": \"test4.msg2.1\", \"defaultMessage\": \"This is message 2.1\" }, - { - \"id\": \"test4.msg2.2\", - \"defaultMessage\": \"This is message 2.2\", - \"description\": \"Description for message 2.2\" - }, { \"id\": \"test4.msg3.1\", \"defaultMessage\": \"This is message 3.1\" } ] diff --git a/test/lib/Tests.re b/test/lib/Tests.re index b2dc944..5f88158 100644 --- a/test/lib/Tests.re +++ b/test/lib/Tests.re @@ -10,12 +10,12 @@ let extractAndGetJson = (~duplicatesAllowed=?, paths) => { describe("Extract", ({test}) => { test("full", ({expect}) => { - let json = extractAndGetJson(["testData/test1", "testData/test2"]); + let json = extractAndGetJson(["testData/test1"]); expect.string(json).toMatchSnapshot(); }); test("partial", ({expect}) => { - let json = extractAndGetJson(["testData/test1/subdir/Test_1_2.re", "testData/test2"]); + let json = extractAndGetJson(["testData/test1/subdir/Test_1_3.re"]); expect.string(json).toMatchSnapshot(); }); }); diff --git a/testData/test1/Test_1_1.re b/testData/test1/Test_1_1.re index 4394a0c..fc94920 100644 --- a/testData/test1/Test_1_1.re +++ b/testData/test1/Test_1_1.re @@ -22,27 +22,6 @@ let theseShouldBeIgnored = () => ; -let _ = - ReactIntl.defineMessages({ - "test1.msg1.6": { - "id": "test1.msg1.6", - "defaultMessage": "This is message 1.6", - }, - "ignored1.3": { - "idd": "test1.msg1.8", /* This will not be extracted. */ - "defaultMessage": "This is message 1.8", - }, - }); - -let _ = - defineMessages({ - "test1.msg1.7": { - "id": "test1.msg1.7", - "defaultMessage": "This is message 1.7", - "description": "Description for message 1.7", - }, - }); - module Msg = { open ReactIntl; diff --git a/testData/test1/subdir/Test_1_2.re b/testData/test1/subdir/Test_1_2.re deleted file mode 100644 index 30b9d0b..0000000 --- a/testData/test1/subdir/Test_1_2.re +++ /dev/null @@ -1,30 +0,0 @@ -let _ = - [@intl.messages] - { - "test1.msg2.1": { - "id": "test1.msg2.1", - "defaultMessage": "This is message 2.1", - }, - "test1.msg2.2": { - "id": "test1.msg2.2", - "defaultMessage": "This is message 2.2", - "description": "Description for message 2.2", - }, - "test1.ignored2.1": { - "idd": "ignored2.1", /* This will not be extracted. */ - "defaultMessage": "This is message 13", - }, - }; - -let _ = - [@intl] - { - "ignored2.2": { - "id": "ignored2.2", - "defaultMessage": "This message is ignored", - }, - "ignored2.3": { - "id": "ignored2.3", - "defaultMessage": "This message is ignored, too", - }, - }; diff --git a/testData/test1/Test_1_3.re b/testData/test1/subdir/Test_1_3.re similarity index 100% rename from testData/test1/Test_1_3.re rename to testData/test1/subdir/Test_1_3.re diff --git a/testData/test2/Test_2_1.re b/testData/test2/Test_2_1.re deleted file mode 100644 index b5ce3a9..0000000 --- a/testData/test2/Test_2_1.re +++ /dev/null @@ -1,6 +0,0 @@ -let _ = [@intl.messages] { - "test2.msg1.1": { - "id": "test2.msg1.1", - "defaultMessage": "This is message 2.1.1", - }, - }; diff --git a/testData/test4/Test_4_1.res b/testData/test4/Test_4_1.res index bcab62b..011a3fe 100644 --- a/testData/test4/Test_4_1.res +++ b/testData/test4/Test_4_1.res @@ -23,25 +23,6 @@ let theseShouldBeIgnored = () => -let _ = ReactIntl.defineMessages({ - "test4.msg1.6": { - "id": "test4.msg1.6", - "defaultMessage": "This is message 1.6", - }, - "ignored1.3": { - "idd": "test4.msg1.8" /* This will not be extracted. */, - "defaultMessage": "This is message 1.8", - }, -}) - -let _ = defineMessages({ - "test4.msg1.7": { - "id": "test4.msg1.7", - "defaultMessage": "This is message 1.7", - "description": "Description for message 1.7", - }, -}) - module Msg = { open ReactIntl diff --git a/testData/test4/subdir/Test_4_2.res b/testData/test4/subdir/Test_4_2.res deleted file mode 100644 index ddd875e..0000000 --- a/testData/test4/subdir/Test_4_2.res +++ /dev/null @@ -1,30 +0,0 @@ -let _ = - @intl.messages - { - "test4.msg2.1": { - "id": "test4.msg2.1", - "defaultMessage": "This is message 2.1", - }, - "test4.msg2.2": { - "id": "test4.msg2.2", - "defaultMessage": "This is message 2.2", - "description": "Description for message 2.2", - }, - "test4.ignored2.1": { - "idd": "ignored2.1" /* This will not be extracted. */, - "defaultMessage": "This is message 13", - }, - } - -let _ = - @intl - { - "ignored2.2": { - "id": "ignored2.2", - "defaultMessage": "This message is ignored", - }, - "ignored2.3": { - "id": "ignored2.3", - "defaultMessage": "This message is ignored, too", - }, - } diff --git a/testData/test4/Test_4_3.res b/testData/test4/subdir/Test_4_3.res similarity index 100% rename from testData/test4/Test_4_3.res rename to testData/test4/subdir/Test_4_3.res