@formatjs/ts-transformer 3.9.9 → 3.9.10

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 (62) hide show
  1. package/BUILD +82 -0
  2. package/CHANGELOG.md +713 -0
  3. package/LICENSE.md +0 -0
  4. package/README.md +0 -0
  5. package/examples/compile.ts +50 -0
  6. package/index.ts +3 -0
  7. package/integration-tests/BUILD +37 -0
  8. package/integration-tests/integration/comp.tsx +40 -0
  9. package/integration-tests/integration/jest.config.js +25 -0
  10. package/integration-tests/integration/ts-jest.test.tsx +32 -0
  11. package/integration-tests/package.json +5 -0
  12. package/integration-tests/vue/fixtures/index.vue +30 -0
  13. package/integration-tests/vue/fixtures/main.ts +4 -0
  14. package/integration-tests/vue/integration.test.ts +75 -0
  15. package/package.json +3 -3
  16. package/src/console_utils.ts +32 -0
  17. package/src/interpolate-name.ts +147 -0
  18. package/src/transform.ts +764 -0
  19. package/src/types.ts +12 -0
  20. package/tests/__snapshots__/index.test.ts.snap +908 -0
  21. package/tests/fixtures/FormattedMessage.tsx +35 -0
  22. package/tests/fixtures/additionalComponentNames.tsx +16 -0
  23. package/tests/fixtures/additionalFunctionNames.tsx +20 -0
  24. package/tests/fixtures/ast.tsx +83 -0
  25. package/tests/fixtures/defineMessages.tsx +67 -0
  26. package/tests/fixtures/defineMessagesPreserveWhitespace.tsx +87 -0
  27. package/tests/fixtures/descriptionsAsObjects.tsx +17 -0
  28. package/tests/fixtures/extractFromFormatMessage.tsx +45 -0
  29. package/tests/fixtures/extractFromFormatMessageStateless.tsx +46 -0
  30. package/tests/fixtures/extractSourceLocation.tsx +8 -0
  31. package/tests/fixtures/formatMessageCall.tsx +44 -0
  32. package/tests/fixtures/inline.tsx +26 -0
  33. package/tests/fixtures/nested.tsx +10 -0
  34. package/tests/fixtures/noImport.tsx +52 -0
  35. package/tests/fixtures/overrideIdFn.tsx +70 -0
  36. package/tests/fixtures/removeDefaultMessage.tsx +22 -0
  37. package/tests/fixtures/removeDescription.tsx +22 -0
  38. package/tests/fixtures/resourcePath.tsx +23 -0
  39. package/tests/fixtures/stringConcat.tsx +26 -0
  40. package/tests/fixtures/templateLiteral.tsx +21 -0
  41. package/tests/index.test.ts +127 -0
  42. package/tests/interpolate-name.test.ts +14 -0
  43. package/ts-jest-integration.ts +9 -0
  44. package/tsconfig.json +5 -0
  45. package/index.d.ts +0 -4
  46. package/index.d.ts.map +0 -1
  47. package/index.js +0 -6
  48. package/src/console_utils.d.ts +0 -4
  49. package/src/console_utils.d.ts.map +0 -1
  50. package/src/console_utils.js +0 -49
  51. package/src/interpolate-name.d.ts +0 -15
  52. package/src/interpolate-name.d.ts.map +0 -1
  53. package/src/interpolate-name.js +0 -95
  54. package/src/transform.d.ts +0 -78
  55. package/src/transform.d.ts.map +0 -1
  56. package/src/transform.js +0 -483
  57. package/src/types.d.ts +0 -12
  58. package/src/types.d.ts.map +0 -1
  59. package/src/types.js +0 -2
  60. package/ts-jest-integration.d.ts +0 -6
  61. package/ts-jest-integration.d.ts.map +0 -1
  62. package/ts-jest-integration.js +0 -10
