Files
pnpm/hooks/read-package-hook/src/createReadPackageHook.ts
Zoltan Kochan 1c8c4e49f5 style: add eslint-plugin-simple-import-sort (#10947)
Add eslint-plugin-simple-import-sort to enforce consistent import ordering:
- Node.js builtins first
- External packages second
- Relative imports last
- Named imports sorted alphabetically within each statement
2026-03-13 02:02:38 +01:00

58 lines
2.0 KiB
TypeScript

import type {
PackageExtension,
PackageManifest,
ProjectManifest,
ReadPackageHook,
} from '@pnpm/types'
import { packageExtensions as compatPackageExtensions } from '@yarnpkg/extensions'
import { isEmpty, pipeWith } from 'ramda'
import { createOptionalDependenciesRemover } from './createOptionalDependenciesRemover.js'
import { createPackageExtender } from './createPackageExtender.js'
import { createVersionsOverrider, type VersionOverrideWithoutRawSelector } from './createVersionsOverrider.js'
export function createReadPackageHook (
{
ignoreCompatibilityDb,
lockfileDir,
overrides,
ignoredOptionalDependencies,
packageExtensions,
readPackageHook,
}: {
ignoreCompatibilityDb?: boolean
lockfileDir: string
overrides?: VersionOverrideWithoutRawSelector[]
ignoredOptionalDependencies?: string[]
packageExtensions?: Record<string, PackageExtension>
readPackageHook?: ReadPackageHook[] | ReadPackageHook
}
): ReadPackageHook | undefined {
const hooks: ReadPackageHook[] = []
if (!ignoreCompatibilityDb) {
hooks.push(createPackageExtender(Object.fromEntries(compatPackageExtensions)))
}
if (!isEmpty(packageExtensions ?? {})) {
hooks.push(createPackageExtender(packageExtensions!))
}
if (Array.isArray(readPackageHook)) {
hooks.push(...readPackageHook)
} else if (readPackageHook) {
hooks.push(readPackageHook)
}
if (!isEmpty(overrides ?? {})) {
hooks.push(createVersionsOverrider(overrides!, lockfileDir))
}
if (ignoredOptionalDependencies && !isEmpty(ignoredOptionalDependencies)) {
hooks.push(createOptionalDependenciesRemover(ignoredOptionalDependencies))
}
if (hooks.length === 0) {
return undefined
}
const readPackageAndExtend = hooks.length === 1
? hooks[0]
: ((pkg: PackageManifest | ProjectManifest, dir: string) => pipeWith(async (f, res) => f(await res, dir), hooks as any)(pkg, dir)) as ReadPackageHook // eslint-disable-line @typescript-eslint/no-explicit-any
return readPackageAndExtend
}