babel-plugin-formatjs 10.3.23 → 10.3.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/BUILD +90 -0
  2. package/CHANGELOG.md +1139 -0
  3. package/LICENSE.md +0 -0
  4. package/README.md +0 -0
  5. package/global.d.ts +0 -0
  6. package/index.ts +88 -0
  7. package/integration-tests/BUILD +21 -0
  8. package/integration-tests/package.json +5 -0
  9. package/integration-tests/vue/fixtures/App.vue +19 -0
  10. package/integration-tests/vue/fixtures/app.js +6 -0
  11. package/integration-tests/vue/integration.test.ts +62 -0
  12. package/package.json +5 -4
  13. package/tests/__snapshots__/index.test.ts.snap +1246 -0
  14. package/tests/fixtures/2663.js +3 -0
  15. package/tests/fixtures/FormattedMessage.js +14 -0
  16. package/tests/fixtures/additionalComponentNames.js +15 -0
  17. package/tests/fixtures/additionalFunctionNames.js +23 -0
  18. package/tests/fixtures/ast.js +45 -0
  19. package/tests/fixtures/defineMessage.js +57 -0
  20. package/tests/fixtures/defineMessages.js +49 -0
  21. package/tests/fixtures/descriptionsAsObjects.js +18 -0
  22. package/tests/fixtures/empty.js +8 -0
  23. package/tests/fixtures/extractFromFormatMessageCall.js +47 -0
  24. package/tests/fixtures/extractFromFormatMessageCallStateless.js +46 -0
  25. package/tests/fixtures/extractSourceLocation.js +8 -0
  26. package/tests/fixtures/formatMessageCall.js +38 -0
  27. package/tests/fixtures/icuSyntax.js +18 -0
  28. package/tests/fixtures/idInterpolationPattern.js +40 -0
  29. package/tests/fixtures/inline.js +26 -0
  30. package/tests/fixtures/overrideIdFn.js +48 -0
  31. package/tests/fixtures/preserveWhitespace.js +79 -0
  32. package/tests/fixtures/removeDefaultMessage.js +36 -0
  33. package/tests/fixtures/skipExtractionFormattedMessage.js +12 -0
  34. package/tests/fixtures/templateLiteral.js +21 -0
  35. package/tests/index.test.ts +221 -0
  36. package/tsconfig.json +5 -0
  37. package/types.ts +46 -0
  38. package/utils.ts +226 -0
  39. package/visitors/call-expression.ts +208 -0
  40. package/visitors/jsx-opening-element.ts +147 -0
  41. package/index.d.ts +0 -10
  42. package/index.d.ts.map +0 -1
  43. package/index.js +0 -74
  44. package/types.d.ts +0 -31
  45. package/types.d.ts.map +0 -1
  46. package/types.js +0 -2
  47. package/utils.d.ts +0 -34
  48. package/utils.d.ts.map +0 -1
  49. package/utils.js +0 -155
  50. package/visitors/call-expression.d.ts +0 -6
  51. package/visitors/call-expression.d.ts.map +0 -1
  52. package/visitors/call-expression.js +0 -127
  53. package/visitors/jsx-opening-element.d.ts +0 -6
  54. package/visitors/jsx-opening-element.d.ts.map +0 -1
  55. package/visitors/jsx-opening-element.js +0 -89
