verify-npm-install-layout.spec.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { describe, expect, it } from 'vitest'
  2. import type { NpmPackageLock, RegistryIndex } from './benchmark-npm-resolution.ts'
  3. import {
  4. assertDualDshInstallLayout,
  5. buildDualDshRegistry,
  6. } from './verify-npm-install-layout.ts'
  7. function validLayout(): NpmPackageLock {
  8. return {
  9. lockfileVersion: 3,
  10. packages: {
  11. '': { dependencies: { '@deepseek-ai/dsh': '0.2.0', 'dsh-previous': 'npm:@deepseek-ai/dsh@0.1.0' } },
  12. 'node_modules/@deepseek-ai/cordis': { version: '4.0.1' },
  13. 'node_modules/@deepseek-ai/dsh': {
  14. version: '0.2.0',
  15. dependencies: { '@deepseek-ai/dsh-child': '^0.2.0' },
  16. peerDependencies: { '@deepseek-ai/cordis': '^4.0.1' },
  17. },
  18. 'node_modules/@deepseek-ai/dsh-child': {
  19. version: '0.2.0',
  20. dependencies: { '@deepseek-ai/dsh-leaf': '^0.2.0' },
  21. },
  22. 'node_modules/@deepseek-ai/dsh-leaf': { version: '0.2.0' },
  23. 'node_modules/dsh-previous': {
  24. name: '@deepseek-ai/dsh',
  25. version: '0.1.0',
  26. dependencies: { '@deepseek-ai/dsh-child': '^0.1.0' },
  27. peerDependencies: { '@deepseek-ai/cordis': '^4.0.1' },
  28. },
  29. 'node_modules/dsh-previous/node_modules/@deepseek-ai/dsh-child': {
  30. version: '0.1.0',
  31. dependencies: { '@deepseek-ai/dsh-leaf': '^0.1.0' },
  32. },
  33. 'node_modules/dsh-previous/node_modules/@deepseek-ai/dsh-leaf': { version: '0.1.0' },
  34. },
  35. }
  36. }
  37. describe('npm install layout verifier', () => {
  38. it('creates two incompatible versions of every DSH package', () => {
  39. const index: RegistryIndex = new Map([
  40. ['@deepseek-ai/dsh', new Map([['0.1.1-rc.2', {
  41. name: '@deepseek-ai/dsh',
  42. version: '0.1.1-rc.2',
  43. dependencies: { '@deepseek-ai/dsh-child': '^0.1.1-rc.2' },
  44. peerDependencies: { '@deepseek-ai/cordis': '^4.0.1' },
  45. }]])],
  46. ['@deepseek-ai/dsh-child', new Map([['0.1.1-rc.2', {
  47. name: '@deepseek-ai/dsh-child',
  48. version: '0.1.1-rc.2',
  49. }]])],
  50. ['@deepseek-ai/cordis', new Map([['4.0.1', {
  51. name: '@deepseek-ai/cordis',
  52. version: '4.0.1',
  53. }]])],
  54. ])
  55. const dual = buildDualDshRegistry(index, '0.1.1-rc.2')
  56. expect([...dual.get('@deepseek-ai/dsh')?.keys() ?? []]).toEqual(['0.1.0', '0.2.0'])
  57. expect(dual.get('@deepseek-ai/dsh')?.get('0.1.0')).toMatchObject({
  58. version: '0.1.0',
  59. dependencies: { '@deepseek-ai/dsh-child': '^0.1.0' },
  60. peerDependencies: { '@deepseek-ai/cordis': '^4.0.1' },
  61. })
  62. expect(dual.get('@deepseek-ai/dsh')?.get('0.2.0')).toMatchObject({
  63. version: '0.2.0',
  64. dependencies: { '@deepseek-ai/dsh-child': '^0.2.0' },
  65. })
  66. expect(dual.get('@deepseek-ai/cordis')).toBe(index.get('@deepseek-ai/cordis'))
  67. })
  68. it('accepts isolated DSH releases with one shared Cordis installation', () => {
  69. expect(assertDualDshInstallLayout(validLayout())).toEqual({
  70. dshPackagesPerVersion: 3,
  71. checkedDshEdges: 4,
  72. })
  73. })
  74. it.each([
  75. ['react', 'node_modules/react'],
  76. ['react-dom', 'node_modules/react-dom'],
  77. ['react', 'node_modules/dsh-previous/node_modules/react'],
  78. ['react-dom', 'node_modules/dsh-previous/node_modules/react-dom'],
  79. ])('rejects browser runtime %s installed at %s in the DSH-only consumer', (name, path) => {
  80. const layout = validLayout()
  81. const packages = { ...layout.packages, [path]: { version: '18.3.1' } }
  82. expect(() => assertDualDshInstallLayout({ ...layout, packages })).toThrow(
  83. `${path}: ${name} is a browser build input`,
  84. )
  85. })
  86. it('rejects an internal edge that crosses release versions', () => {
  87. const layout = validLayout()
  88. const packages = { ...layout.packages }
  89. Reflect.deleteProperty(packages, 'node_modules/dsh-previous/node_modules/@deepseek-ai/dsh-leaf')
  90. expect(() => assertDualDshInstallLayout({ ...layout, packages })).toThrow(
  91. 'node_modules/dsh-previous/node_modules/@deepseek-ai/dsh-child: dependencies '
  92. + '@deepseek-ai/dsh-leaf resolves to node_modules/@deepseek-ai/dsh-leaf@0.2.0, expected 0.1.0',
  93. )
  94. })
  95. it('rejects a second Cordis installation', () => {
  96. const layout = validLayout()
  97. const packages = {
  98. ...layout.packages,
  99. 'node_modules/dsh-previous/node_modules/@deepseek-ai/cordis': { version: '4.0.1' },
  100. }
  101. expect(() => assertDualDshInstallLayout({ ...layout, packages })).toThrow(
  102. 'expected one shared @deepseek-ai/cordis',
  103. )
  104. })
  105. })