benchmark-next-package-dependency.spec.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { describe, expect, it } from 'vitest'
  2. import {
  3. applyFactsToRegistry,
  4. discoverBenchmarkCandidates,
  5. parseNextPackageBenchmarkOptions,
  6. type MutableRegistryManifest,
  7. } from './benchmark-next-package-dependency.ts'
  8. import type {
  9. PackageDependencyFacts,
  10. PackageDependencyManifest,
  11. WorkspacePackageManifest,
  12. } from './verify-package-dependencies.ts'
  13. import type { RegistryIndex } from './benchmark-npm-resolution.ts'
  14. describe('next package benchmark options', () => {
  15. it('parses candidate and repetition controls', () => {
  16. expect(parseNextPackageBenchmarkOptions([
  17. '--',
  18. '--candidates=@f/a,@f/b',
  19. '--runs=2',
  20. '--finalist-runs=4',
  21. '--finalists=3',
  22. '--jobs=6',
  23. '--timeout-ms=9000',
  24. ])).toEqual({
  25. candidates: ['@f/a', '@f/b'],
  26. coarseRuns: 2,
  27. finalistRuns: 4,
  28. finalists: 3,
  29. jobs: 6,
  30. timeoutMs: 9000,
  31. })
  32. })
  33. it('rejects invalid positive integers', () => {
  34. expect(() => parseNextPackageBenchmarkOptions(['--jobs=0'])).toThrow('--jobs must be a positive integer')
  35. })
  36. })
  37. describe('next package benchmark graph', () => {
  38. it('applies a source-derived candidate without changing the filesystem', () => {
  39. const manifest: PackageDependencyManifest & { version: string } = {
  40. name: '@f/probe',
  41. version: '1.0.0',
  42. peerDependencies: {
  43. '@deepseek-ai/cordis': 'workspace:^',
  44. '@f/runtime': 'workspace:^',
  45. '@f/types': 'workspace:^',
  46. },
  47. devDependencies: {
  48. '@deepseek-ai/cordis': 'workspace:^',
  49. '@f/runtime': 'workspace:^',
  50. '@f/types': 'workspace:^',
  51. },
  52. }
  53. const facts: PackageDependencyFacts = {
  54. manifestPath: 'packages/g/probe/package.json',
  55. role: 'configured-host',
  56. manifest,
  57. workspaceNames: new Set(['@deepseek-ai/cordis', '@f/probe', '@f/runtime', '@f/types']),
  58. allSourceUses: new Map([
  59. ['@f/runtime', ['packages/g/probe/src/index.ts']],
  60. ['@f/types', ['packages/g/probe/src/types.ts']],
  61. ]),
  62. hostRuntimeSourceUses: new Map([['@f/runtime', ['packages/g/probe/src/index.ts']]]),
  63. hostRuntimeExportUses: [{
  64. packageName: '@f/runtime',
  65. specifier: '@f/runtime',
  66. exportName: 'runtimeValue',
  67. sourcePath: 'packages/g/probe/src/index.ts',
  68. line: 1,
  69. column: 10,
  70. sourceLine: "import { runtimeValue } from '@f/runtime'",
  71. }],
  72. peerRequiredHostDependencies: new Set(),
  73. configurationOnlyDevDependencies: new Set(),
  74. clientInject: new Set(),
  75. }
  76. const index = new Map<string, Map<string, MutableRegistryManifest>>([
  77. ['@f/probe', new Map([['1.0.0', structuredClone(manifest) as MutableRegistryManifest]])],
  78. ])
  79. applyFactsToRegistry(index, facts, new Map([
  80. ['@deepseek-ai/cordis', '4.0.1'],
  81. ['@f/probe', '1.0.0'],
  82. ['@f/runtime', '2.0.0'],
  83. ['@f/types', '3.0.0'],
  84. ]))
  85. expect(index.get('@f/probe')?.get('1.0.0')).toMatchObject({
  86. dependencies: { '@f/runtime': '^2.0.0' },
  87. peerDependencies: { '@deepseek-ai/cordis': '^4.0.1' },
  88. })
  89. expect(index.get('@f/probe')?.get('1.0.0')?.dependencies).not.toHaveProperty('@f/types')
  90. })
  91. it('finds reachable unconfigured packages with non-Cordis peers', () => {
  92. const index = new Map([
  93. ['@deepseek-ai/dsh', new Map([['1.0.0', {
  94. name: '@deepseek-ai/dsh', version: '1.0.0', dependencies: { '@f/a': '^1.0.0', '@f/b': '^1.0.0' },
  95. }]])],
  96. ['@f/a', new Map([['1.0.0', {
  97. name: '@f/a', version: '1.0.0', peerDependencies: { '@f/runtime': '^1.0.0' },
  98. }]])],
  99. ['@f/b', new Map([['1.0.0', {
  100. name: '@f/b', version: '1.0.0', peerDependencies: { '@deepseek-ai/cordis': '^4.0.0' },
  101. }]])],
  102. ['@f/runtime', new Map([['1.0.0', { name: '@f/runtime', version: '1.0.0' }]])],
  103. ]) as RegistryIndex
  104. const release = new Map<string, WorkspacePackageManifest>([
  105. ['@f/a', {
  106. name: '@f/a', dir: 'packages/g/a', manifestPath: 'packages/g/a/package.json', manifest: { name: '@f/a' },
  107. }],
  108. ['@f/b', {
  109. name: '@f/b', dir: 'packages/g/b', manifestPath: 'packages/g/b/package.json', manifest: { name: '@f/b' },
  110. }],
  111. ])
  112. expect(discoverBenchmarkCandidates(
  113. index,
  114. new Map([['@deepseek-ai/dsh', '1.0.0'], ['@f/a', '1.0.0'], ['@f/b', '1.0.0']]),
  115. release,
  116. new Set(),
  117. )).toEqual(['@f/a'])
  118. })
  119. })