Skip to content

Commit

Permalink
v4 (#1046)
Browse files Browse the repository at this point in the history
  • Loading branch information
oekazuma authored Oct 23, 2024
1 parent 260544a commit 30f9180
Show file tree
Hide file tree
Showing 100 changed files with 1,011 additions and 2,258 deletions.
6 changes: 6 additions & 0 deletions .changeset/lovely-glasses-rush.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'svelte-meta-tags': major
---

Update twitter meta tags to the latest spec.
https://developer.x.com/en/docs/x-for-websites/cards/overview/player-card
5 changes: 5 additions & 0 deletions .changeset/ninety-seals-know.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'svelte-meta-tags': major
---

Supports Svelte 5! And Svelte 3 and Svelte 4 are no longer supported
5 changes: 5 additions & 0 deletions .changeset/smooth-windows-double.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'svelte-meta-tags': major
---

Add `deepMerge` function that allows deep merging of objects
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ jobs:
- name: Run Build
run: pnpm build
- name: Install Playwright
run: pnpm dlx playwright@1.47.0 install --with-deps
run: pnpm dlx playwright@1.48.1 install --with-deps
- name: Run Playwright
run: pnpm test
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20.17.0'
node-version: '20.18.0'
cache: pnpm
- run: pnpm install --frozen-lockfile
- name: Create Release Pull Request or Publish to npm
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
DS_Store
.DS_Store
node_modules
dist
build
Expand Down
2 changes: 1 addition & 1 deletion .npmrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
engine-strict=true
use-node-version=20.17.0
use-node-version=20.18.0
manage-package-manager-versions=true
139 changes: 128 additions & 11 deletions README.md

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json"
},
"devDependencies": {
"@sveltejs/adapter-auto": "^3.2.5",
"@sveltejs/kit": "^2.7.1",
"@sveltejs/vite-plugin-svelte": "^3.1.2",
"@sveltejs/adapter-auto": "^3.3.0",
"@sveltejs/kit": "^2.7.2",
"@sveltejs/vite-plugin-svelte": "^4.0.0",
"just-extend": "^6.2.0",
"svelte": "^4.2.19",
"svelte": "^5.0.5",
"svelte-check": "^4.0.5",
"svelte-meta-tags": "workspace:^",
"tslib": "^2.8.0",
"typescript": "^5.6.3",
"vite": "^5.4.9"
"vite": "^5.4.10"
},
"type": "module"
}
16 changes: 11 additions & 5 deletions example/src/routes/+layout.svelte
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
<script lang="ts">
import type { LayoutData } from './$types';
import { page } from '$app/stores';
import { MetaTags } from 'svelte-meta-tags';
import extend from 'just-extend'; // Please provide functions that allow deep merging of objects, such as lodash.merge, deepmerge, just-extend.
import type { Snippet } from 'svelte';
import { MetaTags, deepMerge } from 'svelte-meta-tags';
export let data;
interface Props {
data: LayoutData;
children: Snippet;
}
$: metaTags = extend(true, {}, data.baseMetaTags, $page.data.pageMetaTags);
let { data, children }: Props = $props();
let metaTags = $derived(deepMerge(data.baseMetaTags, $page.data.pageMetaTags));
</script>

<MetaTags {...metaTags} />

<slot />
{@render children()}

