github-release.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. const { readFileSync } = require('fs');
  2. const { join } = require('path');
  3. const { version } = require(join(__dirname, '../../../package.json'));
  4. module.exports = async ({ github, context }) => {
  5. const changelog = readFileSync('CHANGELOG.md', 'utf8');
  6. await github.rest.repos.createRelease({
  7. owner: context.repo.owner,
  8. repo: context.repo.repo,
  9. tag_name: `v${version}`,
  10. target_commitish: github.ref_name,
  11. body: extractSection(changelog, version),
  12. prerelease: process.env.PRERELEASE === 'true',
  13. });
  14. };
  15. // From https://github.com/frangio/extract-changelog/blob/master/src/utils/word-regexp.ts
  16. function makeWordRegExp(word) {
  17. const start = word.length > 0 && /\b/.test(word[0]) ? '\\b' : '';
  18. const end = word.length > 0 && /\b/.test(word[word.length - 1]) ? '\\b' : '';
  19. return new RegExp(start + [...word].map(c => (/[a-z0-9]/i.test(c) ? c : '\\' + c)).join('') + end);
  20. }
  21. // From https://github.com/frangio/extract-changelog/blob/master/src/core.ts
  22. function extractSection(document, wantedHeading) {
  23. // ATX Headings as defined in GitHub Flavored Markdown (https://github.github.com/gfm/#atx-headings)
  24. const heading = /^ {0,3}(?<lead>#{1,6})(?: [ \t\v\f]*(?<text>.*?)[ \t\v\f]*)?(?:[\n\r]+|$)/gm;
  25. const wantedHeadingRe = makeWordRegExp(wantedHeading);
  26. let start, end;
  27. for (const m of document.matchAll(heading)) {
  28. if (!start) {
  29. if (m.groups.text.search(wantedHeadingRe) === 0) {
  30. start = m;
  31. }
  32. } else if (m.groups.lead.length <= start.groups.lead.length) {
  33. end = m;
  34. break;
  35. }
  36. }
  37. if (start) {
  38. return document.slice(start.index + start[0].length, end?.index);
  39. }
  40. }