main repo

This commit is contained in:
Basilosaurusrex
2025-11-24 18:09:40 +01:00
parent b636ee5e70
commit f027651f9b
34146 changed files with 4436636 additions and 0 deletions

View File

@@ -0,0 +1,184 @@
import { resolveAsArrayOrUndefined } from "../generate/utils";
import { resolveAbsoluteUrlWithPathname } from "./resolve-url";
import { ViewPortKeys } from "../constants";
function resolveAlternateUrl(url, metadataBase, pathname) {
// If alter native url is an URL instance,
// we treat it as a URL base and resolve with current pathname
if (url instanceof URL) {
url = new URL(pathname, url);
}
return resolveAbsoluteUrlWithPathname(url, metadataBase, pathname);
}
export const resolveThemeColor = (themeColor)=>{
var _resolveAsArrayOrUndefined;
if (!themeColor) return null;
const themeColorDescriptors = [];
(_resolveAsArrayOrUndefined = resolveAsArrayOrUndefined(themeColor)) == null ? void 0 : _resolveAsArrayOrUndefined.forEach((descriptor)=>{
if (typeof descriptor === "string") themeColorDescriptors.push({
color: descriptor
});
else if (typeof descriptor === "object") themeColorDescriptors.push({
color: descriptor.color,
media: descriptor.media
});
});
return themeColorDescriptors;
};
export const resolveViewport = (viewport)=>{
let resolved = null;
if (typeof viewport === "string") {
resolved = viewport;
} else if (viewport) {
resolved = "";
for(const viewportKey_ in ViewPortKeys){
const viewportKey = viewportKey_;
if (viewportKey in viewport) {
let value = viewport[viewportKey];
if (typeof value === "boolean") value = value ? "yes" : "no";
if (resolved) resolved += ", ";
resolved += `${ViewPortKeys[viewportKey]}=${value}`;
}
}
}
return resolved;
};
function resolveUrlValuesOfObject(obj, metadataBase, pathname) {
if (!obj) return null;
const result = {};
for (const [key, value] of Object.entries(obj)){
if (typeof value === "string" || value instanceof URL) {
result[key] = [
{
url: resolveAlternateUrl(value, metadataBase, pathname)
}
];
} else {
result[key] = [];
value == null ? void 0 : value.forEach((item, index)=>{
const url = resolveAlternateUrl(item.url, metadataBase, pathname);
result[key][index] = {
url,
title: item.title
};
});
}
}
return result;
}
function resolveCanonicalUrl(urlOrDescriptor, metadataBase, pathname) {
if (!urlOrDescriptor) return null;
const url = typeof urlOrDescriptor === "string" || urlOrDescriptor instanceof URL ? urlOrDescriptor : urlOrDescriptor.url;
// Return string url because structureClone can't handle URL instance
return {
url: resolveAlternateUrl(url, metadataBase, pathname)
};
}
export const resolveAlternates = (alternates, metadataBase, { pathname })=>{
if (!alternates) return null;
const canonical = resolveCanonicalUrl(alternates.canonical, metadataBase, pathname);
const languages = resolveUrlValuesOfObject(alternates.languages, metadataBase, pathname);
const media = resolveUrlValuesOfObject(alternates.media, metadataBase, pathname);
const types = resolveUrlValuesOfObject(alternates.types, metadataBase, pathname);
const result = {
canonical,
languages,
media,
types
};
return result;
};
const robotsKeys = [
"noarchive",
"nosnippet",
"noimageindex",
"nocache",
"notranslate",
"indexifembedded",
"nositelinkssearchbox",
"unavailable_after",
"max-video-preview",
"max-image-preview",
"max-snippet"
];
const resolveRobotsValue = (robots)=>{
if (!robots) return null;
if (typeof robots === "string") return robots;
const values = [];
if (robots.index) values.push("index");
else if (typeof robots.index === "boolean") values.push("noindex");
if (robots.follow) values.push("follow");
else if (typeof robots.follow === "boolean") values.push("nofollow");
for (const key of robotsKeys){
const value = robots[key];
if (typeof value !== "undefined" && value !== false) {
values.push(typeof value === "boolean" ? key : `${key}:${value}`);
}
}
return values.join(", ");
};
export const resolveRobots = (robots)=>{
if (!robots) return null;
return {
basic: resolveRobotsValue(robots),
googleBot: typeof robots !== "string" ? resolveRobotsValue(robots.googleBot) : null
};
};
const VerificationKeys = [
"google",
"yahoo",
"yandex",
"me",
"other"
];
export const resolveVerification = (verification)=>{
if (!verification) return null;
const res = {};
for (const key of VerificationKeys){
const value = verification[key];
if (value) {
if (key === "other") {
res.other = {};
for(const otherKey in verification.other){
const otherValue = resolveAsArrayOrUndefined(verification.other[otherKey]);
if (otherValue) res.other[otherKey] = otherValue;
}
} else res[key] = resolveAsArrayOrUndefined(value);
}
}
return res;
};
export const resolveAppleWebApp = (appWebApp)=>{
var _resolveAsArrayOrUndefined;
if (!appWebApp) return null;
if (appWebApp === true) {
return {
capable: true
};
}
const startupImages = appWebApp.startupImage ? (_resolveAsArrayOrUndefined = resolveAsArrayOrUndefined(appWebApp.startupImage)) == null ? void 0 : _resolveAsArrayOrUndefined.map((item)=>typeof item === "string" ? {
url: item
} : item) : null;
return {
capable: "capable" in appWebApp ? !!appWebApp.capable : true,
title: appWebApp.title || null,
startupImage: startupImages,
statusBarStyle: appWebApp.statusBarStyle || "default"
};
};
export const resolveAppLinks = (appLinks)=>{
if (!appLinks) return null;
for(const key in appLinks){
// @ts-ignore // TODO: type infer
appLinks[key] = resolveAsArrayOrUndefined(appLinks[key]);
}
return appLinks;
};
export const resolveItunes = (itunes, metadataBase, { pathname })=>{
if (!itunes) return null;
return {
appId: itunes.appId,
appArgument: itunes.appArgument ? resolveAlternateUrl(itunes.appArgument, metadataBase, pathname) : undefined
};
};
//# sourceMappingURL=resolve-basics.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,34 @@
import { resolveAsArrayOrUndefined } from "../generate/utils";
import { isStringOrURL } from "./resolve-url";
import { IconKeys } from "../constants";
export function resolveIcon(icon) {
if (isStringOrURL(icon)) return {
url: icon
};
else if (Array.isArray(icon)) return icon;
return icon;
}
export const resolveIcons = (icons)=>{
if (!icons) {
return null;
}
const resolved = {
icon: [],
apple: []
};
if (Array.isArray(icons)) {
resolved.icon = icons.map(resolveIcon).filter(Boolean);
} else if (isStringOrURL(icons)) {
resolved.icon = [
resolveIcon(icons)
];
} else {
for (const key of IconKeys){
const values = resolveAsArrayOrUndefined(icons[key]);
if (values) resolved[key] = values.map(resolveIcon);
}
}
return resolved;
};
//# sourceMappingURL=resolve-icons.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/lib/metadata/resolvers/resolve-icons.ts"],"names":["resolveAsArrayOrUndefined","isStringOrURL","IconKeys","resolveIcon","icon","url","Array","isArray","resolveIcons","icons","resolved","apple","map","filter","Boolean","key","values"],"mappings":"AAGA,SAASA,yBAAyB,QAAQ,oBAAmB;AAC7D,SAASC,aAAa,QAAQ,gBAAe;AAC7C,SAASC,QAAQ,QAAQ,eAAc;AAEvC,OAAO,SAASC,YAAYC,IAAU;IACpC,IAAIH,cAAcG,OAAO,OAAO;QAAEC,KAAKD;IAAK;SACvC,IAAIE,MAAMC,OAAO,CAACH,OAAO,OAAOA;IACrC,OAAOA;AACT;AAEA,OAAO,MAAMI,eAAuC,CAACC;IACnD,IAAI,CAACA,OAAO;QACV,OAAO;IACT;IAEA,MAAMC,WAAsC;QAC1CN,MAAM,EAAE;QACRO,OAAO,EAAE;IACX;IACA,IAAIL,MAAMC,OAAO,CAACE,QAAQ;QACxBC,SAASN,IAAI,GAAGK,MAAMG,GAAG,CAACT,aAAaU,MAAM,CAACC;IAChD,OAAO,IAAIb,cAAcQ,QAAQ;QAC/BC,SAASN,IAAI,GAAG;YAACD,YAAYM;SAAO;IACtC,OAAO;QACL,KAAK,MAAMM,OAAOb,SAAU;YAC1B,MAAMc,SAAShB,0BAA0BS,KAAK,CAACM,IAAI;YACnD,IAAIC,QAAQN,QAAQ,CAACK,IAAI,GAAGC,OAAOJ,GAAG,CAACT;QACzC;IACF;IACA,OAAOO;AACT,EAAC"}

