Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

eslint-plugin-smarthr

Package Overview
Dependencies
Maintainers
20
Versions
84
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

eslint-plugin-smarthr

A sharable ESLint plugin for SmartHR

  • 0.1.2
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
8.1K
decreased by-29.38%
Maintainers
20
Weekly downloads
 
Created
Source

eslint-plugin-smarthr

smarthr/a11y-icon-button-has-name

  • ボタンの中にIconのみが設置されている場合、アクセシビリティの問題が発生する可能性を防ぐルールです

rules

{
  rules: {
    'smarthr/a11y-icon-button-has-name': 'error', // 'warn', 'off'
  },
}

❌ Incorrect

<XxxButton>
  <YyyIcon />
</XxxButton>

✅ Correct

<XxxButton>
  <YyyIcon />
  Hoge
</XxxButton>
<XxxButton>
  <YyyIcon />
  <AnyComponent />
</XxxButton>
<XxxButton>
  <YyyIcon visuallyHiddenText="hoge" />
</XxxButton>

smarthr/format-import-path

  • importする際のpathをフォーマットするruleです
  • ディレクトリ構造からドメインを識別して相対パス、絶対パスいずれかにするかを判定することが出来ます
    • 例: crews/index 以下同士でのimportは相対パス、crews/index外のファイルimportする場合は絶対パスにする
  • eslint を --fix オプション付きで実行すると自動的にパスを置き換えます

config

  • tsconfig.json の compilerOptions.pathsに '@/*' としてroot path を指定する必要があります
  • ドメインを識別するために以下の設定を記述する必要があります
    • globalModuleDir
      • 全体で利用するファイルを収めているディレクトリを相対パスで指定します
    • domainModuleDir:
      • ドメイン内で共通のファイルを収めているディレクトリ名を指定します
    • domainConstituteDir
      • ドメインを構築するディレクトリ名を指定します
ディレクトリ例
/ constants
/ modules  // 全体共通ディレクトリ
/ crews
  / modules // 共通ディレクトリ
    / views
      / parts
  / index
    / adapters
      / index.ts
      / hoge.ts
    / slices
      / index.ts
    / views
      / index.ts
      / parts
        / Abc.ts
  / show
    / views
      / parts
指定例
const DOMAIN_RULE_ARGS = {
  globalModuleDir: [ './constants', './modules' ],
  domainModuleDir: [ 'modules' ],
  domainConstituteDir: [ 'adapters', 'slices', 'views', 'parts' ],
}

rules

{
  rules: {
    'smarthr/format-import-path': [
      'error', // 'warn', 'off'
      {
        ...DOMAIN_RULE_ARGS,
        format: {
          // 'relative', 'auto', 'none'
          // all: 'absolute',
          outside: 'auto',
          globalModule: 'absolute',
          module: 'relative',
          domain: 'relative',
          lower: 'relative',
        },
      },
    ],
  },
}

❌ Incorrect

// crews/index/views/index.js

import slice from '@/crews/index/slice'
import hoge from '@/crews/index/adapter/hoge'
import Abc from '@/crews/index/views/parts/Abc'
import modulePart from '@/crews/modules/views/part'
import showPart from '../../show/views/parts'
import globalModulePart from '../../../module/views/part'

✅ Correct

// crews/index/views/index.js

import slice from '../slice'
import hoge from '../adapter/hoge'
import Abc from './parts/Abc'
import modulePart from '../../modules/views/parts'
import showPart from '@/crews/show/views/parts'
import globalModulePart from '@/modules/views/parts'

smarthr/jsx-start-with-spread-attributes

  • jsxを記述する際、意図しない属性の上書きを防ぐため、spread-attributesを先に指定するように強制するruleです
  • eslint を --fix オプション付きで実行する際、 fix option を true にすると自動修正します

rules

{
  rules: {
    'smarthr/jsx-start-with-spread-attributes': [
      'error', // 'warn', 'off'
      {
        fix: false, // true
      },
    ]
  },
}

❌ Incorrect

<AnyComponent hoge="hoge" {...props} />

✅ Correct

<AnyComponent {...props} hoge="hoge" />

smarthr/no-import-other-domain

  • ドメイン外からのimportを防ぐruleです
    • 例: crews/index 以下からのimportはOK, crews/index から crews/show 以下をimportするとNG
  • ディレクトリ構造からドメインを識別して判定することが出来ます

config

  • tsconfig.json の compilerOptions.pathsに '@/*' としてroot path を指定する必要があります
  • ドメインを識別するために以下の設定を記述する必要があります
    • globalModuleDir
      • 全体で利用するファイルを収めているディレクトリを相対パスで指定します
    • domainModuleDir:
      • ドメイン内で共通のファイルを収めているディレクトリ名を指定します
    • domainConstituteDir
      • ドメインを構築するディレクトリ名を指定します
ディレクトリ例
/ constants
/ modules  // 全体共通ディレクトリ
/ crews
  / modules // 共通ディレクトリ
    / views
      / parts
  / index
    / adapters
      / index.ts
      / hoge.ts
    / slices
      / index.ts
    / views
      / index.ts
      / parts
        / Abc.ts
  / show
    / views
      / parts
指定例
const DOMAIN_RULE_ARGS = {
  globalModuleDir: [ './constants', './modules' ],
  domainModuleDir: [ 'modules' ],
  domainConstituteDir: [ 'adapters', 'slices', 'views', 'parts' ],
}

rules

{
  rules: {
    'smarthr/no-import-other-domain': [
      'error', // 'warn', 'off'
      {
        ...DOMAIN_RULE_ARGS,
        // analyticsMode: 'all', // 'same-domain', 'another-domain'
      }
    ]
  },
}

❌ Incorrect

