nuxt-schema-org
Version:
The quickest and easiest way to build Schema.org graphs for Nuxt.
78 lines (77 loc) • 2.83 kB
JavaScript
import { useLocalePath } from "#i18n";
import { useSiteConfig } from "#site-config/app/composables/useSiteConfig";
import { createSitePathResolver } from "#site-config/app/composables/utils";
import { defineWebPage, defineWebSite } from "@unhead/schema-org/vue";
import { resolveSitePath } from "nuxt-site-config/urls";
import { defineNuxtPlugin, useError, useRuntimeConfig } from "nuxt/app";
import { hasProtocol, withHttps } from "ufo";
import { toValue } from "vue";
import { useSchemaOrg } from "../../composables/useSchemaOrg.js";
import { maybeAddIdentitySchemaOrg } from "../../utils/shared.js";
export default defineNuxtPlugin({
name: "nuxt-schema-org:defaults",
dependsOn: [
"nuxt-schema-org:init"
],
setup(nuxtApp) {
const error = useError();
if (error.value?.error) {
return;
}
const siteConfig = useSiteConfig();
const pathResolver = createSitePathResolver({
canonical: true,
absolute: true
});
if (!nuxtApp.$i18n)
return;
const localePath = useLocalePath();
const locales = nuxtApp.$i18n?.locales.value || [];
const siteUrl = () => pathResolver(localePath("index")).value;
const websiteId = () => `${siteUrl()}#website`;
const website = defineWebSite({
"@id": websiteId,
"url": siteUrl,
"name": () => toValue(siteConfig.name) || "",
// @ts-expect-error untyped
"inLanguage": () => toValue(nuxtApp.$i18n.localeProperties.value.language) || "",
"description": () => toValue(siteConfig.description) || ""
});
const nuxtBase = useRuntimeConfig().app.baseURL || "/";
const resolveIdForLocale = (locale) => {
if (locale.domain) {
return resolveSitePath(localePath("index", locale.code), {
absolute: true,
siteUrl: hasProtocol(locale.domain, { acceptRelative: false }) ? locale.domain : withHttps(locale.domain),
trailingSlash: siteConfig.trailingSlash,
base: nuxtBase
});
}
return pathResolver(localePath("index", locale.code)).value;
};
if (siteConfig.defaultLocale) {
if (siteConfig.currentLocale && siteConfig.currentLocale !== siteConfig.defaultLocale) {
website.translationOfWork = {
"@type": "WebSite",
"@id": () => `${resolveIdForLocale({ code: toValue(siteConfig.defaultLocale) })}#website`
};
} else {
website.workTranslation = locales.filter((locale) => locale.code !== siteConfig.defaultLocale).map((locale) => {
return {
"@type": "WebSite",
"@id": () => `${resolveIdForLocale(locale)}#website`
};
});
}
}
useSchemaOrg([
website,
defineWebPage({
isPartOf: {
"@id": websiteId()
}
})
]);
maybeAddIdentitySchemaOrg();
}
});