<ul>
<li>
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
"@types/eslint": "^9.6.1",
"eslint": "^9.13.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-svelte": "^2.45.1",
"eslint-plugin-svelte": "^2.46.0",
"globals": "^15.11.0",
"prettier": "^3.3.3",
"prettier-plugin-svelte": "^3.2.7",
"typescript-eslint": "^8.10.0"
"typescript-eslint": "^8.11.0"
},
"packageManager": "[email protected]",
"engines": {
Expand Down
19 changes: 11 additions & 8 deletions packages/svelte-meta-tags/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
],
"repository": {
"type": "git",
"url": "https://github.com/oekazuma/svelte-meta-tags"
"url": "git+https://github.com/oekazuma/svelte-meta-tags.git",
"directory": "packages/svelte-meta-tags"
},
"scripts": {
"dev": "vite dev",
Expand All @@ -24,25 +25,27 @@
"package": "svelte-kit sync && svelte-package && publint",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"test": "vitest run",
"prepublishOnly": "pnpm package && cp ../../README.md ./"
},
"dependencies": {
"schema-dts": "^1.1.2"
},
"devDependencies": {
"@sveltejs/adapter-auto": "^3.2.5",
"@sveltejs/kit": "^2.7.1",
"@sveltejs/package": "^2.3.5",
"@sveltejs/vite-plugin-svelte": "^3.1.2",
"@sveltejs/adapter-auto": "^3.3.0",
"@sveltejs/kit": "^2.7.2",
"@sveltejs/package": "^2.3.6",
"@sveltejs/vite-plugin-svelte": "^4.0.0",
"publint": "^0.2.11",
"svelte": "^4.2.19",
"svelte": "^5.0.5",
"svelte-check": "^4.0.5",
"tslib": "^2.8.0",
"typescript": "^5.6.3",
"vite": "^5.4.9"
"vite": "^5.4.10",
"vitest": "^2.1.3"
},
"peerDependencies": {
"svelte": "^3.55.0 || ^4.0.0"
"svelte": "^5.0.0"
},
"exports": {
"./JsonLd.svelte": {
Expand Down
14 changes: 10 additions & 4 deletions packages/svelte-meta-tags/src/lib/JsonLd.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@
import type { JsonLdProps } from './types';
import type { Thing, WithContext } from 'schema-dts';
export let output: JsonLdProps['output'] = 'head';
export let schema: JsonLdProps['schema'] = undefined;
interface Props {
output?: JsonLdProps['output'];
schema?: JsonLdProps['schema'];
}
let { output = 'head', schema = undefined }: Props = $props();
type OmitContext<T> = Omit<T, '@context'>;
$: isValid = schema && typeof schema === 'object';
let isValid = $derived(schema && typeof schema === 'object');
const createSchema = (schema: JsonLdProps['schema']) => {
const addContext = (context: OmitContext<Thing> | OmitContext<WithContext<Thing>>) => ({
Expand All @@ -20,7 +24,9 @@
: addContext(schema as OmitContext<WithContext<Thing>>);
};
$: json = `${'<scri' + 'pt type="application/ld+json">'}${JSON.stringify(createSchema(schema))}${'</scri' + 'pt>'}`;
let json = $derived(
`${'<scri' + 'pt type="application/ld+json">'}${JSON.stringify(createSchema(schema))}${'</scri' + 'pt>'}`
);
</script>

<svelte:head>
Expand Down
96 changes: 71 additions & 25 deletions packages/svelte-meta-tags/src/lib/MetaTags.svelte
Original file line number Diff line number Diff line change
@@ -1,24 +1,26 @@
<script lang="ts">
import type { MetaTagsProps } from './types';
export let title: MetaTagsProps['title'] = '';
export let titleTemplate: MetaTagsProps['titleTemplate'] = '';
export let robots: MetaTagsProps['robots'] = 'index,follow';
export let additionalRobotsProps: MetaTagsProps['additionalRobotsProps'] = undefined;
export let description: MetaTagsProps['description'] = undefined;
export let mobileAlternate: MetaTagsProps['mobileAlternate'] = undefined;
export let languageAlternates: MetaTagsProps['languageAlternates'] = undefined;
export let twitter: MetaTagsProps['twitter'] = undefined;
export let facebook: MetaTagsProps['facebook'] = undefined;
export let openGraph: MetaTagsProps['openGraph'] = undefined;
export let canonical: MetaTagsProps['canonical'] = undefined;
export let keywords: MetaTagsProps['keywords'] = undefined;
export let additionalMetaTags: MetaTagsProps['additionalMetaTags'] = undefined;
export let additionalLinkTags: MetaTagsProps['additionalLinkTags'] = undefined;
$: updatedTitle = titleTemplate ? (title ? titleTemplate.replace(/%s/g, title) : title) : title;
let robotsParams = '';
let {
title = '',
titleTemplate = '',
robots = 'index,follow',
additionalRobotsProps = undefined,
description = undefined,
mobileAlternate = undefined,
languageAlternates = undefined,
twitter = undefined,
facebook = undefined,
openGraph = undefined,
canonical = undefined,
keywords = undefined,
additionalMetaTags = undefined,
additionalLinkTags = undefined
}: Partial<MetaTagsProps> = $props();
let updatedTitle = $derived(titleTemplate ? (title ? titleTemplate.replace(/%s/g, title) : title) : title);
let robotsParams = $state('');
if (additionalRobotsProps) {
const {
nosnippet,
Expand All @@ -38,9 +40,11 @@
}${maxVideoPreview ? `,max-video-preview:${maxVideoPreview}` : ''}${notranslate ? ',notranslate' : ''}`;
}
$: if (!robots && additionalRobotsProps) {
console.warn('additionalRobotsProps cannot be used when robots is set to false');
}
$effect(() => {
if (!robots && additionalRobotsProps) {
console.warn('additionalRobotsProps cannot be used when robots is set to false');
}
});
</script>

<svelte:head>
Expand Down Expand Up @@ -83,21 +87,63 @@
{#if twitter.site}
<meta name="twitter:site" content={twitter.site} />
{/if}
{#if twitter.handle}
<meta name="twitter:creator" content={twitter.handle} />
{/if}
{#if twitter.title}
<meta name="twitter:title" content={twitter.title} />
{/if}
{#if twitter.description}
<meta name="twitter:description" content={twitter.description} />
{/if}
{#if twitter.creator}
<meta name="twitter:creator" content={twitter.creator} />
{/if}
{#if twitter.creatorId}
<meta name="twitter:creator:id" content={twitter.creatorId} />
{/if}
{#if twitter.image}
<meta name="twitter:image" content={twitter.image} />
{/if}
{#if twitter.imageAlt}
<meta name="twitter:image:alt" content={twitter.imageAlt} />
{/if}
{#if twitter.player}
<meta name="twitter:player" content={twitter.player} />
{/if}
{#if twitter.playerWidth}
<meta name="twitter:player:width" content={twitter.playerWidth.toString()} />
{/if}
{#if twitter.playerHeight}
<meta name="twitter:player:height" content={twitter.playerHeight.toString()} />
{/if}
{#if twitter.playerStream}
<meta name="twitter:player:stream" content={twitter.playerStream} />
{/if}
{#if twitter.appNameIphone}
<meta name="twitter:app:name:iphone" content={twitter.appNameIphone} />
{/if}
{#if twitter.appIdIphone}
<meta name="twitter:app:id:iphone" content={twitter.appIdIphone} />
{/if}
{#if twitter.appUrlIphone}
<meta name="twitter:app:url:iphone" content={twitter.appUrlIphone} />
{/if}
{#if twitter.appNameIpad}
<meta name="twitter:app:name:ipad" content={twitter.appNameIpad} />
{/if}
{#if twitter.appIdIpad}
<meta name="twitter:app:id:ipad" content={twitter.appIdIpad} />
{/if}
{#if twitter.appUrlIpad}
<meta name="twitter:app:url:ipad" content={twitter.appUrlIpad} />
{/if}
{#if twitter.appNameGoogleplay}
<meta name="twitter:app:name:googleplay" content={twitter.appNameGoogleplay} />
{/if}
{#if twitter.appIdGoogleplay}
<meta name="twitter:app:id:googleplay" content={twitter.appIdGoogleplay} />
{/if}
{#if twitter.appUrlGoogleplay}
<meta name="twitter:app:url:googleplay" content={twitter.appUrlGoogleplay} />
{/if}
{/if}

{#if facebook}
Expand Down Expand Up @@ -289,7 +335,7 @@

{#if additionalMetaTags && Array.isArray(additionalMetaTags)}
{#each additionalMetaTags as tag}
<meta {...tag} />
<meta {...tag.httpEquiv ? { ...tag, 'http-equiv': tag.httpEquiv } : tag} />
{/each}
{/if}

Expand Down
38 changes: 38 additions & 0 deletions packages/svelte-meta-tags/src/lib/deepMerge.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function deepMerge(target: any, source: any) {
const sourceKeys = Object.keys(source);

for (let i = 0; i < sourceKeys.length; i++) {
const key = sourceKeys[i];

const sourceValue = source[key];
const targetValue = target[key];

if (Array.isArray(sourceValue)) {
if (Array.isArray(targetValue)) {
target[key] = deepMerge(targetValue, sourceValue);
} else {
target[key] = deepMerge([], sourceValue);
}
} else if (isPlainObject(sourceValue)) {
if (isPlainObject(targetValue)) {
target[key] = deepMerge(targetValue, sourceValue);
} else {
target[key] = deepMerge({}, sourceValue);
}
} else if (targetValue === undefined || sourceValue !== undefined) {
target[key] = sourceValue;
}
}

return target;
}

function isPlainObject(object?: unknown): boolean {
if (typeof object !== 'object' || object === null) {
return false;
}

const proto = Object.getPrototypeOf(object);
return proto === Object.prototype || proto === null;
}
1 change: 1 addition & 0 deletions packages/svelte-meta-tags/src/lib/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export { default as MetaTags } from './MetaTags.svelte';
export { default as JsonLd } from './JsonLd.svelte';
export { deepMerge } from './deepMerge';
export type {
MetaTagsProps,
JsonLdProps,
Expand Down
Loading

0 comments on commit 30f9180

Please sign in to comment.