Commit 3792814

Anton Golub <antongolub@antongolub.com>
2024-12-04 14:12:09
feat: add badges if readme has no marks (#86)
1 parent b5190b3
src/update-readme.test.ts
@@ -9,7 +9,7 @@ describe('generateReadme()', () => {
     const readme = `
 <!-- my-badges start -->
 <!-- my-badges end -->
-`
+# readme`
     const badges: Badge[] = []
     const grant = badgeCollection(badges)
 
@@ -27,8 +27,33 @@ describe('generateReadme()', () => {
 <a href="my-badges/abcde-commit.md"><img src="" alt="test" title="test" width="64"></a>
 <a href="my-badges/abcdef-commit.md"><img src="" alt="test" title="test" width="64"></a>
 <!-- my-badges end -->
+# readme`,
+    )
+  })
+
+  test('prepends badges if no marks found', () => {
+    const readme = '# Readme'
+    const badges: Badge[] = []
+    const grant = badgeCollection(badges)
+
+    abcPresenter.badges.forEach((badge) => grant(badge, 'test'))
+    expect(badges.length).toEqual(6)
+
+    const contents = generateReadme(readme, badges, 64)
+
+    console.log('contents', contents)
+
+    expect(contents).toEqual(
+      `<!-- my-badges start -->
+<a href="my-badges/a-commit.md"><img src="" alt="test" title="test" width="64"></a>
+<a href="my-badges/ab-commit.md"><img src="" alt="test" title="test" width="64"></a>
+<a href="my-badges/abc-commit.md"><img src="" alt="test" title="test" width="64"></a>
+<a href="my-badges/abcd-commit.md"><img src="" alt="test" title="test" width="64"></a>
+<a href="my-badges/abcde-commit.md"><img src="" alt="test" title="test" width="64"></a>
+<a href="my-badges/abcdef-commit.md"><img src="" alt="test" title="test" width="64"></a>
+<!-- my-badges end -->
 
-`,
+${readme}`,
     )
   })
 })
src/update-readme.ts
@@ -3,6 +3,10 @@ import path from 'node:path'
 import { Badge } from './badges.js'
 import { quoteAttr } from './utils.js'
 
+const START_MARK = '<!-- my-badges start -->'
+const END_MARK = '<!-- my-badges end -->'
+const BADGE_SIZE = 64
+
 export function updateReadme(
   badges: Badge[],
   size: number | string,
@@ -25,38 +29,37 @@ function detectReadmeFilename(cwd: string): string {
 }
 
 export function generateReadme(
-  readmeContent: string,
+  content: string,
   badges: Badge[],
-  size: number | string = 64,
+  size: number | string = BADGE_SIZE,
 ) {
-  const startString = '<!-- my-badges start -->'
-  const endString = '<!-- my-badges end -->'
-
-  let content = readmeContent
-
-  const start = content.indexOf(startString)
-  const end = content.indexOf(endString)
-  const needToAddNewLine = content[end + endString.length + 1] !== '\n'
-
-  if (start !== -1 && end !== -1) {
-    content = content.slice(0, start) + content.slice(end + endString.length)
-
-    const badgesHtml = badges
-      .map((badge) => {
-        const desc = quoteAttr(badge.desc)
-        // prettier-ignore
-        return `<a href="my-badges/${badge.id}.md"><img src="${badge.image}" alt="${desc}" title="${desc}" width="${parseInt(size + '')}"></a>`
-      })
-      .join('\n')
-
-    content =
-      content.slice(0, start) +
-      `${startString}\n` +
-      badgesHtml +
-      `\n${endString}` +
-      (needToAddNewLine ? '\n' : '') +
-      content.slice(start)
-  }
-
-  return content
+  const start = content.indexOf(START_MARK)
+  const end = content.indexOf(END_MARK)
+  console.log('start', start, 'end', end)
+  if ((start === -1 && end !== -1) || (start !== -1 && end === -1))
+    throw new Error(
+      'Invalid README.md: both or none of the marks should be present',
+    )
+
+  if (start > end)
+    throw new Error('Invalid README.md: start mark should be before end mark')
+
+  const badgesHtml = badges
+    .map((badge) => {
+      const desc = quoteAttr(badge.desc)
+      // prettier-ignore
+      return `<a href="my-badges/${badge.id}.md"><img src="${badge.image}" alt="${desc}" title="${desc}" width="${parseInt(size + '')}"></a>`
+    })
+    .join('\n')
+
+  if (end === -1 && start === -1)
+    return `${START_MARK}
+${badgesHtml}
+${END_MARK}
+
+${content}`
+
+  return `${content.slice(0, start)}${START_MARK}
+${badgesHtml}
+${END_MARK}${content.slice(end + END_MARK.length)}`
 }