core-package-set.spec.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { createHash } from 'node:crypto'
  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 {
  7. DESKTOP_PACKAGES_DIR,
  8. DESKTOP_PACKAGE_SET_FILE,
  9. desktopCorePackageOverrides,
  10. desktopDshPackageSpec,
  11. parseDesktopCorePackageSet,
  12. verifyDesktopCoreLockfile,
  13. verifyDesktopCorePackageSet,
  14. type DesktopCorePackageRecord,
  15. } from '../src/core-package-set.ts'
  16. const roots: string[] = []
  17. function record(name: string, file: string, body: Buffer, version = '1.2.3'): DesktopCorePackageRecord {
  18. return {
  19. name,
  20. version,
  21. file,
  22. bytes: body.byteLength,
  23. integrity: `sha512-${createHash('sha512').update(body).digest('base64')}`,
  24. }
  25. }
  26. function packageSetProject(): {
  27. root: string
  28. dsh: DesktopCorePackageRecord
  29. base: DesktopCorePackageRecord
  30. host: DesktopCorePackageRecord
  31. } {
  32. const root = mkdtempSync(join(tmpdir(), 'dsh-desktop-package-set-'))
  33. roots.push(root)
  34. const packageDir = join(root, DESKTOP_PACKAGES_DIR)
  35. mkdirSync(packageDir)
  36. const dshBody = Buffer.from('dsh')
  37. const baseBody = Buffer.from('base')
  38. const hostBody = Buffer.from('host')
  39. const dsh = record('@deepseek-ai/dsh', 'dsh.tgz', dshBody)
  40. const base = record('@deepseek-ai/dsh-base', 'dsh-base.tgz', baseBody)
  41. const host = record('@deepseek-ai/dsh-desktop-host', 'dsh-desktop-host.tgz', hostBody)
  42. writeFileSync(join(packageDir, dsh.file), dshBody)
  43. writeFileSync(join(packageDir, base.file), baseBody)
  44. writeFileSync(join(packageDir, host.file), hostBody)
  45. writeFileSync(join(root, DESKTOP_PACKAGE_SET_FILE), `${JSON.stringify({
  46. schemaVersion: 1,
  47. packages: [dsh, base, host],
  48. })}\n`)
  49. return { root, dsh, base, host }
  50. }
  51. afterEach(() => {
  52. for (const root of roots.splice(0)) rmSync(root, { recursive: true, force: true })
  53. })
  54. describe('desktop core package set', () => {
  55. it('pins the direct dsh dependency and every internal package to local tarballs', () => {
  56. const { root } = packageSetProject()
  57. const packageSet = verifyDesktopCorePackageSet(root, '1.2.3')
  58. expect(desktopDshPackageSpec(packageSet)).toBe('file:./desktop-packages/dsh.tgz')
  59. expect(desktopCorePackageOverrides(packageSet)).toEqual({
  60. '@deepseek-ai/dsh': 'file:./desktop-packages/dsh.tgz',
  61. '@deepseek-ai/dsh-base': 'file:./desktop-packages/dsh-base.tgz',
  62. '@deepseek-ai/dsh-desktop-host': 'file:./desktop-packages/dsh-desktop-host.tgz',
  63. })
  64. })
  65. it('rejects version drift, descriptor disorder, corruption, and extra files', () => {
  66. const { root, dsh, base, host } = packageSetProject()
  67. expect(() => verifyDesktopCorePackageSet(root, '2.0.0')).toThrow(/does not match Desktop/u)
  68. expect(() => parseDesktopCorePackageSet({
  69. schemaVersion: 1,
  70. packages: [dsh, base, { ...host, version: '2.0.0' }],
  71. }, '1.2.3')).toThrow(/dsh-desktop-host@2\.0\.0 does not match Desktop 1\.2\.3/u)
  72. expect(() => parseDesktopCorePackageSet({ schemaVersion: 1, packages: [base, dsh, host] }))
  73. .toThrow(/sorted by name/u)
  74. writeFileSync(join(root, DESKTOP_PACKAGES_DIR, dsh.file), 'changed')
  75. expect(() => verifyDesktopCorePackageSet(root, '1.2.3')).toThrow(/integrity check failed/u)
  76. writeFileSync(join(root, DESKTOP_PACKAGES_DIR, 'extra.tgz'), '')
  77. expect(() => verifyDesktopCorePackageSet(root, '1.2.3')).toThrow(/does not match its descriptor/u)
  78. })
  79. it('rejects registry resolutions for names supplied by the local package set', () => {
  80. const dsh = record('@deepseek-ai/dsh', 'dsh.tgz', Buffer.from('dsh'))
  81. const host = record('@deepseek-ai/dsh-desktop-host', 'host.tgz', Buffer.from('host'))
  82. const packageSet = parseDesktopCorePackageSet({ schemaVersion: 1, packages: [dsh, host] })
  83. expect(() => {
  84. verifyDesktopCoreLockfile(
  85. "packages:\n '@deepseek-ai/dsh@file:desktop-packages/dsh.tgz':\n resolution: {}\n",
  86. packageSet,
  87. )
  88. }).not.toThrow()
  89. expect(() => {
  90. verifyDesktopCoreLockfile(
  91. "packages:\n '@deepseek-ai/dsh@1.2.3':\n resolution: {integrity: sha512-registry}\n",
  92. packageSet,
  93. )
  94. }).toThrow(/outside the local package set/u)
  95. })
  96. })