GeometricMeanOfContributionsSpec

by Aggre _--

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/9.3.2/math.js"></script>
<main>
	<ol>
		<li><a href="https://docs.github.com/en/graphql/overview/explorer" target="_blank">Open GraphQL Explorer</a></li>
		<li>Pase and run the following query
			<pre><code>{
  user: viewer {
    createdAt
    y2020: contributionsCollection(from: "2020-05-01T00:00:00Z", to: "2021-04-30T23:59:59Z") {
      endedAt
      restrictedContributionsCount
      contributionCalendar {
        totalContributions
      }
    }
    y2019: contributionsCollection(from: "2019-05-01T00:00:00Z", to: "2020-04-30T23:59:59Z") {
      endedAt
      restrictedContributionsCount
      contributionCalendar {
        totalContributions
      }
    }
    y2018: contributionsCollection(from: "2018-05-01T00:00:00Z", to: "2019-04-30T23:59:59Z") {
      endedAt
      restrictedContributionsCount
      contributionCalendar {
        totalContributions
      }
    }
  }
}
</code></pre>
		</li>
		<li>
			<p>
				Copy the results and past it into the following form, then click run</p>
			<form id="form">
				<textarea id="data"></textarea>
				<button type="submit">
					Run
				</button>
			</form>
		</li>
		<li><p>

			Result is <input id="result" disabled /></p><p><i>
			The target audience is users whose this result exceed 500.</i>
			</p></li>
	</ol>
</main>

CSS

ol,
form {
	display: grid;
    gap: 1rem;
}

pre {
	margin: auto;
}

textarea {
	height: 12rem;
	font-family: monospace;
}

JavaScript

const createAnnual = (createdAt) => {
	const createdAtDate = new Date(createdAt)
	return (data) => {
		const startedAtDate = new Date(data.startedAt)
		const isFullfil = createdAtDate <= startedAtDate
		const cont = data.contributionCalendar.totalContributions - data.restrictedContributionsCount
		return (isFullfil ? cont : cont / ((new Date(data.endedAt) - createdAtDate) / 86400000) * 365) || 1
	}
}

const run = (data) => {
	const {
		data: {
			user: {
				createdAt,
				y2020,
				y2019,
				y2018
			}
		}
	} = JSON.parse(data)
	const values = [y2020, y2019, y2018].filter(v => {
		return new Date(createdAt) < new Date(v.endedAt)
	})
	const annual = createAnnual(createdAt)

	const sim = values.length > 1 ? math.pow(values.reduce((a, c) => {
		return math.bignumber(
			a.contributionCalendar ? annual(a) : a
		).mul(annual(c))
	}), math.bignumber(1).div(values.length)) : math.bignumber(y2020.contributionCalendar.totalContributions - y2020.restrictedContributionsCount)
	return sim.toNumber()
}

document.getElementById("form").addEventListener("submit", e => {
	e.preventDefault()
	document.getElementById("result").value = run(
		document.getElementById("data").value
	)
})