installed-product-isolation.spec.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /** Installed-product isolation uses resolved package identities and runtime edges. */
  2. import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
  3. import { tmpdir } from 'node:os'
  4. import { join } from 'node:path'
  5. import { afterEach, describe, expect, it } from 'vitest'
  6. import { verifyInstalledProductIsolation } from './installed-product-isolation.ts'
  7. const roots: string[] = []
  8. const experimental = '@deepseek-ai/dsh-experimental-example'
  9. function fixture(): string {
  10. const root = mkdtempSync(join(tmpdir(), 'dsh-installed-isolation-'))
  11. roots.push(root)
  12. return root
  13. }
  14. function writePackage(root: string, key: string, manifest: Record<string, unknown>): string {
  15. const directory = join(root, 'node_modules', key)
  16. mkdirSync(directory, { recursive: true })
  17. writeFileSync(join(directory, 'package.json'), `${JSON.stringify({ name: key, ...manifest })}\n`)
  18. return directory
  19. }
  20. afterEach(() => {
  21. for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true })
  22. })
  23. describe('installed default-product isolation', () => {
  24. it('ignores development dependencies and unrelated installed experimental packages', () => {
  25. const root = fixture()
  26. const entry = writePackage(root, '@deepseek-ai/dsh', {
  27. dependencies: { core: '1.0.0' },
  28. devDependencies: { [experimental]: '1.0.0' },
  29. })
  30. writePackage(root, 'core', { peerDependencies: { '@deepseek-ai/dsh': '1.0.0' } })
  31. writePackage(root, experimental, {})
  32. expect(verifyInstalledProductIsolation(entry)).toBe(2)
  33. })
  34. it.each(['dependencies', 'optionalDependencies', 'peerDependencies'])(
  35. 'rejects a transitive experimental %s',
  36. (section) => {
  37. const root = fixture()
  38. const entry = writePackage(root, '@deepseek-ai/dsh', { dependencies: { thirdParty: '1.0.0' } })
  39. writePackage(root, 'thirdParty', { [section]: { [experimental]: '1.0.0' } })
  40. expect(() => verifyInstalledProductIsolation(entry)).toThrow(
  41. `@deepseek-ai/dsh -> thirdParty -> ${experimental}`,
  42. )
  43. },
  44. )
  45. it('skips the entry package\'s optional bundles, which must be installed, and still rejects other experimental edges', () => {
  46. const root = fixture()
  47. const entry = writePackage(root, '@deepseek-ai/dsh', { dependencies: { core: '1.0.0', [experimental]: '1.0.0' } })
  48. writePackage(root, 'core', {})
  49. writePackage(root, experimental, { dependencies: { '@deepseek-ai/dsh-experimental-inner': '1.0.0' } })
  50. expect(verifyInstalledProductIsolation(entry, [experimental])).toBe(2)
  51. writePackage(root, 'core', { dependencies: { [experimental]: '1.0.0' } })
  52. expect(() => verifyInstalledProductIsolation(entry, [experimental])).toThrow(`core -> ${experimental}`)
  53. const missing = writePackage(root, '@deepseek-ai/dsh-missing', { dependencies: { absent: '1.0.0' } })
  54. expect(() => verifyInstalledProductIsolation(missing, ['absent'])).toThrow('optional bundle is missing: @deepseek-ai/dsh-missing -> absent')
  55. })
  56. it('rejects experimental identities hidden behind an installed alias', () => {
  57. const root = fixture()
  58. const entry = writePackage(root, '@deepseek-ai/dsh', { dependencies: { safeName: 'file:../prototype' } })
  59. writePackage(root, 'safeName', { name: experimental })
  60. expect(() => verifyInstalledProductIsolation(entry)).toThrow(experimental)
  61. })
  62. it('rejects experimental npm aliases even when an optional package is omitted', () => {
  63. const root = fixture()
  64. const entry = writePackage(root, '@deepseek-ai/dsh', {
  65. optionalDependencies: { safeName: `npm:${experimental}@1.0.0` },
  66. })
  67. expect(() => verifyInstalledProductIsolation(entry)).toThrow(experimental)
  68. })
  69. it('follows nested installations rather than an unrelated hoisted package', () => {
  70. const root = fixture()
  71. const entry = writePackage(root, '@deepseek-ai/dsh', { dependencies: { core: '1.0.0' } })
  72. writePackage(root, 'core', {})
  73. writePackage(entry, 'core', { dependencies: { [experimental]: '1.0.0' } })
  74. expect(() => verifyInstalledProductIsolation(entry)).toThrow(experimental)
  75. })
  76. it('permits missing optional packages and optional peers but rejects missing dependencies', () => {
  77. const root = fixture()
  78. const entry = writePackage(root, '@deepseek-ai/dsh', {
  79. dependencies: { optional: '1.0.0' },
  80. optionalDependencies: { optional: '1.0.0' },
  81. peerDependencies: { peer: '1.0.0' },
  82. peerDependenciesMeta: { peer: { optional: true } },
  83. })
  84. expect(verifyInstalledProductIsolation(entry)).toBe(1)
  85. writePackage(root, '@deepseek-ai/dsh', { dependencies: { missing: '1.0.0' } })
  86. expect(() => verifyInstalledProductIsolation(entry)).toThrow('dependency is missing')
  87. })
  88. })