Skip to content
This repository was archived by the owner on Oct 3, 2024. It is now read-only.

Commit 033e87e

Browse files
Improve 'no-nested-template-literals': do not report on multiline literal (#326)
1 parent 27617cb commit 033e87e

File tree

4 files changed

+39
-74
lines changed

4 files changed

+39
-74
lines changed

docs/rules/no-nested-template-literals.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,15 @@ let count = 3;
2222
let apples = color ? `${count} ${color}` : count;
2323
let message = `I have ${apples} apples`;
2424
```
25+
26+
## Exceptions
27+
28+
Nested template is ignored when the nesting one starts and ends on a different line.
29+
30+
```javascript
31+
let color = "red";
32+
let count = 3;
33+
let message = `I have
34+
${color ? `${count} ${color}` : count}
35+
apples`;
36+
```
Lines changed: 9 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,21 @@
1-
src/create-react-app/packages/create-react-app/createReactApp.js: 141,380,550
1+
src/create-react-app/packages/create-react-app/createReactApp.js: 141,380
22
src/create-react-app/packages/react-dev-utils/WebpackDevServerUtils.js: 111,407
33
src/create-react-app/packages/react-error-overlay/src/utils/stack-frame.js: 115,115
4-
src/create-react-app/packages/react-scripts/scripts/eject.js: 195,196
4+
src/create-react-app/packages/react-scripts/scripts/eject.js: 195
55
src/create-react-app/packages/react-scripts/scripts/init.js: 235
6-
src/create-react-app/packages/react-scripts/scripts/utils/verifyPackageTree.js: 132
7-
src/jest/packages/jest-cli/src/get_no_test_found.js: 13
8-
src/jest/packages/jest-cli/src/get_no_test_found_verbose.js: 40
96
src/jest/packages/jest-cli/src/pattern_prompt.js: 22
10-
src/jest/packages/jest-config/src/deprecated.js: 50
117
src/jest/packages/jest-matcher-utils/src/index.js: 171
12-
src/jest/packages/jest-validate/src/errors.js: 22,29
8+
src/jest/packages/jest-validate/src/errors.js: 22
139
src/jest/packages/jest-validate/src/warnings.js: 31
14-
src/react/scripts/jest/setupTests.js: 102
1510
src/react/scripts/release/build-commands/add-git-tag.js: 21
1611
src/react/scripts/rollup/build.js: 446
17-
src/react/scripts/rollup/wrappers.js: 61,62,84,85
18-
src/spectrum/admin/src/api/index.js: 36
19-
src/spectrum/admin/src/components/avatar/index.js: 17,20,31,32,33
20-
src/spectrum/admin/src/components/buttons/style.js: 30,56,56,62,63,73,81,92,102,112,116,125,131,147,156,158
21-
src/spectrum/admin/src/components/formElements/style.js: 72,142
22-
src/spectrum/admin/src/components/globals/index.js: 62,63,72,73,75,77,82,86,139,417,418,464,464,505,507
23-
src/spectrum/admin/src/components/loading/style.js: 19,20,28,29,30,31,33,35
24-
src/spectrum/admin/src/views/navbar/style.js: 50,87,89,89
25-
src/spectrum/athena/index.js: 73
26-
src/spectrum/athena/queues/community-invoice-paid.js: 48
27-
src/spectrum/hermes/index.js: 91
28-
src/spectrum/hermes/queues/send-new-message-email.js: 73,74,90,91
29-
src/spectrum/hyperion/renderer/html-template.js: 77
30-
src/spectrum/mercury/index.js: 19
31-
src/spectrum/mobile/components/Avatar/style.js: 8,9,10,35,36,37,44,45,46
32-
src/spectrum/mobile/components/Text/index.js: 36,39,39,41
33-
src/spectrum/shared/graphql/index.js: 27
34-
src/spectrum/src/components/avatar/style.js: 25,26,33,35,36,90,91,97,99,100,108,109,115,117,118
35-
src/spectrum/src/components/buttons/style.js: 33,58,58,64,65,75,83,94,98,101,112,123,127,136,143,153,157,166,173,188,197,199
36-
src/spectrum/src/components/chatInput/style.js: 114
37-
src/spectrum/src/components/column/index.js: 18
38-
src/spectrum/src/components/draftjs-editor/Image.js: 26,49
39-
src/spectrum/src/components/draftjs-editor/style.js: 89,128
40-
src/spectrum/src/components/emailInvitationForm/index.js: 153,154
41-
src/spectrum/src/components/formElements/style.js: 74,144,217,219
42-
src/spectrum/src/components/fullscreenView/style.js: 29
43-
src/spectrum/src/components/globals/index.js: 99,100,109,110,112,114,119,123,176,492,539
44-
src/spectrum/src/components/goop/index.js: 37
45-
src/spectrum/src/components/linkPreview/style.js: 38
46-
src/spectrum/src/components/loginButtonSet/style.js: 36,58
47-
src/spectrum/src/components/menu/style.js: 15
48-
src/spectrum/src/components/message/style.js: 15,15,19,74,75,151,222,222,242,242,275,275,283
49-
src/spectrum/src/components/profile/coverPhoto.js: 17
50-
src/spectrum/src/components/reaction/style.js: 19,28,39
51-
src/spectrum/src/components/segmentedControl/index.js: 43
52-
src/spectrum/src/components/themedSection/index.js: 27,37,46,55,69,78
53-
src/spectrum/src/components/threadComposer/style.js: 46,59
54-
src/spectrum/src/components/toasts/style.js: 53
55-
src/spectrum/src/components/upsell/newUserUpsellStyles.js: 17
56-
src/spectrum/src/components/upsell/style.js: 145,214,306,339
57-
src/spectrum/src/views/communitySettings/style.js: 172
58-
src/spectrum/src/views/dashboard/style.js: 162,205,219,807
59-
src/spectrum/src/views/directMessages/components/style.js: 30
60-
src/spectrum/src/views/directMessages/style.js: 48
61-
src/spectrum/src/views/explore/style.js: 105,117
62-
src/spectrum/src/views/login/style.js: 100,119,188
63-
src/spectrum/src/views/navbar/style.js: 45,54,63,148,159,209
64-
src/spectrum/src/views/newCommunity/components/createCommunityForm/style.js: 20,21
65-
src/spectrum/src/views/newCommunity/index.js: 110,126,147
66-
src/spectrum/src/views/newCommunity/style.js: 8
67-
src/spectrum/src/views/newUserOnboarding/style.js: 87
68-
src/spectrum/src/views/notifications/style.js: 126,137,138
69-
src/spectrum/src/views/pages/pricing/style.js: 105,105,114,388,389,390
70-
src/spectrum/src/views/pages/style.js: 191,409,439,669,684
71-
src/spectrum/src/views/thread/style.js: 37,113,231,239,544
72-
src/spectrum/src/views/threadSlider/style.js: 16
73-
src/spectrum/vulcan/index.js: 27
12+
src/spectrum/admin/src/components/buttons/style.js: 56
13+
src/spectrum/hermes/queues/send-new-message-email.js: 74,91
14+
src/spectrum/mobile/components/Text/index.js: 39
15+
src/spectrum/src/components/buttons/style.js: 58
16+
src/spectrum/src/views/newCommunity/index.js: 110
7417
src/vue/scripts/gen-release-note.js: 3,3
7518
src/vue/scripts/verify-commit-msg.js: 10,12,13,15
76-
src/vue/src/compiler/codegen/index.js: 75,77,301,303,305,326,353,399,459,460,482
19+
src/vue/src/compiler/codegen/index.js: 459,460
7720
src/vue/src/core/instance/render-helpers/render-static.js: 36,36
78-
src/vue/src/core/util/debug.js: 92
7921
src/vue/src/core/vdom/create-component.js: 191
80-
src/vue/src/server/optimizing-compiler/codegen.js: 87,89,118
81-
src/vue/src/server/optimizing-compiler/modules.js: 121
82-
src/vue/src/server/template-renderer/index.js: 158

src/rules/no-nested-template-literals.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
// https://sonarsource.github.io/rspec/#/rspec/S4624
2121

2222
import type { TSESTree, TSESLint } from '@typescript-eslint/experimental-utils';
23+
import { ancestorsChain } from '../utils';
2324
import docsUrl from '../utils/docs-url';
2425

2526
const rule: TSESLint.RuleModule<string, string[]> = {
@@ -38,10 +39,18 @@ const rule: TSESLint.RuleModule<string, string[]> = {
3839
create(context) {
3940
return {
4041
'TemplateLiteral TemplateLiteral': (node: TSESTree.Node) => {
41-
context.report({
42-
messageId: 'nestedTemplateLiterals',
43-
node,
44-
});
42+
const ancestors = ancestorsChain(node, new Set(['TemplateLiteral']));
43+
const nestingTemplate = ancestors[ancestors.length - 1];
44+
45+
const { start: nestingStart, end: nestingEnd } = nestingTemplate.loc;
46+
const { start: nestedStart, end: nestedEnd } = node.loc;
47+
48+
if (nestedStart.line === nestingStart.line || nestedEnd.line === nestingEnd.line) {
49+
context.report({
50+
messageId: 'nestedTemplateLiterals',
51+
node,
52+
});
53+
}
4554
},
4655
};
4756
},

tests/rules/no-nested-template-literals.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ ruleTester.run('Template literals should not be nested', rule, {
3030
{
3131
code: 'let message = `I have ${color ? nestedMessage : count} apples`;',
3232
},
33+
{ code: 'let message = `I have \n${color ? `${count} ${color}` : count} \napples`;' },
3334
],
3435
invalid: [
3536
{
@@ -142,5 +143,9 @@ ruleTester.run('Template literals should not be nested', rule, {
142143
},
143144
],
144145
},
146+
{
147+
code: 'let message = `I have \n${color ? `${count} ${color}` : count} apples`;',
148+
errors: [{ messageId: 'nestedTemplateLiterals' }],
149+
},
145150
],
146151
});

0 commit comments

Comments
 (0)