Skip to content

Commit

Permalink
Rename prefer-box-lonely-ref
Browse files Browse the repository at this point in the history
  • Loading branch information
AlbertCarreras committed Aug 17, 2021
1 parent cf233f1 commit 556fc2c
Show file tree
Hide file tree
Showing 31 changed files with 531 additions and 213 deletions.
13 changes: 7 additions & 6 deletions docs/src/Eslint Plugin.doc.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,24 @@ card(
`}
/>
<MainSection.Subsection
title="gestalt/prefer-box"
title="gestalt/prefer-box-inline-style"
description={`
Prevent using \`<div>\` inline styling for attributes that are already implemented in Box.
[Learn more about Box](/Box).
`}
/>
<MainSection.Subsection
title="gestalt/prefer-box-lonely-ref"
description={`
Prevent \`<div>\` tags used to only contain a \`ref\` attribute.
title="gestalt/prefer-box-no-classname"
description={`Prevent <div> tags that don't contain a className attribute. Instead, Use Gestalt Box.
Instead, use \`ref\` props supported in Box or other elements such as Button or TextField.
[Read more about Box](/Box).
With AUTOFIX!
It also prevents \`<div>\` tags used to only contain a \`ref\` attribute. \`ref\` is supported in Box and other elements such as Button or TextField.
[Read more about the ref prop in Box](/Box#Using-as-a-ref).
With AUTOFIX!
`}
/>
<MainSection.Subsection
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import { Box as RenamedBox } from 'gestalt';
export default function TestElement() {
const ref = useRef(null);
return (
<Box>
<RenamedBox>
<div ref={ref}>
<Box />
<RenamedBox />
</div>
</Box>
</RenamedBox>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import { Box as RenamedBox } from 'gestalt';
export default function TestElement() {
const ref = useRef(null);
return (
<Box>
<Box ref={ref}>
<Box />
</Box>
</Box>
<RenamedBox>
<RenamedBox ref={ref}>
<RenamedBox />
</RenamedBox>
</RenamedBox>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ export default function TestElement() {
const ref = useRef(null);
return (
<div ref={ref}>
<div />
<button />
</div>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export default function TestElement() {
const ref = useRef(null);
return (
<Box ref={ref}>
<div />
<button />
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Box } from 'gestalt';
export default function TestElement() {
return (
<Box>
<div role="button" style={{ marginTop: 200 }}>
<Box />
</div>
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Box } from 'gestalt';
export default function TestElement() {
return (
<Box>
<Box role="button" dangerouslySetInlineStyle={{ __style: { marginTop: 200 } }}>
<Box />
</Box>
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Box } from 'gestalt';
export default function TestElement() {
return (
<Box>
<div role="button">
<Box />
</div>
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Box } from 'gestalt';
export default function TestElement() {
return (
<Box>
<Box role="button">
<Box />
</Box>
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Box as RenamedBox } from 'gestalt';
export default function TestElement() {
return (
<RenamedBox>
<div role="button">
<RenamedBox />
</div>
</RenamedBox>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Box as RenamedBox } from 'gestalt';
export default function TestElement() {
return (
<RenamedBox>
<RenamedBox role="button">
<RenamedBox />
</RenamedBox>
</RenamedBox>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { Text, Flex } from 'gestalt';
export default function TestElement() {
return (
<div role="button">
<Text>Test</Text>
</div>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { Box, Flex, Text } from 'gestalt';
export default function TestElement() {
return (
<Box role="button">
<Text>Test</Text>
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export default function TestElement() {
return (
<div role="button">
<button />
</div>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { Box } from 'gestalt';
export default function TestElement() {
return (
<Box role="button">
<button />
</Box>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function TestElement() {
return <div role="button" />;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { Box } from 'gestalt';
export default function TestElement() {
return <Box role="button" />;
}
22 changes: 17 additions & 5 deletions packages/eslint-plugin-gestalt/src/eslintASTFixers.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ type RenameTagFixerType = ({|
context: GenericNode,
elementNode: GenericNode,
fixer: GenericNode,
gestaltImportNode: GenericNode,
newComponentName: string,
replaceRegexCallback?: ({| input: string |}) => string,
tagName: string,
|}) => $ReadOnlyArray<GenericNode>;

Expand All @@ -70,21 +72,31 @@ export const renameTagFixer: RenameTagFixerType = ({
context,
elementNode,
fixer,
gestaltImportNode,
newComponentName,
replaceRegexCallback = ({ input }) => input,
tagName,
}) => {
return [elementNode.openingElement, elementNode.closingElement]
.map((node) => {
// $FlowFixMe[incompatible-type] Flow is not detecting the method filter(Boolean)
if (!node) return false;
const namedImportsComponents =
getNamedImportsComponents({
importNode: gestaltImportNode,
}) ?? [];

return fixer.replaceText(
node,
getTextNodeFromSourceCode({ context, elementNode: node }).replace(
const componentNameMatch = namedImportsComponents.find(
(item) => item[0] === newComponentName,
);

const replacedText = replaceRegexCallback({
input: getTextNodeFromSourceCode({ context, elementNode: node }).replace(
tagName,
newComponentName,
(componentNameMatch && componentNameMatch[1]) ?? newComponentName,
),
);
});
return fixer.replaceText(node, replacedText);
})
.filter(Boolean);
};
Expand Down
14 changes: 14 additions & 0 deletions packages/eslint-plugin-gestalt/src/eslintASTHelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -253,3 +253,17 @@ export const hasLonelyAttribute: HasLonelyAttributeType = ({ elementNode, tagNam
isTag({ elementNode, tagName }) &&
elementNode?.attributes?.length === 1 &&
elementNode.attributes[0]?.name?.name === attribute;

type HasAttributeType = ({|
elementNode: GenericNode,
tagName: string,
attribute: string,
|}) => boolean;

/** This function checks is a given tag (tagName) in a node (elementNode) contains a given attribute (attribute), and returns true if so.
Example 1:
\<div role="button" \/\> if attribute="role" returns true
*/
export const hasAttribute: HasAttributeType = ({ elementNode, tagName, attribute }) =>
isTag({ elementNode, tagName }) &&
elementNode?.attributes.some((nodeAttribute) => nodeAttribute?.name?.name === attribute);
4 changes: 2 additions & 2 deletions packages/eslint-plugin-gestalt/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import noMediumFormfields from './no-medium-formfields.js';
import noRoleLinkComponents from './no-role-link-components.js';
import noSpreadProps from './no-spread-props.js';
import preferBoxInlineStyle from './prefer-box-inline-style.js';
import preferBoxLonelyRef from './prefer-box-lonely-ref.js';
import preferBoxNoClassname from './prefer-box-no-classname.js';
import preferBoxAsTag from './prefer-box-as-tag.js';

module.exports = {
Expand All @@ -22,7 +22,7 @@ module.exports = {
'no-role-link-components': noRoleLinkComponents,
'no-spread-props': noSpreadProps,
'prefer-box-inline-style': preferBoxInlineStyle,
'prefer-box-lonely-ref': preferBoxLonelyRef,
'prefer-box-no-classname': preferBoxNoClassname,
'prefer-box-as-tag': preferBoxAsTag,
},
};
84 changes: 0 additions & 84 deletions packages/eslint-plugin-gestalt/src/prefer-box-lonely-ref.js

This file was deleted.

0 comments on commit 556fc2c

Please sign in to comment.