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

Commit 7ef8e71

Browse files
FP no-duplicate-string: ignore strings used as object keys (#113)
1 parent 375988b commit 7ef8e71

File tree

3 files changed

+41
-17
lines changed

3 files changed

+41
-17
lines changed

ruling/snapshots/no-duplicate-string

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ src/brackets/src/extensions/default/PrefsCodeHints/unittests.js: 201,501,501
7474
src/brackets/src/extensions/default/QuickView/unittests.js: 458
7575
src/brackets/src/extensions/default/RecentProjects/unittests.js: 60
7676
src/brackets/src/extensions/default/StaticServer/node/node_modules/connect/lib/middleware/directory.js: 120,121
77-
src/brackets/src/extensions/default/StaticServer/node/node_modules/connect/lib/middleware/errorHandler.js: 63
7877
src/brackets/src/extensions/default/StaticServer/node/node_modules/connect/lib/middleware/staticCache.js: 70
7978
src/brackets/src/extensions/default/StaticServer/node/node_modules/connect/node_modules/multiparty/index.js: 160
8079
src/brackets/src/extensions/default/StaticServer/node/node_modules/connect/node_modules/send/node_modules/mime/test.js: 21,29,40
@@ -91,9 +90,9 @@ src/brackets/src/language/HTMLUtils.js: 116
9190
src/brackets/src/language/JSONUtils.js: 112
9291
src/brackets/src/language/XMLUtils.js: 101
9392
src/brackets/src/LiveDevelopment/Agents/CSSAgent.js: 184
94-
src/brackets/src/LiveDevelopment/Agents/RemoteFunctions.js: 183,950
93+
src/brackets/src/LiveDevelopment/Agents/RemoteFunctions.js: 950
9594
src/brackets/src/LiveDevelopment/Agents/ScriptAgent.js: 152
96-
src/brackets/src/LiveDevelopment/main.js: 68,68,86,271
95+
src/brackets/src/LiveDevelopment/main.js: 68,68,271
9796
src/brackets/src/LiveDevelopment/MultiBrowserImpl/documents/LiveDocument.js: 71
9897
src/brackets/src/nls/de/strings.js: 345
9998
src/brackets/src/nls/el/strings.js: 125
@@ -119,16 +118,15 @@ src/brackets/tasks/pack-web-dependencies.js: 28
119118
src/Chart.js/src/platforms/platform.dom.js: 174
120119
src/create-react-app/packages/create-react-app/createReactApp.js: 67,126,189,208
121120
src/create-react-app/packages/react-dev-utils/launchEditor.js: 42
122-
src/create-react-app/packages/react-error-overlay/src/styles.js: 33
123121
src/create-react-app/packages/react-scripts/config/paths.js: 58
124122
src/create-react-app/packages/react-scripts/scripts/eject.js: 147
125123
src/create-react-app/packages/react-scripts/scripts/init.js: 84
126124
src/create-react-app/packages/react-scripts/scripts/utils/verifyPackageTree.js: 66
127125
src/express/lib/application.js: 79,92
128126
src/express/lib/request.js: 310
129127
src/express/lib/response.js: 132,194
130-
src/freeCodeCamp/common/app/redux/utils.test.js: 44
131-
src/freeCodeCamp/common/app/routes/Challenges/utils/index.test.js: 24,25,28,90,105,164,274,321,322,350,405,477,596,811
128+
src/freeCodeCamp/common/app/redux/utils.test.js: 54
129+
src/freeCodeCamp/common/app/routes/Challenges/utils/index.test.js: 24,25,28,90,112,164,274,321,322,350,405,477,597,811
132130
src/freeCodeCamp/common/app/routes/Challenges/views/step/redux/step-challenge-epic.test.js: 48,62,69
133131
src/freeCodeCamp/common/utils/ajax-stream.js: 283
134132
src/freeCodeCamp/public/js/calculator.js: 9,16,149
@@ -140,7 +138,6 @@ src/freeCodeCamp/server/middlewares/csp.js: 23,24,25,37
140138
src/freeCodeCamp/server/utils/date-utils.test.js: 13,14
141139
src/freeCodeCamp/server/utils/user-stats.test.js: 21,21,98,121,123,125,126
142140
src/Ghost/core/server/adapters/scheduling/SchedulingDefault.js: 104
143-
src/Ghost/core/server/api/index.js: 207,218
144141
src/Ghost/core/server/api/posts.js: 99
145142
src/Ghost/core/server/api/subscribers.js: 70
146143
src/Ghost/core/server/config/utils.js: 53
@@ -186,8 +183,6 @@ src/react-native/Libraries/Utilities/BackAndroid.js: 25
186183
src/react-native/Libraries/Utilities/PerformanceLogger.js: 74
187184
src/react-native/Libraries/vendor/core/toIterator.js: 27
188185
src/react-native/local-cli/__mocks__/fs.js: 95
189-
src/react-native/local-cli/core/__fixtures__/android.js: 10
190-
src/react-native/local-cli/core/__fixtures__/dependencies.js: 5
191186
src/react-native/local-cli/server/util/launchChrome.js: 35
192187
src/react-native/react-native-cli/index.js: 66
193188
src/react-native/react-native-git-upgrade/cliEntry.js: 97,97
@@ -209,7 +204,6 @@ src/react-native/RNTester/js/TouchableExample.js: 60
209204
src/react-native/RNTester/js/XHRExampleBinaryUpload.js: 57
210205
src/react-native/scripts/android-e2e-test.js: 101
211206
src/react-native/scripts/bump-oss-version.js: 65
212-
src/react-router/packages/react-router-dom/modules/NavLink.js: 19
213207
src/react/fixtures/art/VectorWidget.js: 134
214208
src/react/fixtures/attribute-behavior/src/attributes.js: 34,59,67,109,182,226,302,316,330,344,464,526,571,611,625,640,652,658,664,670,676,801,807,813,847,878,884,916,1053,1065,1095,1101,1107,1292,1298,1316,1371,1469,1574,1695,1701,1719,1725,1755,1767,1773,1779,1785,1791,1797,1895,1901,1907,1971,1977,2001,2007,2045,2057,2063,2103,2118,2206,2219,2268,2269,2270,2271,2272,2273,2274,2289
215209
src/react/fixtures/dom/src/components/fixtures/error-handling/index.js: 99
@@ -222,9 +216,9 @@ src/react/packages/react-reconciler/src/ReactFiberContext.js: 165
222216
src/react/packages/react-reconciler/src/ReactFiberScheduler.js: 496,553,921
223217
src/react/packages/react-reconciler/src/ReactFiberTreeReflection.js: 93
224218
src/react/packages/react-reconciler/src/ReactStrictModeWarnings.js: 98,139,141
225-
src/react/scripts/bench/benchmarks/pe-class-components/benchmark.js: 9,275,277,489,518,746,1158,1225,1544,1602,2408,2556,2627,2630,2640,3170,3200,3401,3406,3409,4011,4077,4134,4530,4756
226-
src/react/scripts/bench/benchmarks/pe-functional-components/benchmark.js: 8,272,274,482,511,739,1112,1175,1459,1511,2213,2345,2408,2411,2421,2878,2908,3107,3112,3115,3715,3771,3821,4120,4338
227-
src/react/scripts/bench/benchmarks/pe-no-components/benchmark.js: 8,272,274,482,511,739,1085,1148,1415,1467,2131,2255,2315,2318,2328,2735,2765,2964,2969,2972,3572,3628,3678,3977,4183
219+
src/react/scripts/bench/benchmarks/pe-class-components/benchmark.js: 9,489,1158,1225,1602,2408,2556,2627,2630,2640,3170,3200,3401,3406,3409,4011,4077,4134,4530,4756
220+
src/react/scripts/bench/benchmarks/pe-functional-components/benchmark.js: 8,482,1112,1175,1511,2213,2345,2408,2411,2421,2878,2908,3107,3112,3115,3715,3771,3821,4120,4338
221+
src/react/scripts/bench/benchmarks/pe-no-components/benchmark.js: 8,482,1085,1148,1467,2131,2255,2315,2318,2328,2735,2765,2964,2969,2972,3572,3628,3678,3977,4183
228222
src/react/scripts/bench/build.js: 13
229223
src/react/scripts/jest/matchers/toWarnDev.js: 54
230224
src/react/scripts/release/build-commands/update-noop-renderer-dependencies.js: 11
@@ -269,7 +263,6 @@ src/spectrum/src/views/pages/style.js: 242
269263
src/spectrum/src/views/userSettings/components/emailSettings.js: 36
270264
src/spectrum/src/views/userSettings/components/notificationSettings.js: 53
271265
src/three.js/editor/js/History.js: 96
272-
src/three.js/editor/js/Sidebar.Object.js: 20,21,22
273266
src/three.js/editor/js/Sidebar.Project.js: 83,104,114,126,136
274267
src/three.js/editor/js/Sidebar.Scene.js: 59
275268
src/three.js/src/audio/Audio.js: 77

src/rules/no-duplicate-string.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const rule: Rule.RuleModule = {
4646
const stringContent = literal.value.trim();
4747

4848
if (
49-
!isExcludedByUsageContext(context) &&
49+
!isExcludedByUsageContext(context, literal) &&
5050
stringContent.length >= MIN_LENGTH &&
5151
!stringContent.match(NO_SEPARATOR_REGEXP)
5252
) {
@@ -72,15 +72,21 @@ const rule: Rule.RuleModule = {
7272
},
7373
};
7474

75-
function isExcludedByUsageContext(context: Rule.RuleContext) {
75+
function isExcludedByUsageContext(context: Rule.RuleContext, literal: SimpleLiteral) {
7676
const parent = getParent(context)!;
7777
const parentType = parent.type;
7878

79-
return EXCLUDED_CONTEXTS.includes(parentType) || isRequireContext(parent, context);
79+
return (
80+
EXCLUDED_CONTEXTS.includes(parentType) || isRequireContext(parent, context) || isObjectPropertyKey(parent, literal)
81+
);
8082
}
8183

8284
function isRequireContext(parent: Node, context: Rule.RuleContext) {
8385
return parent.type === "CallExpression" && context.getSourceCode().getText(parent.callee) === "require";
8486
}
8587

88+
function isObjectPropertyKey(parent: Node, literal: SimpleLiteral) {
89+
return parent.type === "Property" && parent.key === literal;
90+
}
91+
8692
export = rule;

tests/rules/no-duplicate-string.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,18 @@ ruleTester.run("no-duplicate-string", rule, {
121121
console.log('some message');
122122
console.log("some message");`,
123123
},
124+
{
125+
code: `
126+
const obj1 = {
127+
"some property": 1
128+
};
129+
const obj2 = {
130+
"some property": 1
131+
};
132+
const obj3 = {
133+
"some property": 1
134+
};`,
135+
},
124136
],
125137
invalid: [
126138
{
@@ -157,5 +169,18 @@ ruleTester.run("no-duplicate-string", rule, {
157169
errors: 1,
158170
options: [2],
159171
},
172+
{
173+
code: `
174+
const obj1 = {
175+
key: "some message"
176+
};
177+
const obj2 = {
178+
key: "some message"
179+
};
180+
const obj3 = {
181+
key: "some message"
182+
};`,
183+
errors: 1,
184+
},
160185
],
161186
});

0 commit comments

Comments
 (0)