{"version":3,"sources":["utils/git.ts"],"names":[],"mappings":"AAOA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAEpD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAOpD;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,QAAQ,UAAQ,GACf,OAAO,CAAC,MAAM,EAAE,CAAC,CAanB;AAED,wBAAsB,0BAA0B,CAAC,QAAQ,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGpF;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsD5F;AAED,wBAAsB,+BAA+B,CACnD,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,wBAAsB,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUpF;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWlE;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7C","file":"git.d.ts","sourcesContent":["import execa from 'execa';\nimport path from 'path';\nimport regex from 'conventional-commits-parser/lib/regex';\nimport parser from 'conventional-commits-parser/lib/parser';\nimport analyzeCommit from '@semantic-release/commit-analyzer/lib/analyze-commit';\n\n\nexport async function getRef(name: string): Promise<string> {\n  try {\n    const { stdout } = await execa('git', ['rev-parse', name]);\n    return stdout.trim().split('\\n')[0];\n  } catch {\n    return null;\n  }\n}\n\nexport async function getMasterRef(): Promise<string> {\n  return getRef('master');\n}\n\nexport async function getLatestTag(): Promise<string> {\n  try {\n    const { stdout } = await execa('git', ['describe', '--tags', '--abbrev=0']);\n    return stdout.trim().split('\\n')[0];\n  } catch (e) {\n    return null;\n  }\n}\n\nexport async function getChangedFilesSinceRef(\n  ref: string,\n  fullPath = false,\n): Promise<string[]> {\n  if (ref === null) {\n    throw Error('Current ref is undefined');\n  }\n\n  // First we need to find the commit where we diverged from `ref` at using `git merge-base`\n  let cmd = await execa('git', ['merge-base', ref, 'HEAD']);\n  const divergedAt = cmd.stdout.trim();\n  // Now we can find which files we added\n  cmd = await execa('git', ['diff', '--name-only', divergedAt]);\n  const files = cmd.stdout.trim().split('\\n');\n  if (!fullPath) return files;\n  return files.map((file: string) => path.resolve(file));\n}\n\nexport async function getChangedFilesSinceMaster(fullPath = false): Promise<string[]> {\n  const ref = await getMasterRef();\n  return getChangedFilesSinceRef(ref, fullPath);\n}\n\nexport async function analyzeCommitsSinceRef(ref: string, workspace: string): Promise<string> {\n  const { stdout } = await execa('git', [\n    'log',\n    `${ref}..HEAD`,\n    '--stat',\n    '--name-only',\n    '--format=%B%n------------------------ >8 ------------------------',\n    '--',\n    workspace,\n  ]);\n\n  const options = {\n    headerPattern: /^(\\w*)(?:\\(([\\w$.\\-* ]*)\\))?: (.*)$/,\n    headerCorrespondence: ['type', 'scope', 'subject'],\n    referenceActions: [\n      'close',\n      'closes',\n      'closed',\n      'fix',\n      'fixes',\n      'fixed',\n      'resolve',\n      'resolves',\n      'resolved',\n      'add',\n      'adds',\n      'added',\n    ],\n    issuePrefixes: ['#'],\n    noteKeywords: ['BREAKING CHANGE'],\n    fieldPattern: /^-(.*?)-$/,\n    revertPattern: /^Revert\\s\"([\\s\\S]*)\"\\s*This reverts commit (\\w*)\\./,\n    revertCorrespondence: ['header', 'hash'],\n    mergePattern: null as any,\n    mergeCorrespondence: null as any,\n  };\n\n  const releaseRules = [\n    { type: '/feat/', release: 'patch' },\n    { type: '/fix/', release: 'patch' },\n    { type: '/perf/', release: 'patch' },\n    { type: '/bump(patch)/', release: 'patch' },\n    { type: '/bump(minor)/', release: 'minor' },\n    { type: '/bump(major)/', release: 'major' },\n  ];\n\n  try {\n    const parsed = parser(stdout.trim(), options, regex(options));\n    const release = analyzeCommit(releaseRules, parsed);\n\n    return release;\n  } catch (e) {\n    return null;\n  }\n}\n\nexport async function getFirstCommitByWorkspaceFolder(\n  workspaceFolder: string,\n): Promise<string> {\n  const { stdout } = await execa('git', [\n    'log',\n    '--reverse',\n    '--pretty=format:%H',\n    '--',\n    workspaceFolder,\n  ]);\n\n  return stdout.split('\\n')[0].trim();\n}\n\nexport async function getTags({ isRevert }: { isRevert: boolean }): Promise<string[]> {\n  const execaOpts = ['tag'];\n\n  if (isRevert) {\n    execaOpts.push('--sort=-refname');\n  }\n\n  return (await execa('git', execaOpts)).stdout\n    .split('\\n')\n    .map(tag => tag.trim());\n}\n\nexport async function isRefInHistory(ref: string): Promise<boolean> {\n  try {\n    await execa('git', ['merge-base', '--is-ancestor', ref, 'HEAD']);\n    return true;\n  } catch (error) {\n    if (error.code === 1) {\n      return false;\n    }\n\n    throw error;\n  }\n}\n\nexport async function addTag(tag: string, message?: string, ref = 'HEAD'): Promise<void> {\n  await execa('git', ['tag', '-a', tag, '-m', (message || tag), ref]);\n}\n\nexport async function pushTag(): Promise<void> {\n  await execa('git', ['push', 'origin', '--tags']);\n}\n"]}