release-config.mjs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { createRequire } from 'node:module'
  2. const require = createRequire(import.meta.url)
  3. const version = require('../src/version.json')
  4. export const DEFAULT_GITHUB_REPOSITORY = 'oldj/SwitchHosts'
  5. export function getReleaseVersion() {
  6. return version.slice(0, 3).join('.')
  7. }
  8. export function getFullVersion() {
  9. return `${version[0]}.${version[1]}.${version[2]}.${version[3]}`
  10. }
  11. export function getReleaseTag(env = process.env) {
  12. const expectedTag = `v${getReleaseVersion()}`
  13. const tag = env.RELEASE_TAG || expectedTag
  14. // Keep GitHub Release tags aligned with the app's public semver so
  15. // the uploader cannot silently publish assets under a mismatched tag.
  16. if (tag !== expectedTag) {
  17. throw new Error(`RELEASE_TAG must be "${expectedTag}", got "${tag}".`)
  18. }
  19. return tag
  20. }
  21. export function resolveGithubRepository(env = process.env) {
  22. const rawRepository =
  23. env.GH_RELEASE_REPOSITORY || env.GITHUB_REPOSITORY || DEFAULT_GITHUB_REPOSITORY
  24. const match = /^([^/\s]+)\/([^/\s]+)$/.exec(rawRepository || '')
  25. if (!match) {
  26. throw new Error(
  27. `Invalid GitHub repository "${rawRepository}". Expected the format "owner/repo".`,
  28. )
  29. }
  30. const [, owner, repo] = match
  31. return {
  32. owner,
  33. repo,
  34. fullName: `${owner}/${repo}`,
  35. }
  36. }
  37. export function isReleaseArtifactFile(fileName, fullVersion = getFullVersion()) {
  38. if (!fileName || fileName.startsWith('.')) {
  39. return false
  40. }
  41. // builder-debug.yml is useful locally, but publishing it would only clutter the release page.
  42. if (fileName === 'builder-debug.yml') {
  43. return false
  44. }
  45. // latest*.yml files are required by electron-updater to discover GitHub-hosted updates.
  46. if (/^latest.*\.ya?ml$/i.test(fileName)) {
  47. return true
  48. }
  49. return fileName.includes(`v${fullVersion}`)
  50. }