Skip to content

Commit c4e6728

Browse files
authored
Intl PPX support (#77)
* Add intl ppx support * Bump version * Add ppx usage warning
1 parent de26ab3 commit c4e6728

File tree

9 files changed

+176
-2
lines changed

9 files changed

+176
-2
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## 0.12.0 - 2021-05-24
4+
- [bs-react-intl-ppx](https://github.com/ahrefs/bs-react-intl-ppx) support added
5+
36
## 0.11.0 - 2021-05-17
47

58
- Repo renamed to `rescript-react-intl-extractor` and moved to the cca-io organization.

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ You also can pass descriptions to the records with:
122122
let foo = [@intl.description "Hello description"] {id: "message.hello", defaultMessage: "Hello"};
123123
```
124124

125+
3. within [intl-ppx](https://github.com/ahrefs/bs-react-intl-ppx)
126+
[ReScript team recommends not to use PPXes](https://forum.rescript-lang.org/t/some-thoughts-on-community-building/1474/25)
127+
128+
```reason
129+
let hello = [%intl "hello"]
130+
let world = [%intl {msg: "world", desc: "Some description"}]
131+
```
132+
125133
## Building and Testing
126134

127135
The ReScript parser is included as a git submodule. Therefore, after checking out the sources, first run
@@ -151,6 +159,7 @@ Run the tests:
151159
[rescript]: https://rescript-lang.org/
152160
[reason]: https://reasonml.github.io
153161
[rescript-react-intl]: https://github.com/cca-io/rescript-react-intl
162+
[bs-react-intl-ppx]: https://github.com/ahrefs/bs-react-intl-ppx
154163
[react-intl]: https://github.com/yahoo/react-intl
155164
[releases page]: https://github.com/cca-io/rescript-react-intl-extractor/releases
156165
[esy]: https://esy.sh

bin/Version.re

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
// *** GENERATED BY "yarn setVersion" ***
22

3-
let version = "0.11.0 (ReScript bd995ff)";
3+
let version = "0.12.0 (ReScript bd995ff)";

lib/ExtractionIterator.re

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,44 @@ let extractMessageFromRecord = (~description=?, callback, fields) => {
3838
Message.fromStringMap(~description?, map) |> Option.iter(callback);
3939
};
4040

41+
let extractMessageFromExtension = (callback, item) => {
42+
// TODO share this function with intl ppx
43+
let makeId = (~description="", message) => message ++ "|" ++ description |> Digest.string |> Digest.to_hex;
44+
45+
switch (item) {
46+
| PStr([{pstr_desc: Pstr_eval({pexp_desc: Pexp_constant(Pconst_string(defaultMessage, _)), _}, _), _}]) =>
47+
let id = defaultMessage |> makeId;
48+
callback(Message.{id, defaultMessage, description: None});
49+
| PStr([
50+
{
51+
pstr_desc:
52+
Pstr_eval(
53+
{
54+
pexp_desc:
55+
Pexp_record(
56+
[
57+
({txt: Lident("msg"), _}, {pexp_desc: Pexp_constant(Pconst_string(defaultMessage, _)), _}),
58+
({txt: Lident("desc"), _}, {pexp_desc: Pexp_constant(Pconst_string(description, _)), _}),
59+
] |
60+
[
61+
({txt: Lident("desc"), _}, {pexp_desc: Pexp_constant(Pconst_string(description, _)), _}),
62+
({txt: Lident("msg"), _}, {pexp_desc: Pexp_constant(Pconst_string(defaultMessage, _)), _}),
63+
],
64+
None,
65+
),
66+
_,
67+
},
68+
_,
69+
),
70+
_,
71+
},
72+
]) =>
73+
let id = defaultMessage |> makeId(~description);
74+
callback(Message.{id, defaultMessage, description: Some(description)});
75+
| _ => ()
76+
};
77+
};
78+
4179
let hasIntlAttribute = (items: structure) =>
4280
items
4381
|> List.exists(item =>
@@ -111,6 +149,18 @@ let getIterator = callback => {
111149
| {pexp_desc: Pexp_apply({pexp_desc: Pexp_ident({txt, _})}, labels)} when matchesFormattedMessage(txt) =>
112150
extractMessageFromLabels(callback, labels)
113151

152+
// Match [%intl "message"]
153+
// [%intl.s "message"]
154+
// [%intl.el "message"]
155+
// [%intl {msg: "message", desc: "description}]
156+
// [%intl.s {msg: "message", desc: "description}]
157+
// [%intl.el {msg: "message", desc: "description}]
158+
// [%intl {desc: "description", msg: "message"}]
159+
// [%intl.s {desc: "description", msg: "message"}]
160+
// [%intl.el { desc: "description", msg: "message"}]
161+
| {pexp_desc: Pexp_extension(({txt: "intl" | "intl.s" | "intl.el"}, item)), _} =>
162+
extractMessageFromExtension(callback, item)
163+
114164
| _ => ()
115165
};
116166

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "rescript-react-intl-extractor",
3-
"version": "0.11.0",
3+
"version": "0.12.0",
44
"description": "Message extractor for rescript-react-intl",
55
"author": "Christoph Knittel <[email protected]>",
66
"license": "MIT",
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
IntlPpx › full
2+
[
3+
{
4+
\"id\": \"07ef8ec9f2dd894c45b447292d527f4a\",
5+
\"defaultMessage\": \"This is message 5.2.2\"
6+
},
7+
{
8+
\"id\": \"09644115fd7f4e0803e5300442acaa3f\",
9+
\"defaultMessage\": \"This is message 5.2.9\",
10+
\"description\": \"This is description for message 5.2.9\"
11+
},
12+
{
13+
\"id\": \"50c182276f426aaed9bb73e932749c12\",
14+
\"defaultMessage\": \"This is message 5.1.1\"
15+
},
16+
{
17+
\"id\": \"517ecc8330114017ce1fa3358b0e19fb\",
18+
\"defaultMessage\": \"This is message 5.2.7\",
19+
\"description\": \"This is description for message 5.2.7\"
20+
},
21+
{
22+
\"id\": \"617b406e8ce2d6117eb79e480b7db916\",
23+
\"defaultMessage\": \"This is message 5.1.6\",
24+
\"description\": \"This is description for message 5.1.6\"
25+
},
26+
{
27+
\"id\": \"705ebca03144cedde0772b42454db9bc\",
28+
\"defaultMessage\": \"This is message 5.1.2\"
29+
},
30+
{
31+
\"id\": \"82d39a35baed93572eb9d3e2f31d9549\",
32+
\"defaultMessage\": \"This is message 5.1.7\",
33+
\"description\": \"This is description for message 5.1.7\"
34+
},
35+
{
36+
\"id\": \"9bd72b86b4707b49e954679611f24389\",
37+
\"defaultMessage\": \"This is message 5.1.9\",
38+
\"description\": \"This is description for message 5.1.9\"
39+
},
40+
{
41+
\"id\": \"aa90db9568631794111be2c0dbf3f290\",
42+
\"defaultMessage\": \"This is message 5.2.4\",
43+
\"description\": \"This is description for message 5.2.4\"
44+
},
45+
{
46+
\"id\": \"b5efe6bdb050410f0182c3e2b74b7add\",
47+
\"defaultMessage\": \"This is message 5.2.5\",
48+
\"description\": \"This is description for message 5.2.5\"
49+
},
50+
{
51+
\"id\": \"bbd2f42ed446c470db8326dd1ea169fe\",
52+
\"defaultMessage\": \"This is message 5.2.1\"
53+
},
54+
{
55+
\"id\": \"c26daf229e5a13904d33004e1e48fa87\",
56+
\"defaultMessage\": \"This is message 5.2.3\"
57+
},
58+
{
59+
\"id\": \"d48a62aec72f3b16408aacff820de2de\",
60+
\"defaultMessage\": \"This is message 5.1.3\"
61+
},
62+
{
63+
\"id\": \"da572261a2f0bc6550f8701e35aa0d13\",
64+
\"defaultMessage\": \"This is message 5.2.6\",
65+
\"description\": \"This is description for message 5.2.6\"
66+
},
67+
{
68+
\"id\": \"dec09d01d1cf004612cef6f2dc4c81e3\",
69+
\"defaultMessage\": \"This is message 5.1.4\",
70+
\"description\": \"This is description for message 5.1.4\"
71+
},
72+
{
73+
\"id\": \"deeb9aaca5b6be205f113483625b19e2\",
74+
\"defaultMessage\": \"This is message 5.1.8\",
75+
\"description\": \"This is description for message 5.1.8\"
76+
},
77+
{
78+
\"id\": \"e4a34c50454eec2a66088d7a5e7f00d5\",
79+
\"defaultMessage\": \"This is message 5.2.8\",
80+
\"description\": \"This is description for message 5.2.8\"
81+
},
82+
{
83+
\"id\": \"fc63eab6a84654a8a5d05d83f165db1e\",
84+
\"defaultMessage\": \"This is message 5.1.5\",
85+
\"description\": \"This is description for message 5.1.5\"
86+
}
87+
]

test/lib/Tests.re

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,10 @@ describe("ReScript", ({test}) => {
6060
expect.string(json).toMatchSnapshot();
6161
})
6262
});
63+
64+
describe("IntlPpx", ({test}) => {
65+
test("full", ({expect}) => {
66+
let json = extractAndGetJson(["testData/test5"]);
67+
expect.string(json).toMatchSnapshot();
68+
})
69+
});

testData/test5/Test_5_1.re

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
let msg51 = [%intl "This is message 5.1.1"]
2+
let msg52 = [%intl.s "This is message 5.1.2"]
3+
let msg53 = [%intl.el "This is message 5.1.3"]
4+
let msg54 = [%intl {msg: "This is message 5.1.4", desc: "This is description for message 5.1.4"}]
5+
let msg55 = [%intl.s {msg: "This is message 5.1.5", desc: "This is description for message 5.1.5"}]
6+
let msg56 = [%intl.el {msg: "This is message 5.1.6", desc: "This is description for message 5.1.6"}]
7+
let msg57 = [%intl {desc: "This is description for message 5.1.7", msg: "This is message 5.1.7"}]
8+
let msg58 = [%intl.s {desc: "This is description for message 5.1.8", msg: "This is message 5.1.8"}]
9+
let msg59 = [%intl.el {desc: "This is description for message 5.1.9", msg: "This is message 5.1.9"}]

testData/test5/Test_5_2.res

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
let msg51 = %intl("This is message 5.2.1")
2+
let msg52 = %intl.s("This is message 5.2.2")
3+
let msg53 = %intl.el("This is message 5.2.3")
4+
let msg54 = %intl({msg: "This is message 5.2.4", desc: "This is description for message 5.2.4"})
5+
let msg55 = %intl.s({msg: "This is message 5.2.5", desc: "This is description for message 5.2.5"})
6+
let msg56 = %intl.el({msg: "This is message 5.2.6", desc: "This is description for message 5.2.6"})
7+
let msg57 = %intl({desc: "This is description for message 5.2.7", msg: "This is message 5.2.7"})
8+
let msg58 = %intl.s({desc: "This is description for message 5.2.8", msg: "This is message 5.2.8"})
9+
let msg59 = %intl.el({desc: "This is description for message 5.2.9", msg: "This is message 5.2.9"})

0 commit comments

Comments
 (0)