lock-pre-release-versions.mjs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { exec } from 'node:child_process'
  2. import fs from 'node:fs/promises'
  3. import path from 'node:path'
  4. import prettier from 'prettier'
  5. exec('pnpm --silent --filter=!./playgrounds/* -r exec pwd', async (err, stdout) => {
  6. if (err) {
  7. console.error(err)
  8. process.exit(1)
  9. }
  10. let paths = stdout
  11. .trim()
  12. .split('\n')
  13. .map((x) => path.resolve(x, 'package.json'))
  14. for (let path of paths) {
  15. let pkg = await fs.readFile(path, 'utf8').then(JSON.parse)
  16. // In our case, all pre-release like versions have a `-` in the version
  17. // number.
  18. //
  19. // E.g.:
  20. //
  21. // - `0.0.0-development.0`
  22. // - `0.0.0-insiders.{hash}`
  23. if (!pkg.version?.includes('-')) continue
  24. let shouldUpdate = false
  25. for (let group of [
  26. 'dependencies',
  27. 'devDependencies',
  28. 'peerDependencies',
  29. 'optionalDependencies',
  30. ]) {
  31. for (let [name, version] of Object.entries(pkg[group] ?? {})) {
  32. if (version === 'workspace:*' || !version.startsWith('workspace:')) continue
  33. // Set the version to `workspace:*`, we don't need to know the exact
  34. // version because `pnpm` will handle it for us at publishing time.
  35. pkg[group][name] = 'workspace:*'
  36. // Whether or not we should update the `package.json` file.
  37. shouldUpdate = true
  38. }
  39. }
  40. if (shouldUpdate) {
  41. await fs.writeFile(
  42. path,
  43. await prettier
  44. .format(JSON.stringify(pkg, null, 2), { filepath: path })
  45. .then((x) => `${x.trim()}\n`),
  46. )
  47. }
  48. }
  49. console.log('Done.')
  50. })