check-workspace-constraints.spec.ts 3.3 KB

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