Skip to content

Commit

Permalink
refactor: resolve dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
zkochan committed Aug 26, 2022
1 parent 7db6b33 commit 1efb987
Showing 1 changed file with 65 additions and 49 deletions.
114 changes: 65 additions & 49 deletions packages/resolve-dependencies/src/resolveDependencies.ts
Expand Up @@ -259,11 +259,11 @@ export async function resolveRootDependencies (
importersToResolve.push({ ctx, options, parentPkgAliases, preferredVersions, wantedDependencies })
}
const result = await resolveDependenciesOfImporters(importersToResolve)
const results = await Promise.all(result.map(async (importerResolutionResult, index) => {
const results = await Promise.all(zipWith(async (importerResolutionResult, importerToResolve) => {
const pkgAddresses: Array<PkgAddress | LinkedDependency> = importerResolutionResult.pkgAddresses
const parentPkgAliases = importersToResolve[index].parentPkgAliases
const parentPkgAliases = importerToResolve.parentPkgAliases
while (true) {
if (!importersToResolve[index].ctx.autoInstallPeers) break
if (!importerToResolve.ctx.autoInstallPeers) break
for (const pkgAddress of importerResolutionResult.pkgAddresses) {
parentPkgAliases[pkgAddress.alias] = true
}
Expand All @@ -281,14 +281,14 @@ export async function resolveRootDependencies (
if (!Object.keys(importerResolutionResult.missingPeers).length) break
const wantedDependencies = getNonDevWantedDependencies({ dependencies: importerResolutionResult.missingPeers })

importerResolutionResult = await resolveDependencies(importersToResolve[index].ctx, importersToResolve[index].preferredVersions, wantedDependencies, {
...importersToResolve[index].options,
importerResolutionResult = await resolveDependencies(importerToResolve.ctx, importerToResolve.preferredVersions, wantedDependencies, {
...importerToResolve.options,
parentPkgAliases,
})
pkgAddresses.push(...importerResolutionResult.pkgAddresses)
}
return pkgAddresses
}))
}, result, importersToResolve))
const pkgAddressesByImporterId = {}
Object.keys(importers).forEach((importerId, index) => {
pkgAddressesByImporterId[importerId] = results[index]
Expand Down Expand Up @@ -323,17 +323,22 @@ export async function resolveDependenciesOfImporters (
const resolveResults = await Promise.all(
extendedWantedDepsByImporters.map(async (extendedWantedDeps, index) => {
const postponedResolutionsQueue: PostponedResolutionFunction[] = []
const pkgAddresses = (
await Promise.all(
extendedWantedDeps.map(async (extendedWantedDep) => resolveDependenciesOfDependency(
postponedResolutionsQueue,
importers[index].ctx,
importers[index].preferredVersions,
{ ...importers[index].options, parentPkgAliases: importers[index].parentPkgAliases },
extendedWantedDep
))
)
).filter(Boolean) as PkgAddress[]
const pkgAddresses: PkgAddress[] = []
;(await Promise.all(
extendedWantedDeps.map((extendedWantedDep) => resolveDependenciesOfDependency(
importers[index].ctx,
importers[index].preferredVersions,
{ ...importers[index].options, parentPkgAliases: importers[index].parentPkgAliases },
extendedWantedDep
))
)).forEach(({ resolveDependencyResult, postponedResolution }) => {
if (resolveDependencyResult) {
pkgAddresses.push(resolveDependencyResult as PkgAddress)
}
if (postponedResolution) {
postponedResolutionsQueue.push(postponedResolution)
}
})
return { pkgAddresses, postponedResolutionsQueue }
})
)
Expand Down Expand Up @@ -386,25 +391,30 @@ export async function resolveDependencies (
wantedDependencies: Array<WantedDependency & { updateDepth?: number }>,
options: ResolvedDependenciesOptions
): Promise<ResolvedDependenciesResult> {
const postponedResolutionsQueue: PostponedResolutionFunction[] = []
const extendedWantedDeps = getDepsToResolve(wantedDependencies, ctx.wantedLockfile, {
preferredDependencies: options.preferredDependencies,
prefix: ctx.prefix,
proceed: options.proceed || ctx.forceFullResolution,
registries: ctx.registries,
resolvedDependencies: options.resolvedDependencies,
})
const pkgAddresses = (
await Promise.all(
extendedWantedDeps.map(async (extendedWantedDep) => resolveDependenciesOfDependency(
postponedResolutionsQueue,
ctx,
preferredVersions,
options,
extendedWantedDep
))
)
).filter(Boolean) as PkgAddress[]
const postponedResolutionsQueue: PostponedResolutionFunction[] = []
const pkgAddresses: PkgAddress[] = []
;(await Promise.all(
extendedWantedDeps.map((extendedWantedDep) => resolveDependenciesOfDependency(
ctx,
preferredVersions,
options,
extendedWantedDep
))
)).forEach(({ resolveDependencyResult, postponedResolution }) => {
if (resolveDependencyResult) {
pkgAddresses.push(resolveDependencyResult as PkgAddress)
}
if (postponedResolution) {
postponedResolutionsQueue.push(postponedResolution)
}
})
const newPreferredVersions = { ...preferredVersions }
const newParentPkgAliases = { ...options.parentPkgAliases }
for (const pkgAddress of pkgAddresses) {
Expand Down Expand Up @@ -468,13 +478,17 @@ interface ExtendedWantedDependency {
wantedDependency: WantedDependency & { updateDepth?: number }
}

interface ResolveDependenciesOfDependency {
postponedResolution?: PostponedResolutionFunction
resolveDependencyResult: ResolveDependencyResult
}

async function resolveDependenciesOfDependency (
postponedResolutionsQueue: PostponedResolutionFunction[],
ctx: ResolutionContext,
preferredVersions: PreferredVersions,
options: ResolvedDependenciesOptions,
extendedWantedDep: ExtendedWantedDependency
) {
): Promise<ResolveDependenciesOfDependency> {
const updateDepth = typeof extendedWantedDep.wantedDependency.updateDepth === 'number'
? extendedWantedDep.wantedDependency.updateDepth
: options.updateDepth
Expand Down Expand Up @@ -508,7 +522,7 @@ async function resolveDependenciesOfDependency (
}
const resolveDependencyResult = await resolveDependency(extendedWantedDep.wantedDependency, ctx, resolveDependencyOpts)

if (resolveDependencyResult == null) return null
if (resolveDependencyResult == null) return { resolveDependencyResult: null }
if (resolveDependencyResult.isLinkedDependency) {
ctx.dependenciesTree[resolveDependencyResult.pkgId] = {
children: {},
Expand All @@ -519,24 +533,24 @@ async function resolveDependenciesOfDependency (
version: resolveDependencyResult.version,
},
}
return resolveDependencyResult
return { resolveDependencyResult }
}
if (!resolveDependencyResult.isNew) return resolveDependencyResult

postponedResolutionsQueue.push(async (preferredVersions, parentPkgAliases) =>
resolveChildren(
ctx,
resolveDependencyResult,
parentPkgAliases,
extendedWantedDep.infoFromLockfile?.dependencyLockfile,
options.workspacePackages,
options.currentDepth,
updateDepth,
preferredVersions
)
)
if (!resolveDependencyResult.isNew) return { resolveDependencyResult }

return resolveDependencyResult
return {
resolveDependencyResult,
postponedResolution: async (preferredVersions, parentPkgAliases) =>
resolveChildren(
ctx,
resolveDependencyResult,
parentPkgAliases,
extendedWantedDep.infoFromLockfile?.dependencyLockfile,
options.workspacePackages,
options.currentDepth,
updateDepth,
preferredVersions
),
}
}

async function resolveChildren (
Expand Down Expand Up @@ -784,11 +798,13 @@ interface ResolveDependencyOptions {
workspacePackages?: WorkspacePackages
}

type ResolveDependencyResult = PkgAddress | LinkedDependency | null

async function resolveDependency (
wantedDependency: WantedDependency,
ctx: ResolutionContext,
options: ResolveDependencyOptions
): Promise<PkgAddress | LinkedDependency | null> {
): Promise<ResolveDependencyResult> {
const currentPkg = options.currentPkg ?? {}

const currentLockfileContainsTheDep = currentPkg.depPath
Expand Down

0 comments on commit 1efb987

Please sign in to comment.