View File

@@ -0,0 +1,140 @@
import { resolveAsArrayOrUndefined } from "../generate/utils";
import { getSocialImageFallbackMetadataBase, isStringOrURL, resolveUrl, resolveAbsoluteUrlWithPathname } from "./resolve-url";
import { resolveTitle } from "./resolve-title";
const OgTypeFields = {
article: [
"authors",
"tags"
],
song: [
"albums",
"musicians"
],
playlist: [
"albums",
"musicians"
],
radio: [
"creators"
],
video: [
"actors",
"directors",
"writers",
"tags"
],
basic: [
"emails",
"phoneNumbers",
"faxNumbers",
"alternateLocale",
"audio",
"videos"
]
};
export function resolveImages(images, metadataBase) {
const resolvedImages = resolveAsArrayOrUndefined(images);
if (!resolvedImages) return resolvedImages;
const nonNullableImages = [];
for (const item of resolvedImages){
if (!item) continue;
const isItemUrl = isStringOrURL(item);
const inputUrl = isItemUrl ? item : item.url;
if (!inputUrl) continue;
nonNullableImages.push(isItemUrl ? {
url: resolveUrl(item, metadataBase)
} : {
...item,
// Update image descriptor url
url: resolveUrl(item.url, metadataBase)
});
}
return nonNullableImages;
}
function getFieldsByOgType(ogType) {
switch(ogType){
case "article":
case "book":
return OgTypeFields.article;
case "music.song":
case "music.album":
return OgTypeFields.song;
case "music.playlist":
return OgTypeFields.playlist;
case "music.radio_station":
return OgTypeFields.radio;
case "video.movie":
case "video.episode":
return OgTypeFields.video;
default:
return OgTypeFields.basic;
}
}
export const resolveOpenGraph = (openGraph, metadataBase, { pathname }, titleTemplate)=>{
if (!openGraph) return null;
function resolveProps(target, og) {
const ogType = og && "type" in og ? og.type : undefined;
const keys = getFieldsByOgType(ogType);
for (const k of keys){
const key = k;
if (key in og && key !== "url") {
const value = og[key];
if (value) {
const arrayValue = resolveAsArrayOrUndefined(value);
target[key] = arrayValue;
}
}
}
const imageMetadataBase = getSocialImageFallbackMetadataBase(metadataBase);
target.images = resolveImages(og.images, imageMetadataBase);
}
const resolved = {
...openGraph,
title: resolveTitle(openGraph.title, titleTemplate)
};
resolveProps(resolved, openGraph);
resolved.url = openGraph.url ? resolveAbsoluteUrlWithPathname(openGraph.url, metadataBase, pathname) : null;
return resolved;
};
const TwitterBasicInfoKeys = [
"site",
"siteId",
"creator",
"creatorId",
"description"
];
export const resolveTwitter = (twitter, metadataBase, titleTemplate)=>{
var _resolved_images;
if (!twitter) return null;
let card = "card" in twitter ? twitter.card : undefined;
const resolved = {
...twitter,
title: resolveTitle(twitter.title, titleTemplate)
};
for (const infoKey of TwitterBasicInfoKeys){
resolved[infoKey] = twitter[infoKey] || null;
}
const imageMetadataBase = getSocialImageFallbackMetadataBase(metadataBase);
resolved.images = resolveImages(twitter.images, imageMetadataBase);
card = card || (((_resolved_images = resolved.images) == null ? void 0 : _resolved_images.length) ? "summary_large_image" : "summary");
resolved.card = card;
if ("card" in resolved) {
switch(resolved.card){
case "player":
{
resolved.players = resolveAsArrayOrUndefined(resolved.players) || [];
break;
}
case "app":
{
resolved.app = resolved.app || {};
break;
}
default:
break;
}
}
return resolved;
};
//# sourceMappingURL=resolve-opengraph.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/lib/metadata/resolvers/resolve-opengraph.ts"],"names":["resolveAsArrayOrUndefined","getSocialImageFallbackMetadataBase","isStringOrURL","resolveUrl","resolveAbsoluteUrlWithPathname","resolveTitle","OgTypeFields","article","song","playlist","radio","video","basic","resolveImages","images","metadataBase","resolvedImages","nonNullableImages","item","isItemUrl","inputUrl","url","push","getFieldsByOgType","ogType","resolveOpenGraph","openGraph","pathname","titleTemplate","resolveProps","target","og","type","undefined","keys","k","key","value","arrayValue","imageMetadataBase","resolved","title","TwitterBasicInfoKeys","resolveTwitter","twitter","card","infoKey","length","players","app"],"mappings":"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"}

View File

@@ -0,0 +1,30 @@
function resolveTitleTemplate(template, title) {
return template ? template.replace(/%s/g, title) : title;
}
export function resolveTitle(title, stashedTemplate) {
let resolved;
const template = typeof title !== "string" && title && "template" in title ? title.template : null;
if (typeof title === "string") {
resolved = resolveTitleTemplate(stashedTemplate, title);
} else if (title) {
if ("default" in title) {
resolved = resolveTitleTemplate(stashedTemplate, title.default);
}
if ("absolute" in title && title.absolute) {
resolved = title.absolute;
}
}
if (title && typeof title !== "string") {
return {
template,
absolute: resolved || ""
};
} else {
return {
absolute: resolved || title || "",
template
};
}
}
//# sourceMappingURL=resolve-title.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/lib/metadata/resolvers/resolve-title.ts"],"names":["resolveTitleTemplate","template","title","replace","resolveTitle","stashedTemplate","resolved","default","absolute"],"mappings":"AAGA,SAASA,qBACPC,QAAmC,EACnCC,KAAa;IAEb,OAAOD,WAAWA,SAASE,OAAO,CAAC,OAAOD,SAASA;AACrD;AAEA,OAAO,SAASE,aACdF,KAAwB,EACxBG,eAA0C;IAE1C,IAAIC;IACJ,MAAML,WACJ,OAAOC,UAAU,YAAYA,SAAS,cAAcA,QAChDA,MAAMD,QAAQ,GACd;IAEN,IAAI,OAAOC,UAAU,UAAU;QAC7BI,WAAWN,qBAAqBK,iBAAiBH;IACnD,OAAO,IAAIA,OAAO;QAChB,IAAI,aAAaA,OAAO;YACtBI,WAAWN,qBAAqBK,iBAAiBH,MAAMK,OAAO;QAChE;QACA,IAAI,cAAcL,SAASA,MAAMM,QAAQ,EAAE;YACzCF,WAAWJ,MAAMM,QAAQ;QAC3B;IACF;IAEA,IAAIN,SAAS,OAAOA,UAAU,UAAU;QACtC,OAAO;YACLD;YACAO,UAAUF,YAAY;QACxB;IACF,OAAO;QACL,OAAO;YAAEE,UAAUF,YAAYJ,SAAS;YAAID;QAAS;IACvD;AACF"}

