@tanstack/cli
Version:
TanStack CLI
49 lines (48 loc) • 1.92 kB
JavaScript
import { randomUUID } from 'node:crypto';
const partnerTierOrder = {
gold: 0,
silver: 1,
bronze: 2,
};
const cliSessionSeed = randomUUID();
function hashString(value) {
let hash = 2166136261;
for (let index = 0; index < value.length; index++) {
hash ^= value.charCodeAt(index);
hash = Math.imul(hash, 16777619);
}
return hash >>> 0;
}
function compareIdentity(left, right) {
const nameComparison = left.name.localeCompare(right.name);
return nameComparison || left.id.localeCompare(right.id);
}
function compareSeededPartnerOrder(left, right, seed) {
const leftWeight = left.partner.placementWeight ?? 1;
const rightWeight = right.partner.placementWeight ?? 1;
const leftRandom = (hashString(`${seed}:${left.partner.id}`) + 1) / 4294967297;
const rightRandom = (hashString(`${seed}:${right.partner.id}`) + 1) / 4294967297;
const seededComparison = -Math.log(leftRandom) / leftWeight + Math.log(rightRandom) / rightWeight;
return seededComparison || compareIdentity(left, right);
}
export function orderAddOnsForPartnerPlacement(addOns, surface, sessionSeed = cliSessionSeed) {
const rotationSeed = `${surface}:${sessionSeed}`;
const partners = addOns
.filter((addOn) => addOn.partner)
.sort((left, right) => {
const tierComparison = partnerTierOrder[left.partner.tier] -
partnerTierOrder[right.partner.tier];
if (tierComparison !== 0) {
return tierComparison;
}
if (surface === 'deployment' && left.partner.id === 'cloudflare') {
return -1;
}
if (surface === 'deployment' && right.partner.id === 'cloudflare') {
return 1;
}
return compareSeededPartnerOrder(left, right, rotationSeed);
});
const nonPartners = addOns.filter((addOn) => !addOn.partner);
return [...partners, ...nonPartners];
}