Skip to content

Commit

Permalink
feat: add exclude mode
Browse files Browse the repository at this point in the history
  • Loading branch information
He110te4m committed Mar 31, 2023
1 parent eabb5da commit 52c2fa7
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 3 deletions.
24 changes: 24 additions & 0 deletions apps/vscode-circular-dependency/README-zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,30 @@
"index.js",
"index.cjs",
"index.mjs"
],

// 用于处理大型项目的边界问题。
// 忽略特定后缀的文件名。
// 默认忽略 `.md`、`.d.ts`。
"vscode-circular-dependency.exclude-suffix-list": [
".md",
".d.ts"
],

// 用于处理大型项目的边界问题。
// 忽略特定目录中的所有文件。
// 默认忽略 `node_modules`。
// 支持相对路径 / 绝对路径,使用相对路径时默认相对项目根目录
"vscode-circular-dependency.exclude-directories": [
"./node_modules"
],

// 用于处理大型项目的边界问题。
// 忽略特定模块的所有导入。
// 将直接与 `import` 语句关联。
// 配置为 `a/b` 时,导入 `a/b`、`a/b/c`、`a/b/c/d` 等都将被忽略,用于处理 monorepo 或者跨项目使用等常见
"vscode-circular-dependency.exclude-modules": [
"./node_modules"
]
}
```
Expand Down
24 changes: 24 additions & 0 deletions apps/vscode-circular-dependency/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,30 @@
"index.js",
"index.cjs",
"index.mjs"
],

// Used to handle boundary issues for large projects.
// File names with specific suffixes are ignored.
// Ignore by default: `.md`、`.d.ts`。
"vscode-circular-dependency.exclude-suffix-list": [
".md",
".d.ts"
],

// Used to handle boundary issues for large projects.
// All files in a specific directory are ignored.
// Ignore by default: `node_modules`。
// Relative/absolute paths are supported, and the default relative project root is used when relative paths are used.
"vscode-circular-dependency.exclude-directories": [
"./node_modules"
],

// Used to handle boundary issues for large projects.
// All imports for a particular module are ignored.
// Will be directly associated with the 'import' statement.
// When configured to 'A/B' , importing 'A/B' , 'A/B/C' , 'A/B/C/D' and so on will be ignored. Used for common purposes such as `monorepo` or `cross-project` usage
"vscode-circular-dependency.exclude-modules": [
"./node_modules"
]
}
```
Expand Down
21 changes: 21 additions & 0 deletions apps/vscode-circular-dependency/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,27 @@
"index.mjs"
],
"description": "When the resolved module address is a directory, an attempt is made to match the default index file."
},
"vscode-circular-dependency.exclude-suffix-list": {
"type": "array",
"default": [
".md",
".d.ts"
],
"description": "Module suffixes that need to be excluded."
},
"vscode-circular-dependency.exclude-directories": {
"type": "array",
"default": [
"./node_modules"
],
"description": "Directories that need to be excluded."
},
"vscode-circular-dependency.exclude-modules": {
"type": "array",
"default": [
],
"description": "Module name prefixes that need to be excluded."
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,13 @@ interface Options {
getLineBySubchar: (char: string) => string
}

export function detectCircularDependencies(targetDepPath: string, cacheMap: CacheStoreType) {
interface DetectCircularDependenciesOption {
targetDepPath: string
cacheMap: CacheStoreType
checkDeps: (dep: DependencyResolvedInfo) => boolean
}

export function detectCircularDependencies({ targetDepPath, cacheMap, checkDeps }: DetectCircularDependenciesOption) {
const result: DependencyResolvedInfo[][] = []
const checkedDeps = new Set()
searchDeps(targetDepPath, [])
Expand All @@ -30,6 +36,7 @@ export function detectCircularDependencies(targetDepPath: string, cacheMap: Cach
path: currentDepPath,
getLineBySubchar: makeGetLineTextBySubchar(content),
})
.filter(checkDeps)
if (!deps.length || checkedDeps.has(currentDepPath)) {
return
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,46 @@
import { isAbsolute, relative, resolve } from 'path'
import { existsSync } from 'fs'
import { type TextDocument } from 'vscode'
import type { CacheStoreType } from '../types'
import type { CacheStoreType, DependencyResolvedInfo } from '../types'
import { getExcludeDirectories, getExcludeModules, getExcludeSuffixList } from '../../helpers/config'
import { getWorkspaceFolder } from '../../helpers/path/env'
import { resolveCircularDependencies } from './resolveCircularDependencies'
import { detectCircularDependencies } from './detectCircularDependencies'

export function getFormatterCircularDependencies(cacheMap: CacheStoreType, doc: TextDocument) {
return resolveCircularDependencies(
doc,
detectCircularDependencies(doc.uri.fsPath, cacheMap),
detectCircularDependencies({
targetDepPath: doc.uri.fsPath,
cacheMap,
checkDeps: makeCheckDeps(),
}),
)
}

function makeCheckDeps() {
const excludeSuffixList = getExcludeSuffixList()
const excludeModules = getExcludeModules()
const rootDir = getWorkspaceFolder()
const excludeDirectories = getExcludeDirectories()
.map(dir => isAbsolute(dir) ? dir : resolve(rootDir, dir))
.filter(dir => existsSync(dir))

return ({ dep, resolvedPath }: DependencyResolvedInfo) => {
return checkSuffix(resolvedPath, excludeSuffixList)
&& checkModule(dep, excludeModules)
&& checkDirectories(resolvedPath, excludeDirectories)
}
}

function checkSuffix(path: string, excludeSuffixList: string[]) {
return excludeSuffixList.every(ext => !path.endsWith(ext))
}

function checkModule(dep: string, excludeModules: string[]) {
return excludeModules.every(item => !dep.startsWith(item))
}

function checkDirectories(path: string, excludeDirectories: string[]) {
return excludeDirectories.every(dir => relative(dir, path).startsWith('..'))
}
12 changes: 12 additions & 0 deletions apps/vscode-circular-dependency/src/helpers/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,18 @@ export function getDefaultIndexs() {
return getConfig().get<string[]>('default-indexs', [])
}

export function getExcludeSuffixList() {
return getConfig().get<string[]>('exclude-suffix-list', [])
}

export function getExcludeDirectories() {
return getConfig().get<string[]>('exclude-directories', [])
}

export function getExcludeModules() {
return getConfig().get<string[]>('exclude-modules', [])
}

//#endregion

function getConfig() {
Expand Down
2 changes: 2 additions & 0 deletions packages/utils/tsup.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,5 @@ function getModules(directory: string) {
})
.map(filename => basename(filename, tsSuffix))
}

//#endregion

0 comments on commit 52c2fa7

Please sign in to comment.