refactor(infra): share one workspace walk between the alias collectors
collectPackageNames repeated collectPackageAliases' directory walk verbatim, which jscpd reported as a 7-line clone and which failed the lint-and-duplication gate on both the Linux and Windows lanes. Both now read one workspacePackages() iterator: the alias collector keeps only packages named after their directory, and the coverage collector keeps every one of them.
This commit is contained in:
parent
c4c3c32931
commit
71b3c50261
1 changed files with 45 additions and 35 deletions
|
|
@ -58,6 +58,34 @@ function packageName(manifest: string): string | undefined {
|
||||||
return typeof name === 'string' ? name : undefined
|
return typeof name === 'string' ? name : undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** One workspace package directory and the name its manifest declares. */
|
||||||
|
interface WorkspacePackage {
|
||||||
|
readonly group: string
|
||||||
|
readonly directory: string
|
||||||
|
readonly packageDir: string
|
||||||
|
readonly name: string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Walk `packages/<group>/<directory>` once, in a stable order.
|
||||||
|
* @returns Every directory whose manifest names a `@deepseek-ai/dsh-` package and that carries `src`.
|
||||||
|
*/
|
||||||
|
function workspacePackages(): WorkspacePackage[] {
|
||||||
|
const packages = join(ROOT, 'packages')
|
||||||
|
const found: WorkspacePackage[] = []
|
||||||
|
for (const group of readdirSync(packages).sort()) {
|
||||||
|
const groupDir = join(packages, group)
|
||||||
|
if (!statSync(groupDir).isDirectory()) continue
|
||||||
|
for (const directory of readdirSync(groupDir).sort()) {
|
||||||
|
const packageDir = join(groupDir, directory)
|
||||||
|
const name = packageName(join(packageDir, 'package.json'))
|
||||||
|
if (name === undefined || !name.startsWith(PREFIX)) continue
|
||||||
|
if (existsSync(join(packageDir, 'src'))) found.push({ group, directory, packageDir, name })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return found
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Collect every package the removed wildcards could resolve.
|
* Collect every package the removed wildcards could resolve.
|
||||||
*
|
*
|
||||||
|
|
@ -71,30 +99,22 @@ function packageName(manifest: string): string | undefined {
|
||||||
* wildcards resolved by group order and an explicit map cannot express.
|
* wildcards resolved by group order and an explicit map cannot express.
|
||||||
*/
|
*/
|
||||||
export function collectPackageAliases(): PackageAlias[] {
|
export function collectPackageAliases(): PackageAlias[] {
|
||||||
const packages = join(ROOT, 'packages')
|
|
||||||
const bySpecifier = new Map<string, PackageAlias & { directory: string }>()
|
const bySpecifier = new Map<string, PackageAlias & { directory: string }>()
|
||||||
for (const group of readdirSync(packages).sort()) {
|
for (const { group, directory, packageDir, name } of workspacePackages()) {
|
||||||
const groupDir = join(packages, group)
|
if (name !== `${PREFIX}${directory}`) continue
|
||||||
if (!statSync(groupDir).isDirectory()) continue
|
const previous = bySpecifier.get(name)
|
||||||
for (const directory of readdirSync(groupDir).sort()) {
|
if (previous !== undefined) {
|
||||||
const packageDir = join(groupDir, directory)
|
throw new Error(
|
||||||
const name = packageName(join(packageDir, 'package.json'))
|
`gen-tsconfig-paths: ${name} is claimed by packages/${previous.directory} and packages/${group}/${directory}; `
|
||||||
if (name === undefined || name !== `${PREFIX}${directory}`) continue
|
+ 'an explicit alias cannot express the group-order tiebreak the wildcard used.',
|
||||||
if (!existsSync(join(packageDir, 'src'))) continue
|
)
|
||||||
const previous = bySpecifier.get(name)
|
|
||||||
if (previous !== undefined) {
|
|
||||||
throw new Error(
|
|
||||||
`gen-tsconfig-paths: ${name} is claimed by packages/${previous.directory} and packages/${group}/${directory}; `
|
|
||||||
+ 'an explicit alias cannot express the group-order tiebreak the wildcard used.',
|
|
||||||
)
|
|
||||||
}
|
|
||||||
bySpecifier.set(name, {
|
|
||||||
specifier: name,
|
|
||||||
source: `./packages/${group}/${directory}/src`,
|
|
||||||
hasInvariant: existsSync(join(packageDir, 'src', 'invariant.ts')),
|
|
||||||
directory: `${group}/${directory}`,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
bySpecifier.set(name, {
|
||||||
|
specifier: name,
|
||||||
|
source: `./packages/${group}/${directory}/src`,
|
||||||
|
hasInvariant: existsSync(join(packageDir, 'src', 'invariant.ts')),
|
||||||
|
directory: `${group}/${directory}`,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return [...bySpecifier.values()]
|
return [...bySpecifier.values()]
|
||||||
.map(({ specifier, source, hasInvariant }) => ({ specifier, source, hasInvariant }))
|
.map(({ specifier, source, hasInvariant }) => ({ specifier, source, hasInvariant }))
|
||||||
|
|
@ -112,19 +132,9 @@ export function collectPackageAliases(): PackageAlias[] {
|
||||||
* @returns Declared names of every `@deepseek-ai/dsh-` package carrying a `src` directory.
|
* @returns Declared names of every `@deepseek-ai/dsh-` package carrying a `src` directory.
|
||||||
*/
|
*/
|
||||||
export function collectPackageNames(): string[] {
|
export function collectPackageNames(): string[] {
|
||||||
const packages = join(ROOT, 'packages')
|
return workspacePackages()
|
||||||
const names: string[] = []
|
.map(({ name }) => name)
|
||||||
for (const group of readdirSync(packages).sort()) {
|
.sort((left, right) => left.localeCompare(right))
|
||||||
const groupDir = join(packages, group)
|
|
||||||
if (!statSync(groupDir).isDirectory()) continue
|
|
||||||
for (const directory of readdirSync(groupDir).sort()) {
|
|
||||||
const packageDir = join(groupDir, directory)
|
|
||||||
const name = packageName(join(packageDir, 'package.json'))
|
|
||||||
if (name === undefined || !name.startsWith(PREFIX)) continue
|
|
||||||
if (existsSync(join(packageDir, 'src'))) names.push(name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return names.sort((left, right) => left.localeCompare(right))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue