check-workspace-constraints.spec.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /** Experimental-package publication and dependency constraints. */
  2. import { describe, expect, it } from 'vitest'
  3. import {
  4. checkExperimentalDependencyIsolation,
  5. checkExperimentalManifest,
  6. type WorkspaceManifest,
  7. } from './check-workspace-constraints.ts'
  8. const experimental: WorkspaceManifest = {
  9. dir: 'packages/experimental/prototype',
  10. manifest: { name: '@deepseek-ai/dsh-experimental-prototype', private: true },
  11. }
  12. describe('experimental workspace constraints', () => {
  13. it('requires the experimental package-name prefix', () => {
  14. expect(checkExperimentalManifest({
  15. ...experimental,
  16. manifest: { ...experimental.manifest, name: '@deepseek-ai/dsh-prototype' },
  17. })).toEqual([
  18. '@deepseek-ai/dsh-prototype: experimental package name must start with "@deepseek-ai/dsh-experimental-"',
  19. ])
  20. })
  21. it('requires private manifests without publication metadata', () => {
  22. expect(checkExperimentalManifest(experimental)).toEqual([])
  23. expect(checkExperimentalManifest({
  24. ...experimental,
  25. manifest: { ...experimental.manifest, private: false, publishConfig: { access: 'public' } },
  26. })).toEqual([
  27. '@deepseek-ai/dsh-experimental-prototype: experimental package must set "private": true',
  28. '@deepseek-ai/dsh-experimental-prototype: experimental package must omit publishConfig',
  29. ])
  30. })
  31. it.each(['dependencies', 'optionalDependencies', 'peerDependencies'] as const)(
  32. 'rejects release %s on an experimental package',
  33. (section) => {
  34. expect(checkExperimentalDependencyIsolation([experimental, {
  35. dir: 'packages/core/consumer',
  36. manifest: {
  37. name: '@deepseek-ai/dsh-consumer',
  38. [section]: { '@deepseek-ai/dsh-experimental-prototype': 'workspace:^' },
  39. },
  40. }])).toEqual([
  41. `@deepseek-ai/dsh-consumer: ${section}.@deepseek-ai/dsh-experimental-prototype must not reference an experimental package`,
  42. ])
  43. },
  44. )
  45. it('allows development and experimental consumers but rejects the Python release runtime', () => {
  46. const manifests: WorkspaceManifest[] = [experimental, {
  47. dir: 'packages/core/test-only',
  48. manifest: {
  49. name: '@deepseek-ai/dsh-test-only',
  50. devDependencies: { '@deepseek-ai/dsh-experimental-prototype': 'workspace:^' },
  51. },
  52. }, {
  53. dir: 'packages/experimental/consumer',
  54. manifest: {
  55. name: '@deepseek-ai/dsh-experimental-consumer',
  56. dependencies: { '@deepseek-ai/dsh-experimental-prototype': 'workspace:^' },
  57. },
  58. }, {
  59. dir: 'python/sdk-runtime',
  60. manifest: {
  61. name: '@deepseek-ai/dsh-python-runtime',
  62. dependencies: { '@deepseek-ai/dsh-experimental-prototype': 'workspace:^' },
  63. },
  64. }]
  65. expect(checkExperimentalDependencyIsolation(manifests)).toEqual([
  66. '@deepseek-ai/dsh-python-runtime: dependencies.@deepseek-ai/dsh-experimental-prototype must not reference an experimental package',
  67. ])
  68. })
  69. })