Skip to content

Commit d61e0cf

Browse files
ZtarboxJohannes Kann
andauthored
fix(typescript): fix react-native support #465 (#488)
Co-authored-by: Johannes Kann <[email protected]>
1 parent 0eb8085 commit d61e0cf

File tree

5 files changed

+180
-15
lines changed

5 files changed

+180
-15
lines changed

packages/babel-plugin-transform-svg-component/src/__snapshots__/index.test.js.snap

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,17 @@ export default \\"logo.svg\\";
7676
export { SvgComponent as Component };"
7777
`;
7878
79+
exports[`plugin javascript with "native" and "expandProps" option adds import from "react-native-svg" and adds props 1`] = `
80+
"import * as React from \\"react\\";
81+
import Svg from \\"react-native-svg\\";
82+
83+
function SvgComponent(props) {
84+
return <Svg><g /></Svg>;
85+
}
86+
87+
export default SvgComponent;"
88+
`;
89+
7990
exports[`plugin javascript with "native" option adds import from "react-native-svg" 1`] = `
8091
"import * as React from \\"react\\";
8192
import Svg from \\"react-native-svg\\";
@@ -87,6 +98,30 @@ function SvgComponent() {
8798
export default SvgComponent;"
8899
`;
89100
101+
exports[`plugin javascript with "native", "ref" and "expandProps" option adds import from "react-native-svg" and adds props and adds ForwardRef component 1`] = `
102+
"import * as React from \\"react\\";
103+
import Svg from \\"react-native-svg\\";
104+
105+
function SvgComponent(props, svgRef) {
106+
return <Svg><g /></Svg>;
107+
}
108+
109+
const ForwardRef = React.forwardRef(SvgComponent);
110+
export default ForwardRef;"
111+
`;
112+
113+
exports[`plugin javascript with "native", "ref" option adds import from "react-native-svg" and adds ForwardRef component 1`] = `
114+
"import * as React from \\"react\\";
115+
import Svg from \\"react-native-svg\\";
116+
117+
function SvgComponent(props, svgRef) {
118+
return <Svg><g /></Svg>;
119+
}
120+
121+
const ForwardRef = React.forwardRef(SvgComponent);
122+
export default ForwardRef;"
123+
`;
124+
90125
exports[`plugin javascript with "native.expo" option adds import from "react-native-svg" & from "expo" 1`] = `
91126
"import * as React from \\"react\\";
92127
import \\"expo\\";
@@ -219,6 +254,17 @@ export default \\"logo.svg\\";
219254
export { SvgComponent as Component };"
220255
`;
221256
257+
exports[`plugin typescript with "native" and "expandProps" option adds import from "react-native-svg" and adds props 1`] = `
258+
"import * as React from \\"react\\";
259+
import Svg, { SvgProps } from \\"react-native-svg\\";
260+
261+
function SvgComponent(props: SvgProps) {
262+
return <Svg><g /></Svg>;
263+
}
264+
265+
export default SvgComponent;"
266+
`;
267+
222268
exports[`plugin typescript with "native" option adds import from "react-native-svg" 1`] = `
223269
"import * as React from \\"react\\";
224270
import Svg from \\"react-native-svg\\";
@@ -230,6 +276,30 @@ function SvgComponent() {
230276
export default SvgComponent;"
231277
`;
232278
279+
exports[`plugin typescript with "native", "ref" and "expandProps" option adds import from "react-native-svg" and adds props and adds ForwardRef component 1`] = `
280+
"import * as React from \\"react\\";
281+
import Svg, { SvgProps } from \\"react-native-svg\\";
282+
283+
function SvgComponent(props: SvgProps, svgRef?: React.Ref<React.Component<SvgProps>>) {
284+
return <Svg><g /></Svg>;
285+
}
286+
287+
const ForwardRef = React.forwardRef(SvgComponent);
288+
export default ForwardRef;"
289+
`;
290+
291+
exports[`plugin typescript with "native", "ref" option adds import from "react-native-svg" and adds ForwardRef component 1`] = `
292+
"import * as React from \\"react\\";
293+
import Svg from \\"react-native-svg\\";
294+
295+
function SvgComponent(props: {}, svgRef?: React.Ref<React.Component<SvgProps>>) {
296+
return <Svg><g /></Svg>;
297+
}
298+
299+
const ForwardRef = React.forwardRef(SvgComponent);
300+
export default ForwardRef;"
301+
`;
302+
233303
exports[`plugin typescript with "native.expo" option adds import from "react-native-svg" & from "expo" 1`] = `
234304
"import * as React from \\"react\\";
235305
import \\"expo\\";

packages/babel-plugin-transform-svg-component/src/index.test.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,40 @@ describe('plugin', () => {
9494
})
9595
})
9696

