Compare commits

...

24 commits
1.0.1 ... main

Author SHA1 Message Date
8615595ad6 Update modules 2025-01-29 22:42:22 +01:00
f621c33de9 Consent API (#1)
# Changelog
- fix typo in supressDnt to suppressDnt setting,
- expose recordConsent and revokeConsent API calls,
- expose Wide Angle API as `useWideAngle()` and remove obsolete `useWaaEvent`

Reviewed-on: https://cloud.inputobjects.eu/forge/forge/wideangle/wideangle-nuxt/pulls/1
Co-authored-by: Jarek Rozanski <jrozanski@inputobjects.eu>
Co-committed-by: Jarek Rozanski <jrozanski@inputobjects.eu>
2025-01-29 20:28:22 +00:00
787a1fd57f Update module tooling 2025-01-02 22:46:27 +01:00
f52bec681c Update dependencies 2025-01-02 22:14:31 +01:00
1f21177997 Reference latest Wide Angle Analytics Vue loader 2025-01-02 22:07:56 +01:00
f8fd8d9567 Packages movie to new repository 2025-01-02 21:57:19 +01:00
Daniel Roe
b51f1f256a
chore: indicate compatibility with new v4 major (#5) 2025-01-02 09:54:36 +01:00
Daniel Roe
967997b2e0
docs: use new nuxi module add command in installation (#4)
* docs: use new `nuxi module add` command in installation

* chore: update block
2025-01-02 09:53:51 +01:00
f34a13327e Version 1.2.1 2024-09-22 20:42:30 +00:00
91b53da7f0 Update documentation 2024-09-22 20:42:16 +00:00
804e8ea1d8 Support Wide Angle Analytics values. 2024-09-22 19:58:12 +00:00
7b78980023
Future proof to Nuxt 3.7.0+ (#3) 2024-04-02 20:49:18 +02:00
d6b11afd2d
Merge pull request #1 from rvdriest/docs-spelling
docs: fix spelling mistakes
2023-11-08 12:07:37 +01:00
Richard van Driest
45a65edaae fixed spelling mistake 2023-11-08 10:57:11 +00:00
Richard van Driest
3b570b2044
docs: remove double a 2023-10-21 18:56:17 +02:00
Richard van Driest
ac81d120e2
docs: fix some spelling mistakes 2023-10-21 18:54:32 +02:00
07eb639f04 Fix build issue due to missing defu dep 2023-09-13 14:37:57 +00:00
3867c24b41 Clean imports and remove unused 2023-09-13 14:28:30 +00:00
5414117a3a Module version 1.0.2 2023-09-13 14:20:10 +00:00
554d6a3ebf Version update 2023-09-13 14:19:53 +00:00
5fab6a5594 Fix for handling default values 2023-09-13 14:19:43 +00:00
e26d6542d3 Wide Angle Analytics Link 2023-08-26 19:00:00 +00:00
1bb566bf6f Missing Nuxt Link 2023-08-26 18:32:49 +00:00
05a2dc1f75 Fix README links 2023-08-26 18:31:56 +00:00
17 changed files with 15574 additions and 7355 deletions

5
.gitignore vendored
View file

@ -35,11 +35,6 @@ coverage
# VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Intellij idea
*.iml

136
README.md
View file

@ -1,9 +1,12 @@
# Wide Angle Analytics Nuxt3 Module
[![License][license-src]][license-href]
[![Latest][npm-version-src]][npm-version-href]
[![Downloads][npm-downloads-src]][npm-downloads-href]
[![Nuxt][nuxt-src]][nuxt-href]
[![Wide Angle][wideangle-src]][wideangle-href]
![Wide Angle Analytics Large Logo](https://github.com/inputobjects/wideangle-nuxt/assets/4896588/7efee4f1-d9e1-4b54-a5cd-257d13494f41)
![Wide Angle Analytics Large Logo](assets/full_logo_color_light_transparent.png)
# Wide Angle Analytics module for Nuxt
@ -13,15 +16,17 @@ Enable **privacy-friendly** web analytics in your [Nuxt 3.x](https://nuxt.com/)
# How to get started
You can enable Wide Angle Analytics in your Nuxt projects in just few steps. No complex configuration needed as our sane defaults give you reliable and privacy centric deployment out of the box.
You can enable Wide Angle Analytics in your Nuxt projects in just a few steps. No complex configuration needed, as our sane defaults provide you with a reliable and privacy-centric deployment out of the box.
1. Go to [Wide Angle](https://wideangle.co) website, create an account. You can create free 14-day trail. No Credit Card is required. [Learn more.](https://wideangle.co/documentation/create-account)
2. [Create new Site](https://wideangle.co/documentation/create-and-configure-site) and activate it.
3. Install `wideangle-vuejs` plugin in your Vue application.
1. Go to the [Wide Angle](https://wideangle.co) website and create an account. You can enjoy a free 14-day trail. No Credit Card is required. [Learn more.](https://wideangle.co/documentation/create-account)
2. [Create a new site](https://wideangle.co/documentation/create-and-configure-site) and activate it.
3. Install the `wideangle-vuejs` plugin in your Vue application.
```npm install wideangle-nuxt```
```bash
npx nuxi@latest module add wideangle
```
4. Enable and configure module.
4. Enable and configure the module.
```javascript
export default defineNuxtConfig({
@ -39,20 +44,21 @@ export default defineNuxtConfig({
# Configuring Wide Angle Analytics plugin
The Wide Angle Analytics plugin must be initialized with configuration object as there are required settings without defaults.
The Wide Angle Analytics plugin must be initialized with a configuration object as there are required settings without defaults.
option|description|required|default|example
------|-----------|--------|-------|-------
siteId| The Site ID from Wide Angle Site settings| :white_check_mark: | _none_ | 8D27G3B9ACA01F4241
siteId| The Site ID from the Wide Angle Site settings| :white_check_mark: | _none_ | 8D27G3B9ACA01F4241
domain| Domain hosting the script, can be found in Wide Angle Analytics Site settings | :x: | stats.wideangle.co | your.domain.com
fingerprint | Should script use browser fingerprinting; this might require collecting consent depeing on the applicable laws | :x: | false | true
supressDnt | Should script ingore Do Not Track browser setting. If not enabled, not events will be sent if user's browser has DNT enabled | :x: | false | true
fingerprint | Should script use browser fingerprinting; this might require collecting consent depending on the applicable laws | :x: | false | true
suppressDnt | Should script ingore Do Not Track browser setting. If not enabled, no events will be sent if user's browser has DNT enabled | :x: | false | true
includeParams | An array of query parameters that can be passed as part of tracking event. By default only `utm_*` and `ref` parameters are passed in the event | :x: | `[]` | `['sessionId', 'offset']`
excludePaths | An array of URL paths that should not trigger default events such as page view, page leave | :x: | `[]` | `['^/wp-admin/.*', ]`
ignoreHash | If enabled, change in the URL fragment will not trigger page view event | :x: | false | true
ignoreHash | If enabled, a change in the URL fragment will not trigger page view event | :x: | false | true
consentMarker | Name of cookie (with or without) which presence is treated as implied consent; when not defined, consent is not determined by cookie | :x: | n/a | `WAA_CONSENT=true`
You will find more details about these settings in [Wide Angle Analytics documentation](https://wideangle.co/documentation/configure-site).
You can find more details about these settings in the [Wide Angle Analytics documentation](https://wideangle.co/documentation/configure-site).
Example:
@ -67,10 +73,11 @@ export default defineNuxtConfig({
siteId: "8D27G3B9ACA01F4241",
domain: "your.domain.com",
fingerprint: false,
supressDnt: true,
suppressDnt: true,
includeParams: ['q', 'customerId'],
excludePaths: ['^/admin.*'],
ignoreHash: true
ignoreHash: true,
consentMarker: `WAA_CONSENT=true`
}
}
}
@ -80,12 +87,21 @@ export default defineNuxtConfig({
# Usage
The Wide Angle Analytics provides an instance of `waa` which can be then injected to your component.
The Wide Angle Analytics provides a composable which can be used in your component.
```javascript
import { useWideAngle } from '#imports'
<template>
<button @click="sendEvent">Send Event</button>
</template>
<script setup>
import { useWideAngle } from '#imports';
const sendEvent = () => {
useWideAngle().dispatchEvent('basket-open', {'page': 'catalogue'}, {'item-price': 599.00, 'basket-total': 1299.00});
}
</script>
useWideAngle('purchase', {'basket_value': '45.00'})
```
You will find a fully functional example in this [repository](playground/app.vue).
@ -102,7 +118,7 @@ Wide Angle supports three specialized events:
* downloads
* custom actions
Site has to have these event enable in Wide Angle Analytics configuration prior to usage. Otherwise the tracker script will not sent these events. Consult [official documentation](https://wideangle.co/documentation/tracking-custom-actions) regarding how to enable event handling.
Site has to have these events enabled in the Wide Angle Analytics configuration prior to usage. Otherwise the tracker script will not send these events. Consult the [official documentation](https://wideangle.co/documentation/tracking-custom-actions) regarding how to enable event handling.
### Tracking Clicks
@ -116,7 +132,7 @@ Depending on the configured mode, the **Download Event** will fire automatically
### Tracking Custom Actions
Custom action are the most flexible and can be triggered directly from Vue components. As such their usage is not limitted due to Shadow DOM.
Custom actions are the most flexible and can be triggered directly from Vue components. As such, their usage is not limitted due to the Shadow DOM.
Example:
@ -126,25 +142,91 @@ Example:
</template>
<script setup>
import { useWaaEvent } from '#imports'
import { useWideAngle } from '#imports'
const sendEvent = async () => {
const params = {
session: 'cjhw92nf9aq',
cohort: 'c1233'
}
useWaaEvent('interest', params);
}
useWideAngle().dispatchEvent('interest', params);
}
</script>
```
### Module Assets
You can find high-resolution Wide Angle Analytics logo and icon on our [media page](https://wideangle.co/media).
You can find a high-resolution Wide Angle Analytics logo and icon on our [media page](https://wideangle.co/media).
# Recording consent
The Wide Angle Analytics, thanks to is privacy-first, anonymous approach to web traffic analytics does not requires consent by default.
However, we do offer multiple tools that support collecting consent should it be required in your use case.
## Opt-Out by default
If the visitors browsers has `DoNotTrack` setting enabled in the browser, it will be understood as opt-out and not tracking events will be issued.
You website can't overwrite this behaviour by specifying `suppressDnt` setting.
```javascript
wideangle: {
siteId: "8D27G3B9ACA01F4241",
suppressDnt: true
}
```
## Opt-In or Opt-Out based on Cookie
Wide Angle can be configure to handle presence of a cookie, or a cookie with specific value, as an implicit consent. Lack of the cookie will be handled as implicit opt-out.
Example configuration with cookie marker, expecting cookie name `WAA_CONSENT` with value `true`:
```javascript
wideangle: {
siteId: "8D27G3B9ACA01F4241",
consentMarker: "WAA_CONSENT=true"
}
```
## Programmatic consent
The Wide Angle serving offers two additional methods, which allow for recording tracking consent:
- `recordConsent(subjectId: String): void`, and
- `revokeConsent()`
Calling above methods on `waa` service will overwrite other consent mechanism (ie. DoNotTrack, and cookie marker).
Example usage:
```vue
<script setup>
import { useWideAngle } from '#imports'
useWideAngle().recordConsent('FHJ44111');
</script>
```
<!-- Badges -->
[license-src]: https://img.shields.io/npm/l/wideangle.svg?style=flat&colorA=18181B&colorB=28CF8D
[license-href]: https://npmjs.com/package/wideangle
[license-src]: https://img.shields.io/npm/l/wideangle-nuxt.svg?style=flat&colorA=18181B&colorB=28CF8D
[license-href]: https://opensource.org/license/apache-2-0/
[nuxt-src]: https://img.shields.io/badge/Nuxt-18181B?logo=nuxt.js
[npm-downloads-src]: https://img.shields.io/npm/dm/wideangle-nuxt.svg?style=flat&colorA=18181B&colorB=28CF8DD
[npm-downloads-href]: https://npmjs.com/package/wideangle-nuxt
[npm-version-src]: https://img.shields.io/npm/v/wideangle-nuxt/latest.svg?style=flat&colorA=18181B&colorB=28CF8DD
[npm-version-href]: https://npmjs.com/package/wideangle-nuxt
[nuxt-src]: https://img.shields.io/badge/Nuxt-18181B?&logo=nuxt.js
[nuxt-href]: https://nuxt.com
[wideangle-src]: https://img.shields.io/badge/logo-wideangle-blue?label=&logo=data:image/png;base64,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
[wideangle-href]: https://wideangle.co?utm_source=github&utm_content=wideangle-nuxt

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

20
eslint.config.mjs Normal file
View file

@ -0,0 +1,20 @@
// @ts-check
import { createConfigForNuxt } from '@nuxt/eslint-config/flat'
// Run `npx @eslint/config-inspector` to inspect the resolved config interactively
export default createConfigForNuxt({
features: {
// Rules for module authors
tooling: true,
// Rules for formatting
stylistic: true,
},
dirs: {
src: [
'./playground',
],
},
})
.append(
// your custom flat config here...
)

22502
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,12 @@
{
"name": "wideangle-nuxt",
"version": "1.0.1",
"version": "2.0.0",
"description": "Wide Angle Analytics module for Nuxt",
"repository": "inputobjects/wideangle-nuxt",
"homepage": "https://wideangle.co",
"repository": {
"type": "git",
"url": "https://cloud.inputobjects.eu/forge/wideangle/wideangle-nuxt.git"
},
"author": "Wide Angle Analytics <developers@wideangle.co>",
"license": "Apache-2.0",
"type": "module",
@ -13,7 +17,9 @@
"vuejs",
"plugin",
"vuejs plugin",
"nuxt module"
"nuxt module",
"privacy",
"privacy web analytics"
],
"exports": {
".": {
@ -28,28 +34,29 @@
"dist"
],
"scripts": {
"prepack": "nuxt-module-build",
"prepack": "nuxt-module-build build",
"dev": "nuxi dev playground",
"dev:build": "nuxi build playground",
"dev:prepare": "nuxt-module-build --stub && nuxi prepare playground",
"release": "npm run lint && npm run test && npm run prepack && changelogen --release && npm publish && git push --follow-tags",
"dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground",
"release": "npm run prepack && changelogen --release && npm publish",
"lint": "eslint .",
"test": "vitest run",
"test:watch": "vitest watch"
"lint:fix": "eslint . --fix"
},
"dependencies": {
"@nuxt/kit": "^3.4.3",
"wideangle-vuejs": "1.0.0"
"@nuxt/kit": "^3.15.3",
"wideangle-vuejs": "2.0.0",
"defu": "^6.1.4"
},
"devDependencies": {
"@nuxt/eslint-config": "^0.1.1",
"@nuxt/module-builder": "^0.3.0",
"@nuxt/schema": "^3.4.3",
"@nuxt/test-utils": "^3.4.3",
"@types/node": "^18",
"changelogen": "^0.5.3",
"eslint": "^8.39.0",
"nuxt": "^3.4.3",
"vitest": "^0.30.1"
"@nuxt/devtools": "latest",
"@nuxt/eslint-config": "^0.7.5",
"@nuxt/module-builder": "^0.8.4",
"@nuxt/schema": "^3.15.3",
"@types/node": "latest",
"changelogen": "^0.5.7",
"eslint": "^9.19.0",
"nuxt": "^3.13.2",
"typescript": "~5.7.2",
"vue-tsc": "^2.2.0"
}
}

View file

@ -1,34 +0,0 @@
<template>
<main>
<h1>Nuxt Application</h1>
<button @click="trackClick">Track Click</button>
</main>
</template>
<script setup lang="ts">
import { useWaaEvent } from "#imports";
function trackClick() {
useWaaEvent("foo", {"name": "bar"});
}
</script>
<style>
main {
font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
font-size: 2rem;
display: flex;
flex-direction: column;
max-width: 300px;
gap: 2rem;
align-items: center;
margin: 0 auto;
text-align: center;
}
button {
padding: 1rem;
}
</style>

View file

@ -0,0 +1,11 @@
<template>
<button @click="sendEvent">Send Event</button>
</template>
<script setup>
import { useWideAngle } from '#imports';
const sendEvent = () => {
useWideAngle().dispatchEvent('foo', {'param1': 'bar'}, {'value1': 123});
}
</script>

View file

@ -1,10 +1,17 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
modules: ['../src/module'],
wideangle: {
siteId: "8D27G3B9ACA01F4241",
domain: "wideangle.local:3000",
fingerprint: true,
supressDnt: true
devtools: { enabled: true },
compatibilityDate: "2025-01-28",
modules: ['wideangle-nuxt'],
// ssr: false,
runtimeConfig: {
public: {
wideangle: {
siteId: "8D27G3B9ACA01F4241",
domain: "events.wideangle.test",
fingerprint: false,
suppressDnt: true
}
}
}
})

View file

@ -1,4 +0,0 @@
{
"private": true,
"name": "wideangle-playground"
}

View file

@ -0,0 +1,7 @@
<template>
<div>
<h1>Wide Angle Analytics Playground</h1>
<sample-tracker/>
</div>
</template>

View file

@ -1,16 +1,17 @@
import { defineNuxtModule, addPlugin, addImports, createResolver, useLogger } from '@nuxt/kit'
import { fileURLToPath } from 'url'
import { defineNuxtModule, addPlugin, addImportsDir, createResolver, useLogger } from '@nuxt/kit'
import { defu } from 'defu'
const logger = useLogger('nuxt:wideangle')
export interface ModuleOptions {
siteId?: string
domain?: string
fingerprint?: boolean
supressDnt?: boolean
includeParams?: string[]
excludePaths?: string[]
ignoreHash?: boolean
domain: string
fingerprint: boolean
suppressDnt: boolean
includeParams: string[]
excludePaths: string[]
ignoreHash: boolean
consentMarker?: string
}
export default defineNuxtModule<ModuleOptions>({
@ -18,31 +19,29 @@ export default defineNuxtModule<ModuleOptions>({
name: 'wideangle',
configKey: 'wideangle',
compatibility: {
nuxt: '^3'
}
nuxt: '>=3',
},
},
defaults: {
domain: "stats.wideangle.co",
domain: 'stats.wideangle.co',
fingerprint: false,
supressDnt: false,
suppressDnt: false,
includeParams: [],
excludePaths: [],
ignoreHash: false
ignoreHash: false,
consentMarker: undefined,
},
setup (options, nuxt) {
const runtimeDir = fileURLToPath(new URL('./runtime', import.meta.url))
nuxt.options.build.transpile.push(runtimeDir);
const resolver = createResolver(import.meta.url);
setup(options, nuxt) {
const resolver = createResolver(import.meta.url)
nuxt.options.build.transpile.push(resolver.resolve('./runtime'))
addImports({
name: "useWaaEvent",
as: "useWaaEvent",
from: resolver.resolve('./runtime/composables/useWaaEvent')
});
nuxt.options.runtimeConfig.public.wideangle = defu(
nuxt.options.runtimeConfig.public.wideangle ||= {},
{ ...options })
logger.info('Adding Wide Angle Analytics (useWideAngle) import')
addImportsDir(resolver.resolve('./runtime/composables'))
addPlugin({
src: resolver.resolve('./runtime/plugin.client')
});
}
logger.info('Adding Wide Angle Analytics runtime plugin')
addPlugin(resolver.resolve('./runtime/plugin.client'))
},
})

View file

@ -1,10 +0,0 @@
import { useNuxtApp } from '#imports';
export function useWaaEvent (name: string, params?: Record<string, any>) {
const waa = useNuxtApp().$waa
if(waa && waa.value) {
waa.value.dispatchEvent(name, params);
} else {
console.debug("[WAA] Wide Angle Analytics is not yest initialized");
}
}

View file

@ -0,0 +1,27 @@
import {useNuxtApp} from '#imports'
import type {WideAngleApi} from "~/src/types";
class NoOpWideAngleAnalyticsApi implements WideAngleApi {
dispatchEvent(name: string, params: any, values: any): void {
console.debug(`[WideAngleApi#dispatchEvent] Defaulting to NoOp Wide Angle call with name "${name}", params: ${JSON.stringify(params)}, values: ${JSON.stringify(params)}`);
}
recordConsent(subjectsId: string): void {
console.debug(`[WideAngleApi#recordConsent] Defaulting to NoOp Wide Angle call with ${subjectsId}`);
}
revokeConsent() {
console.debug(`[WideAngleApi#revokeConsent] Defaulting to NoOp Wide Angle call`);
}
}
const noOpWideAngleApi = new NoOpWideAngleAnalyticsApi();
export function useWideAngle() {
const { $waa } = useNuxtApp()
if ($waa) {
return $waa.value;
} else {
return noOpWideAngleApi;
}
}

View file

@ -1,30 +1,36 @@
import { defineNuxtPlugin, useRuntimeConfig } from '#imports';
import { ref } from 'vue';
import { initWideAngle } from 'wideangle-vuejs';
import { type Ref, ref} from 'vue'
import { initWideAngle } from 'wideangle-vuejs'
import { defineNuxtPlugin, type NuxtApp } from '#app'
import { useRuntimeConfig } from "#imports";
import type { WideAngleApi } from "~/src/types";
export default defineNuxtPlugin((nuxtApp) => {
if(process.server) {
console.warn("[WAA] Plugin will not be enabled on server side.");
return;
export default defineNuxtPlugin(async (_nuxtApp) => {
if (import.meta.server) {
console.warn('[WAA] Plugin will not be enabled on server side.')
return
}
const { wideangle: options } = useRuntimeConfig().public
console.debug(`[WAA] Initializing Wide Angle Analytics with: ${JSON.stringify(options)}`);
if(options.siteId == null) {
throw new Error("[WAA] Wide Angle Analytics requires the site ID.");
console.debug(`[WAA] Initializing Wide Angle Analytics with: ${JSON.stringify(options)}`)
if (options.siteId == null) {
throw new Error('[WAA] Wide Angle Analytics requires the site ID.')
}
const waa = ref()
initWideAngle(options)
.then(waaInstance => {
waa.value = waaInstance;
console.debug("[WAA] Wide Angle Analytics instance available");
}).catch(e => { console.error("[WAA] Failed to load Wide Angle Plugin", e)});
.then((waaInstance) => {
waa.value = waaInstance
console.debug('[WAA] Wide Angle Analytics instance available')
}).catch((e) => {
console.error('[WAA] Failed to load Wide Angle Plugin', e)
})
return {
provide: {
waa
}
waa: waa as Ref<WideAngleApi>,
},
}
})

5
src/types.ts Normal file
View file

@ -0,0 +1,5 @@
export interface WideAngleApi {
dispatchEvent(name: string, params: any, values: any) : void;
recordConsent(subjectsId: string) : void;
revokeConsent() : void;
}

View file

@ -1,3 +1,8 @@
{
"extends": "./playground/.nuxt/tsconfig.json"
"extends": "./.nuxt/tsconfig.json",
"exclude": [
"dist",
"node_modules",
"playground",
]
}