Skip to content

Commit 5c6d82c

Browse files
authored
fix: register with template string
1 parent cb2c535 commit 5c6d82c

File tree

4 files changed

+71
-25
lines changed

4 files changed

+71
-25
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { useForm } from 'react-hook-form';
2+
3+
const id = 1;
4+
5+
const Form = () => {
6+
const { register } = useForm();
7+
8+
useEffect(() => {
9+
register(`example.${id}`);
10+
}, [register]);
11+
12+
return (
13+
<form>
14+
<input ref={register({ required: true })} name={`example.${id}`} />
15+
</form>
16+
);
17+
};
18+
19+
export default Form;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { useForm } from 'react-hook-form';
2+
3+
const id = 1;
4+
5+
const Form = () => {
6+
const { register } = useForm();
7+
8+
useEffect(() => {
9+
register(`example.${id}`);
10+
}, [register]);
11+
12+
return (
13+
<form>
14+
<input {...register(`example.${id}`, { required: true })} />
15+
</form>
16+
);
17+
};
18+
19+
export default Form;

transforms/__tests__/v7/update-register.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ const fixtures = [
1515
'function-component-context',
1616
'function-components-context',
1717
'no-transform-context',
18-
'custom-register-context'
18+
'custom-register-context',
19+
'template-string-register'
1920
];
2021

2122
fixtures.forEach(defineTest(__dirname, 'v7/update-register'));

transforms/v7/update-register.ts

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ export default function transformer(file: FileInfo, api: API, options) {
1616
trailingComma: true
1717
};
1818

19-
const transformDeclaration = (useFormDeclarator: ASTPath<VariableDeclarator>) => {
19+
const transformDeclaration = (
20+
useFormDeclarator: ASTPath<VariableDeclarator>
21+
) => {
2022
/**
2123
* We search for all `register` properties
2224
* @example
@@ -42,29 +44,29 @@ export default function transformer(file: FileInfo, api: API, options) {
4244
j(registerProperty)
4345
.closestScope()
4446
.forEach((component) => {
45-
/**
46-
* We search for all `register`
47-
* */
47+
/**
48+
* We search for all `register`
49+
* */
4850
const registerIdentifiers = j(component).find(j.Identifier, {
4951
name: register
5052
});
5153

5254
registerIdentifiers.forEach((registerIdentifier) => {
5355
const isCallExpression =
54-
registerIdentifier.parent.value.type === 'CallExpression';
56+
registerIdentifier.parent.value.type === 'CallExpression';
5557

5658
/**
57-
* We filter `register` to keep only `ref`
58-
* @example
59-
* <input ref={register} name="example" />
60-
* <input ref={register()} name="example" />
61-
* <input ref={register({ required: true })} name="example" />
62-
* <input ref={registerCustomName({ required: true })} name="example" />
63-
* */
59+
* We filter `register` to keep only `ref`
60+
* @example
61+
* <input ref={register} name="example" />
62+
* <input ref={register()} name="example" />
63+
* <input ref={register({ required: true })} name="example" />
64+
* <input ref={registerCustomName({ required: true })} name="example" />
65+
* */
6466
if (
6567
registerIdentifier.parent.value.type !==
66-
'JSXExpressionContainer' &&
67-
!isCallExpression
68+
'JSXExpressionContainer' &&
69+
!isCallExpression
6870
) {
6971
return;
7072
}
@@ -84,28 +86,33 @@ export default function transformer(file: FileInfo, api: API, options) {
8486
nameAttributes.forEach((nameAttribute) => {
8587
if (
8688
nameAttribute.value.value.type !== 'Literal' &&
87-
nameAttribute.value.value.type !== 'StringLiteral'
89+
nameAttribute.value.value.type !== 'StringLiteral' &&
90+
nameAttribute.value.value.type !== 'JSXExpressionContainer' // Handle template string case
8891
) {
8992
return;
9093
}
9194

92-
const name = nameAttribute.value.value.value;
95+
const name =
96+
nameAttribute.value.value.type === 'JSXExpressionContainer'
97+
? nameAttribute.value.value.expression
98+
: j.literal(nameAttribute.value.value.value);
99+
93100
/**
94-
* Add name to register('name')
95-
* ^
96-
* */
97-
const args = [j.literal(name)];
101+
* Add name to register('name')
102+
* ^
103+
* */
104+
const args = [name];
98105

99106
// If `register` have params, we add them to our new args
100107
if (isCallExpression) {
101108
args.push(...registerIdentifier.parent.value.arguments);
102109
}
103110

104111
/**
105-
* Replace `name` attribute with the new `register` api and args
106-
* @example
107-
* name="example" => {...register("example")}
108-
* */
112+
* Replace `name` attribute with the new `register` api and args
113+
* @example
114+
* name="example" => {...register("example")}
115+
* */
109116
j(nameAttribute).replaceWith(
110117
j.jsxSpreadAttribute(
111118
j.callExpression(j.identifier(register), args)

0 commit comments

Comments
 (0)