@@ -0,0 +1,35 @@
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
+ <p>
8
+ <FormattedMessage
9
+ id="foo.bar.baz"
10
+ defaultMessage="Hello World! {foo, number}"
11
+ description="The default message."
12
+ values={{
13
+ foo: 1,
14
+ }}
15
+ />
16
+ <FormattedMessage
17
+ id="foo.bar.baz"
18
+ defaultMessage={`Hello World! {foo, number}`}
19
+ description="The default message."
20
+ values={{
21
+ foo: 1,
22
+ }}
23
+ />
24
+ <FormattedMessage
25
+ id="foo.bar.baz"
26
+ defaultMessage={'Hello World! {foo, number}'}
27
+ description="The default message."
28
+ values={{
29
+ foo: 1,
30
+ }}
31
+ />
32
+ </p>
33
+ )
34
+ }
35
+ }
@@ -0,0 +1,16 @@
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
+ return (
9
+ <CustomMessage
10
+ id="greeting-world"
11
+ description="Greeting to the world"
12
+ defaultMessage="Hello World!"
13
+ />
14
+ )
15
+ }
16
+ }
@@ -0,0 +1,20 @@
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
+ return (
9
+ <CustomMessage
10
+ id={formatMessage({
11
+ defaultMessage: 'foo',
12
+ })}
13
+ description={$formatMessage({
14
+ defaultMessage: 'foo',
15
+ })}
16
+ defaultMessage="Hello World!"
17
+ />
18
+ )
19
+ }
20
+ }
@@ -0,0 +1,83 @@
1
+ import React, {Component} from 'react'
2
+ import {defineMessages, FormattedMessage, defineMessage} 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
+ defineMessage({
21
+ defaultMessage: 'defineMessage',
22
+ description: 'foo',
23
+ })
24
+
25
+ export default class Foo extends Component {
26
+ render() {
27
+ const {intl} = this.props
28
+ const {formatMessage} = intl
29
+ this.props.intl.formatMessage({
30
+ defaultMessage: 'no-id',
31
+ description: 'no-id',
32
+ })
33
+ intl.formatMessage({
34
+ defaultMessage: 'intl.formatMessage',
35
+ description: 'no-id',
36
+ })
37
+ formatMessage({
38
+ defaultMessage: 'formatMessage',
39
+ description: 'no-id',
40
+ })
41
+ formatMessage({
42
+ defaultMessage: '{count, plural, =0 {zero} other{other}}',
43
+ description: 'no-id',
44
+ })
45
+
46
+ return (
47
+ <div>
48
+ <h1>
49
+ <FormattedMessage {...msgs.header} />
50
+ </h1>
51
+ <p>
52
+ <FormattedMessage {...msgs.content} />
53
+ </p>
54
+ <FormattedMessage
55
+ id="foo.bar.zoo"
56
+ defaultMessage="Hello World! {abc}"
57
+ description={{
58
+ text: 'Something for the translator. Another description',
59
+ metadata: 'Additional metadata content.',
60
+ }}
61
+ values={{abc: 2}}
62
+ />
63
+ <FormattedMessage
64
+ defaultMessage="Hello World! {abc}"
65
+ description={{
66
+ text: 'Something for the translator. Another description',
67
+ metadata: 'Additional metadata content.',
68
+ }}
69
+ values={{abc: 2}}
70
+ />
71
+
72
+ <FormattedMessage
73
+ defaultMessage="{value, number}"
74
+ description={{
75
+ text: 'number',
76
+ metadata: 'number',
77
+ }}
78
+ values={{abc: 2}}
79
+ />
80
+ </div>
81
+ )
82
+ }
83
+ }
@@ -0,0 +1,67 @@
1
+ // @react-intl project:foo file:bar
2
+ import React, {Component} from 'react'
3
+ import {defineMessages, FormattedMessage, defineMessage} 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
+ quoted: {
32
+ id: 'escaped.apostrophe',
33
+ description: 'Escaped apostrophe',
34
+ defaultMessage: "What's going on",
35
+ },
36
+ newline: {
37
+ id: 'newline',
38
+ description: 'this is \
39
+ a \
40
+ description',
41
+ defaultMessage: 'this is \
42
+ a message',
43
+ },
44
+ } as const)
45
+
46
+ export default class Foo extends Component {
47
+ render() {
48
+ return (
49
+ <div>
50
+ <h1>
51
+ <FormattedMessage {...msgs.header} />
52
+ </h1>
53
+ <p>
54
+ <FormattedMessage {...msgs.content} />
55
+ </p>
56
+ <p>
57
+ <FormattedMessage {...msgs.kittens} />
58
+ <FormattedMessage
59
+ id="inline"
60
+ defaultMessage="formatted message"
61
+ description="foo"
62
+ />
63
+ </p>
64
+ </div>
65
+ )
66
+ }
67
+ }
@@ -0,0 +1,87 @@
1
+ // @react-intl project:foo file:bar
2
+ import React, {Component} from 'react'
3
+ import {defineMessages, FormattedMessage, defineMessage} 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
+ quoted: {
32
+ id: 'escaped.apostrophe',
33
+ description: 'Escaped apostrophe',
34
+ defaultMessage: "What's going on",
35
+ },
36
+ newline: {
37
+ id: 'newline',
38
+ description: 'this is \
39
+ a \
40
+ description',
41
+ defaultMessage: 'this is \
42
+ a message',
43
+ },
44
+ linebreak: {
45
+ id: 'linebreak',
46
+ description: 'this is\na\ndescription',
47
+ defaultMessage: 'this is\na message',
48
+ },
49
+ templateLinebreak: {
50
+ id: 'templateLinebreak',
51
+ description: `this is
52
+ a
53
+ description`,
54
+ defaultMessage: `this is
55
+ a message`,
56
+ },
57
+ } as const)
58
+
59
+ export default class Foo extends Component {
60
+ render() {
61
+ return (
62
+ <div>
63
+ <h1>
64
+ <FormattedMessage {...msgs.header} />
65
+ </h1>
66
+ <p>
67
+ <FormattedMessage {...msgs.content} />
68
+ </p>
69
+ <p>
70
+ <FormattedMessage {...msgs.kittens} />
71
+ <FormattedMessage
72
+ id="inline"
73
+ defaultMessage="formatted message"
74
+ description="foo"
75
+ />
76
+ <FormattedMessage
77
+ id="inline.linebreak"
78
+ defaultMessage="formatted message
79
+ with linebreak"
80
+ description="foo
81
+ bar"
82
+ />
83
+ </p>
84
+ </div>
85
+ )
86
+ }
87
+ }
@@ -0,0 +1,17 @@
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={{
11
+ text: 'Something for the translator.',
12
+ metadata: 'Additional metadata content.',
13
+ }}
14
+ />
15
+ )
16
+ }
17
+ }
@@ -0,0 +1,45 @@
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 {intl} = this.props
13
+ const msgs = {
14
+ baz: this.props.intl.formatMessage({
15
+ id: 'foo.bar.baz',
16
+ defaultMessage: 'Hello World!',
17
+ description: 'The default message',
18
+ }),
19
+ biff: intl.formatMessage({
20
+ id: 'foo.bar.biff',
21
+ defaultMessage: 'Hello Nurse!',
22
+ description: 'Another message',
23
+ }),
24
+ invalid: this.props.intl.formatMessage(objectPointer),
25
+ invalid2: this.props.intl.formatMessage({
26
+ id,
27
+ defaultMessage,
28
+ description: 'asd',
29
+ }),
30
+ }
31
+
32
+ return (
33
+ <div>
34
+ <h1>{msgs.header}</h1>
35
+ <p>{msgs.content}</p>
36
+ <input placeholder={intl.formatMessage({defaultMessage: 'inline'})} />
37
+ <span>
38
+ <FormattedMessage id="foo" defaultMessage="bar" description="baz" />
39
+ </span>
40
+ </div>
41
+ )
42
+ }
43
+ }
44
+
45
+ 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',
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 Stateless!',
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,44 @@
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: formatMessage({
14
+ id: 'foo.bar.baz',
15
+ defaultMessage: 'Hello World!',
16
+ description: 'The default message',
17
+ }),
18
+ baz2: this.props.intl.$formatMessage({
19
+ id: 'foo.bar.baz2',
20
+ defaultMessage: 'Hello World!',
21
+ description: 'The default message $$$',
22
+ }),
23
+ biff: $formatMessage({
24
+ id: 'foo.bar.biff',
25
+ defaultMessage: 'Hello Nurse!',
26
+ description: 'Another message',
27
+ }),
28
+ invalid: this.props.intl.formatMessage(objectPointer),
29
+ }
30
+
31
+ return (
32
+ <div>
33
+ <h1>{msgs.header}</h1>
34
+ <p>{msgs.content}</p>
35
+ <input placeholder={intl.formatMessage({defaultMessage: 'inline'})} />
36
+ <span>
37
+ <FormattedMessage id="foo" defaultMessage="bar" description="baz" />
38
+ </span>
39
+ </div>
40
+ )
41
+ }
42
+ }
43
+
44
+ export default injectIntl(Foo)
@@ -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,10 @@
1
+ intl.formatMessage(
2
+ {
3
+ defaultMessage: 'layer1 {name}',
4
+ },
5
+ {
6
+ name: intl.formatMessage({
7
+ defaultMessage: 'layer2',
8
+ }),
9
+ }
10
+ )
@@ -0,0 +1,52 @@
1
+ export function foo() {
2
+ props.intl.formatMessage(
3
+ {
4
+ defaultMessage: 'props {intl}',
5
+ description: 'bar',
6
+ },
7
+ {bar: 'bar'}
8
+ )
9
+ this.props.intl.formatMessage(
10
+ {
11
+ defaultMessage: 'this props {intl}',
12
+ description: 'bar',
13
+ },
14
+ {bar: 'bar'}
15
+ )
16
+ this.props.intl.formatMessage(
17
+ {
18
+ defaultMessage: 'this props {intl}',
19
+ description: {
20
+ obj1: 1,
21
+ obj2: '123',
22
+ },
23
+ },
24
+ {bar: 'bar'}
25
+ )
26
+ this.props.intl.formatMessage(
27
+ {
28
+ defaultMessage: 'this props {intl}',
29
+ description: {
30
+ obj2: '123',
31
+ obj1: 1,
32
+ },
33
+ },
34
+ {bar: 'bar'}
35
+ )
36
+ this.props.intl.formatMessage(
37
+ {
38
+ defaultMessage: 'this props {intl}',
39
+ description: {
40
+ obj2: '123',
41
+ },
42
+ },
43
+ {bar: 'bar'}
44
+ )
45
+ return intl.formatMessage(
46
+ {
47
+ defaultMessage: 'foo {bar}',
48
+ description: 'bar',
49
+ },
50
+ {bar: 'bar'}
51
+ )
52
+ }
@@ -0,0 +1,70 @@
1
+ import React, {Component} from 'react'
2
+ import {defineMessages, FormattedMessage, defineMessage} 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
+ defineMessage({
21
+ defaultMessage: 'defineMessage',
22
+ description: 'foo',
23
+ })
24
+
25
+ export default class Foo extends Component {
26
+ render() {
27
+ const {intl} = this.props
28
+ const {formatMessage} = intl
29
+ this.props.intl.formatMessage({
30
+ defaultMessage: 'no-id',
31
+ description: 'no-id',
32
+ })
33
+ intl.formatMessage({
34
+ defaultMessage: 'intl.formatMessage',
35
+ description: 'no-id',
36
+ })
37
+ formatMessage({
38
+ defaultMessage: 'formatMessage',
39
+ description: 'no-id',
40
+ })
41
+
42
+ return (
43
+ <div>
44
+ <h1>
45
+ <FormattedMessage {...msgs.header} />
46
+ </h1>
47
+ <p>
48
+ <FormattedMessage {...msgs.content} />
49
+ </p>
50
+ <FormattedMessage
51
+ id="foo.bar.zoo"
52
+ defaultMessage="Hello World! {abc}"
53
+ description={{
54
+ text: 'Something for the translator. Another description',
55
+ metadata: 'Additional metadata content.',
56
+ }}
57
+ values={{abc: 2}}
58
+ />
59
+ <FormattedMessage
60
+ defaultMessage="Hello World! {abc}"
61
+ description={{
62
+ text: 'Something for the translator. Another description',
63
+ metadata: 'Additional metadata content.',
64
+ }}
65
+ values={{abc: 2}}
66
+ />
67
+ </div>
68
+ )
69
+ }
70
+ }
@@ -0,0 +1,22 @@
1
+ import React, {Component} from 'react'
2
+ import {defineMessages, FormattedMessage} from 'react-intl'
3
+
4
+ const messages = defineMessages({
5
+ foo: {
6
+ id: 'greeting-user',
7
+ description: 'Greeting the user',
8
+ defaultMessage: 'Hello, {name}',
9
+ },
10
+ })
11
+
12
+ export default class Foo extends Component {
13
+ render() {
14
+ return (
15
+ <FormattedMessage
16
+ id="greeting-world"
17
+ description="Greeting to the world"
18
+ defaultMessage="Hello World!"
19
+ />
20
+ )
21
+ }
22
+ }
@@ -0,0 +1,22 @@
1
+ import React, {Component} from 'react'
2
+ import {defineMessages, FormattedMessage} from 'react-intl'
3
+
4
+ const messages = defineMessages({
5
+ foo: {
6
+ id: 'greeting-user',
7
+ description: 'Greeting the user',
8
+ defaultMessage: 'Hello, {name}',
9
+ },
10
+ })
11
+
12
+ export default class Foo extends Component {
13
+ render() {
14
+ return (
15
+ <FormattedMessage
16
+ id="greeting-world"
17
+ description="Greeting to the world"
18
+ defaultMessage="Hello World!"
19
+ />
20
+ )
21
+ }
22
+ }