{"version":3,"file":"commit-search-B63Lbx9u.cjs","names":[],"sources":["../src/core/date.ts","../src/core/normalize.ts","../src/providers/shared/github-graphql.ts","../src/providers/shared/gitlab-events.ts","../src/providers/trailers.ts","../src/providers/shared/commit-search.ts"],"sourcesContent":["const DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst MS_PER_DAY = 1000 * 60 * 60 * 24;\n\nconst pad2 = (value: number): string => String(value).padStart(2, \"0\");\n\nconst formatDateYYYYMMDD = (d: Date): string =>\n  `${d.getUTCFullYear()}-${pad2(d.getUTCMonth() + 1)}-${pad2(d.getUTCDate())}`;\n\nconst dateParts = (date: string): [number, number, number] => {\n  const [y = 0, m = 1, d = 1] = date.split(\"-\").map(Number);\n  return [y, m, d];\n};\n\nexport const toUTC = (date: string): number => {\n  const [y, m, d] = dateParts(date);\n  return Date.UTC(y, m - 1, d);\n};\n\nexport const addDays = (date: string, days: number): string => {\n  const [y, m, d] = dateParts(date);\n  return formatDateYYYYMMDD(new Date(Date.UTC(y, m - 1, d + days)));\n};\n\nexport const daysInRange = (start: string, end: string): number =>\n  Math.round((toUTC(end) - toUTC(start)) / MS_PER_DAY) + 1;\n\nexport const isValidDateString = (value: string): boolean => {\n  const parsed = DATE_RE.test(value) ? new Date(`${value}T00:00:00Z`) : null;\n  return !!parsed && !Number.isNaN(parsed.getTime()) && parsed.toISOString().slice(0, 10) === value;\n};\n\nexport const validateDateRange = (start: string, end: string): void => {\n  if (!isValidDateString(start))\n    throw new Error(`Invalid start date \"${start}\" (expected YYYY-MM-DD)`);\n  if (!isValidDateString(end)) throw new Error(`Invalid end date \"${end}\" (expected YYYY-MM-DD)`);\n  if (start > end) throw new Error(`Invalid range: start \"${start}\" must be <= end \"${end}\"`);\n};\n","import type { ContributionDay } from \"../types\";\nimport { addDays, daysInRange } from \"./date\";\n\nconst mergeSources = (\n  current: ContributionDay[\"sources\"] = {},\n  next: ContributionDay[\"sources\"] = {},\n): ContributionDay[\"sources\"] => {\n  const entries = Object.entries(next).map(([source, count]): [string, number] => [\n    source,\n    (current[source] ?? 0) + count,\n  ]);\n  return Object.keys(next).length ? { ...current, ...Object.fromEntries(entries) } : current;\n};\n\nconst cloneDay = (day: ContributionDay): ContributionDay => {\n  const sources = day.sources;\n  return {\n    date: day.date,\n    count: day.count,\n    ...(sources ? { sources: { ...sources } } : {}),\n  };\n};\n\nconst mergeDay = (\n  existing: ContributionDay | undefined,\n  next: ContributionDay,\n): ContributionDay => {\n  if (!existing) return cloneDay(next);\n  const sources =\n    next.sources || existing.sources ? mergeSources(existing.sources, next.sources) : undefined;\n  return {\n    date: existing.date,\n    count: existing.count + next.count,\n    ...(sources ? { sources } : {}),\n  };\n};\n\nexport const normalizeEventsToDaily = (events: ContributionDay[]): ContributionDay[] => {\n  if (events.length === 0) return [];\n\n  const merged = events.reduce((acc, event) => {\n    acc.set(event.date, mergeDay(acc.get(event.date), event));\n    return acc;\n  }, new Map<string, ContributionDay>());\n\n  const dates = [...merged.keys()].sort((a, b) => a.localeCompare(b));\n  const startDate = dates[0];\n  const endDate = dates[dates.length - 1];\n  if (startDate === undefined || endDate === undefined) return [];\n\n  return Array.from({ length: daysInRange(startDate, endDate) }, (_, i) => {\n    const dateStr = addDays(startDate, i);\n    return merged.get(dateStr) ?? { date: dateStr, count: 0 };\n  });\n};\n\nexport const toCanonicalDays = (\n  days: ContributionDay[],\n  start: string,\n  end: string,\n): ContributionDay[] => {\n  const anchors =\n    start === end\n      ? [{ date: start, count: 0 }]\n      : [\n          { date: start, count: 0 },\n          { date: end, count: 0 },\n        ];\n  return normalizeEventsToDaily([...anchors, ...days]);\n};\n","import type { ContributionDay, FetchParams } from \"../../types\";\nimport { toCanonicalDays } from \"../../core/normalize\";\nimport { validateDateRange } from \"../../core/date\";\n\nexport const CONTRIBUTIONS_QUERY = `\n  query GitHubContributions($login: String!, $from: DateTime!, $to: DateTime!) {\n    user(login: $login) {\n      contributionsCollection(from: $from, to: $to) {\n        contributionCalendar {\n          weeks {\n            contributionDays {\n              date\n              contributionCount\n            }\n          }\n        }\n      }\n    }\n    rateLimit {\n      limit\n      remaining\n      resetAt\n      cost\n    }\n  }\n`;\n\ninterface RateLimitInfo {\n  limit: number;\n  remaining: number;\n  resetAt: string;\n  cost: number;\n}\n\nexport interface GitHubGraphQLResponse {\n  data?: {\n    user: {\n      contributionsCollection: {\n        contributionCalendar: {\n          weeks: { contributionDays: { date: string; contributionCount: number }[] }[];\n        };\n      };\n    } | null;\n    rateLimit?: RateLimitInfo;\n  };\n  errors?: { message: string }[];\n}\n\nexport type GitHubGraphQLRequest = (variables: {\n  login: string;\n  from: string;\n  to: string;\n}) => Promise<GitHubGraphQLResponse>;\n\nexport const fetchContributionCalendar = async (\n  request: GitHubGraphQLRequest,\n  params: FetchParams,\n): Promise<ContributionDay[]> => {\n  validateDateRange(params.start, params.end);\n\n  const days: ContributionDay[] = [];\n  for (const range of splitByYear(params.start, params.end)) {\n    days.push(...(await fetchRange(request, params.user, range.start, range.end)));\n  }\n  return toCanonicalDays(days, params.start, params.end);\n};\n\nconst fetchRange = async (\n  request: GitHubGraphQLRequest,\n  user: string,\n  start: string,\n  end: string,\n): Promise<ContributionDay[]> => {\n  const payload = await request({\n    login: user,\n    from: `${start}T00:00:00Z`,\n    to: `${end}T23:59:59Z`,\n  });\n\n  const errors = payload.errors ?? [];\n  if (errors.length > 0) {\n    const rateLimit = payload.data?.rateLimit;\n    const rateLimitSuffix = rateLimit\n      ? ` (rateLimit remaining=${rateLimit.remaining}, resetAt=${rateLimit.resetAt})`\n      : \"\";\n    throw new Error(\n      `GitHub GraphQL error: ${errors.map((e) => e.message).join(\"; \")}${rateLimitSuffix}`,\n    );\n  }\n\n  const user_ = payload.data?.user;\n  if (!user_) throw new Error(`GitHub user \"${user}\" not found`);\n\n  return user_.contributionsCollection.contributionCalendar.weeks\n    .flatMap((week) => week.contributionDays)\n    .filter((day) => day.date >= start && day.date <= end)\n    .map<ContributionDay>((day) => ({ date: day.date, count: day.contributionCount }));\n};\n\nconst splitByYear = (start: string, end: string): { start: string; end: string }[] => {\n  const startYear = Number(start.slice(0, 4));\n  const endYear = Number(end.slice(0, 4));\n  return Array.from({ length: endYear - startYear + 1 }, (_, index) => {\n    const year = startYear + index;\n    return {\n      start: year === startYear ? start : `${year}-01-01`,\n      end: year === endYear ? end : `${year}-12-31`,\n    };\n  });\n};\n","import type { ContributionDay, FetchParams } from \"../../types\";\nimport { validateDateRange } from \"../../core/date\";\nimport { toCanonicalDays } from \"../../core/normalize\";\n\nconst EVENTS_PER_PAGE = 100;\n\ninterface GitLabUser {\n  id: number;\n  username: string;\n}\n\ninterface GitLabEvent {\n  created_at: string;\n}\n\nexport type GitLabRequest = <T>(path: string) => Promise<T>;\n\nexport const fetchGitLabDays = async (\n  request: GitLabRequest,\n  params: FetchParams,\n): Promise<ContributionDay[]> => {\n  validateDateRange(params.start, params.end);\n\n  const users = await request<GitLabUser[]>(`/users?username=${encodeURIComponent(params.user)}`);\n  const userId = users[0]?.id;\n  if (userId === undefined) throw new Error(`GitLab user \"${params.user}\" not found`);\n\n  const counts = new Map<string, number>();\n  let page = 1;\n  while (true) {\n    const events = await request<GitLabEvent[]>(\n      `/users/${userId}/events?after=${params.start}&before=${params.end}&per_page=${EVENTS_PER_PAGE}&page=${page}`,\n    );\n    for (const event of events) {\n      const date = event.created_at.slice(0, 10);\n      if (date >= params.start && date <= params.end) {\n        counts.set(date, (counts.get(date) ?? 0) + 1);\n      }\n    }\n    if (events.length < EVENTS_PER_PAGE) break;\n    page += 1;\n  }\n\n  return toCanonicalDays(\n    [...counts].map(([date, count]) => ({ date, count })),\n    params.start,\n    params.end,\n  );\n};\n","export interface CoAuthor {\n  name: string;\n  email: string;\n}\n\nexport interface AgentCoAuthor extends CoAuthor {\n  key: string;\n}\n\nexport interface AgentTrailerRule {\n  key: string;\n  email?: string | RegExp;\n  name?: string | RegExp;\n}\n\nexport interface AgentMatch {\n  key: string;\n  match: string;\n}\n\nexport const AGENT_TRAILER_RULES: readonly AgentTrailerRule[] = [\n  { key: \"claude\", email: \"noreply@anthropic.com\" },\n  { key: \"codex\", email: \"codex@openai.com\" },\n  { key: \"opencode\", email: \"noreply@opencode.ai\" },\n  { key: \"copilot\", name: \"copilot\", email: /@users\\.noreply\\.github\\.com$/i },\n];\n\nconst TRAILER_RE = /^co-authored-by:(.*)$/i;\nconst CO_AUTHOR_RE = /^(.*?)<([^<>]+)>\\s*$/;\n\nexport const parseCoAuthorValue = (value: string): CoAuthor | null => {\n  const match = CO_AUTHOR_RE.exec(value.trim());\n  return match ? { name: (match[1] ?? \"\").trim(), email: (match[2] ?? \"\").trim() } : null;\n};\n\nconst searchableMatch = (rule: AgentTrailerRule): string | null => {\n  if (typeof rule.email === \"string\") return rule.email;\n  if (typeof rule.name === \"string\") return rule.name;\n  return null;\n};\n\nexport const resolveAgentMatches = (\n  keys?: readonly string[],\n  rules: readonly AgentTrailerRule[] = AGENT_TRAILER_RULES,\n): AgentMatch[] =>\n  (keys ?? rules.map((rule) => rule.key)).map((key) => {\n    const rule = rules.find((candidate) => candidate.key === key);\n    if (!rule) throw new Error(`Unknown agent key \"${key}\"`);\n    const match = searchableMatch(rule);\n    if (match === null) {\n      throw new Error(`Agent \"${key}\" has no searchable co-author match`);\n    }\n    return { key, match };\n  });\n\nconst finalBlock = (message: string): string[] => {\n  const lines = message.split(/\\r?\\n/).map((line) => line.trimEnd());\n  let end = lines.length;\n  while (end > 0 && lines[end - 1] === \"\") end -= 1;\n  let start = end;\n  while (start > 0 && lines[start - 1] !== \"\") start -= 1;\n  return lines.slice(start, end);\n};\n\nexport const parseCoAuthors = (message: string): CoAuthor[] =>\n  finalBlock(message)\n    .map((line) => TRAILER_RE.exec(line))\n    .filter((match): match is RegExpExecArray => match !== null)\n    .map((match) => parseCoAuthorValue(match[1] ?? \"\"))\n    .filter((coAuthor): coAuthor is CoAuthor => coAuthor !== null);\n\nexport const testStateless = (pattern: RegExp, value: string): boolean => {\n  if (!pattern.global && !pattern.sticky) return pattern.test(value);\n  const lastIndex = pattern.lastIndex;\n  pattern.lastIndex = 0;\n  const matched = pattern.test(value);\n  pattern.lastIndex = lastIndex;\n  return matched;\n};\n\nconst matchesEmail = (email: string, expected: string | RegExp | undefined): boolean => {\n  if (expected === undefined) return true;\n  if (expected instanceof RegExp) return testStateless(expected, email);\n  return email.toLowerCase() === expected.toLowerCase();\n};\n\nconst matchesName = (name: string, expected: string | RegExp | undefined): boolean => {\n  if (expected === undefined) return true;\n  if (expected instanceof RegExp) return testStateless(expected, name);\n  return name.toLowerCase().includes(expected.toLowerCase());\n};\n\nexport const matchAgent = (\n  coAuthor: CoAuthor,\n  rules: readonly AgentTrailerRule[] = AGENT_TRAILER_RULES,\n): string | null => {\n  const matched = rules.find(\n    (rule) =>\n      (rule.email !== undefined || rule.name !== undefined) &&\n      matchesEmail(coAuthor.email, rule.email) &&\n      matchesName(coAuthor.name, rule.name),\n  );\n  return matched?.key ?? null;\n};\n\nexport const parseAgentCoAuthors = (\n  message: string,\n  rules: readonly AgentTrailerRule[] = AGENT_TRAILER_RULES,\n): AgentCoAuthor[] =>\n  parseCoAuthors(message).flatMap((coAuthor) => {\n    const key = matchAgent(coAuthor, rules);\n    return key === null ? [] : [{ ...coAuthor, key }];\n  });\n","import type { ContributionDay, FetchParams } from \"../../types\";\nimport { addDays, daysInRange, validateDateRange } from \"../../core/date\";\nimport { toCanonicalDays } from \"../../core/normalize\";\nimport type { AgentMatch } from \"../trailers\";\n\nexport const PER_PAGE = 100;\nconst SEARCH_RESULT_CAP = 1000;\nconst MAX_PAGES = SEARCH_RESULT_CAP / PER_PAGE;\n\ninterface CommitSearchItem {\n  commit: { author: { date: string } };\n}\n\nexport interface CommitSearchResponse {\n  total_count?: number;\n  items?: CommitSearchItem[];\n}\n\nexport type CommitSearchRequest = (query: string, page: number) => Promise<CommitSearchResponse>;\n\ninterface CommitSearchPage {\n  total_count: number;\n  items: CommitSearchItem[];\n}\n\nexport const fetchCoAuthorDays = async (\n  request: CommitSearchRequest,\n  matches: readonly AgentMatch[],\n  params: FetchParams,\n): Promise<ContributionDay[]> => {\n  validateDateRange(params.start, params.end);\n\n  const sourcesByDate = new Map<string, Record<string, number>>();\n\n  for (const { key, match } of matches) {\n    const items = await searchRange(request, params.user, match, params.start, params.end);\n    for (const item of items) {\n      const date = item.commit.author.date.slice(0, 10);\n      if (date < params.start || date > params.end) continue;\n      const bucket = sourcesByDate.get(date) ?? {};\n      bucket[key] = (bucket[key] ?? 0) + 1;\n      sourcesByDate.set(date, bucket);\n    }\n  }\n\n  return toCanonicalDays(\n    Array.from(sourcesByDate.entries()).map(([date, sources]) => ({\n      date,\n      count: Object.values(sources).reduce((total, value) => total + value, 0),\n      sources,\n    })),\n    params.start,\n    params.end,\n  );\n};\n\nconst searchRange = async (\n  request: CommitSearchRequest,\n  user: string,\n  match: string,\n  start: string,\n  end: string,\n): Promise<CommitSearchItem[]> => {\n  const first = await searchPage(request, user, match, start, end, 1);\n\n  if (first.total_count > SEARCH_RESULT_CAP && start !== end) {\n    const mid = addDays(start, Math.floor((daysInRange(start, end) - 1) / 2));\n    return [\n      ...(await searchRange(request, user, match, start, mid)),\n      ...(await searchRange(request, user, match, addDays(mid, 1), end)),\n    ];\n  }\n\n  const items = [...first.items];\n  const pages = Math.min(Math.ceil(first.total_count / PER_PAGE), MAX_PAGES);\n  for (let page = 2; page <= pages; page += 1) {\n    items.push(...(await searchPage(request, user, match, start, end, page)).items);\n  }\n  return items;\n};\n\nconst searchPage = async (\n  request: CommitSearchRequest,\n  user: string,\n  match: string,\n  start: string,\n  end: string,\n  page: number,\n): Promise<CommitSearchPage> => {\n  const query = `author:${user} \"${match}\" author-date:${start}..${end}`;\n  const payload = await request(query, page);\n  return { total_count: payload.total_count ?? 0, items: payload.items ?? [] };\n};\n"],"mappings":"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"}