View File

@@ -0,0 +1,58 @@
import path from "../../../shared/lib/isomorphic/path";
import * as Log from "../../../build/output/log";
function isStringOrURL(icon) {
return typeof icon === "string" || icon instanceof URL;
}
function createLocalMetadataBase() {
return new URL(`http://localhost:${process.env.PORT || 3000}`);
}
// For deployment url for metadata routes, prefer to use the deployment url if possible
// as these routes are unique to the deployments url.
export function getSocialImageFallbackMetadataBase(metadataBase) {
const isMetadataBaseMissing = !metadataBase;
const defaultMetadataBase = createLocalMetadataBase();
const deploymentUrl = process.env.VERCEL_URL && new URL(`https://${process.env.VERCEL_URL}`);
let fallbackMetadata;
if (process.env.NODE_ENV === "development") {
fallbackMetadata = defaultMetadataBase;
} else {
fallbackMetadata = process.env.NODE_ENV === "production" && deploymentUrl && process.env.VERCEL_ENV === "preview" ? deploymentUrl : metadataBase || deploymentUrl || defaultMetadataBase;
}
if (isMetadataBaseMissing) {
Log.warnOnce("");
Log.warnOnce(`metadata.metadataBase is not set for resolving social open graph or twitter images, using "${fallbackMetadata.origin}". See https://nextjs.org/docs/app/api-reference/functions/generate-metadata#metadatabase`);
}
return fallbackMetadata;
}
function resolveUrl(url, metadataBase) {
if (url instanceof URL) return url;
if (!url) return null;
try {
// If we can construct a URL instance from url, ignore metadataBase
const parsedUrl = new URL(url);
return parsedUrl;
} catch {}
if (!metadataBase) {
metadataBase = createLocalMetadataBase();
}
// Handle relative or absolute paths
const basePath = metadataBase.pathname || "";
const joinedPath = path.join(basePath, url);
return new URL(joinedPath, metadataBase);
}
// Resolve with `pathname` if `url` is a relative path.
function resolveRelativeUrl(url, pathname) {
if (typeof url === "string" && url.startsWith("./")) {
return path.resolve(pathname, url);
}
return url;
}
// Resolve `pathname` if `url` is a relative path the compose with `metadataBase`.
function resolveAbsoluteUrlWithPathname(url, metadataBase, pathname) {
url = resolveRelativeUrl(url, pathname);
const result = metadataBase ? resolveUrl(url, metadataBase) : url;
return result.toString();
}
export { isStringOrURL, resolveUrl, resolveRelativeUrl, resolveAbsoluteUrlWithPathname, };
//# sourceMappingURL=resolve-url.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/lib/metadata/resolvers/resolve-url.ts"],"names":["path","Log","isStringOrURL","icon","URL","createLocalMetadataBase","process","env","PORT","getSocialImageFallbackMetadataBase","metadataBase","isMetadataBaseMissing","defaultMetadataBase","deploymentUrl","VERCEL_URL","fallbackMetadata","NODE_ENV","VERCEL_ENV","warnOnce","origin","resolveUrl","url","parsedUrl","basePath","pathname","joinedPath","join","resolveRelativeUrl","startsWith","resolve","resolveAbsoluteUrlWithPathname","result","toString"],"mappings":"AAAA,OAAOA,UAAU,sCAAqC;AACtD,YAAYC,SAAS,4BAA2B;AAEhD,SAASC,cAAcC,IAAS;IAC9B,OAAO,OAAOA,SAAS,YAAYA,gBAAgBC;AACrD;AAEA,SAASC;IACP,OAAO,IAAID,IAAI,CAAC,iBAAiB,EAAEE,QAAQC,GAAG,CAACC,IAAI,IAAI,KAAK,CAAC;AAC/D;AAEA,uFAAuF;AACvF,qDAAqD;AACrD,OAAO,SAASC,mCACdC,YAAwB;IAExB,MAAMC,wBAAwB,CAACD;IAC/B,MAAME,sBAAsBP;IAC5B,MAAMQ,gBACJP,QAAQC,GAAG,CAACO,UAAU,IAAI,IAAIV,IAAI,CAAC,QAAQ,EAAEE,QAAQC,GAAG,CAACO,UAAU,CAAC,CAAC;IAEvE,IAAIC;IACJ,IAAIT,QAAQC,GAAG,CAACS,QAAQ,KAAK,eAAe;QAC1CD,mBAAmBH;IACrB,OAAO;QACLG,mBACET,QAAQC,GAAG,CAACS,QAAQ,KAAK,gBACzBH,iBACAP,QAAQC,GAAG,CAACU,UAAU,KAAK,YACvBJ,gBACAH,gBAAgBG,iBAAiBD;IACzC;IAEA,IAAID,uBAAuB;QACzBV,IAAIiB,QAAQ,CAAC;QACbjB,IAAIiB,QAAQ,CACV,CAAC,2FAA2F,EAAEH,iBAAiBI,MAAM,CAAC,yFAAyF,CAAC;IAEpN;IAEA,OAAOJ;AACT;AAQA,SAASK,WACPC,GAAoC,EACpCX,YAAwB;IAExB,IAAIW,eAAejB,KAAK,OAAOiB;IAC/B,IAAI,CAACA,KAAK,OAAO;IAEjB,IAAI;QACF,mEAAmE;QACnE,MAAMC,YAAY,IAAIlB,IAAIiB;QAC1B,OAAOC;IACT,EAAE,OAAM,CAAC;IAET,IAAI,CAACZ,cAAc;QACjBA,eAAeL;IACjB;IAEA,oCAAoC;IACpC,MAAMkB,WAAWb,aAAac,QAAQ,IAAI;IAC1C,MAAMC,aAAazB,KAAK0B,IAAI,CAACH,UAAUF;IAEvC,OAAO,IAAIjB,IAAIqB,YAAYf;AAC7B;AAEA,uDAAuD;AACvD,SAASiB,mBAAmBN,GAAiB,EAAEG,QAAgB;IAC7D,IAAI,OAAOH,QAAQ,YAAYA,IAAIO,UAAU,CAAC,OAAO;QACnD,OAAO5B,KAAK6B,OAAO,CAACL,UAAUH;IAChC;IACA,OAAOA;AACT;AAEA,kFAAkF;AAClF,SAASS,+BACPT,GAAiB,EACjBX,YAAwB,EACxBc,QAAgB;IAEhBH,MAAMM,mBAAmBN,KAAKG;IAE9B,MAAMO,SAASrB,eAAeU,WAAWC,KAAKX,gBAAgBW;IAC9D,OAAOU,OAAOC,QAAQ;AACxB;AAEA,SACE9B,aAAa,EACbkB,UAAU,EACVO,kBAAkB,EAClBG,8BAA8B,KAC/B"}