| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- /** Verify npm's physical package placement for two incompatible DSH releases. */
- import { readFileSync } from 'node:fs'
- import { posix, resolve } from 'node:path'
- import {
- buildRegistryIndex,
- resolveNpmPackageLock,
- type NpmLockPackage,
- type NpmPackageLock,
- type RegistryIndex,
- } from './benchmark-npm-resolution.ts'
- const DSH_PACKAGE = '@deepseek-ai/dsh'
- const CORDIS_PACKAGE = '@deepseek-ai/cordis'
- const NESTED_DSH_ALIAS = 'dsh-previous'
- const NESTED_DSH_PATH = `node_modules/${NESTED_DSH_ALIAS}`
- const DEPENDENCY_FIELDS = ['dependencies', 'optionalDependencies', 'peerDependencies'] as const
- const TIMEOUT_MS = 300_000
- /** Synthetic incompatible versions used to expose cross-release placement errors. */
- export const SYNTHETIC_DSH_VERSIONS = ['0.1.0', '0.2.0'] as const
- interface MutableRegistryManifest {
- name: string
- version: string
- dependencies?: Record<string, string>
- optionalDependencies?: Record<string, string>
- peerDependencies?: Record<string, string>
- [key: string]: unknown
- }
- /** Summary of a verified two-release npm layout. */
- export interface DshInstallLayoutSummary {
- readonly dshPackagesPerVersion: number
- readonly checkedDshEdges: number
- }
- function isDshPackage(name: string): boolean {
- return name === DSH_PACKAGE || name.startsWith(`${DSH_PACKAGE}-`)
- }
- function cloneForVersion(manifest: object, version: string): MutableRegistryManifest {
- const cloned = structuredClone(manifest) as MutableRegistryManifest
- cloned.version = version
- for (const field of DEPENDENCY_FIELDS) {
- const dependencies = cloned[field]
- if (dependencies === undefined) continue
- for (const name of Object.keys(dependencies)) {
- if (isDshPackage(name)) dependencies[name] = `^${version}`
- }
- }
- return cloned
- }
- /**
- * Replace the working release with two incompatible, internally consistent DSH releases.
- * @param index - Registry metadata containing the working release.
- * @param sourceVersion - Workspace version copied into each synthetic release.
- * @returns Registry metadata containing both synthetic DSH releases and unchanged external packages.
- */
- export function buildDualDshRegistry(index: RegistryIndex, sourceVersion: string): RegistryIndex {
- const output = new Map(index)
- let dshPackages = 0
- for (const [name, versions] of index) {
- if (!isDshPackage(name)) {
- output.set(name, versions)
- continue
- }
- const source = versions.get(sourceVersion)
- if (source === undefined) throw new Error(`${name} has no workspace version ${sourceVersion}`)
- dshPackages++
- output.set(name, new Map(SYNTHETIC_DSH_VERSIONS.map(version => [
- version,
- cloneForVersion(source, version),
- ])))
- }
- if (dshPackages === 0) throw new Error('registry contains no DSH packages')
- return output
- }
- function packageNameAtPath(path: string, manifest: NpmLockPackage): string | undefined {
- if (manifest.name !== undefined) return manifest.name
- const marker = 'node_modules/'
- const markerIndex = path.lastIndexOf(marker)
- if (markerIndex < 0) return undefined
- const segments = path.slice(markerIndex + marker.length).split('/')
- if (segments[0]?.startsWith('@')) {
- return segments[1] === undefined ? undefined : `${segments[0]}/${segments[1]}`
- }
- return segments[0]
- }
- function resolvePackagePath(
- packages: Readonly<Record<string, NpmLockPackage>>,
- sourcePath: string,
- dependency: string,
- ): string | undefined {
- let directory = sourcePath
- while (directory !== '.') {
- const candidate = posix.join(directory, 'node_modules', dependency)
- if (packages[candidate] !== undefined) return candidate
- directory = posix.dirname(directory)
- }
- const rootCandidate = posix.join('node_modules', dependency)
- return packages[rootCandidate] === undefined ? undefined : rootCandidate
- }
- function setDifference(left: ReadonlySet<string>, right: ReadonlySet<string>): string[] {
- return [...left].filter(value => !right.has(value)).sort()
- }
- /**
- * Assert that npm isolates both DSH releases while sharing the Cordis runtime.
- * @param packageLock - Metadata-only package lock produced by npm.
- * @returns Counts for the verified DSH packages and dependency edges.
- */
- export function assertDualDshInstallLayout(packageLock: NpmPackageLock): DshInstallLayoutSummary {
- const [nestedVersion, rootVersion] = SYNTHETIC_DSH_VERSIONS
- const errors: string[] = []
- const namesByVersion = new Map<string, Set<string>>([
- [nestedVersion, new Set()],
- [rootVersion, new Set()],
- ])
- const installed = Object.entries(packageLock.packages)
- let checkedDshEdges = 0
- for (const [path, manifest] of installed) {
- const name = packageNameAtPath(path, manifest)
- if (name === undefined || !isDshPackage(name)) continue
- const version = manifest.version
- if (version !== nestedVersion && version !== rootVersion) {
- errors.push(`${path}: expected DSH version ${nestedVersion} or ${rootVersion}, got ${String(version)}`)
- continue
- }
- namesByVersion.get(version)?.add(name)
- const expectedPath = version === rootVersion
- ? `node_modules/${name}`
- : name === DSH_PACKAGE
- ? NESTED_DSH_PATH
- : `${NESTED_DSH_PATH}/node_modules/${name}`
- if (path !== expectedPath) {
- errors.push(`${path}: expected ${name}@${version} at ${expectedPath}`)
- }
- for (const field of DEPENDENCY_FIELDS) {
- for (const dependency of Object.keys(manifest[field] ?? {})) {
- if (!isDshPackage(dependency)) continue
- const targetPath = resolvePackagePath(packageLock.packages, path, dependency)
- const optionalPeer = field === 'peerDependencies'
- && manifest.peerDependenciesMeta?.[dependency]?.optional === true
- if (targetPath === undefined) {
- if (field === 'optionalDependencies' || optionalPeer) continue
- errors.push(`${path}: ${field} ${dependency} does not resolve`)
- continue
- }
- checkedDshEdges++
- const targetVersion = packageLock.packages[targetPath]?.version
- if (targetVersion !== version) {
- errors.push(
- `${path}: ${field} ${dependency} resolves to ${targetPath}@${String(targetVersion)}, expected ${version}`,
- )
- }
- }
- }
- }
- const nestedNames = namesByVersion.get(nestedVersion) ?? new Set<string>()
- const rootNames = namesByVersion.get(rootVersion) ?? new Set<string>()
- if (!nestedNames.has(DSH_PACKAGE)) errors.push(`${NESTED_DSH_PATH}: missing ${DSH_PACKAGE}@${nestedVersion}`)
- if (!rootNames.has(DSH_PACKAGE)) errors.push(`node_modules/${DSH_PACKAGE}: missing ${DSH_PACKAGE}@${rootVersion}`)
- const onlyNested = setDifference(nestedNames, rootNames)
- const onlyRoot = setDifference(rootNames, nestedNames)
- if (onlyNested.length > 0) errors.push(`only ${nestedVersion} contains: ${onlyNested.join(', ')}`)
- if (onlyRoot.length > 0) errors.push(`only ${rootVersion} contains: ${onlyRoot.join(', ')}`)
- const cordisPaths = installed.flatMap(([path, manifest]) =>
- packageNameAtPath(path, manifest) === CORDIS_PACKAGE ? [path] : [])
- if (cordisPaths.length !== 1 || cordisPaths[0] !== `node_modules/${CORDIS_PACKAGE}`) {
- errors.push(`expected one shared ${CORDIS_PACKAGE} at node_modules/${CORDIS_PACKAGE}, got ${cordisPaths.join(', ')}`)
- }
- if (errors.length > 0) throw new Error(`invalid npm install layout:\n${errors.map(error => ` - ${error}`).join('\n')}`)
- return { dshPackagesPerVersion: rootNames.size, checkedDshEdges }
- }
- function workspaceVersion(root: string): string {
- const manifest = JSON.parse(readFileSync(resolve(root, 'apps/cli/package.json'), 'utf8')) as { version?: unknown }
- if (typeof manifest.version !== 'string') throw new Error('apps/cli/package.json has no string version')
- return manifest.version
- }
- async function main(): Promise<void> {
- const root = resolve(import.meta.dirname, '..')
- const index = buildDualDshRegistry(buildRegistryIndex(root), workspaceVersion(root))
- const [nestedVersion, rootVersion] = SYNTHETIC_DSH_VERSIONS
- const result = await resolveNpmPackageLock(index, {
- [DSH_PACKAGE]: rootVersion,
- [NESTED_DSH_ALIAS]: `npm:${DSH_PACKAGE}@${nestedVersion}`,
- }, TIMEOUT_MS)
- if (result.archiveRequests !== 0) throw new Error(`npm requested ${String(result.archiveRequests)} package archive(s)`)
- const summary = assertDualDshInstallLayout(result.packageLock)
- console.log(
- `verify-npm-install-layout: ${String(summary.dshPackagesPerVersion)} DSH package(s) per release and `
- + `${String(summary.checkedDshEdges)} internal edge(s) verified in ${(result.durationMs / 1000).toFixed(2)} s; `
- + `both releases share one Cordis installation; ${String(result.unknownPackages.length)} unavailable optional `
- + 'package name(s) ignored by npm.',
- )
- }
- if (import.meta.main) {
- try {
- await main()
- } catch (error) {
- console.error(`verify-npm-install-layout: ${error instanceof Error ? error.message : String(error)}`)
- process.exitCode = 1
- }
- }
|