@@ -0,0 +1,3 @@
1
+ async function error1() {
2
+ await intl.formatMessage({defaultMessage: 'foo', description: 'foo'})
3
+ }
@@ -0,0 +1,14 @@
1
+ import React, {Component} from 'react'
2
+ import {FormattedMessage} from 'react-intl'
3
+
4
+ export default class Foo extends Component {
5
+ render() {
6
+ return (
7
+ <FormattedMessage
8
+ id="foo.bar.baz"
9
+ defaultMessage="Hello World!"
10
+ description="The default message."
11
+ />
12
+ )
13
+ }
14
+ }
@@ -0,0 +1,15 @@
1
+ import React, {Component} from 'react'
2
+
3
+ function CustomMessage() {}
4
+
5
+ export default class Foo extends Component {
6
+ render() {
7
+ return (
8
+ <CustomMessage
9
+ id="greeting-world"
10
+ description="Greeting to the world"
11
+ defaultMessage="Hello World!"
12
+ />
13
+ )
14
+ }
15
+ }
@@ -0,0 +1,23 @@
1
+ // @react-intl project:foo
2
+ import React, {Component} from 'react'
3
+
4
+ function CustomMessage() {}
5
+
6
+ export default class Foo extends Component {
7
+ render() {
8
+ t({
9
+ defaultMessage: 't',
10
+ })
11
+ return (
12
+ <CustomMessage
13
+ id={formatMessage({
14
+ defaultMessage: 'foo',
15
+ })}
16
+ description={$formatMessage({
17
+ defaultMessage: 'foo2',
18
+ })}
19
+ defaultMessage="Hello World!"
20
+ />
21
+ )
22
+ }
23
+ }
@@ -0,0 +1,45 @@
1
+ import React, {Component} from 'react'
2
+ import {FormattedMessage, defineMessage, defineMessages} from 'react-intl'
3
+
4
+ defineMessage({
5
+ id: 'defineMessage',
6
+ defaultMessage: 'this is a {dt, date, full}',
7
+ })
8
+
9
+ defineMessages({
10
+ foo: {
11
+ id: 'defineMessages1',
12
+ defaultMessage: 'this is a {dt, time, full}',
13
+ },
14
+ bar: {
15
+ id: 'defineMessages2',
16
+ defaultMessage: 'this is a {dt, number}',
17
+ },
18
+ baz: {
19
+ id: 'compiled',
20
+ defaultMessage: [{type: 0, value: 'asd'}],
21
+ },
22
+ })
23
+
24
+ export default class Foo extends Component {
25
+ render() {
26
+ Intl.formatMessage({
27
+ id: 'intl.formatMessage',
28
+ defaultMessage: 'foo {s, plural, one{1} other{2}}',
29
+ })
30
+ return (
31
+ <>
32
+ <FormattedMessage
33
+ id="foo.bar.baz"
34
+ defaultMessage="Hello World!"
35
+ description="The default message."
36
+ />
37
+ <FormattedMessage
38
+ id="compiled2"
39
+ defaultMessage={[{type: 0, value: 'compiled comp'}]}
40
+ description="The default message."
41
+ />
42
+ </>
43
+ )
44
+ }
45
+ }
@@ -0,0 +1,57 @@
1
+ // @react-intl project:amazing
2
+ import React, {Component} from 'react'
3
+ import {defineMessage, FormattedMessage} from 'react-intl'
4
+
5
+ const msgs = {
6
+ header: defineMessage({
7
+ id: 'foo.bar.baz',
8
+ defaultMessage: 'Hello World!',
9
+ description: 'The default message',
10
+ }),
11
+ content: defineMessage({
12
+ id: 'foo.bar.biff',
13
+ defaultMessage: 'Hello Nurse!',
14
+ description: 'Another message',
15
+ }),
16
+ kittens: defineMessage({
17
+ id: 'app.home.kittens',
18
+ description: 'Counts kittens',
19
+ defaultMessage: '{count, plural, =0 {😭} one {# kitten} other {# kittens}}',
20
+ }),
21
+ trailingWhitespace: defineMessage({
22
+ id: 'trailing.ws',
23
+ description: 'Whitespace',
24
+ defaultMessage: ' Some whitespace ',
25
+ }),
26
+ escaped: defineMessage({
27
+ id: 'escaped.apostrophe',
28
+ description: 'Escaped apostrophe',
29
+ defaultMessage: "A quoted value ''{value}'",
30
+ }),
31
+ stringKeys: defineMessage({
32
+ // prettier-ignore
33
+ 'id': 'string.key.id',
34
+ // prettier-ignore
35
+ 'description': 'Keys as a string literal',
36
+ // prettier-ignore
37
+ 'defaultMessage': 'This is message',
38
+ }),
39
+ }
40
+
41
+ export default class Foo extends Component {
42
+ render() {
43
+ return (
44
+ <div>
45
+ <h1>
46
+ <FormattedMessage {...msgs.header} />
47
+ </h1>
48
+ <p>
49
+ <FormattedMessage {...msgs.content} />
50
+ </p>
51
+ <p>
52
+ <FormattedMessage {...msgs.kittens} />
53
+ </p>
54
+ </div>
55
+ )
56
+ }
57
+ }
@@ -0,0 +1,49 @@
1
+ // @react-intl project:amazing
2
+ import React, {Component} from 'react'
3
+ import {defineMessages, FormattedMessage} from 'react-intl'
4
+
5
+ const msgs = defineMessages({
6
+ header: {
7
+ id: 'foo.bar.baz',
8
+ defaultMessage: 'Hello World!',
9
+ description: 'The default message',
10
+ },
11
+ content: {
12
+ id: 'foo.bar.biff',
13
+ defaultMessage: 'Hello Nurse!',
14
+ description: 'Another message',
15
+ },
16
+ kittens: {
17
+ id: 'app.home.kittens',
18
+ description: 'Counts kittens',
19
+ defaultMessage: '{count, plural, =0 {😭} one {# kitten} other {# kittens}}',
20
+ },
21
+ trailingWhitespace: {
22
+ id: 'trailing.ws',
23
+ description: 'Whitespace',
24
+ defaultMessage: ' Some whitespace ',
25
+ },
26
+ escaped: {
27
+ id: 'escaped.apostrophe',
28
+ description: 'Escaped apostrophe',
29
+ defaultMessage: "A quoted value ''{value}'",
30
+ },
31
+ })
32
+
33
+ export default class Foo extends Component {
34
+ render() {
35
+ return (
36
+ <div>
37
+ <h1>
38
+ <FormattedMessage {...msgs.header} />
39
+ </h1>
40
+ <p>
41
+ <FormattedMessage {...msgs.content} />
42
+ </p>
43
+ <p>
44
+ <FormattedMessage {...msgs.kittens} />
45
+ </p>
46
+ </div>
47
+ )
48
+ }
49
+ }
@@ -0,0 +1,18 @@
1
+ import React, {Component} from 'react'
2
+ import {FormattedMessage} from 'react-intl'
3
+
4
+ // @react-intl project:amazing2
5
+ export default class Foo extends Component {
6
+ render() {
7
+ return (
8
+ <FormattedMessage
9
+ id="foo.bar.baz"
10
+ defaultMessage="Hello World!"
11
+ description={{
12
+ text: 'Something for the translator.',
13
+ metadata: 'Additional metadata content.',
14
+ }}
15
+ />
16
+ )
17
+ }
18
+ }
@@ -0,0 +1,8 @@
1
+ import React, {Component} from 'react'
2
+ import {defineMessage} from 'react-intl'
3
+
4
+ export default class Foo extends Component {
5
+ render() {
6
+ return <div></div>
7
+ }
8
+ }
@@ -0,0 +1,47 @@
1
+ import {FormattedMessage, injectIntl} from 'react-intl'
2
+ import React, {Component} from 'react'
3
+
4
+ const objectPointer = {
5
+ id: 'foo.bar.invalid',
6
+ defaultMessage: 'This cannot be extracted',
7
+ description: 'the plugin only supports inline objects',
8
+ }
9
+
10
+ class Foo extends Component {
11
+ render() {
12
+ const {intl} = this.props
13
+ const {
14
+ intl: {formatMessage},
15
+ } = this.props
16
+ const msgs = {
17
+ baz: this.props.intl.formatMessage({
18
+ id: 'foo.bar.baz',
19
+ defaultMessage: 'Hello World!',
20
+ description: 'The default message',
21
+ }),
22
+ biff: intl.formatMessage({
23
+ id: 'foo.bar.biff',
24
+ defaultMessage: 'Hello Nurse!',
25
+ description: 'Another message',
26
+ }),
27
+ qux: formatMessage({
28
+ id: 'foo.bar.qux',
29
+ defaultMessage: 'Hello Stranger!',
30
+ description: 'A different message',
31
+ }),
32
+ invalid: this.props.intl.formatMessage(objectPointer),
33
+ }
34
+
35
+ return (
36
+ <div>
37
+ <h1>{msgs.header}</h1>
38
+ <p>{msgs.content}</p>
39
+ <span>
40
+ <FormattedMessage id="foo" defaultMessage="bar" description="baz" />
41
+ </span>
42
+ </div>
43
+ )
44
+ }
45
+ }
46
+
47
+ export default injectIntl(Foo)
@@ -0,0 +1,46 @@
1
+ import {FormattedMessage, injectIntl, useIntl} from 'react-intl'
2
+
3
+ import React from 'react'
4
+
5
+ function myFunction(param1, {formatMessage, formatDate}) {
6
+ return (
7
+ formatMessage({
8
+ id: 'inline1',
9
+ defaultMessage: 'Hello params!',
10
+ description: 'A stateless message',
11
+ }) + formatDate(new Date())
12
+ )
13
+ }
14
+
15
+ const child = myFunction(filterable, intl)
16
+
17
+ function SFC() {
18
+ const {formatMessage} = useIntl()
19
+ return formatMessage({
20
+ id: 'hook',
21
+ defaultMessage: 'hook <b>foo</b>',
22
+ description: 'hook',
23
+ })
24
+ }
25
+
26
+ const Foo = ({intl: {formatMessage}}) => {
27
+ const msgs = {
28
+ qux: formatMessage({
29
+ id: 'foo.bar.quux',
30
+ defaultMessage: 'Hello <b>Stateless!</b>',
31
+ description: 'A stateless message',
32
+ }),
33
+ }
34
+
35
+ return (
36
+ <div>
37
+ <h1>{msgs.header}</h1>
38
+ <p>{msgs.content}</p>
39
+ <span>
40
+ <FormattedMessage id="foo" defaultMessage="bar" description="baz" />
41
+ </span>
42
+ </div>
43
+ )
44
+ }
45
+
46
+ export default injectIntl(Foo)
@@ -0,0 +1,8 @@
1
+ import React, {Component} from 'react'
2
+ import {FormattedMessage} from 'react-intl'
3
+
4
+ export default class Foo extends Component {
5
+ render() {
6
+ return <FormattedMessage id="foo.bar.baz" defaultMessage="Hello World!" />
7
+ }
8
+ }
@@ -0,0 +1,38 @@
1
+ import React, {Component} from 'react'
2
+ import {injectIntl, FormattedMessage} from 'react-intl'
3
+
4
+ const objectPointer = {
5
+ id: 'foo.bar.invalid',
6
+ defaultMessage: 'This cannot be extracted',
7
+ description: 'the plugin only supports inline objects',
8
+ }
9
+
10
+ class Foo extends Component {
11
+ render() {
12
+ const msgs = {
13
+ baz: this.props.intl.formatMessage({
14
+ id: 'foo.bar.baz',
15
+ defaultMessage: 'Hello World!',
16
+ description: 'The default message',
17
+ }),
18
+ biff: this.props.intl.formatMessage({
19
+ id: 'foo.bar.biff',
20
+ defaultMessage: 'Hello Nurse!',
21
+ description: 'Another message',
22
+ }),
23
+ invalid: this.props.intl.formatMessage(objectPointer),
24
+ }
25
+
26
+ return (
27
+ <div>
28
+ <h1>{msgs.header}</h1>
29
+ <p>{msgs.content}</p>
30
+ <span>
31
+ <FormattedMessage id="foo" defaultMessage="bar" description="baz" />
32
+ </span>
33
+ </div>
34
+ )
35
+ }
36
+ }
37
+
38
+ export default injectIntl(Foo)
@@ -0,0 +1,18 @@
1
+ import React, {Component} from 'react'
2
+ import {FormattedMessage} from 'react-intl'
3
+
4
+ export default class Foo extends Component {
5
+ render() {
6
+ // This is bad syntax (object property in message)
7
+ return (
8
+ <FormattedMessage
9
+ id="foo.bar.baz"
10
+ defaultMessage="Hello, {foo.baz}!"
11
+ description="Broken message"
12
+ values={{
13
+ foo: {baz: 'biff'},
14
+ }}
15
+ />
16
+ )
17
+ }
18
+ }
@@ -0,0 +1,40 @@
1
+ import React, {Component} from 'react'
2
+ import {defineMessages, FormattedMessage} from 'react-intl'
3
+
4
+ const msgs = defineMessages({
5
+ header: {
6
+ defaultMessage: 'Hello World!',
7
+ description: 'The default message',
8
+ },
9
+ content: {
10
+ id: 'foo.bar.biff',
11
+ defaultMessage: 'Hello Nurse!',
12
+ description: {
13
+ text: 'Something for the translator.',
14
+ metadata: 'Additional metadata content.',
15
+ },
16
+ },
17
+ })
18
+
19
+ export default class Foo extends Component {
20
+ render() {
21
+ return (
22
+ <div>
23
+ <h1>
24
+ <FormattedMessage {...msgs.header} />
25
+ </h1>
26
+ <p>
27
+ <FormattedMessage {...msgs.content} />
28
+ </p>
29
+ <FormattedMessage
30
+ defaultMessage="Hello World!"
31
+ description="Something for the translator. Another description"
32
+ />
33
+ <FormattedMessage
34
+ defaultMessage="NO ID"
35
+ description="Something for the translator. Another description"
36
+ />
37
+ </div>
38
+ )
39
+ }
40
+ }
@@ -0,0 +1,26 @@
1
+ import React, {Component} from 'react'
2
+ import {FormattedMessage, defineMessage} from 'react-intl'
3
+
4
+ export default class Foo extends Component {
5
+ render() {
6
+ return (
7
+ <div>
8
+ <FormattedMessage
9
+ id="foo.bar.baz"
10
+ defaultMessage="Hello World!"
11
+ description="The default message."
12
+ />
13
+ {defineMessage({
14
+ id: 'header',
15
+ defaultMessage: 'Hello World!',
16
+ description: 'The default message',
17
+ })}
18
+ {defineMessage({
19
+ id: 'header2',
20
+ defaultMessage: 'Hello World!',
21
+ description: 'The default message',
22
+ })}
23
+ </div>
24
+ )
25
+ }
26
+ }
@@ -0,0 +1,48 @@
1
+ import React, {Component} from 'react'
2
+ import {defineMessages, FormattedMessage} from 'react-intl'
3
+
4
+ const msgs = defineMessages({
5
+ header: {
6
+ id: 'foo.bar.baz',
7
+ defaultMessage: 'Hello World!',
8
+ description: 'The default message',
9
+ },
10
+ content: {
11
+ id: 'foo.bar.biff',
12
+ defaultMessage: 'Hello Nurse!',
13
+ description: {
14
+ text: 'Something for the translator.',
15
+ metadata: 'Additional metadata content.',
16
+ },
17
+ },
18
+ })
19
+
20
+ export default class Foo extends Component {
21
+ render() {
22
+ return (
23
+ <div>
24
+ <h1>
25
+ <FormattedMessage {...msgs.header} />
26
+ </h1>
27
+ <p>
28
+ <FormattedMessage {...msgs.content} />
29
+ </p>
30
+ <FormattedMessage
31
+ id="foo.bar.zoo"
32
+ defaultMessage="Hello World!"
33
+ description={{
34
+ text: 'Something for the translator. Another description',
35
+ metadata: 'Additional metadata content.',
36
+ }}
37
+ />
38
+ <FormattedMessage
39
+ defaultMessage="NO ID"
40
+ description={{
41
+ text: 'Something for the translator. Another description',
42
+ metadata: 'Additional metadata content.',
43
+ }}
44
+ />
45
+ </div>
46
+ )
47
+ }
48
+ }
@@ -0,0 +1,79 @@
1
+ // @react-intl project:amazing
2
+ import React, {Component} from 'react'
3
+ import {defineMessages, FormattedMessage} from 'react-intl'
4
+
5
+ const msgs = defineMessages({
6
+ header: {
7
+ id: 'foo.bar.baz',
8
+ defaultMessage: 'Hello World!',
9
+ description: 'The default message',
10
+ },
11
+ content: {
12
+ id: 'foo.bar.biff',
13
+ defaultMessage: 'Hello Nurse!',
14
+ description: 'Another message',
15
+ },
16
+ kittens: {
17
+ id: 'app.home.kittens',
18
+ description: 'Counts kittens',
19
+ defaultMessage: '{count, plural, =0 {😭} one {# kitten} other {# kittens}}',
20
+ },
21
+ trailingWhitespace: {
22
+ id: 'trailing.ws',
23
+ description: 'Whitespace',
24
+ defaultMessage: ' Some whitespace ',
25
+ },
26
+ escaped: {
27
+ id: 'escaped.apostrophe',
28
+ description: 'Escaped apostrophe',
29
+ defaultMessage: "A quoted value ''{value}'",
30
+ },
31
+ newline: {
32
+ id: 'newline',
33
+ description: 'this is \
34
+ a \
35
+ description',
36
+ defaultMessage: 'this is \
37
+ a message',
38
+ },
39
+ linebreak: {
40
+ id: 'linebreak',
41
+ description: 'this is\na\ndescription',
42
+ defaultMessage: 'this is\na message',
43
+ },
44
+ templateLinebreak: {
45
+ id: 'templateLinebreak',
46
+ description: `this is
47
+ a
48
+ description`,
49
+ defaultMessage: `this is
50
+ a message`,
51
+ },
52
+ })
53
+
54
+ export default class Foo extends Component {
55
+ render() {
56
+ return (
57
+ <div>
58
+ <h1>
59
+ <FormattedMessage {...msgs.header} />
60
+ </h1>
61
+ <p>
62
+ <FormattedMessage {...msgs.content} />
63
+ </p>
64
+ <p>
65
+ <FormattedMessage {...msgs.kittens} />
66
+ </p>
67
+ <p>
68
+ <FormattedMessage
69
+ id="inline.linebreak"
70
+ defaultMessage="formatted message
71
+ with linebreak"
72
+ description="foo
73
+ bar"
74
+ />
75
+ </p>
76
+ </div>
77
+ )
78
+ }
79
+ }
@@ -0,0 +1,36 @@
1
+ import React, {Component} from 'react'
2
+ import {defineMessages, FormattedMessage} from 'react-intl'
3
+
4
+ defineMessages({
5
+ foo: {
6
+ id: 'greeting-user',
7
+ description: 'Greeting the user',
8
+ defaultMessage: 'Hello, {name}',
9
+ },
10
+ foo2: {
11
+ description: 'foo2',
12
+ defaultMessage: 'foo2-msg',
13
+ },
14
+ foo3: {
15
+ defaultMessage: 'foo3-msg',
16
+ },
17
+ })
18
+
19
+ export default class Foo extends Component {
20
+ render() {
21
+ return (
22
+ <>
23
+ <FormattedMessage
24
+ id="greeting-world"
25
+ description="Greeting to the world"
26
+ defaultMessage="Hello World!"
27
+ />
28
+ <FormattedMessage
29
+ defaultMessage="message with desc"
30
+ description="desc with desc"
31
+ />
32
+ <FormattedMessage defaultMessage="message only" />
33
+ </>
34
+ )
35
+ }
36
+ }
@@ -0,0 +1,12 @@
1
+ import React, {Component} from 'react'
2
+ import {FormattedMessage} from 'react-intl'
3
+
4
+ function nonStaticId() {
5
+ return 'baz'
6
+ }
7
+
8
+ export default class Foo extends Component {
9
+ render() {
10
+ return <FormattedMessage id={`foo.bar.${nonStaticId()}`} />
11
+ }
12
+ }
@@ -0,0 +1,21 @@
1
+ import React, {Component} from 'react'
2
+ import {FormattedMessage, defineMessage} from 'react-intl'
3
+
4
+ defineMessage({
5
+ id: `template`,
6
+ defaultMessage: `should remove
7
+ newline and
8
+ extra spaces`,
9
+ })
10
+
11
+ export default class Foo extends Component {
12
+ render() {
13
+ return (
14
+ <FormattedMessage
15
+ id="foo.bar.baz"
16
+ defaultMessage={`Hello World!`}
17
+ description="The default message."
18
+ />
19
+ )
20
+ }
21
+ }