25 lines
829 B
TypeScript
25 lines
829 B
TypeScript
export function deterministicSupplyChainGeneratedAt(input: Readonly<{
|
|
generatedAt: string;
|
|
sourceDateEpoch: string | null;
|
|
}>): string {
|
|
const generatedAtMs = Date.parse(input.generatedAt);
|
|
if (!Number.isFinite(generatedAtMs)) {
|
|
throw new TypeError("build manifest generatedAt must be an ISO timestamp");
|
|
}
|
|
if (input.sourceDateEpoch !== null) {
|
|
if (!/^(?:0|[1-9]\d*)$/u.test(input.sourceDateEpoch)) {
|
|
throw new TypeError("SOURCE_DATE_EPOCH must be whole seconds");
|
|
}
|
|
const epoch = Number(input.sourceDateEpoch);
|
|
if (
|
|
!Number.isSafeInteger(epoch) ||
|
|
new Date(epoch * 1000).toISOString() !== input.generatedAt
|
|
) {
|
|
throw new TypeError(
|
|
"build manifest generatedAt must match SOURCE_DATE_EPOCH",
|
|
);
|
|
}
|
|
}
|
|
return new Date(generatedAtMs).toISOString();
|
|
}
|