test(lint): separate multiline comments (#6476)

This commit is contained in:
Zach Pomerantz 2023-05-02 08:26:07 -07:00 committed by GitHub
parent 607d0d443e
commit 00ecb933ac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 90 additions and 118 deletions

@ -5,6 +5,12 @@ require('@uniswap/eslint-config/load')
module.exports = {
extends: '@uniswap/eslint-config/react',
overrides: [
{
files: ['**/*'],
rules: {
'multiline-comment-style': ['error', 'separate-lines'],
},
},
{
// Configuration/typings typically export objects/definitions that are used outside of the transpiled package
// (eg not captured by the tsconfig). Because it's typical and not exceptional, this is turned off entirely.

@ -22,12 +22,12 @@ import { PositionInfo } from './cache'
import { useFeeValues } from './hooks'
import useMultiChainPositions from './useMultiChainPositions'
/*
This hook takes an array of PositionInfo objects (format used by the Uniswap Labs gql API).
The hook access PositionInfo.details (format used by the NFT position contract),
filters the PositionDetails data for malicious content,
and then returns the original data in its original format.
*/
/**
* Takes an array of PositionInfo objects (format used by the Uniswap Labs gql API).
* The hook access PositionInfo.details (format used by the NFT position contract),
* filters the PositionDetails data for malicious content,
* and then returns the original data in its original format.
*/
function useFilterPossiblyMaliciousPositionInfo(positions: PositionInfo[] | undefined): PositionInfo[] {
const tokenIdsToPositionInfo: Record<string, PositionInfo> = useMemo(
() =>

@ -1,4 +1,4 @@
/*
/**
* Generates an SVG path for the east brush handle.
* Apply `scale(-1, 1)` to generate west brush handle.
*

@ -262,11 +262,9 @@ export function PriceChart({ width, height, prices: originalPrices, timePeriod }
const crosshairEdgeMax = width * 0.85
const crosshairAtEdge = !!crosshair && crosshair > crosshairEdgeMax
/*
* Default curve doesn't look good for the HOUR chart.
* Higher values make the curve more rigid, lower values smooth the curve but make it less "sticky" to real data points,
* making it unacceptable for shorter durations / smaller variances.
*/
// Default curve doesn't look good for the HOUR chart.
// Higher values make the curve more rigid, lower values smooth the curve but make it less "sticky" to real data points,
// making it unacceptable for shorter durations / smaller variances.
const curveTension = timePeriod === TimePeriod.HOUR ? 1 : 0.9
const getX = useMemo(() => (p: PricePoint) => timeScale(p.timestamp), [timeScale])

@ -56,16 +56,14 @@ export default function SwapBuyFiatButton() {
const [buyFiatFlowState, setBuyFiatFlowState] = useState(BuyFiatFlowState.INACTIVE)
const [walletDrawerOpen, toggleWalletDrawer] = useAccountDrawer()
/*
* Depending on the current state of the buy fiat flow the user is in (buyFiatFlowState),
* the desired behavior of clicking the 'Buy' button is different.
* 1) Initially upon first click, need to check the availability of the feature in the user's
* region, and continue the flow.
* 2) If the feature is available in the user's region, need to connect a wallet, and continue
* the flow.
* 3) If the feature is available and a wallet account is connected, show fiat on ramp modal.
* 4) If the feature is unavailable, show feature unavailable tooltip.
*/
// Depending on the current state of the buy fiat flow the user is in (buyFiatFlowState),
// the desired behavior of clicking the 'Buy' button is different.
// 1) Initially upon first click, need to check the availability of the feature in the user's
// region, and continue the flow.
// 2) If the feature is available in the user's region, need to connect a wallet, and continue
// the flow.
// 3) If the feature is available and a wallet account is connected, show fiat on ramp modal.
// 4) If the feature is unavailable, show feature unavailable tooltip.
const handleBuyCrypto = useCallback(() => {
if (!fiatOnrampAvailabilityChecked) {
setCheckFiatRegionAvailability(true)

@ -28,10 +28,8 @@ function useTryActivation() {
return useCallback(
async (connection: Connection, onSuccess: () => void) => {
/*
* Skips wallet connection if the connection should override the default
* behavior, i.e. install MetaMask or launch Coinbase app
*/
// Skips wallet connection if the connection should override the default
// behavior, i.e. install MetaMask or launch Coinbase app
if (connection.overrideActivate?.()) return
try {

@ -1,4 +1,4 @@
/*
/**
* SupportedChainId must be defined inline, without using @uniswap/sdk-core, so that its members are their own types
* {@see https://www.typescriptlang.org/docs/handbook/enums.html#union-enums-and-enum-member-types}. This allows the
* derived const arrays and their types (eg {@link L1_CHAIN_IDS}, {@link SupportedL1ChainId}) to be narrowed and used

@ -56,8 +56,7 @@ export function getWarningCopy(warning: Warning | null, plural = false) {
export type Warning = {
level: WARNING_LEVEL
message: JSX.Element
/* canProceed determines whether triangle/slash alert icon is used, and
whether this token is supported/able to be traded */
/** Determines whether triangle/slash alert icon is used, and whether this token is supported/able to be traded. */
canProceed: boolean
}

@ -5,14 +5,12 @@ import { WrappedTokenInfo } from 'state/lists/wrappedTokenInfo'
import { TokenQuery } from './__generated__/types-and-hooks'
import { CHAIN_NAME_TO_CHAIN_ID } from './util'
/*
The difference between Token and TokenProject:
Token: an on-chain entity referring to a contract (e.g. uni token on ethereum 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984)
TokenProject: an off-chain, aggregated entity that consists of a token and its bridged tokens (e.g. uni token on all chains)
TokenMarket and TokenProjectMarket then are market data entities for the above.
TokenMarket is per-chain market data for contracts pulled from the graph.
TokenProjectMarket is aggregated market data (aggregated over multiple dexes and centralized exchanges) that we get from coingecko.
*/
// The difference between Token and TokenProject:
// Token: an on-chain entity referring to a contract (e.g. uni token on ethereum 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984)
// TokenProject: an off-chain, aggregated entity that consists of a token and its bridged tokens (e.g. uni token on all chains)
// TokenMarket and TokenProjectMarket then are market data entities for the above.
// TokenMarket is per-chain market data for contracts pulled from the graph.
// TokenProjectMarket is aggregated market data (aggregated over multiple dexes and centralized exchanges) that we get from coingecko.
gql`
query Token($chain: Chain!, $address: String = null) {
token(chain: $chain, address: $address) {

@ -28,10 +28,9 @@ export default function useENSName(address?: string): { ENSName: string | null;
const nameCallRes = useSingleCallResult(resolverContract, 'name', ensNodeArgument)
const name = nameCallRes.result?.[0]
/* ENS does not enforce that an address owns a .eth domain before setting it as a reverse proxy
and recommends that you perform a match on the forward resolution
see: https://docs.ens.domains/dapp-developer-guide/resolving-names#reverse-resolution
*/
// ENS does not enforce that an address owns a .eth domain before setting it as a reverse proxy
// and recommends that you perform a match on the forward resolution
// see: https://docs.ens.domains/dapp-developer-guide/resolving-names#reverse-resolution
const fwdAddr = useENSAddress(name)
const checkedName = address === fwdAddr?.address ? name : null

@ -11,7 +11,7 @@ function getUniqueAddressesFromPositions(positions: PositionDetails[]): string[]
new Set(positions.reduce<string[]>((acc, position) => acc.concat(position.token0, position.token1), []))
)
}
/*
/**
* This function is an attempt to filter out an observed phishing attack from LP list UIs.
* Attackers would airdrop valueless LP positions with urls in the symbol to render phishing sites into users' LP position list view.
*

@ -3,9 +3,7 @@ import { useWeb3React } from '@web3-react/core'
import { useMemo } from 'react'
import { useCombinedActiveList } from 'state/lists/hooks'
/**
* Returns a WrappedTokenInfo from the active token lists when possible,
* or the passed token otherwise. */
/** Returns a WrappedTokenInfo from the active token lists when possible, or the passed token otherwise. */
export function useTokenInfoFromActiveList(currency: Currency) {
const { chainId } = useWeb3React()
const activeList = useCombinedActiveList()

@ -44,11 +44,9 @@ const urlParamsUtils = {
clonedQuery[key] = []
}
/*
query-string package treats arrays with one value as a string.
Here we're making sure that we have an array, not a string. Example:
const foo = 'hey' // => ['hey']
*/
// query-string package treats arrays with one value as a string.
// Here we're making sure that we have an array, not a string. Example:
// const foo = 'hey' // => ['hey']
if (clonedQuery[key] && typeof clonedQuery[key] === 'string') {
clonedQuery[key] = [clonedQuery[key]]
}
@ -66,23 +64,20 @@ const urlParamsUtils = {
clonedQuery['buyNow'] = !(clonedQuery['all'] === undefined ? !initialBuyNow : clonedQuery['all'])
clonedQuery['search'] = clonedQuery['search'] === undefined ? initialSearchText : String(clonedQuery['search'])
/*
Handling an edge case caused by query-string's bad array parsing, when user
only selects one trait and reloads the page.
Here's the general data-structure for our traits in URL:
`traits=("trait_type","trait_value"),("trait_type","trait_value")`
Expected behavior: When user selects one trait, there should be an array
containing one element.
Actual behavior: It creates an array with two elements, first element being
trait_type & the other trait_value. This causes confusion since we don't know
whether user has selected two traits (cause we have two elements in our array)
or it's only one.
Using this block of code, we'll identify if that's the case.
*/
// Handling an edge case caused by query-string's bad array parsing, when user
// only selects one trait and reloads the page.
// Here's the general data-structure for our traits in URL:
// `traits=("trait_type","trait_value"),("trait_type","trait_value")`
//
// Expected behavior: When user selects one trait, there should be an array
// containing one element.
//
// Actual behavior: It creates an array with two elements, first element being
// trait_type & the other trait_value. This causes confusion since we don't know
// whether user has selected two traits (cause we have two elements in our array)
// or it's only one.
//
// Using this block of code, we'll identify if that's the case.
if (clonedQuery['traits'].length === 2) {
const [trait_type, trait_value] = clonedQuery['traits'] as [string, string]
const fullTrait = `${trait_type}${trait_value}`
@ -104,11 +99,9 @@ const urlParamsUtils = {
collectionStats.traits &&
collectionStats.traits[trait_type].find((trait) => trait.trait_value === trait_value)
/*
For most cases, `traitInStats` is assigned. In case the trait
does not exist in our store, e.g "Number of traits", we have to
manually create an object for it.
*/
// For most cases, `traitInStats` is assigned. In case the trait
// does not exist in our store, e.g "Number of traits", we have to
// manually create an object for it.
const trait = traitInStats ?? { trait_type, trait_value, trait_count: 0 }
return trait as Trait

@ -21,8 +21,8 @@ export default function TokenDetailsPage() {
const isNative = tokenAddress === NATIVE_CHAIN_ID
const [timePeriod, setTimePeriod] = useAtom(pageTimePeriodAtom)
const [detailedTokenAddress, duration] = useMemo(
/* tokenAddress will always be defined in the path for for this page to render, but useParams will always
return optional arguments; nullish coalescing operator is present here to appease typechecker */
// tokenAddress will always be defined in the path for for this page to render, but useParams will always
// return optional arguments; nullish coalescing operator is present here to appease typechecker
() => [isNative ? getNativeTokenDBAddress(chain) : tokenAddress ?? '', toHistoryDuration(timePeriod)],
[chain, isNative, timePeriod, tokenAddress]
)

@ -1,14 +1,12 @@
import { atomWithStorage, createJSONStorage } from 'jotai/utils'
/*
Note:
We should consider a generic sessionStorage abstraction if this pattern becomes common. (i.e., Future promo dismissals like the tax service discounts or Fiat Onramp launch notification may use this.)
This would be something similar to the current feature flag implementation, but utilizing session instead
Motivation:
some dapp browsers need to be able to disable the NFT portion of the app in order to pass Apple's app store review
this atom persists the inclusion of the `disableNFTs=boolean` query parameter via the webview's session storage
*/
// Note:
// We should consider a generic sessionStorage abstraction if this pattern becomes common. (i.e., Future promo dismissals like the tax service discounts or Fiat Onramp launch notification may use this.)
// This would be something similar to the current feature flag implementation, but utilizing session instead
//
// Motivation:
// some dapp browsers need to be able to disable the NFT portion of the app in order to pass Apple's app store review
// this atom persists the inclusion of the `disableNFTs=boolean` query parameter via the webview's session storage
const storage = createJSONStorage(() => sessionStorage)
export const shouldDisableNFTRoutesAtom = atomWithStorage('shouldDisableNFTRoutes', false, storage)

@ -3,8 +3,8 @@ import { shallowEqual } from 'react-redux'
import { Wallet } from './types'
/* Used to track wallets that have been connected by the user in current session, and remove them when deliberately disconnected.
Used to compute is_reconnect event property for analytics */
// Used to track wallets that have been connected by the user in current session, and remove them when deliberately disconnected.
// Used to compute is_reconnect event property for analytics
interface WalletState {
connectedWallets: Wallet[]
}

@ -1,9 +1,8 @@
import { ClientOptions, ErrorEvent, EventHint } from '@sentry/types'
import { didUserReject } from 'utils/swapErrorToUserReadableMessage'
/* `responseStatus` is only currently supported on certain browsers.
* see: https://caniuse.com/mdn-api_performanceresourcetiming_responsestatus
*/
// `responseStatus` is only currently supported on certain browsers.
// see: https://caniuse.com/mdn-api_performanceresourcetiming_responsestatus
declare global {
interface PerformanceEntry {
responseStatus?: number
@ -16,12 +15,10 @@ function isEthersRequestError(error: Error): error is Error & { requestBody: str
}
export function beforeSend(event: ErrorEvent, hint: EventHint) {
/*
* Since the interface currently uses HashRouter, URLs will have a # before the path.
* This leads to issues when we send the URL into Sentry, as the path gets parsed as a "fragment".
* Instead, this logic removes the # part of the URL.
* See https://romain-clement.net/articles/sentry-url-fragments/#url-fragments
**/
// Since the interface currently uses HashRouter, URLs will have a # before the path.
// This leads to issues when we send the URL into Sentry, as the path gets parsed as a "fragment".
// Instead, this logic removes the # part of the URL.
// See https://romain-clement.net/articles/sentry-url-fragments/#url-fragments
if (event.request?.url) {
event.request.url = event.request.url.replace('/#', '')
}
@ -34,11 +31,9 @@ function shouldFilterChunkError(asset?: string) {
const resource = entries?.find(({ name }) => name === asset)
const status = resource?.responseStatus
/*
* If the status if 499, then we ignore.
* If there's no status (meaning the browser doesn't support `responseStatus`) then we also ignore.
* These errors are likely also 499 errors, and we can catch any spikes in non-499 chunk errors via other browsers.
*/
// If the status if 499, then we ignore.
// If there's no status (meaning the browser doesn't support `responseStatus`) then we also ignore.
// These errors are likely also 499 errors, and we can catch any spikes in non-499 chunk errors via other browsers.
return !status || status === 499
}
@ -62,11 +57,9 @@ export const filterKnownErrors: Required<ClientOptions>['beforeSend'] = (event:
// If the error is based on a user rejecting, it should not be considered an exception.
if (didUserReject(error)) return null
/*
* This ignores 499 errors, which are caused by Cloudflare when a request is cancelled.
* CF claims that some number of these is expected, and that they should be ignored.
* See https://groups.google.com/a/uniswap.org/g/cloudflare-eng/c/t3xvAiJFujY.
*/
// This ignores 499 errors, which are caused by Cloudflare when a request is cancelled.
// CF claims that some number of these is expected, and that they should be ignored.
// See https://groups.google.com/a/uniswap.org/g/cloudflare-eng/c/t3xvAiJFujY.
if (error.message.match(/Loading chunk \d+ failed\. \(([a-zA-Z]+): .+\.chunk\.js\)/)) {
const asset = error.message.match(/https?:\/\/.+?\.chunk\.js/)?.[0]
if (shouldFilterChunkError(asset)) return null
@ -78,24 +71,18 @@ export const filterKnownErrors: Required<ClientOptions>['beforeSend'] = (event:
if (shouldFilterChunkError(asset)) return null
}
/*
* This is caused by HTML being returned for a chunk from Cloudflare.
* Usually, it's the result of a 499 exception right before it, which should be handled.
* Therefore, this can be ignored.
*/
// This is caused by HTML being returned for a chunk from Cloudflare.
// Usually, it's the result of a 499 exception right before it, which should be handled.
// Therefore, this can be ignored.
if (error.message.match(/Unexpected token '<'/)) return null
/*
* Errors coming from OneKey (a desktop wallet) can be ignored for now.
* These errors are either application-specific, or they will be thrown separately outside of OneKey.
*/
// Errors coming from OneKey (a desktop wallet) can be ignored for now.
// These errors are either application-specific, or they will be thrown separately outside of OneKey.
if (error.stack?.match(/OneKey/i)) return null
/*
* Content security policy 'unsafe-eval' errors can be filtered out because there are expected failures.
* For example, if a user runs an eval statement in console this error would still get thrown.
* TODO(INFRA-176): We should extend this to filter out any type of CSP error.
*/
// Content security policy 'unsafe-eval' errors can be filtered out because there are expected failures.
// For example, if a user runs an eval statement in console this error would still get thrown.
// TODO(INFRA-176): We should extend this to filter out any type of CSP error.
if (error.message.match(/'unsafe-eval'.*content security policy/i)) {
return null
}