Skip to content

Commit 277683e

Browse files
committed
feat: eslint custom rules
1 parent 7720c19 commit 277683e

17 files changed

+58
-37
lines changed

eslint.config.mjs

+6-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import globals from 'globals'
22
import pluginJs from '@eslint/js'
33
import tseslint from 'typescript-eslint'
44
import pluginVue from 'eslint-plugin-vue'
5-
import customRules from './rules/eslint-plugin-custom-rules.js'
5+
import customRules from './rules/require-file-extension-plugin.js'
66

77
export default [
88
{ files: ['**/*.{js,mjs,cjs,ts,vue}'] },
@@ -14,23 +14,18 @@ export default [
1414
{ ignores: ['**/*.d.ts'] },
1515
{
1616
plugins: {
17-
'custom-rules': customRules
17+
'brenoepics': customRules
1818
},
1919
rules: {
2020
'no-restricted-imports': [
2121
'error',
2222
{
23-
name: 'vitepress',
24-
importNames: ['DefaultTheme']
23+
name: 'vitepress/theme',
24+
importNames: ['DefaultTheme'],
2525
}
2626
],
27-
//'no-restricted-imports': [
28-
// 'error',
29-
// {
30-
// patterns: ['^(?!.*\\.[a-z]+$).*'],
31-
// }
32-
//],
33-
'custom-rules/require-file-extension-in-exports': 'error',
27+
'brenoepics/require-file-extension-in-exports': 'error',
28+
'brenoepics/require-file-extension-in-imports': 'error',
3429
'vue/multi-word-component-names': 'off'
3530
}
3631
}

packages/cli/src/commands/init.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type { PackageManagerName } from 'nypm'
66
import { installDependencies } from 'nypm'
77
import { defineCommand } from 'citty'
88

9-
import { sharedArgs } from './_shared'
9+
import { sharedArgs } from './_shared.js'
1010
import { stringify } from 'yaml'
1111
import { promises as fsp } from 'node:fs'
1212
import { dependabotTemplate, githubPagesTemplate } from '../utils/templates'

packages/cli/src/run.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
import { fileURLToPath } from 'node:url'
33
import { runCommand as _runCommand, runMain as _runMain } from 'citty'
44

5-
import { commands } from './commands'
6-
import { main } from './main'
5+
import { commands } from './commands/index.js'
6+
import { main } from './main.js'
77
globalThis.__vp_cli__ = globalThis.__vp_cli__ || {
88
// Programmatic usage fallback
99
startTime: Date.now(),

packages/theme/src/theme/CarbonTheme.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-namespace */
12
import type { Options as MiniSearchOptions } from 'minisearch'
23
import type { ComputedRef, Ref, ShallowRef } from 'vue'
34

packages/theme/src/theme/Layout.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import VPLocalNav from './components/VPLocalNav.vue'
88
import VPNav from './components/VPNav.vue'
99
import VPSidebar from './components/VPSidebar.vue'
1010
import VPSkipLink from './components/VPSkipLink.vue'
11-
import { useData } from './composables/data'
12-
import { useCloseSidebarOnEscape, useSidebar } from './composables/sidebar'
11+
import { useData } from './composables/data.js'
12+
import { useCloseSidebarOnEscape, useSidebar } from './composables/sidebar.js'
1313
1414
const {
1515
isOpen: isSidebarOpen,

packages/theme/src/theme/NotFound.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<script setup lang="ts">
22
import { onMounted, ref } from 'vue'
33
import { withBase } from 'vitepress'
4-
import { useData } from './composables/data'
5-
import { useLanguages } from './composables/langs'
4+
import { useData } from './composables/data.js'
5+
import { useLanguages } from './composables/langs.js'
66
77
const { site, theme } = useData()
88
const { localeLinks } = useLanguages({ removeCurrent: false })

packages/theme/src/theme/components/VPNavBarSearch.vue

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<script lang="ts" setup>
2+
/* eslint-disable @typescript-eslint/no-explicit-any, no-undef */
23
import '@docsearch/css'
34
import { onKeyStroke } from '@vueuse/core'
45
import {

packages/theme/src/theme/composables/aside.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useMediaQuery } from '@vueuse/core'
22
import { computed } from 'vue'
3-
import { useSidebar } from './sidebar'
3+
import { useSidebar } from './sidebar.js'
44

55
export function useAside() {
66
const { hasSidebar } = useSidebar()

packages/theme/src/theme/composables/edit-link.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { computed } from 'vue'
2-
import { useData } from './data'
2+
import { useData } from './data.js'
33

44
export function useEditLink() {
55
const { theme, page } = useData()

packages/theme/src/theme/composables/langs.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { computed } from 'vue'
2-
import { ensureStartingSlash } from '../support/utils'
3-
import { useData } from './data'
4-
import { hashRef } from './hash'
2+
import { ensureStartingSlash } from '../support/utils.js'
3+
import { useData } from './data.js'
4+
import { hashRef } from './hash.js'
55

66
export function useLanguages({
77
removeCurrent = true,

packages/theme/src/theme/composables/local-nav.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { onContentUpdated } from 'vitepress'
22
import type { CarbonTheme } from '../CarbonTheme.js'
33
import { computed, shallowRef } from 'vue'
4-
import { getHeaders, type MenuItem } from './outline'
5-
import { useData } from './data'
4+
import { getHeaders, type MenuItem } from './outline.js'
5+
import { useData } from './data.js'
66

77
export function useLocalNav(): CarbonTheme.DocLocalNav {
88
const { theme, frontmatter } = useData()

packages/theme/src/theme/composables/outline.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { getScrollOffset } from 'vitepress'
22
import type { CarbonTheme } from '../CarbonTheme.js'
33
import { onMounted, onUnmounted, onUpdated, type Ref } from 'vue'
44
import type { Header } from 'vitepress'
5-
import { throttleAndDebounce } from '../support/utils'
6-
import { useAside } from './aside'
5+
import { throttleAndDebounce } from '../support/utils.js'
6+
import { useAside } from './aside.js'
77

88
// cached list of anchor elements from resolveHeaders
99
const resolvedHeaders: { element: HTMLHeadElement; link: string }[] = []

packages/theme/src/theme/composables/prev-next.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/* eslint-disable @typescript-eslint/no-explicit-any */
22
import { computed, type Ref } from 'vue'
3-
import { useData } from './data'
4-
import { isActive } from '../../shared'
5-
import { getSidebar, getFlatSideBarLinks } from '../support/sidebar'
3+
import { useData } from './data.js'
4+
import { isActive } from '../../shared.js'
5+
import { getSidebar, getFlatSideBarLinks } from '../support/sidebar.js'
66
import { type PageData } from 'vitepress'
7-
import type { CarbonTheme } from '../CarbonTheme'
7+
import type { CarbonTheme } from '../CarbonTheme.js'
88

99
export function usePrevNext() {
1010
const { page, theme, frontmatter } = useData()

packages/theme/src/theme/composables/sidebar.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ import {
1515
hasActiveLink as containsActiveLink,
1616
getSidebar,
1717
getSidebarGroups
18-
} from '../support/sidebar'
19-
import { useData } from './data'
20-
import { hashRef } from './hash'
21-
import { isActive } from '../../shared'
18+
} from '../support/sidebar.js'
19+
import { useData } from './data.js'
20+
import { hashRef } from './hash.js'
21+
import { isActive } from '../../shared.js'
2222

2323
export interface SidebarControl {
2424
collapsed: Ref<boolean>

packages/theme/src/theme/config.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
12
import type { PageData } from 'vitepress'
23
import type { ComputedRef, Ref, ShallowRef } from 'vue'
34
import type { MenuItem } from './composables/outline.js'

packages/theme/src/theme/support/sidebar.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { CarbonTheme } from '../CarbonTheme.js'
2-
import { ensureStartingSlash } from './utils'
3-
import { isActive } from '../../shared'
2+
import { ensureStartingSlash } from './utils.js'
3+
import { isActive } from '../../shared.js'
44

55
export interface SidebarLink {
66
text: string

rules/eslint-plugin-custom-rules.js rules/require-file-extension-plugin.js

+23
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,28 @@
11
module.exports = {
22
rules: {
3+
'require-file-extension-in-imports': {
4+
meta: {
5+
type: 'problem',
6+
docs: {
7+
description: 'require file extensions in import statements',
8+
category: 'Best Practices',
9+
recommended: false
10+
},
11+
schema: [] // no options
12+
},
13+
create(context) {
14+
return {
15+
ImportDeclaration(node) {
16+
if (node.source && node.source.value.startsWith('./') && !/\.[a-z]+$/.test(node.source.value)) {
17+
context.report({
18+
node,
19+
message: 'Import statements must include a file extension.'
20+
})
21+
}
22+
}
23+
}
24+
}
25+
},
326
'require-file-extension-in-exports': {
427
meta: {
528
type: 'problem',

0 commit comments

Comments
 (0)