diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml
index 0a0b4d6..5ffea73 100644
--- a/.github/workflows/quality.yml
+++ b/.github/workflows/quality.yml
@@ -10,28 +10,40 @@ concurrency:
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
jobs:
- typescript:
- name: typescript
+ biome:
+ name: lint and format
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v5
+ with:
+ persist-credentials: false
+ - name: Setup Biome
+ uses: biomejs/setup-biome@v2
+ with:
+ version: latest
+ - name: Run Biome
+ run: biome ci
+
+ tests:
+ name: unit tests
runs-on: ubuntu-latest
- timeout-minutes: 10
steps:
- - name: checkout
- uses: actions/checkout@v3
+ - name: Checkout
+ uses: actions/checkout@v5
+ with:
+ persist-credentials: false
- name: Install
uses: ./.github/composite-actions/install
- - name: lint
- run: pnpm -r lint
- - name: type-check
- run: pnpm -r type-check
- - name: prettier
- run: pnpm prettier -c .
- - name: build
- run: pnpm -r build
- - name: test
+ - name: Build
+ run: pnpm -F @vercel/analytics build
+ - name: Run tests
run: pnpm -r test
playwright:
- name: playwright
+ name: e2e tests
runs-on: ubuntu-latest
timeout-minutes: 10
strategy:
@@ -41,14 +53,14 @@ jobs:
- 'test:e2e:production'
- 'test:e2e:development'
steps:
- - name: checkout
- uses: actions/checkout@v3
+ - name: Checkout
+ uses: actions/checkout@v5
- name: Install
uses: ./.github/composite-actions/install
- - name: get playwright version
+ - name: Get Playwright version
id: pw
run: echo "version=$(cat apps/nextjs/package.json | jq -r '.devDependencies."@playwright/test"')" >> $GITHUB_OUTPUT
- - name: install playwright
+ - name: Install Playwright
run: pnpx playwright@${{ steps.pw.outputs.version }} install
- - name: test
+ - name: Run tests
run: pnpm -r ${{ matrix.test }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 78c706a..fa58fed 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -6,23 +6,23 @@ jobs:
release:
runs-on: ubuntu-latest
steps:
- - name: checkout
- uses: actions/checkout@v3
+ - name: Checkout
+ uses: actions/checkout@v5
+ with:
+ persist-credentials: false
- name: Install
uses: ./.github/composite-actions/install
- - name: lint
- run: pnpm -r lint
- - name: type-check
- run: pnpm -r type-check
- - name: prettier
- run: pnpm prettier -c .
- - name: build
- run: pnpm -r build
- - run: pnpm --filter @vercel/analytics publish --tag beta --no-git-checks
+ - name: Setup Biome
+ uses: biomejs/setup-biome@v2
+ - name: Run Biome
+ run: biome ci
+ - name: Build
+ run: pnpm -F @vercel/analytics build
+ - run: pnpm -F @vercel/analytics publish --tag beta --no-git-checks
if: github.event.release.prerelease == true
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN_ELEVATED }}
- - run: pnpm --filter @vercel/analytics publish --no-git-checks
+ - run: pnpm -F@vercel/analytics publish --no-git-checks
if: github.event.release.prerelease == false
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN_ELEVATED }}
diff --git a/.gitignore b/.gitignore
index ab0c11c..37cbef1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,5 @@ dist
.DS_Store
.vscode
.vercel
+.claude
+.env*.local
diff --git a/.husky/pre-commit b/.husky/pre-commit
deleted file mode 100755
index a5a29d9..0000000
--- a/.husky/pre-commit
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/usr/bin/env sh
-. "$(dirname -- "$0")/_/husky.sh"
-
-pnpm lint-staged
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 767c4a8..0000000
--- a/.prettierignore
+++ /dev/null
@@ -1,10 +0,0 @@
-.next/
-dist/
-.astro/
-.vercel/
-.nuxt/
-.output/
-.cache/
-build/
-.svelte-kit/
-pnpm-lock.yaml
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index fa0086a..0834a80 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,373 +1,21 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
- means each individual or legal entity that creates, contributes to
- the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
- means the combination of the Contributions of others (if any) used
- by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
- means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
- means Source Code Form to which the initial Contributor has attached
- the notice in Exhibit A, the Executable Form of such Source Code
- Form, and Modifications of such Source Code Form, in each case
- including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
- means
-
- (a) that the initial Contributor has attached the notice described
- in Exhibit B to the Covered Software; or
-
- (b) that the Covered Software was made available under the terms of
- version 1.1 or earlier of the License, but not also under the
- terms of a Secondary License.
-
-1.6. "Executable Form"
- means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
- means a work that combines Covered Software with other material, in
- a separate file or files, that is not Covered Software.
-
-1.8. "License"
- means this document.
-
-1.9. "Licensable"
- means having the right to grant, to the maximum extent possible,
- whether at the time of the initial grant or subsequently, any and
- all of the rights conveyed by this License.
-
-1.10. "Modifications"
- means any of the following:
-
- (a) any file in Source Code Form that results from an addition to,
- deletion from, or modification of the contents of Covered
- Software; or
-
- (b) any new file in Source Code Form that contains any Covered
- Software.
-
-1.11. "Patent Claims" of a Contributor
- means any patent claim(s), including without limitation, method,
- process, and apparatus claims, in any patent Licensable by such
- Contributor that would be infringed, but for the grant of the
- License, by the making, using, selling, offering for sale, having
- made, import, or transfer of either its Contributions or its
- Contributor Version.
-
-1.12. "Secondary License"
- means either the GNU General Public License, Version 2.0, the GNU
- Lesser General Public License, Version 2.1, the GNU Affero General
- Public License, Version 3.0, or any later versions of those
- licenses.
-
-1.13. "Source Code Form"
- means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
- means an individual or a legal entity exercising rights under this
- License. For legal entities, "You" includes any entity that
- controls, is controlled by, or is under common control with You. For
- purposes of this definition, "control" means (a) the power, direct
- or indirect, to cause the direction or management of such entity,
- whether by contract or otherwise, or (b) ownership of more than
- fifty percent (50%) of the outstanding shares or beneficial
- ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
- Licensable by such Contributor to use, reproduce, make available,
- modify, display, perform, distribute, and otherwise exploit its
- Contributions, either on an unmodified basis, with Modifications, or
- as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
- for sale, have made, import, and otherwise transfer either its
- Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
- or
-
-(b) for infringements caused by: (i) Your and any other third party's
- modifications of Covered Software, or (ii) the combination of its
- Contributions with other software (except as part of its Contributor
- Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
- its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
- Form, as described in Section 3.1, and You must inform recipients of
- the Executable Form how they can obtain a copy of such Source Code
- Form by reasonable means in a timely manner, at a charge no more
- than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
- License, or sublicense it under different terms, provided that the
- license for the Executable Form does not attempt to limit or alter
- the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-* *
-* 6. Disclaimer of Warranty *
-* ------------------------- *
-* *
-* Covered Software is provided under this License on an "as is" *
-* basis, without warranty of any kind, either expressed, implied, or *
-* statutory, including, without limitation, warranties that the *
-* Covered Software is free of defects, merchantable, fit for a *
-* particular purpose or non-infringing. The entire risk as to the *
-* quality and performance of the Covered Software is with You. *
-* Should any Covered Software prove defective in any respect, You *
-* (not any Contributor) assume the cost of any necessary servicing, *
-* repair, or correction. This disclaimer of warranty constitutes an *
-* essential part of this License. No use of any Covered Software is *
-* authorized under this License except under this disclaimer. *
-* *
-************************************************************************
-
-************************************************************************
-* *
-* 7. Limitation of Liability *
-* -------------------------- *
-* *
-* Under no circumstances and under no legal theory, whether tort *
-* (including negligence), contract, or otherwise, shall any *
-* Contributor, or anyone who distributes Covered Software as *
-* permitted above, be liable to You for any direct, indirect, *
-* special, incidental, or consequential damages of any character *
-* including, without limitation, damages for lost profits, loss of *
-* goodwill, work stoppage, computer failure or malfunction, or any *
-* and all other commercial damages or losses, even if such party *
-* shall have been informed of the possibility of such damages. This *
-* limitation of liability shall not apply to liability for death or *
-* personal injury resulting from such party's negligence to the *
-* extent applicable law prohibits such limitation. Some *
-* jurisdictions do not allow the exclusion or limitation of *
-* incidental or consequential damages, so this exclusion and *
-* limitation may not apply to You. *
-* *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
- This Source Code Form is "Incompatible With Secondary Licenses", as
- defined by the Mozilla Public License, v. 2.0.
\ No newline at end of file
+The MIT License (MIT)
+
+Copyright (c) 2026 Vercel, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/apps/astro/src/pages/blog/[...slug].astro b/apps/astro/src/pages/blog/[...slug].astro
index 0945e4e..c22895d 100644
--- a/apps/astro/src/pages/blog/[...slug].astro
+++ b/apps/astro/src/pages/blog/[...slug].astro
@@ -4,8 +4,9 @@ import Layout from '../../layouts/Base.astro';
export async function getStaticPaths() {
const blogEntries = await getCollection('blog');
- return blogEntries.map(entry => ({
- params: { slug: entry.slug }, props: { entry },
+ return blogEntries.map((entry) => ({
+ params: { slug: entry.slug },
+ props: { entry },
}));
}
diff --git a/apps/nextjs-15/package.json b/apps/nextjs-15/package.json
index 10544bf..84f98b6 100644
--- a/apps/nextjs-15/package.json
+++ b/apps/nextjs-15/package.json
@@ -5,20 +5,18 @@
"scripts": {
"build": "next build",
"dev": "next dev --turbopack",
- "lint": "next lint",
"start": "next start"
},
"dependencies": {
"@vercel/analytics": "workspace:^",
- "next": "15.1.9",
- "react": "19.2.1",
- "react-dom": "19.2.1"
+ "next": "16.0.7",
+ "react": "latest",
+ "react-dom": "latest"
},
"devDependencies": {
"@types/node": "^20",
"@types/react": "npm:types-react@19.0.0-rc.1",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
- "eslint-config-next": "15.0.1",
- "typescript": "^5"
+ "eslint-config-next": "15.0.1"
}
}
diff --git a/apps/nextjs-15/src/app/layout.tsx b/apps/nextjs-15/src/app/layout.tsx
index b4c4311..af44dfc 100644
--- a/apps/nextjs-15/src/app/layout.tsx
+++ b/apps/nextjs-15/src/app/layout.tsx
@@ -1,6 +1,6 @@
+import { Analytics } from '@vercel/analytics/next';
import type { Metadata } from 'next';
import localFont from 'next/font/local';
-import { Analytics } from '@vercel/analytics/next';
import './globals.css';
const geistSans = localFont({
diff --git a/apps/nextjs-15/src/app/page.module.css b/apps/nextjs-15/src/app/page.module.css
index 8a46041..ee9b8e6 100644
--- a/apps/nextjs-15/src/app/page.module.css
+++ b/apps/nextjs-15/src/app/page.module.css
@@ -68,7 +68,10 @@
padding: 0 20px;
border: none;
border: 1px solid transparent;
- transition: background 0.2s, color 0.2s, border-color 0.2s;
+ transition:
+ background 0.2s,
+ color 0.2s,
+ border-color 0.2s;
cursor: pointer;
display: flex;
align-items: center;
diff --git a/apps/nextjs-15/tsconfig.json b/apps/nextjs-15/tsconfig.json
index 51d0dbc..6749425 100644
--- a/apps/nextjs-15/tsconfig.json
+++ b/apps/nextjs-15/tsconfig.json
@@ -10,7 +10,7 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
- "jsx": "preserve",
+ "jsx": "react-jsx",
"incremental": true,
"plugins": [
{
@@ -22,6 +22,12 @@
},
"target": "ES2017"
},
- "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
"exclude": ["node_modules"]
}
diff --git a/apps/nextjs/app/api/edge-no-context/route.test.ts b/apps/nextjs/app/api/edge-no-context/route.test.ts
index 051f05b..f008e26 100644
--- a/apps/nextjs/app/api/edge-no-context/route.test.ts
+++ b/apps/nextjs/app/api/edge-no-context/route.test.ts
@@ -10,7 +10,7 @@ describe('app API edge-no-context route', () => {
expect(response.status).toBe(200);
expect(log).toHaveBeenCalledTimes(1);
expect(log).toHaveBeenCalledWith(
- '[Vercel Web Analytics] Track "Edge Event" with data {"data":"edge","router":"app","manual":true}'
+ '[Vercel Web Analytics] Track "Edge Event" with data {"data":"edge","router":"app","manual":true}',
);
});
});
diff --git a/apps/nextjs/app/api/edge-no-context/route.ts b/apps/nextjs/app/api/edge-no-context/route.ts
index 898647c..b81edc9 100644
--- a/apps/nextjs/app/api/edge-no-context/route.ts
+++ b/apps/nextjs/app/api/edge-no-context/route.ts
@@ -12,7 +12,7 @@ async function handler(request: Request) {
},
{
request,
- }
+ },
);
return new Response('OK');
diff --git a/apps/nextjs/app/api/edge/route.test.ts b/apps/nextjs/app/api/edge/route.test.ts
index 5b3f2e2..c2e6d62 100644
--- a/apps/nextjs/app/api/edge/route.test.ts
+++ b/apps/nextjs/app/api/edge/route.test.ts
@@ -10,7 +10,7 @@ describe('app API edge route', () => {
expect(response.status).toBe(200);
expect(log).toHaveBeenCalledTimes(1);
expect(log).toHaveBeenCalledWith(
- '[Vercel Web Analytics] Track "Edge Event" with data {"data":"edge","router":"app"}'
+ '[Vercel Web Analytics] Track "Edge Event" with data {"data":"edge","router":"app"}',
);
});
});
diff --git a/apps/nextjs/app/api/serverless/route.test.ts b/apps/nextjs/app/api/serverless/route.test.ts
index 5a9eded..9bc1a18 100644
--- a/apps/nextjs/app/api/serverless/route.test.ts
+++ b/apps/nextjs/app/api/serverless/route.test.ts
@@ -10,7 +10,7 @@ describe('app API serverless route', () => {
expect(response.status).toBe(200);
expect(log).toHaveBeenCalledTimes(1);
expect(log).toHaveBeenCalledWith(
- '[Vercel Web Analytics] Track "Serverless Event" with data {"data":"serverless","router":"app"}'
+ '[Vercel Web Analytics] Track "Serverless Event" with data {"data":"serverless","router":"app"}',
);
});
});
diff --git a/apps/nextjs/app/rsc/page.tsx b/apps/nextjs/app/rsc/page.tsx
index 1e1d839..21a1fc9 100644
--- a/apps/nextjs/app/rsc/page.tsx
+++ b/apps/nextjs/app/rsc/page.tsx
@@ -1,5 +1,5 @@
-import { cookies } from 'next/headers';
import { track } from '@vercel/analytics/server';
+import { cookies } from 'next/headers';
export default async function RSC() {
cookies();
diff --git a/apps/nextjs/e2e/development/beforeSend.spec.ts b/apps/nextjs/e2e/development/beforeSend.spec.ts
index 8ba5fea..5d59d45 100644
--- a/apps/nextjs/e2e/development/beforeSend.spec.ts
+++ b/apps/nextjs/e2e/development/beforeSend.spec.ts
@@ -1,4 +1,4 @@
-import { test, expect } from '@playwright/test';
+import { expect, test } from '@playwright/test';
import { useMockForProductionScript } from '../utils';
test.describe('beforeSend', () => {
@@ -35,15 +35,15 @@ test.describe('beforeSend', () => {
expect(
messages.find((m) =>
- m.includes('[pageview] http://localhost:3000/before-send/first')
- )
+ m.includes('[pageview] http://localhost:3000/before-send/first'),
+ ),
).toBeDefined();
expect(
messages.find((m) =>
m.includes(
- '[pageview] http://localhost:3000/before-send/second?secret=REDACTED'
- )
- )
+ '[pageview] http://localhost:3000/before-send/second?secret=REDACTED',
+ ),
+ ),
).toBeDefined();
expect(messages.find((m) => m.includes('secret=vercel'))).toBeUndefined();
diff --git a/apps/nextjs/e2e/development/pageview.spec.ts b/apps/nextjs/e2e/development/pageview.spec.ts
index e585707..5ac69d8 100644
--- a/apps/nextjs/e2e/development/pageview.spec.ts
+++ b/apps/nextjs/e2e/development/pageview.spec.ts
@@ -1,4 +1,4 @@
-import { test, expect } from '@playwright/test';
+import { expect, test } from '@playwright/test';
import { useMockForProductionScript } from '../utils';
test.describe('pageview', () => {
@@ -35,13 +35,13 @@ test.describe('pageview', () => {
expect(
messages.find((m) =>
- m.includes('[pageview] http://localhost:3000/navigation/first')
- )
+ m.includes('[pageview] http://localhost:3000/navigation/first'),
+ ),
).toBeDefined();
expect(
messages.find((m) =>
- m.includes('[pageview] http://localhost:3000/navigation/second')
- )
+ m.includes('[pageview] http://localhost:3000/navigation/second'),
+ ),
).toBeDefined();
});
});
diff --git a/apps/nextjs/e2e/production/beforeSend.spec.ts b/apps/nextjs/e2e/production/beforeSend.spec.ts
index 03bc806..31d4f71 100644
--- a/apps/nextjs/e2e/production/beforeSend.spec.ts
+++ b/apps/nextjs/e2e/production/beforeSend.spec.ts
@@ -1,11 +1,11 @@
-import { test, expect } from '@playwright/test';
+import { expect, test } from '@playwright/test';
import { useMockForProductionScript } from '../utils';
test.describe('beforeSend', () => {
test('should replace the value of the secret query parameter', async ({
page,
}) => {
- const payloads: { page: string; payload: Object }[] = [];
+ const payloads: { page: string; payload: unknown }[] = [];
await useMockForProductionScript({
page,
diff --git a/apps/nextjs/e2e/production/pageview.spec.ts b/apps/nextjs/e2e/production/pageview.spec.ts
index 7eb25c1..5ec9461 100644
--- a/apps/nextjs/e2e/production/pageview.spec.ts
+++ b/apps/nextjs/e2e/production/pageview.spec.ts
@@ -1,11 +1,11 @@
-import { test, expect } from '@playwright/test';
+import { expect, test } from '@playwright/test';
import { useMockForProductionScript } from '../utils';
test.describe('pageview', () => {
test('should track page views when navigating between pages', async ({
page,
}) => {
- const payloads: { page: string; payload: Object }[] = [];
+ const payloads: { page: string; payload: unknown }[] = [];
await useMockForProductionScript({
page,
@@ -52,7 +52,7 @@ test.describe('pageview', () => {
});
test('should properly send dynamic route', async ({ page }) => {
- const payloads: { page: string; payload: Object }[] = [];
+ const payloads: { page: string; payload: unknown }[] = [];
await useMockForProductionScript({
page,
@@ -132,7 +132,7 @@ test.describe('pageview', () => {
test('should send pageviews when route doesnt change but path does', async ({
page,
}) => {
- const payloads: { page: string; payload: Object }[] = [];
+ const payloads: { page: string; payload: unknown }[] = [];
await useMockForProductionScript({
page,
diff --git a/apps/nextjs/e2e/utils.ts b/apps/nextjs/e2e/utils.ts
index 9aeeaf5..36044ed 100644
--- a/apps/nextjs/e2e/utils.ts
+++ b/apps/nextjs/e2e/utils.ts
@@ -1,10 +1,15 @@
-import { Page } from '@playwright/test';
+import type { Page } from '@playwright/test';
export async function useMockForProductionScript(props: {
page: Page;
- onPageView: (page: string, payload: Object) => void;
+ onPageView: (page: string, payload: unknown) => void;
debug?: boolean;
}) {
+ await props.page.addInitScript({
+ content:
+ "Object.defineProperty(navigator, 'webdriver', { get() { return undefined }})",
+ });
+
await props.page.route('**/_vercel/insights/script.js', async (route, _) => {
return route.fulfill({
status: 301,
diff --git a/apps/nextjs/middleware.ts b/apps/nextjs/middleware.ts
index c37846f..e16578f 100644
--- a/apps/nextjs/middleware.ts
+++ b/apps/nextjs/middleware.ts
@@ -1,13 +1,13 @@
-import { NextResponse } from 'next/server';
-import type { NextFetchEvent, NextRequest } from 'next/server';
import { track } from '@vercel/analytics/server';
+import type { NextFetchEvent, NextRequest } from 'next/server';
+import { NextResponse } from 'next/server';
export async function middleware(request: NextRequest, event: NextFetchEvent) {
event.waitUntil(
track('Redirect', {
path: request.nextUrl.pathname,
type: 'waitUntil',
- })
+ }),
);
return NextResponse.redirect(new URL('/server-actions', request.url));
}
diff --git a/apps/nextjs/package.json b/apps/nextjs/package.json
index 4d70d3c..1737136 100644
--- a/apps/nextjs/package.json
+++ b/apps/nextjs/package.json
@@ -11,7 +11,7 @@
},
"dependencies": {
"@vercel/analytics": "workspace:*",
- "next": "14.1.0",
+ "next": "14.2.35",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
diff --git a/apps/nextjs/pages/api/test.test.ts b/apps/nextjs/pages/api/test.test.ts
index 9009f94..d2074b1 100644
--- a/apps/nextjs/pages/api/test.test.ts
+++ b/apps/nextjs/pages/api/test.test.ts
@@ -13,7 +13,7 @@ describe('pages API edge route', () => {
expect(response.status).toBe(200);
expect(log).toHaveBeenCalledTimes(1);
expect(log).toHaveBeenCalledWith(
- '[Vercel Web Analytics] Track "Pages Api Route" with data {"runtime":"edge","router":"pages"}'
+ '[Vercel Web Analytics] Track "Pages Api Route" with data {"runtime":"edge","router":"pages"}',
);
});
});
diff --git a/apps/nextjs/pages/api/test.ts b/apps/nextjs/pages/api/test.ts
index cc4af1d..d60b275 100644
--- a/apps/nextjs/pages/api/test.ts
+++ b/apps/nextjs/pages/api/test.ts
@@ -1,11 +1,11 @@
import { track } from '@vercel/analytics/server';
-import { NextFetchEvent, NextRequest } from 'next/server';
+import type { NextFetchEvent, NextRequest } from 'next/server';
export const config = {
runtime: 'edge',
};
-async function handler(request: NextRequest, event: NextFetchEvent) {
+async function handler(_request: NextRequest, _event: NextFetchEvent) {
track('Pages Api Route', {
runtime: 'edge',
router: 'pages',
diff --git a/apps/nextjs/playwright.config.ts b/apps/nextjs/playwright.config.ts
index 0b195f7..d592642 100644
--- a/apps/nextjs/playwright.config.ts
+++ b/apps/nextjs/playwright.config.ts
@@ -1,5 +1,5 @@
-import { PlaywrightTestConfig, devices } from '@playwright/test';
-import path from 'path';
+import path from 'node:path';
+import { devices, type PlaywrightTestConfig } from '@playwright/test';
// Use process.env.PORT by default and fallback to port 3000
const PORT = process.env.PORT || 3000;
diff --git a/apps/nuxt/app.vue b/apps/nuxt/app.vue
deleted file mode 100644
index b56c21c..0000000
--- a/apps/nuxt/app.vue
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/apps/nuxt/app/app.vue b/apps/nuxt/app/app.vue
new file mode 100644
index 0000000..ff10bd9
--- /dev/null
+++ b/apps/nuxt/app/app.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
diff --git a/apps/nuxt/assets/base.css b/apps/nuxt/app/assets/base.css
similarity index 89%
rename from apps/nuxt/assets/base.css
rename to apps/nuxt/app/assets/base.css
index fc15cc4..32a1bdb 100644
--- a/apps/nuxt/assets/base.css
+++ b/apps/nuxt/app/assets/base.css
@@ -62,11 +62,13 @@ body {
min-height: 100vh;
color: var(--color-text);
background: var(--color-background);
- transition: color 0.5s, background-color 0.5s;
+ transition:
+ color 0.5s,
+ background-color 0.5s;
line-height: 1.6;
- font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
- Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
- sans-serif;
+ font-family:
+ Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
+ Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
font-size: 15px;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
diff --git a/apps/nuxt/app/assets/logo.svg b/apps/nuxt/app/assets/logo.svg
new file mode 100644
index 0000000..44177e2
--- /dev/null
+++ b/apps/nuxt/app/assets/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/nuxt/assets/main.css b/apps/nuxt/app/assets/main.css
similarity index 95%
rename from apps/nuxt/assets/main.css
rename to apps/nuxt/app/assets/main.css
index 9db9703..0281132 100644
--- a/apps/nuxt/assets/main.css
+++ b/apps/nuxt/app/assets/main.css
@@ -1,4 +1,4 @@
-@import './base.css';
+@import "./base.css";
#app {
max-width: 1280px;
diff --git a/apps/nuxt/layouts/default.vue b/apps/nuxt/app/layouts/default.vue
similarity index 53%
rename from apps/nuxt/layouts/default.vue
rename to apps/nuxt/app/layouts/default.vue
index bf8ff2d..5ef6abc 100644
--- a/apps/nuxt/layouts/default.vue
+++ b/apps/nuxt/app/layouts/default.vue
@@ -1,25 +1,11 @@
-
-
-
+
diff --git a/apps/vue/src/assets/base.css b/apps/vue/src/assets/base.css
index fc15cc4..32a1bdb 100644
--- a/apps/vue/src/assets/base.css
+++ b/apps/vue/src/assets/base.css
@@ -62,11 +62,13 @@ body {
min-height: 100vh;
color: var(--color-text);
background: var(--color-background);
- transition: color 0.5s, background-color 0.5s;
+ transition:
+ color 0.5s,
+ background-color 0.5s;
line-height: 1.6;
- font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
- Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
- sans-serif;
+ font-family:
+ Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
+ Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
font-size: 15px;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
diff --git a/apps/vue/src/assets/main.css b/apps/vue/src/assets/main.css
index 36fb845..cdbdca2 100644
--- a/apps/vue/src/assets/main.css
+++ b/apps/vue/src/assets/main.css
@@ -1,4 +1,4 @@
-@import './base.css';
+@import "./base.css";
#app {
max-width: 1280px;
diff --git a/apps/vue/vite.config.js b/apps/vue/vite.config.js
index 58f57c5..9ef1986 100644
--- a/apps/vue/vite.config.js
+++ b/apps/vue/vite.config.js
@@ -1,7 +1,6 @@
import { fileURLToPath, URL } from 'node:url';
-
-import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
+import { defineConfig } from 'vite';
// https://vite.dev/config/
export default defineConfig({
diff --git a/biome.jsonc b/biome.jsonc
new file mode 100644
index 0000000..c353b6d
--- /dev/null
+++ b/biome.jsonc
@@ -0,0 +1,49 @@
+{
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true
+ },
+ "formatter": {
+ "enabled": true,
+ "indentStyle": "space",
+ "indentWidth": 2
+ },
+ "javascript": {
+ // So biome does not complain about React "unused" import
+ "jsxRuntime": "reactClassic",
+ "formatter": {
+ "quoteStyle": "single"
+ }
+ },
+ "overrides": [
+ {
+ // Recommended settings for partially supported frameworks
+ "includes": ["packages/web/src/nuxt/**/*"],
+ "linter": {
+ "rules": {
+ "correctness": {
+ // nuxt useRouter isn't a React hook
+ "useHookAtTopLevel": "off"
+ }
+ }
+ }
+ },
+ {
+ // Recommended settings for partially supported frameworks
+ "includes": ["**/*.svelte", "**/*.astro", "**/*.vue"],
+ "linter": {
+ "rules": {
+ "style": {
+ "useConst": "off",
+ "useImportType": "off"
+ },
+ "correctness": {
+ "noUnusedVariables": "off",
+ "noUnusedImports": "off"
+ }
+ }
+ }
+ }
+ ]
+}
diff --git a/lefthook.yml b/lefthook.yml
new file mode 100644
index 0000000..ec8ba25
--- /dev/null
+++ b/lefthook.yml
@@ -0,0 +1,6 @@
+pre-commit:
+ commands:
+ check:
+ glob: '*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}'
+ run: npx @biomejs/biome check --write --no-errors-on-unmatched --files-ignore-unknown=true --colors=off {staged_files}
+ stage_fixed: true
diff --git a/lint-staged.config.js b/lint-staged.config.js
deleted file mode 100644
index e9afbd1..0000000
--- a/lint-staged.config.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = {
- '*': 'prettier --write --ignore-unknown',
-};
diff --git a/package.json b/package.json
index 170ccfd..598f6f9 100644
--- a/package.json
+++ b/package.json
@@ -4,18 +4,11 @@
"type": "git",
"url": "git+https://github.com/vercel/analytics.git"
},
- "license": "MPL-2.0",
- "scripts": {
- "prepare": "husky install"
- },
+ "license": "MIT",
"prettier": "@vercel/style-guide/prettier",
- "dependencies": {
- "lint-staged": "^13.2.2"
- },
"devDependencies": {
- "@vercel/style-guide": "^5.0.1",
- "husky": "^8.0.3",
- "prettier": "2.8.8",
+ "@biomejs/biome": "^2.3.10",
+ "lefthook": "^2.0.12",
"typescript": "^5.1.6"
},
"packageManager": "pnpm@8.6.5"
diff --git a/packages/eslint-config/index.js b/packages/eslint-config/index.js
deleted file mode 100644
index 749aa43..0000000
--- a/packages/eslint-config/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-module.exports = {
- root: true,
- extends: [
- require.resolve('@vercel/style-guide/eslint/browser'),
- require.resolve('@vercel/style-guide/eslint/react'),
- require.resolve('@vercel/style-guide/eslint/next'),
- require.resolve('@vercel/style-guide/eslint/typescript'),
- require.resolve('@vercel/style-guide/eslint/jest'),
- ],
- env: {
- jest: true,
- },
- parserOptions: {
- project: './tsconfig.json',
- },
- ignorePatterns: ['*.config.js', 'dist/'],
-};
diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json
deleted file mode 100644
index ced54c0..0000000
--- a/packages/eslint-config/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "name": "@vercel/eslint-config",
- "version": "0.0.0",
- "private": true,
- "main": "index.js",
- "dependencies": {
- "@next/eslint-plugin-next": "13.4.7"
- },
- "devDependencies": {
- "@vercel/style-guide": "5.0.1",
- "eslint": "8.43.0",
- "prettier": "2.8.8",
- "typescript": "5.1.3"
- },
- "peerDependencies": {
- "eslint": "8.26.0",
- "typescript": "4.8.4"
- }
-}
diff --git a/packages/web/LICENSE b/packages/web/LICENSE
deleted file mode 100644
index fa0086a..0000000
--- a/packages/web/LICENSE
+++ /dev/null
@@ -1,373 +0,0 @@
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
- means each individual or legal entity that creates, contributes to
- the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
- means the combination of the Contributions of others (if any) used
- by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
- means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
- means Source Code Form to which the initial Contributor has attached
- the notice in Exhibit A, the Executable Form of such Source Code
- Form, and Modifications of such Source Code Form, in each case
- including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
- means
-
- (a) that the initial Contributor has attached the notice described
- in Exhibit B to the Covered Software; or
-
- (b) that the Covered Software was made available under the terms of
- version 1.1 or earlier of the License, but not also under the
- terms of a Secondary License.
-
-1.6. "Executable Form"
- means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
- means a work that combines Covered Software with other material, in
- a separate file or files, that is not Covered Software.
-
-1.8. "License"
- means this document.
-
-1.9. "Licensable"
- means having the right to grant, to the maximum extent possible,
- whether at the time of the initial grant or subsequently, any and
- all of the rights conveyed by this License.
-
-1.10. "Modifications"
- means any of the following:
-
- (a) any file in Source Code Form that results from an addition to,
- deletion from, or modification of the contents of Covered
- Software; or
-
- (b) any new file in Source Code Form that contains any Covered
- Software.
-
-1.11. "Patent Claims" of a Contributor
- means any patent claim(s), including without limitation, method,
- process, and apparatus claims, in any patent Licensable by such
- Contributor that would be infringed, but for the grant of the
- License, by the making, using, selling, offering for sale, having
- made, import, or transfer of either its Contributions or its
- Contributor Version.
-
-1.12. "Secondary License"
- means either the GNU General Public License, Version 2.0, the GNU
- Lesser General Public License, Version 2.1, the GNU Affero General
- Public License, Version 3.0, or any later versions of those
- licenses.
-
-1.13. "Source Code Form"
- means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
- means an individual or a legal entity exercising rights under this
- License. For legal entities, "You" includes any entity that
- controls, is controlled by, or is under common control with You. For
- purposes of this definition, "control" means (a) the power, direct
- or indirect, to cause the direction or management of such entity,
- whether by contract or otherwise, or (b) ownership of more than
- fifty percent (50%) of the outstanding shares or beneficial
- ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
- Licensable by such Contributor to use, reproduce, make available,
- modify, display, perform, distribute, and otherwise exploit its
- Contributions, either on an unmodified basis, with Modifications, or
- as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
- for sale, have made, import, and otherwise transfer either its
- Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
- or
-
-(b) for infringements caused by: (i) Your and any other third party's
- modifications of Covered Software, or (ii) the combination of its
- Contributions with other software (except as part of its Contributor
- Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
- its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
- Form, as described in Section 3.1, and You must inform recipients of
- the Executable Form how they can obtain a copy of such Source Code
- Form by reasonable means in a timely manner, at a charge no more
- than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
- License, or sublicense it under different terms, provided that the
- license for the Executable Form does not attempt to limit or alter
- the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-* *
-* 6. Disclaimer of Warranty *
-* ------------------------- *
-* *
-* Covered Software is provided under this License on an "as is" *
-* basis, without warranty of any kind, either expressed, implied, or *
-* statutory, including, without limitation, warranties that the *
-* Covered Software is free of defects, merchantable, fit for a *
-* particular purpose or non-infringing. The entire risk as to the *
-* quality and performance of the Covered Software is with You. *
-* Should any Covered Software prove defective in any respect, You *
-* (not any Contributor) assume the cost of any necessary servicing, *
-* repair, or correction. This disclaimer of warranty constitutes an *
-* essential part of this License. No use of any Covered Software is *
-* authorized under this License except under this disclaimer. *
-* *
-************************************************************************
-
-************************************************************************
-* *
-* 7. Limitation of Liability *
-* -------------------------- *
-* *
-* Under no circumstances and under no legal theory, whether tort *
-* (including negligence), contract, or otherwise, shall any *
-* Contributor, or anyone who distributes Covered Software as *
-* permitted above, be liable to You for any direct, indirect, *
-* special, incidental, or consequential damages of any character *
-* including, without limitation, damages for lost profits, loss of *
-* goodwill, work stoppage, computer failure or malfunction, or any *
-* and all other commercial damages or losses, even if such party *
-* shall have been informed of the possibility of such damages. This *
-* limitation of liability shall not apply to liability for death or *
-* personal injury resulting from such party's negligence to the *
-* extent applicable law prohibits such limitation. Some *
-* jurisdictions do not allow the exclusion or limitation of *
-* incidental or consequential damages, so this exclusion and *
-* limitation may not apply to You. *
-* *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
- This Source Code Form is "Incompatible With Secondary Licenses", as
- defined by the Mozilla Public License, v. 2.0.
\ No newline at end of file
diff --git a/packages/web/jest.config.js b/packages/web/jest.config.js
deleted file mode 100644
index f45b9dd..0000000
--- a/packages/web/jest.config.js
+++ /dev/null
@@ -1,9 +0,0 @@
-module.exports = {
- testEnvironment: 'jsdom',
- transform: {
- '^.+\\.(t|j)sx?$': '@swc/jest',
- },
- coverageReporters: ['text', 'html'],
- setupFilesAfterEnv: ['/jest.setup.ts'],
- reporters: ['default', 'github-actions'],
-};
diff --git a/packages/web/package.json b/packages/web/package.json
index 6a0f89d..15de50a 100644
--- a/packages/web/package.json
+++ b/packages/web/package.json
@@ -1,6 +1,6 @@
{
"name": "@vercel/analytics",
- "version": "1.6.1",
+ "version": "2.0.0",
"description": "Gain real-time traffic insights with Vercel Web Analytics",
"keywords": [
"analytics",
@@ -10,7 +10,7 @@
"url": "github:vercel/analytics",
"directory": "packages/web"
},
- "license": "MPL-2.0",
+ "license": "MIT",
"exports": {
"./package.json": "./package.json",
".": {
@@ -27,10 +27,14 @@
"require": "./dist/next/index.js"
},
"./nuxt": {
- "browser": "./dist/nuxt/index.mjs",
"import": "./dist/nuxt/index.mjs",
"require": "./dist/nuxt/index.js"
},
+ "./nuxt/runtime": {
+ "browser": "./dist/nuxt/runtime/index.mjs",
+ "import": "./dist/nuxt/runtime/index.mjs",
+ "require": "./dist/nuxt/runtime/index.js"
+ },
"./react": {
"browser": "./dist/react/index.mjs",
"import": "./dist/react/index.mjs",
@@ -71,6 +75,9 @@
"nuxt": [
"dist/nuxt/index.d.ts"
],
+ "nuxt/runtime": [
+ "dist/nuxt/runtime/index.d.ts"
+ ],
"react": [
"dist/react/index.d.ts"
],
@@ -92,33 +99,20 @@
"build": "tsup && pnpm copy-astro",
"copy-astro": "cp -R src/astro dist/",
"dev": "pnpm copy-astro && tsup --watch",
- "lint": "eslint .",
- "lint-fix": "eslint . --fix",
- "test": "vitest",
- "type-check": "tsc --noEmit"
- },
- "eslintConfig": {
- "extends": [
- "@vercel/eslint-config"
- ],
- "rules": {
- "tsdoc/syntax": "off"
- },
- "ignorePatterns": [
- "jest.setup.ts"
- ]
+ "test": "vitest"
},
"devDependencies": {
+ "@nuxt/kit": "^4.2.0",
+ "@nuxt/schema": "^4.2.0",
"@swc/core": "^1.9.2",
- "@testing-library/jest-dom": "^6.6.3",
- "@testing-library/react": "^16.0.1",
+ "@testing-library/jest-dom": "^6.9.1",
+ "@testing-library/react": "^16.3.1",
"@types/node": "^22.9.0",
"@types/react": "^18.3.12",
- "@vercel/eslint-config": "workspace:0.0.0",
"server-only": "^0.0.1",
"svelte": "^5.1.10",
"tsup": "8.3.5",
- "vitest": "^2.1.5",
+ "vitest": "^4.0.16",
"vue": "^3.5.12",
"vue-router": "^4.4.5"
},
@@ -126,6 +120,7 @@
"@remix-run/react": "^2",
"@sveltejs/kit": "^1 || ^2",
"next": ">= 13",
+ "nuxt": ">= 3",
"react": "^18 || ^19 || ^19.0.0-rc",
"svelte": ">= 4",
"vue": "^3",
diff --git a/packages/web/src/astro/component.ts b/packages/web/src/astro/component.ts
index 5e390a5..46def13 100644
--- a/packages/web/src/astro/component.ts
+++ b/packages/web/src/astro/component.ts
@@ -1,9 +1,7 @@
-// @ts-expect-error typescript doesn't handle ./index.astro properly, but it's needed to generate types
-// eslint-disable-next-line import/no-default-export, no-useless-rename -- Exporting everything doesn't yield the desired outcome
-export { default as default } from './index.astro';
export type {
AnalyticsProps,
BeforeSend,
BeforeSendEvent,
// @ts-expect-error this filed is copied to dist, so it's ok to reference the generated index.d.ts
} from '../index.d.ts';
+export { default } from './index.astro';
diff --git a/packages/web/src/astro/index.astro b/packages/web/src/astro/index.astro
index 52bac82..8c69667 100644
--- a/packages/web/src/astro/index.astro
+++ b/packages/web/src/astro/index.astro
@@ -1,6 +1,7 @@
---
// Since this file will not be bundled by Tsup, it is referencing bundled files relative to dist/astro/
import type { AnalyticsProps } from '../index.d.ts';
+
type Props = Omit;
const propsStr = JSON.stringify(Astro.props);
@@ -15,12 +16,26 @@ const paramsStr = JSON.stringify(Astro.params);