Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions apps/sveltekit-old/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
node_modules

# Output
.output
.vercel
/.svelte-kit
/build

# OS
.DS_Store
Thumbs.db

# Env
.env
.env.*
!.env.example
!.env.test

# Vite
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
1 change: 1 addition & 0 deletions apps/sveltekit-old/.npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
engine-strict=true
17 changes: 17 additions & 0 deletions apps/sveltekit-old/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# SvelteKit 2 Demo application for Vercel Web Analytics

## Setup

This application was created with the following commands:

- `cd apps`
- `pnpx sv create sveltekit` (answers: SvelteKit minimal, no Typescript, no additional install, pnpm)
- `cd sveltekit`
- add `src/+layout.js` to include `import { injectAnalytics } from '@vercel/analytics/sveltekit'; injectAnalytics();`
- edit package.json to add `"@vercel/analytics": "workspace:*"` dependency and change `@sveltejs/adapter-auto` into `@sveltejs/adapter-vercel`
- edit `svelte.config.js` to change `@sveltejs/adapter-auto` into `@sveltejs/adapter-vercel`
- `pnpm i`

## Usage

Start it with `pnpm -F sveltekit-old dev` and browse to [http://localhost:5173](http://localhost:5173)
18 changes: 18 additions & 0 deletions apps/sveltekit-old/jsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"moduleResolution": "bundler"
}
// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias and https://kit.svelte.dev/docs/configuration#files
//
// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
// from the referenced tsconfig.json - TypeScript does not merge them in
}
24 changes: 24 additions & 0 deletions apps/sveltekit-old/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "sveltekit-old",
"version": "0.0.1",
"private": true,
"type": "module",
"scripts": {
"build": "vite build",
"check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json",
"dev": "vite dev",
"prepare": "svelte-kit sync",
"preview": "vite preview"
},
"devDependencies": {
"@sveltejs/adapter-vercel": "^6.2",
"@sveltejs/kit": "^2.49",
"@sveltejs/vite-plugin-svelte": "^4.0.0",
"@types/node": "^22.9.0",
"@vercel/analytics": "workspace:*",
"svelte": "^5",
"svelte-check": "^4",
"typescript": "^5.5.0",
"vite": "^5.4.4"
}
}
12 changes: 12 additions & 0 deletions apps/sveltekit-old/src/app.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div style="display: contents">%sveltekit.body%</div>
</body>
</html>
13 changes: 13 additions & 0 deletions apps/sveltekit-old/src/routes/+layout.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import {
type BeforeSendEvent,
injectAnalytics,
} from '@vercel/analytics/sveltekit';
import { dev } from '$app/environment';

injectAnalytics({
mode: dev ? 'development' : 'production',
beforeSend(event: BeforeSendEvent) {
console.log('beforeSend', event);
return event;
},
});
2 changes: 2 additions & 0 deletions apps/sveltekit-old/src/routes/+page.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<h1>Welcome to SvelteKit</h1>
<p>Visit <a href="/bruno">this page</a> to know more...</p>
10 changes: 10 additions & 0 deletions apps/sveltekit-old/src/routes/[slug]/+page.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<script>
import { track } from '@vercel/analytics/sveltekit';
import { page } from '$app/stores';
</script>

<h1>We don't talk about {$page.params.slug}</h1>

<a href="/" onclick={() => track('go-back', { slug: $page.params.slug })}
>Go back</a
>
Binary file added apps/sveltekit-old/static/favicon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes.
6 changes: 6 additions & 0 deletions apps/sveltekit-old/vite.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';

export default defineConfig({
plugins: [sveltekit()],
});
5 changes: 2 additions & 3 deletions apps/sveltekit/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Sveltekit Demo application for Vercel Web Analytics
# SvelteKit 3 Demo application for Vercel Web Analytics

## Setup

Expand All @@ -7,9 +7,8 @@ This application was created with the following commands:
- `cd apps`
- `pnpx sv create sveltekit` (answers: SvelteKit minimal, no Typescript, no additional install, pnpm)
- `cd sveltekit`
- add `src/+layout.js` to include `import { injectAnalytics } from '@vercel/analytics/sveltekit'; injectAnalytics();`
- add `src/+layout.js` to include `import { injectAnalytics } from '@vercel/analytics/sveltekit-next'; injectAnalytics();`
- edit package.json to add `"@vercel/analytics": "workspace:*"` dependency and change `@sveltejs/adapter-auto` into `@sveltejs/adapter-vercel`
- eddi `svelte.config.js` to change `@sveltejs/adapter-auto` into `@sveltejs/adapter-vercel`
- `pnpm i`

