Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ node_modules
/test-*/coverage
.rete-cli
.sonar
/tmp
43 changes: 43 additions & 0 deletions src/shared/dependency-topo.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,47 @@ describe('Dependency topology', () => {

expect(dirs).toEqual([])
})

it('includes devDependencies in topology', () => {
const a: PackageFile = { name: 'a' }
const b: PackageFile = { name: 'b', devDependencies: { a: '' } }
const c: PackageFile = { name: 'c', dependencies: { a: '' }, devDependencies: { b: '' } }

const packages: PackageMeta[] = [
{
folder: './pkgs/a',
config: a
},
{
folder: './pkgs/b',
config: b
},
{
folder: './pkgs/c',
config: c
}
]
const dirs = getDependencyTopo(packages)

expect(dirs).toEqual([
{
dependencies: [],
dependent: ['b', 'c'],
folder: './pkgs/a',
config: a
},
{
dependencies: ['a'],
dependent: ['c'],
folder: './pkgs/b',
config: b
},
{
dependencies: ['a', 'b'],
dependent: [],
folder: './pkgs/c',
config: c
}
])
})
})
5 changes: 3 additions & 2 deletions src/shared/dependency-topo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import toposort from 'toposort'
export type PackageFile = {
name: string
dependencies?: Record<string, string>
devDependencies?: Record<string, string>
peerDependencies?: Record<string, string>
}
export type Dependencies = string[]
Expand All @@ -11,11 +12,11 @@ export type Topology = { dependent: Dependencies, dependencies: Dependencies }

export function getDependencyTopo<T extends PackageMeta>(list: T[]): (T & Topology)[] {
const packages = Object.fromEntries(list.map(item => {
const { config: { name, dependencies, peerDependencies } } = item
const { config: { name, dependencies, devDependencies, peerDependencies } } = item

Copilot AI Jun 30, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When destructuring optional dependency objects, provide defaults to avoid runtime errors (e.g., dependencies = {}, devDependencies = {}, peerDependencies = {}).

Suggested change
const { config: { name, dependencies, devDependencies, peerDependencies } } = item
const { config: { name, dependencies = {}, devDependencies = {}, peerDependencies = {} } } = item

Copilot uses AI. Check for mistakes.

return [name, {
...item,
dependencies: Object.keys({ ...dependencies, ...peerDependencies })
dependencies: Object.keys({ ...dependencies, ...devDependencies, ...peerDependencies })
.filter(dependencyName => list.map(({ config }) => config.name).includes(dependencyName))
Comment on lines 14 to 20

Copilot AI Jun 30, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Avoid rebuilding the package name list on every filter iteration; precompute a Set of valid package names before mapping to achieve O(1) lookups.

Copilot uses AI. Check for mistakes.
}]
}))
Expand Down
Loading