97+
describe('with "native", "ref" option', () => {
98+
it('adds import from "react-native-svg" and adds ForwardRef component', () => {
99+
const { code } = testPlugin(language)('<Svg><g /></Svg>', {
100+
state: { componentName: 'SvgComponent' },
101+
native: true,
102+
ref: true,
103+
})
104+
expect(code).toMatchSnapshot()
105+
})
106+
})
107+
108+
describe('with "native" and "expandProps" option', () => {
109+
it('adds import from "react-native-svg" and adds props', () => {
110+
const { code } = testPlugin(language)('<Svg><g /></Svg>', {
111+
state: { componentName: 'SvgComponent' },
112+
native: true,
113+
expandProps: true,
114+
})
115+
expect(code).toMatchSnapshot()
116+
})
117+
})
118+
119+
describe('with "native", "ref" and "expandProps" option', () => {
120+
it('adds import from "react-native-svg" and adds props and adds ForwardRef component', () => {
121+
const { code } = testPlugin(language)('<Svg><g /></Svg>', {
122+
state: { componentName: 'SvgComponent' },
123+
native: true,
124+
expandProps: true,
125+
ref: true,
126+
})
127+
expect(code).toMatchSnapshot()
128+
})
129+
})
130+
97131
describe('with "memo" option', () => {
98132
it('wrap component in "React.memo"', () => {
99133
const { code } = testPlugin(language)('<svg><g /></svg>', {

packages/babel-plugin-transform-svg-component/src/util.js

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ function addTypeAnotation(obj, typeAnnotation, opts) {
6262
return { ...obj, typeAnnotation }
6363
}
6464

65-
function getSvgPropsTypeAnnotation(t) {
65+
function getSvgPropsTypeAnnotation(t, opts) {
66+
if (opts.native) {
67+
return t.genericTypeAnnotation(t.identifier('SvgProps'))
68+
}
6669
return genericTypeAnnotation(
6770
qualifiedTypeIdentifier(t.identifier('React'), t.identifier('SVGProps')),
6871
typeParameters([genericTypeAnnotation(t.identifier('SVGSVGElement'))]),
@@ -104,13 +107,13 @@ export const getProps = ({ types: t }, opts) => {
104107

105108
if (opts.expandProps) {
106109
propsTypeAnnotation = intersectionTypeAnnotation([
107-
getSvgPropsTypeAnnotation(t),
110+
getSvgPropsTypeAnnotation(t, opts),
108111
propsTypeAnnotation,
109112
])
110113
}
111114
} else {
112115
propsTypeAnnotation = opts.expandProps
113-
? getSvgPropsTypeAnnotation(t)
116+
? getSvgPropsTypeAnnotation(t, opts)
114117
: t.objectPattern([])
115118
}
116119

@@ -132,7 +135,11 @@ export const getProps = ({ types: t }, opts) => {
132135
genericTypeAnnotation(
133136
qualifiedTypeIdentifier(t.identifier('React'), t.identifier('Ref')),
134137
typeParameters([
135-
genericTypeAnnotation(t.identifier('SVGSVGElement')),
138+
opts.native
139+
? genericTypeAnnotation(
140+
qualifiedTypeIdentifier(t.identifier('React'), t.identifier('Component')),
141+
typeParameters([genericTypeAnnotation(t.identifier('SvgProps'))]))
142+
: genericTypeAnnotation(t.identifier('SVGSVGElement')),
136143
]),
137144
),
138145
),
@@ -175,9 +182,13 @@ export const getImport = ({ types: t }, opts) => {
175182
if (opts.native.expo) {
176183
importDeclarations.push(t.importDeclaration([], t.stringLiteral('expo')))
177184
} else {
185+
const imports = [t.importDefaultSpecifier(t.identifier('Svg'))];
186+
if (opts.typescript && opts.expandProps) {
187+
imports.push(t.importSpecifier(t.identifier('SvgProps'), t.identifier('SvgProps')));
188+
}
178189
importDeclarations.push(
179190
t.importDeclaration(
180-
[t.importDefaultSpecifier(t.identifier('Svg'))],
191+
imports,
181192
t.stringLiteral('react-native-svg'),
182193
),
183194
)

packages/core/src/__snapshots__/convert.test.js.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ exports[`convert config should support options 18 1`] = `
450450
451451
function SvgComponent(props) {
452452
return (
453-
<svg width={88} height={88} {...props}>
453+
<svg width={88} height={88} xmlns=\\"http://www.w3.org/2000/svg\\" {...props}>
454454
<g
455455
stroke=\\"#063855\\"
456456
strokeWidth={2}

yarn.lock

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4219,7 +4219,7 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
42194219
dependencies:
42204220
ms "^2.1.1"
42214221

4222-
debug@^3.1.0:
4222+
debug@^3.1.0, debug@^3.2.6:
42234223
version "3.2.6"
42244224
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
42254225
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@@ -4261,6 +4261,11 @@ dedent@^0.7.0:
42614261
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
42624262
integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
42634263

4264+
deep-extend@^0.6.0:
4265+
version "0.6.0"
4266+
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
4267+
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
4268+
42644269
deep-is@~0.1.3:
42654270
version "0.1.3"
42664271
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
@@ -4359,6 +4364,11 @@ detect-indent@^5.0.0:
43594364
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
43604365
integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
43614366

4367+
detect-libc@^1.0.2:
4368+
version "1.0.3"
4369+
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
4370+
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
4371+
43624372
detect-newline@^3.0.0:
43634373
version "3.1.0"
43644374
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
@@ -5899,7 +5909,7 @@ humanize-ms@^1.2.1:
58995909
dependencies:
59005910
ms "^2.0.0"
59015911

5902-
[email protected], iconv-lite@^0.4.24, iconv-lite@~0.4.13:
5912+
[email protected], iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
59035913
version "0.4.24"
59045914
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
59055915
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -6025,7 +6035,7 @@ [email protected]:
60256035
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
60266036
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
60276037

6028-
ini@^1.3.2, ini@^1.3.4:
6038+
ini@^1.3.2, ini@^1.3.4, ini@~1.3.0:
60296039
version "1.3.5"
60306040
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
60316041
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
@@ -7763,6 +7773,15 @@ natural-compare@^1.4.0:
77637773
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
77647774
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
77657775

7776+
needle@^2.2.1:
7777+
version "2.4.1"
7778+
resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.1.tgz#14af48732463d7475696f937626b1b993247a56a"
7779+
integrity sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==
7780+
dependencies:
7781+
debug "^3.2.6"
7782+
iconv-lite "^0.4.4"
7783+
sax "^1.2.4"
7784+
77667785
neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
77677786
version "2.6.1"
77687787
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
@@ -7872,6 +7891,22 @@ node-notifier@^6.0.0:
78727891
shellwords "^0.1.1"
78737892
which "^1.3.1"
78747893

7894+
node-pre-gyp@*:
7895+
version "0.14.0"
7896+
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
7897+
integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
7898+
dependencies:
7899+
detect-libc "^1.0.2"
7900+
mkdirp "^0.5.1"
7901+
needle "^2.2.1"
7902+
nopt "^4.0.1"
7903+
npm-packlist "^1.1.6"
7904+
npmlog "^4.0.2"
7905+
rc "^1.2.7"
7906+
rimraf "^2.6.1"
7907+
semver "^5.3.0"
7908+
tar "^4.4.2"
7909+
78757910
node-releases@^1.1.53:
78767911
version "1.1.53"
78777912
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4"
@@ -7962,7 +7997,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1:
79627997
semver "^5.6.0"
79637998
validate-npm-package-name "^3.0.0"
79647999

7965-
npm-packlist@^1.4.4:
8000+
npm-packlist@^1.1.6, npm-packlist@^1.4.4:
79668001
version "1.4.8"
79678002
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
79688003
integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
@@ -7994,7 +8029,7 @@ npm-run-path@^4.0.0:
79948029
dependencies:
79958030
path-key "^3.0.0"
79968031

7997-
npmlog@^4.1.2:
8032+
npmlog@^4.0.2, npmlog@^4.1.2:
79988033
version "4.1.2"
79998034
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
80008035
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -9271,6 +9306,16 @@ range-parser@~1.2.1:
92719306
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
92729307
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
92739308

9309+
rc@^1.2.7:
9310+
version "1.2.8"
9311+
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
9312+
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
9313+
dependencies:
9314+
deep-extend "^0.6.0"
9315+
ini "~1.3.0"
9316+
minimist "^1.2.0"
9317+
strip-json-comments "~2.0.1"
9318+
92749319
react-is@^16.12.0, react-is@^16.8.1:
92759320
version "16.13.1"
92769321
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
@@ -9702,7 +9747,7 @@ [email protected]:
97029747
dependencies:
97039748
glob "^7.1.3"
97049749

9705-
rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3:
9750+
rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
97069751
version "2.7.1"
97079752
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
97089753
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
@@ -9827,7 +9872,7 @@ sane@^4.0.3:
98279872
minimist "^1.1.1"
98289873
walker "~1.0.5"
98299874

9830-
sax@~1.2.4:
9875+
sax@^1.2.4, sax@~1.2.4:
98319876
version "1.2.4"
98329877
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
98339878
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@@ -9861,7 +9906,7 @@ semver-regex@^2.0.0:
98619906
resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
98629907
integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
98639908

9864-
"semver@2 || 3 || 4 || 5", "[email protected] || 3.x || 4 || 5", semver@^5.0.1, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
9909+
"semver@2 || 3 || 4 || 5", "[email protected] || 3.x || 4 || 5", semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
98659910
version "5.7.1"
98669911
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
98679912
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -10488,6 +10533,11 @@ strip-json-comments@^3.0.1:
1048810533
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
1048910534
integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
1049010535

10536+
strip-json-comments@~2.0.1:
10537+
version "2.0.1"
10538+
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
10539+
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
10540+
1049110541
strong-log-transformer@^2.0.0:
1049210542
version "2.1.0"
1049310543
resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10"
@@ -10596,7 +10646,7 @@ tapable@^1.0.0, tapable@^1.1.3:
1059610646
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
1059710647
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
1059810648

10599-
tar@^4.4.10, tar@^4.4.12, tar@^4.4.8:
10649+
tar@^4.4.10, tar@^4.4.12, tar@^4.4.2, tar@^4.4.8:
1060010650
version "4.4.13"
1060110651
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
1060210652
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==

0 commit comments

Comments
 (0)