## Usage
Expand Down
14 changes: 7 additions & 7 deletions apps/sveltekit/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@
"preview": "vite preview"
},
"devDependencies": {
"@sveltejs/adapter-vercel": "latest",
"@sveltejs/kit": "latest",
"@sveltejs/vite-plugin-svelte": "latest",
"@sveltejs/adapter-vercel": "^7.0.0-next.0",
"@sveltejs/kit": "^3.0.0-next.5",
"@sveltejs/vite-plugin-svelte": "^7.0.0",
"@vercel/analytics": "workspace:*",
"svelte": "latest",
"svelte-check": "latest",
"typescript": "latest",
"vite": "latest"
"svelte": "^5.56.3",
"svelte-check": "^4",
"typescript": "^6",
"vite": "^8.0.12"
}
}
4 changes: 2 additions & 2 deletions apps/sveltekit/src/routes/+layout.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {
type BeforeSendEvent,
injectAnalytics,
} from '@vercel/analytics/sveltekit';
import { dev } from '$app/environment';
} from '@vercel/analytics/sveltekit-next';
import { dev } from '$app/env';

injectAnalytics({
mode: dev ? 'development' : 'production',
Expand Down
8 changes: 4 additions & 4 deletions apps/sveltekit/src/routes/[slug]/+page.svelte
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<script>
import { track } from '@vercel/analytics/sveltekit';
import { page } from '$app/stores';
import { track } from '@vercel/analytics/sveltekit-next';
import { page } from '$app/state';
</script>

<h1>We don't talk about {$page.params.slug}</h1>
<h1>We don't talk about {page.params.slug}</h1>

<a href="/" onclick={() => track('go-back', { slug: $page.params.slug })}
<a href="/" onclick={() => track('go-back', { slug: page.params.slug })}
>Go back</a
>
7 changes: 6 additions & 1 deletion apps/sveltekit/vite.config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import adapter from '@sveltejs/adapter-vercel';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';

export default defineConfig({
plugins: [sveltekit()],
plugins: [
sveltekit({
adapter: adapter(),
}),
],
});
2 changes: 2 additions & 0 deletions packages/web/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ This package does **not** track data in development mode.
3. Inject the Analytics script to your app

- If you are using **Next.js** or **React**, you can use the `<Analytics />` component to inject the script into your app.
- If you are using **SvelteKit 2**, you can use the `injectAnalytics()` function from `@vercel/analytics/sveltekit` in your top-level `+layout.js/ts` file.
- If you are using **SvelteKit 3**, import `injectAnalytics()` from `@vercel/analytics/sveltekit-next` instead.
- To add the tracking script for other frameworks, use the `inject` function.
- If you want to use Vercel Web Analytics on a static site without npm, follow the instructions in the [documentation](https://vercel.com/docs/analytics/quickstart).

Expand Down
17 changes: 13 additions & 4 deletions packages/web/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@vercel/analytics",
"version": "2.1.0-canary",
"version": "2.2.0-canary",
"description": "Gain real-time traffic insights with Vercel Web Analytics",
"keywords": [
"analytics",
Expand Down Expand Up @@ -59,6 +59,10 @@
"svelte": "./dist/sveltekit/index.mjs",
"types": "./dist/sveltekit/index.d.ts"
},
"./sveltekit-next": {
"types": "./dist/sveltekit-next/index.svelte.d.mts",
"svelte": "./dist/sveltekit-next/index.svelte.js"
},
"./vue": {
"browser": "./dist/vue/index.mjs",
"import": "./dist/vue/index.mjs",
Expand Down Expand Up @@ -93,20 +97,25 @@
"sveltekit": [
"dist/sveltekit/index.d.ts"
],
"sveltekit-next": [
"dist/sveltekit-next/index.svelte.d.mts"
],
"vue": [
"dist/vue/index.d.ts"
]
}
},
"scripts": {
"build": "tsup && pnpm copy-astro",
"build": "tsup && pnpm copy-astro && pnpm copy-sveltekit-next-package",
"copy-astro": "cp -R src/astro dist/",
"dev": "pnpm copy-astro && tsup --watch",
"copy-sveltekit-next-package": "mkdir -p dist/sveltekit-next && cp src/sveltekit-next/package.json dist/sveltekit-next/package.json",
"dev": "pnpm copy-astro && pnpm copy-sveltekit-next-package && tsup --watch",
"test": "vitest"
},
"devDependencies": {
"@nuxt/kit": "^4.2.0",
"@nuxt/schema": "^4.2.0",
"@sveltejs/kit": "^3.0.0-next.0",
"@swc/core": "^1.9.2",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.1",
Expand All @@ -123,7 +132,7 @@
},
"peerDependencies": {
"@remix-run/react": "^2",
"@sveltejs/kit": "^1 || ^2",
"@sveltejs/kit": "^1 || ^2 || ^3 || ^3.0.0-next.0",
"next": ">= 13",
"nuxt": ">= 3",
"react": "^18 || ^19 || ^19.0.0-rc",
Expand Down
40 changes: 40 additions & 0 deletions packages/web/src/sveltekit-next/index.svelte.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import type {} from '@sveltejs/kit';
import { page } from '$app/state';
import { inject, pageview, track } from '../generic';
import type { AnalyticsProps, BeforeSend, BeforeSendEvent } from '../types';
import { getBasePath, getConfigString } from './utils';

/**
* Injects Vercel Web Analytics in SvelteKit 3 apps.
*/
function injectAnalytics(props: Omit<AnalyticsProps, 'framework'> = {}): void {
let analyticsInjected = false;

$effect.root(() => {
$effect.pre(() => {
const route = page.route?.id;

if (!route) {
return;
}

if (!analyticsInjected) {
inject(
{
...props,
basePath: getBasePath(),
disableAutoTrack: true,
framework: 'sveltekit',
},
getConfigString(),
);
analyticsInjected = true;
}

pageview({ route, path: page.url.pathname });
});
});
}

export type { AnalyticsProps, BeforeSend, BeforeSendEvent };
export { injectAnalytics, track };
3 changes: 3 additions & 0 deletions packages/web/src/sveltekit-next/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"type": "module"
}
29 changes: 29 additions & 0 deletions packages/web/src/sveltekit-next/utils.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { afterEach, describe, expect, it } from 'vitest';
import { getBasePath, getConfigString } from './utils';

afterEach(() => {
delete import.meta.env.VITE_VERCEL_OBSERVABILITY_BASEPATH;
delete import.meta.env.VITE_VERCEL_OBSERVABILITY_CLIENT_CONFIG;
});

describe('getBasePath()', () => {
it('returns basepath set for SvelteKit', () => {
const basepath = `/_vercel-${Math.random()}/insights`;
import.meta.env.VITE_VERCEL_OBSERVABILITY_BASEPATH = basepath;
expect(getBasePath()).toBe(basepath);
});
});

describe('getConfigString()', () => {
it('returns configuration string for SvelteKit', () => {
const config = JSON.stringify({
analytics: {
viewEndpoint: `/_vercel-${Math.random()}`,
eventEndpoint: `/hfi/${Math.random()}`,
sessionEndpoint: `/_sessions-${Math.random()}`,
},
});
import.meta.env.VITE_VERCEL_OBSERVABILITY_CLIENT_CONFIG = config;
expect(getConfigString()).toBe(config);
});
});
23 changes: 23 additions & 0 deletions packages/web/src/sveltekit-next/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// !! important !!
// do not access env variables using import.meta.env[varname]
// some bundlers won't replace the value at build time.

export function getBasePath(): string | undefined {
try {
return import.meta.env.VITE_VERCEL_OBSERVABILITY_BASEPATH as
| string
| undefined;
} catch {
// do nothing
}
}

export function getConfigString(): string | undefined {
try {
return import.meta.env.VITE_VERCEL_OBSERVABILITY_CLIENT_CONFIG as
| string
| undefined;
} catch {
// do nothing
}
}
6 changes: 5 additions & 1 deletion packages/web/src/sveltekit/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import type {} from '@sveltejs/kit';
// @ts-expect-error $app/environment has been removed in kit 3
import { browser } from '$app/environment';
import { page } from '$app/stores';
import { inject, pageview, track } from '../generic';
import type { AnalyticsProps, BeforeSend, BeforeSendEvent } from '../types';
import { getBasePath, getConfigString } from './utils';

/**
* Injects Vercel Web Analytics in SvelteKit 2 apps.
*/
function injectAnalytics(props: Omit<AnalyticsProps, 'framework'> = {}): void {
if (browser) {
inject(
Expand All @@ -25,5 +29,5 @@ function injectAnalytics(props: Omit<AnalyticsProps, 'framework'> = {}): void {
}
}

export { injectAnalytics, track };
export type { AnalyticsProps, BeforeSend, BeforeSendEvent };
export { injectAnalytics, track };
Loading
Loading