// crews/index/views/index.js

import showPart1 from '@/crews/show/views/parts'
import showPart2 from '../../show/views/parts'

✅ Correct

// crews/index/views/index.js

import slice from '../slice'
import hoge from '../adapter/hoge'
import Abc from './parts/Abc'
import modulePart from '../../modules/views/parts'
import globalModulePart from '@/modules/views/parts'

smarthr/prohibit-import

  • 例えば特定の module にバグが発見されたなど、importさせたくない場合に利用するルールです

rules

{
  rules: {
    'smarthr/prohibit-import': [
      'error', // 'warn', 'off'
      {
        '^.+$': {
          'smarthr-ui': {
            imported: ['SecondaryButtonAnchor'],
            reportMessage: `{{module}}/{{export}} はXxxxxxなので利用せず yyyy/zzzz を利用してください`
          }, 
        }
        '\/pages\/views\/': {
          'query-string': {
            imported: true,
          },
        },
      }
    ]
  },
}

❌ Incorrect

// src/pages/views/Page.tsx
import queryString from 'query-string'
import { SecondaryButtonAnchor } from 'smarthr-ui'

✅ Correct

// src/pages/views/Page.tsx
import { PrimaryButton, SecondaryButton } from 'smarthr-ui'

smarthr/require-import

  • 対象ファイルにimportを強制させたい場合に利用します
    • 例: Page.tsx ではページタイトルを設定させたいので useTitle を必ずimportさせたい

rules

{
  rules: {
    'smarthr/require-import': [
      'error',
      {
        'Buttons\/.+\.tsx': {
          'smarthr-ui': {
            imported: ['SecondaryButton'],
            reportMessage: 'Buttons以下のコンポーネントでは {{module}}/{{export}} を拡張するようにしてください',
          },
        },
        'Page.tsx$': {
          './client/src/hooks/useTitle': {
            imported: true,
            reportMessage: '{{module}} を利用してください(ページタイトルを設定するため必要です)',
          },
        },
      },
    ]
  },
}

❌ Incorrect

// client/src/Buttons/SecondaryButton.tsx
import { SecondaryButtonAnchor } from 'smarthr-ui'

// client/src/Page.tsx
import { SecondaryButton } from 'smarthr-ui'

✅ Correct

// client/src/Buttons/SecondaryButton.tsx
import { SecondaryButton } from 'smarthr-ui'

// client/src/Page.tsx
import useTitle from '.hooks/useTitle'

smarthr/require-barrel-import

  • tsconfig.json の compilerOptions.pathsに '@/*' としてroot path を指定する必要があります
  • importした対象が本来exportされているべきであるbarrel(index.tsなど)が有る場合、import pathの変更を促します
    • 例: Page/parts/Menu/Item の import は Page/parts/Menu から行わせたい
  • ディレクトリ内のindexファイルを捜査し、対象を決定します

rules

{
  rules: {
    'smarthr/require-barrel-import': 'error',
  },
}

❌ Incorrect

// client/src/views/Page/parts/Menu/index.ts
export { Menu } from './Menu'
export { Item } from './Item'

// client/src/App.tsx
import { Item } from './Page/parts/Menu/Item'

✅ Correct

// client/src/views/Page/parts/Menu/index.ts
export { Menu } from './Menu'
export { Item } from './Item'

// client/src/App.tsx
import { Item } from './Page/parts/Menu'

smarthr/redundant-name

  • ファイル、コードの冗長な部分を取り除くことを提案するruleです
  • ファイルが設置されているディレクトリ構造からキーワードを生成し、取り除く文字列を生成します

config

  • tsconfig.json の compilerOptions.pathsに '@/*' としてroot path を指定する必要があります
  • 以下の設定を行えます。全て省略可能です。
    • ignoreKeywords
      • ディレクトリ名から生成されるキーワードに含めたくない文字列を指定します
    • betterNames
      • 対象の名前を修正する候補を指定します
    • suffix:
      • type のみ指定出来ます
      • type のsuffixを指定します
ファイル例
  • @/crews/index/views/page.tsx の場合
    • 生成されるキーワードは ['crews', 'crew', 'index', 'page']
  • @/crews/index/views/parts/Abc.tsx の場合
    • 生成されるキーワードは ['crews', 'crew', 'index', 'Abc']
  • @/crews/index/repositories/index.ts の場合
    • 生成されるキーワードは ['crews', 'crew', 'index', 'repositories', 'repository']

rules

const ignorekeywords = ['views', 'parts']
const betterNames = {
  '\/repositories\/': {
    operator: '-',
    names: ['repository', 'Repository'],
  },
  '\/entities\/': {
    operator: '+',
    names: ['entity'],
  },
  '\/slices\/': {
    operator: '=',
    names: ['index'],
  },
}

{
  rules: {
    'smarthr/redundant-name': [
      'error', // 'warn', 'off'
      {
        type: { ignorekeywords, suffix: ['Props', 'Type'] },
        file: { ignorekeywords, betternames },
        // property: { ignorekeywords },
        // function: { ignorekeywords },
        // variable: { ignorekeywords },
        // class: { ignorekeywords },
      }
    ]
  },
}

❌ Incorrect

// @/crews/index/views/page.tsx

type CrewIndexPage = { hoge: string }
type CrewsView = { hoge: string }
// @/crews/show/repositories/index.tsx

type CrewIndexRepository = { hoge: () => any }

✅ Correct

// @/crews/index/views/page.tsx

type ItemProps = { hoge: string }
// @/crews/show/repositories/index.tsx

type IndexProps = { hoge: () => any }
type ResponseType = { hoge: () => any }
``

Keywords

FAQs

Package last updated on 09 Mar 2022

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc