check-workspace-constraints.spec.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /** Experimental-package publication and dependency constraints. */
  2. import { readFileSync } from 'node:fs'
  3. import { join } from 'node:path'
  4. import { describe, expect, it } from 'vitest'
  5. import {
  6. checkExperimentalDependencyIsolation,
  7. checkExperimentalManifest,
  8. checkWorkspaceManifest,
  9. type WorkspaceManifest,
  10. } from './check-workspace-constraints.ts'
  11. const experimental: WorkspaceManifest = {
  12. dir: 'packages/experimental/prototype',
  13. manifest: { name: '@deepseek-ai/dsh-experimental-prototype', private: true },
  14. }
  15. describe('experimental workspace constraints', () => {
  16. it('requires the experimental package-name prefix', () => {
  17. expect(checkExperimentalManifest({
  18. ...experimental,
  19. manifest: { ...experimental.manifest, name: '@deepseek-ai/dsh-prototype' },
  20. })).toEqual([
  21. '@deepseek-ai/dsh-prototype: experimental package name must start with "@deepseek-ai/dsh-experimental-"',
  22. ])
  23. })
  24. it('requires private manifests without publication metadata', () => {
  25. expect(checkExperimentalManifest(experimental)).toEqual([])
  26. expect(checkExperimentalManifest({
  27. ...experimental,
  28. manifest: { ...experimental.manifest, private: false, publishConfig: { access: 'public' } },
  29. })).toEqual([
  30. '@deepseek-ai/dsh-experimental-prototype: experimental package must set "private": true',
  31. '@deepseek-ai/dsh-experimental-prototype: experimental package must omit publishConfig',
  32. ])
  33. })
  34. it.each(['dependencies', 'optionalDependencies', 'peerDependencies'] as const)(
  35. 'rejects release %s on an experimental package',
  36. (section) => {
  37. expect(checkExperimentalDependencyIsolation([experimental, {
  38. dir: 'packages/core/consumer',
  39. manifest: {
  40. name: '@deepseek-ai/dsh-consumer',
  41. [section]: { '@deepseek-ai/dsh-experimental-prototype': 'workspace:^' },
  42. },
  43. }])).toEqual([
  44. `@deepseek-ai/dsh-consumer: ${section}.@deepseek-ai/dsh-experimental-prototype must not reference an experimental package`,
  45. ])
  46. },
  47. )
  48. it('allows development and experimental consumers but rejects the Python release runtime', () => {
  49. const manifests: WorkspaceManifest[] = [experimental, {
  50. dir: 'packages/core/test-only',
  51. manifest: {
  52. name: '@deepseek-ai/dsh-test-only',
  53. devDependencies: { '@deepseek-ai/dsh-experimental-prototype': 'workspace:^' },
  54. },
  55. }, {
  56. dir: 'packages/experimental/consumer',
  57. manifest: {
  58. name: '@deepseek-ai/dsh-experimental-consumer',
  59. dependencies: { '@deepseek-ai/dsh-experimental-prototype': 'workspace:^' },
  60. },
  61. }, {
  62. dir: 'python/sdk-runtime',
  63. manifest: {
  64. name: '@deepseek-ai/dsh-python-runtime',
  65. dependencies: { '@deepseek-ai/dsh-experimental-prototype': 'workspace:^' },
  66. },
  67. }]
  68. expect(checkExperimentalDependencyIsolation(manifests)).toEqual([
  69. '@deepseek-ai/dsh-python-runtime: dependencies.@deepseek-ai/dsh-experimental-prototype must not reference an experimental package',
  70. ])
  71. })
  72. })
  73. describe('private Python runtime carrier', () => {
  74. const manifest = JSON.parse(
  75. readFileSync(new URL('../packages/sdk/python-runtime/package.json', import.meta.url), 'utf8'),
  76. ) as WorkspaceManifest['manifest']
  77. it('participates in dsh package checks without becoming an npm release member', () => {
  78. expect(checkWorkspaceManifest({ dir: 'packages/sdk/python-runtime', manifest })).toEqual([])
  79. })
  80. it('rejects publication metadata on the private carrier', () => {
  81. const path = join('packages', 'sdk', 'python-runtime', 'package.json')
  82. expect(checkWorkspaceManifest({
  83. dir: 'packages/sdk/python-runtime',
  84. manifest: { ...manifest, private: false, publishConfig: { access: 'public' } },
  85. })).toEqual([
  86. `${path}: @deepseek-ai/dsh-sdk-python-runtime: private carrier must set "private": true`,
  87. `${path}: @deepseek-ai/dsh-sdk-python-runtime: private carrier must omit publishConfig`,
  88. ])
  89. })
  90. })