diff --git a/dist/index.cjs b/dist/index.cjs deleted file mode 100644 index cd5a69a..0000000 --- a/dist/index.cjs +++ /dev/null @@ -1,273 +0,0 @@ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); -var __objRest = (source, exclude) => { - var target = {}; - for (var prop in source) - if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0) - target[prop] = source[prop]; - if (source != null && __getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(source)) { - if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop)) - target[prop] = source[prop]; - } - return target; -}; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var __async = (__this, __arguments, generator) => { - return new Promise((resolve, reject) => { - var fulfilled = (value) => { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - }; - var rejected = (value) => { - try { - step(generator.throw(value)); - } catch (e) { - reject(e); - } - }; - var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); - step((generator = generator.apply(__this, __arguments)).next()); - }); -}; - -// index.ts -var next_umami_exports = {}; -__export(next_umami_exports, { - default: () => next_umami_default, - useUmami: () => useUmami, - withUmamiProxy: () => withUmamiProxy -}); -module.exports = __toCommonJS(next_umami_exports); - -// src/useUmami.ts -var import_react = require("react"); -function useUmami() { - const [isClient, setIsClient] = (0, import_react.useState)(false); - const [eventQueue, setEventQueue] = (0, import_react.useState)([]); - (0, import_react.useEffect)(() => { - setIsClient(true); - }, []); - const isUmamiAvailable = (0, import_react.useCallback)(() => { - return isClient && typeof window.umami !== "undefined"; - }, [isClient]); - (0, import_react.useEffect)(() => { - if (!isClient) return; - const processQueue = () => { - var _a, _b; - if (!isUmamiAvailable()) return; - while (eventQueue.length > 0) { - const event2 = eventQueue[0]; - if (event2.type === "pageView") { - ; - (_a = window.umami) == null ? void 0 : _a.track(event2.payload.data); - } else { - ; - (_b = window.umami) == null ? void 0 : _b.track( - event2.payload.name, - event2.payload.data - ); - } - setEventQueue((queue) => queue.slice(1)); - } - }; - const intervalId = setInterval(() => { - if (isUmamiAvailable()) { - processQueue(); - if (eventQueue.length === 0) { - clearInterval(intervalId); - } - } - }, 1e3); - return () => clearInterval(intervalId); - }, [isClient, isUmamiAvailable, eventQueue]); - const pageView = (0, import_react.useCallback)( - (data) => { - var _a; - const fullData = __spreadValues({}, data || {}); - if (!isUmamiAvailable()) { - console.warn("UmamiProvider not found, queueing pageView"); - setEventQueue((queue) => [ - ...queue, - { - type: "pageView", - payload: { data: fullData }, - timestamp: Date.now() - } - ]); - return fullData; - } - ; - (_a = window.umami) == null ? void 0 : _a.track(fullData); - return fullData; - }, - [isUmamiAvailable] - ); - const event = (0, import_react.useCallback)( - (name, data) => { - var _a; - if (!isUmamiAvailable()) { - console.warn("UmamiProvider not found, queueing event"); - setEventQueue((queue) => [ - ...queue, - { - type: "event", - payload: { name, data }, - timestamp: Date.now() - } - ]); - return { name, data }; - } - ; - (_a = window.umami) == null ? void 0 : _a.track(name, __spreadValues({}, data && __spreadValues({}, data))); - return { name, data: __spreadValues({}, data && __spreadValues({}, data)) }; - }, - [isUmamiAvailable] - ); - return { pageView, event }; -} - -// src/withUmamiProxy.ts -function withUmamiProxy(options = {}) { - return (nextConfig) => { - var _a, _b, _c, _d; - const nextUmamiEnv = { - next_umami_proxy: "true", - next_umami_clientScriptPath: (_a = options.clientScriptPath) != null ? _a : "/script.js", - next_umami_serverScriptDestination: (_b = options.serverScriptDestination) != null ? _b : "https://cloud.umami.is/script.js", - next_umami_clientApiPath: (_c = options.clientApiPath) != null ? _c : "/", - next_umami_serverApiDestination: (_d = options.serverApiDestination) != null ? _d : "https://api-gateway.umami.dev/api/send" - }; - return __spreadProps(__spreadValues({}, nextConfig), { - env: __spreadValues(__spreadValues({}, nextConfig.env), Object.fromEntries( - Object.entries(nextUmamiEnv).filter( - ([_, value]) => value !== void 0 - ) - )), - rewrites: () => __async(this, null, function* () { - var _a2, _b2; - const umamiRewrites = [ - { - source: nextUmamiEnv.next_umami_clientScriptPath, - destination: nextUmamiEnv.next_umami_serverScriptDestination - }, - { - source: `${(_a2 = nextUmamiEnv.next_umami_clientApiPath) == null ? void 0 : _a2.replace(/\/$/, "")}/api/send`, - destination: nextUmamiEnv.next_umami_serverApiDestination, - headers: {} - } - ]; - if (process.env.NEXT_UMAMI_DEBUG) { - console.log("umamiRewrites = ", umamiRewrites); - } - const rewrites = yield (_b2 = nextConfig.rewrites) == null ? void 0 : _b2.call(nextConfig); - if (!rewrites) { - return umamiRewrites; - } else if (Array.isArray(rewrites)) { - return rewrites.concat(umamiRewrites); - } else if (rewrites.afterFiles) { - rewrites.afterFiles = rewrites.afterFiles.concat(umamiRewrites); - return rewrites; - } else { - rewrites.afterFiles = umamiRewrites; - return rewrites; - } - }) - }); - }; -} - -// src/UmamiProvider.tsx -var import_script = __toESM(require("next/script"), 1); -var import_react2 = __toESM(require("react"), 1); -function UmamiProvider(_a) { - var _b = _a, { - src = "https://cloud.umami.is/script.js", - websiteId, - autoTrack = true, - hostUrl, - domains, - children - } = _b, props = __objRest(_b, [ - "src", - "websiteId", - "autoTrack", - "hostUrl", - "domains", - "children" - ]); - var _a2; - const proxyOptions = process.env.next_umami_proxy ? { - clientScriptPath: process.env.next_umami_clientScriptPath, - serverScriptDestination: process.env.next_umami_serverScriptDestination, - clientApiPath: process.env.next_umami_clientApiPath, - serverApiDestination: process.env.next_umami_serverApiDestination - } : void 0; - const effectiveHostUrl = (proxyOptions == null ? void 0 : proxyOptions.clientApiPath) || hostUrl; - return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement( - import_script.default, - __spreadValues(__spreadProps(__spreadValues(__spreadValues({ - src: (_a2 = proxyOptions == null ? void 0 : proxyOptions.clientScriptPath) != null ? _a2 : src, - "data-website-id": websiteId, - "data-auto-track": autoTrack - }, effectiveHostUrl && { "data-host-url": effectiveHostUrl }), domains && { - "data-domains": Array.isArray(domains) ? domains.join(",") : domains - }), { - strategy: "afterInteractive" - }), props) - ), children); -} - -// index.ts -var next_umami_default = UmamiProvider; -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - useUmami, - withUmamiProxy -}); -//# sourceMappingURL=index.cjs.map \ No newline at end of file diff --git a/dist/index.cjs.map b/dist/index.cjs.map deleted file mode 100644 index 396e37b..0000000 --- a/dist/index.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../index.ts","../src/useUmami.ts","../src/withUmamiProxy.ts","../src/UmamiProvider.tsx"],"sourcesContent":["import useUmami from './src/useUmami'\nimport withUmamiProxy from './src/withUmamiProxy'\nimport UmamiProvider from './src/UmamiProvider'\n\nexport { useUmami, withUmamiProxy }\nexport default UmamiProvider\n","'use client'\nimport { useCallback, useEffect, useState } from 'react'\n\ninterface PageView {\n // Hostname of server\n hostname: string\n // Browser language\n language: string\n // Page referrer\n referrer: string\n // Screen dimensions (eg. 1920x1080)\n screen: string\n // Page title\n title: string\n // Page url\n url: string\n // Website ID (required)\n website: string\n}\n\ntype EventName = string\ntype EventData = Record\n\ninterface QueuedEvent {\n type: 'pageView' | 'event'\n payload: {\n name?: EventName\n data?: Partial | EventData\n }\n timestamp: number\n}\n\n// https://umami.is/docs/tracker-functions\nexport default function useUmami() {\n const [isClient, setIsClient] = useState(false)\n const [eventQueue, setEventQueue] = useState([])\n\n useEffect(() => {\n setIsClient(true) // this will be set to true only in the client\n }, [])\n\n const isUmamiAvailable = useCallback(() => {\n return isClient && typeof (window as any).umami !== 'undefined'\n }, [isClient])\n\n useEffect(() => {\n if (!isClient) return\n\n const processQueue = () => {\n if (!isUmamiAvailable()) return\n\n while (eventQueue.length > 0) {\n const event = eventQueue[0]\n if (event.type === 'pageView') {\n ;(window as any).umami?.track(event.payload.data)\n } else {\n ;(window as any).umami?.track(\n event.payload.name as string,\n event.payload.data\n )\n }\n setEventQueue((queue) => queue.slice(1))\n }\n }\n\n const intervalId = setInterval(() => {\n if (isUmamiAvailable()) {\n processQueue()\n if (eventQueue.length === 0) {\n clearInterval(intervalId)\n }\n }\n }, 1000)\n\n return () => clearInterval(intervalId)\n }, [isClient, isUmamiAvailable, eventQueue])\n\n const pageView = useCallback(\n (data?: Partial) => {\n const fullData = {\n ...(data || {}),\n }\n\n if (!isUmamiAvailable()) {\n console.warn('UmamiProvider not found, queueing pageView')\n setEventQueue((queue) => [\n ...queue,\n {\n type: 'pageView',\n payload: { data: fullData },\n timestamp: Date.now(),\n },\n ])\n return fullData\n }\n\n ;(window as any).umami?.track(fullData)\n return fullData\n },\n [isUmamiAvailable]\n )\n\n const event = useCallback(\n (name: EventName, data?: EventData) => {\n if (!isUmamiAvailable()) {\n console.warn('UmamiProvider not found, queueing event')\n setEventQueue((queue) => [\n ...queue,\n {\n type: 'event',\n payload: { name, data },\n timestamp: Date.now(),\n },\n ])\n return { name, data }\n }\n\n ;(window as any).umami?.track(name, { ...(data && { ...data }) })\n return { name, data: { ...(data && { ...data }) } }\n },\n [isUmamiAvailable]\n )\n\n return { pageView, event }\n}\n","import type { NextConfig } from 'next'\nimport type { NextUmamiProxyOptions } from './common'\nimport type { Rewrite } from 'next/dist/lib/load-custom-routes'\n\ntype NextUmamiEnv = { next_umami_proxy: 'true' } & {\n [K in keyof Required as `next_umami_${K}`]:\n | string\n | undefined\n}\n\nexport default function withUmamiProxy(\n options: NextUmamiProxyOptions = {}\n): NextConfig {\n return (nextConfig: NextConfig): NextConfig => {\n const nextUmamiEnv: NextUmamiEnv = {\n next_umami_proxy: 'true',\n next_umami_clientScriptPath: options.clientScriptPath ?? '/script.js',\n next_umami_serverScriptDestination:\n options.serverScriptDestination ?? 'https://cloud.umami.is/script.js',\n next_umami_clientApiPath: options.clientApiPath ?? '/',\n next_umami_serverApiDestination:\n options.serverApiDestination ??\n 'https://api-gateway.umami.dev/api/send',\n }\n\n return {\n ...nextConfig,\n env: {\n ...nextConfig.env,\n ...(Object.fromEntries(\n Object.entries(nextUmamiEnv).filter(\n ([_, value]) => value !== undefined\n )\n ) as Record),\n },\n rewrites: async () => {\n const umamiRewrites = [\n {\n source: nextUmamiEnv.next_umami_clientScriptPath,\n destination: nextUmamiEnv.next_umami_serverScriptDestination,\n },\n {\n source: `${nextUmamiEnv.next_umami_clientApiPath?.replace(/\\/$/, '')}/api/send`,\n destination: nextUmamiEnv.next_umami_serverApiDestination,\n headers: {},\n },\n ] as const as Rewrite[]\n\n if (process.env.NEXT_UMAMI_DEBUG) {\n console.log('umamiRewrites = ', umamiRewrites)\n }\n\n const rewrites = await nextConfig.rewrites?.()\n\n if (!rewrites) {\n return umamiRewrites\n } else if (Array.isArray(rewrites)) {\n return rewrites.concat(umamiRewrites)\n } else if (rewrites.afterFiles) {\n rewrites.afterFiles = rewrites.afterFiles.concat(umamiRewrites)\n return rewrites\n } else {\n rewrites.afterFiles = umamiRewrites\n return rewrites\n }\n },\n }\n }\n}\n","import Script from 'next/script'\nimport React from 'react'\nimport type { NextUmamiProxyOptions, UmamiProps } from './common'\ntype RequiredKeys = {\n [K in keyof Required]-?: T[K] | undefined\n}\n\nexport default function UmamiProvider({\n src = 'https://cloud.umami.is/script.js',\n websiteId,\n autoTrack = true,\n hostUrl,\n domains,\n children,\n ...props\n}: UmamiProps) {\n const proxyOptions: RequiredKeys | undefined = process\n .env.next_umami_proxy\n ? {\n clientScriptPath: process.env.next_umami_clientScriptPath,\n serverScriptDestination: process.env.next_umami_serverScriptDestination,\n clientApiPath: process.env.next_umami_clientApiPath,\n serverApiDestination: process.env.next_umami_serverApiDestination,\n }\n : undefined\n\n const effectiveHostUrl = proxyOptions?.clientApiPath || hostUrl\n\n return (\n <>\n \n {children}\n \n )\n}\n"],"mappings":"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","names":["event","_a","_b","import_react","_a","React","Script"]} \ No newline at end of file diff --git a/dist/index.d.cts b/dist/index.d.cts deleted file mode 100644 index cc401fd..0000000 --- a/dist/index.d.cts +++ /dev/null @@ -1,78 +0,0 @@ -import { NextConfig } from 'next'; -import { ScriptProps } from 'next/script'; -import React, { ReactNode } from 'react'; - -interface PageView { - hostname: string; - language: string; - referrer: string; - screen: string; - title: string; - url: string; - website: string; -} -type EventName = string; -type EventData = Record; -declare function useUmami(): { - pageView: (data?: Partial) => { - hostname?: string | undefined; - language?: string | undefined; - referrer?: string | undefined; - screen?: string | undefined; - title?: string | undefined; - url?: string | undefined; - website?: string | undefined; - }; - event: (name: EventName, data?: EventData) => { - name: string; - data: EventData | undefined; - }; -}; - -interface UmamiProps extends Pick { - /** - * The source of the script. Defaults to version hosted by Umami. - */ - src?: string; - /** - * Website ID found in Umami dashboard. https://umami.is/docs/collect-data - */ - websiteId: string; - /** - * By default, Umami will send data to wherever the script is located. You can override this to send data to another location. - */ - hostUrl?: string; - /** - * By default, Umami tracks all pageviews and events for you automatically. You can disable this behavior and track events yourself using the tracker functions. - */ - autoTrack?: boolean; - /** - * If you want the tracker to only run on specific domains, you can add them to your tracker script. This is a comma delimited list of domain names. Helps if you are working in a staging/development environment. - */ - domains?: string | string[]; - children?: ReactNode; -} -type NextUmamiProxyOptions = { - /** - * The path to the script. This can be any path. Defaults to '/script.js'. - */ - clientScriptPath?: string; - /** - * The location of the script you'd like to pull. Defaults to 'https://cloud.umami.is/script.js'. - */ - serverScriptDestination?: string; - /** - * The path to the API. Defaults to '/'. This can be any path but this will ALWAYS end with '/api/send' due to a restriction in the Umami script. - */ - clientApiPath?: string; - /** - * The location of the API you'd like to pull. Defaults to 'https://api-gateway.umami.dev/api/send'. - */ - serverApiDestination?: string; -}; - -declare function withUmamiProxy(options?: NextUmamiProxyOptions): NextConfig; - -declare function UmamiProvider({ src, websiteId, autoTrack, hostUrl, domains, children, ...props }: UmamiProps): React.JSX.Element; - -export { UmamiProvider as default, useUmami, withUmamiProxy }; diff --git a/dist/index.js b/dist/index.js index c359ba4..4da1fe9 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,7 +1,12 @@ +"use strict"; +var __create = Object.create; var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; @@ -29,6 +34,27 @@ var __objRest = (source, exclude) => { } return target; }; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { @@ -50,18 +76,27 @@ var __async = (__this, __arguments, generator) => { }); }; +// index.ts +var next_umami_exports = {}; +__export(next_umami_exports, { + default: () => next_umami_default, + useUmami: () => useUmami, + withUmamiProxy: () => withUmamiProxy +}); +module.exports = __toCommonJS(next_umami_exports); + // src/useUmami.ts -import { useCallback, useEffect, useState } from "react"; +var import_react = require("react"); function useUmami() { - const [isClient, setIsClient] = useState(false); - const [eventQueue, setEventQueue] = useState([]); - useEffect(() => { + const [isClient, setIsClient] = (0, import_react.useState)(false); + const [eventQueue, setEventQueue] = (0, import_react.useState)([]); + (0, import_react.useEffect)(() => { setIsClient(true); }, []); - const isUmamiAvailable = useCallback(() => { + const isUmamiAvailable = (0, import_react.useCallback)(() => { return isClient && typeof window.umami !== "undefined"; }, [isClient]); - useEffect(() => { + (0, import_react.useEffect)(() => { if (!isClient) return; const processQueue = () => { var _a, _b; @@ -91,7 +126,7 @@ function useUmami() { }, 1e3); return () => clearInterval(intervalId); }, [isClient, isUmamiAvailable, eventQueue]); - const pageView = useCallback( + const pageView = (0, import_react.useCallback)( (data) => { var _a; const fullData = __spreadValues({}, data || {}); @@ -113,7 +148,7 @@ function useUmami() { }, [isUmamiAvailable] ); - const event = useCallback( + const event = (0, import_react.useCallback)( (name, data) => { var _a; if (!isUmamiAvailable()) { @@ -188,8 +223,8 @@ function withUmamiProxy(options = {}) { } // src/UmamiProvider.tsx -import Script from "next/script"; -import React from "react"; +var import_script = __toESM(require("next/script")); +var import_react2 = __toESM(require("react")); function UmamiProvider(_a) { var _b = _a, { src = "https://cloud.umami.is/script.js", @@ -214,8 +249,8 @@ function UmamiProvider(_a) { serverApiDestination: process.env.next_umami_serverApiDestination } : void 0; const effectiveHostUrl = (proxyOptions == null ? void 0 : proxyOptions.clientApiPath) || hostUrl; - return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement( - Script, + return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement( + import_script.default, __spreadValues(__spreadProps(__spreadValues(__spreadValues({ src: (_a2 = proxyOptions == null ? void 0 : proxyOptions.clientScriptPath) != null ? _a2 : src, "data-website-id": websiteId, @@ -230,9 +265,9 @@ function UmamiProvider(_a) { // index.ts var next_umami_default = UmamiProvider; -export { - next_umami_default as default, +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { useUmami, withUmamiProxy -}; +}); //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 74829dc..396e37b 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/useUmami.ts","../src/withUmamiProxy.ts","../src/UmamiProvider.tsx","../index.ts"],"sourcesContent":["'use client'\nimport { useCallback, useEffect, useState } from 'react'\n\ninterface PageView {\n // Hostname of server\n hostname: string\n // Browser language\n language: string\n // Page referrer\n referrer: string\n // Screen dimensions (eg. 1920x1080)\n screen: string\n // Page title\n title: string\n // Page url\n url: string\n // Website ID (required)\n website: string\n}\n\ntype EventName = string\ntype EventData = Record\n\ninterface QueuedEvent {\n type: 'pageView' | 'event'\n payload: {\n name?: EventName\n data?: Partial | EventData\n }\n timestamp: number\n}\n\n// https://umami.is/docs/tracker-functions\nexport default function useUmami() {\n const [isClient, setIsClient] = useState(false)\n const [eventQueue, setEventQueue] = useState([])\n\n useEffect(() => {\n setIsClient(true) // this will be set to true only in the client\n }, [])\n\n const isUmamiAvailable = useCallback(() => {\n return isClient && typeof (window as any).umami !== 'undefined'\n }, [isClient])\n\n useEffect(() => {\n if (!isClient) return\n\n const processQueue = () => {\n if (!isUmamiAvailable()) return\n\n while (eventQueue.length > 0) {\n const event = eventQueue[0]\n if (event.type === 'pageView') {\n ;(window as any).umami?.track(event.payload.data)\n } else {\n ;(window as any).umami?.track(\n event.payload.name as string,\n event.payload.data\n )\n }\n setEventQueue((queue) => queue.slice(1))\n }\n }\n\n const intervalId = setInterval(() => {\n if (isUmamiAvailable()) {\n processQueue()\n if (eventQueue.length === 0) {\n clearInterval(intervalId)\n }\n }\n }, 1000)\n\n return () => clearInterval(intervalId)\n }, [isClient, isUmamiAvailable, eventQueue])\n\n const pageView = useCallback(\n (data?: Partial) => {\n const fullData = {\n ...(data || {}),\n }\n\n if (!isUmamiAvailable()) {\n console.warn('UmamiProvider not found, queueing pageView')\n setEventQueue((queue) => [\n ...queue,\n {\n type: 'pageView',\n payload: { data: fullData },\n timestamp: Date.now(),\n },\n ])\n return fullData\n }\n\n ;(window as any).umami?.track(fullData)\n return fullData\n },\n [isUmamiAvailable]\n )\n\n const event = useCallback(\n (name: EventName, data?: EventData) => {\n if (!isUmamiAvailable()) {\n console.warn('UmamiProvider not found, queueing event')\n setEventQueue((queue) => [\n ...queue,\n {\n type: 'event',\n payload: { name, data },\n timestamp: Date.now(),\n },\n ])\n return { name, data }\n }\n\n ;(window as any).umami?.track(name, { ...(data && { ...data }) })\n return { name, data: { ...(data && { ...data }) } }\n },\n [isUmamiAvailable]\n )\n\n return { pageView, event }\n}\n","import type { NextConfig } from 'next'\nimport type { NextUmamiProxyOptions } from './common'\nimport type { Rewrite } from 'next/dist/lib/load-custom-routes'\n\ntype NextUmamiEnv = { next_umami_proxy: 'true' } & {\n [K in keyof Required as `next_umami_${K}`]:\n | string\n | undefined\n}\n\nexport default function withUmamiProxy(\n options: NextUmamiProxyOptions = {}\n): NextConfig {\n return (nextConfig: NextConfig): NextConfig => {\n const nextUmamiEnv: NextUmamiEnv = {\n next_umami_proxy: 'true',\n next_umami_clientScriptPath: options.clientScriptPath ?? '/script.js',\n next_umami_serverScriptDestination:\n options.serverScriptDestination ?? 'https://cloud.umami.is/script.js',\n next_umami_clientApiPath: options.clientApiPath ?? '/',\n next_umami_serverApiDestination:\n options.serverApiDestination ??\n 'https://api-gateway.umami.dev/api/send',\n }\n\n return {\n ...nextConfig,\n env: {\n ...nextConfig.env,\n ...(Object.fromEntries(\n Object.entries(nextUmamiEnv).filter(\n ([_, value]) => value !== undefined\n )\n ) as Record),\n },\n rewrites: async () => {\n const umamiRewrites = [\n {\n source: nextUmamiEnv.next_umami_clientScriptPath,\n destination: nextUmamiEnv.next_umami_serverScriptDestination,\n },\n {\n source: `${nextUmamiEnv.next_umami_clientApiPath?.replace(/\\/$/, '')}/api/send`,\n destination: nextUmamiEnv.next_umami_serverApiDestination,\n headers: {},\n },\n ] as const as Rewrite[]\n\n if (process.env.NEXT_UMAMI_DEBUG) {\n console.log('umamiRewrites = ', umamiRewrites)\n }\n\n const rewrites = await nextConfig.rewrites?.()\n\n if (!rewrites) {\n return umamiRewrites\n } else if (Array.isArray(rewrites)) {\n return rewrites.concat(umamiRewrites)\n } else if (rewrites.afterFiles) {\n rewrites.afterFiles = rewrites.afterFiles.concat(umamiRewrites)\n return rewrites\n } else {\n rewrites.afterFiles = umamiRewrites\n return rewrites\n }\n },\n }\n }\n}\n","import Script from 'next/script'\nimport React from 'react'\nimport type { NextUmamiProxyOptions, UmamiProps } from './common'\ntype RequiredKeys = {\n [K in keyof Required]-?: T[K] | undefined\n}\n\nexport default function UmamiProvider({\n src = 'https://cloud.umami.is/script.js',\n websiteId,\n autoTrack = true,\n hostUrl,\n domains,\n children,\n ...props\n}: UmamiProps) {\n const proxyOptions: RequiredKeys | undefined = process\n .env.next_umami_proxy\n ? {\n clientScriptPath: process.env.next_umami_clientScriptPath,\n serverScriptDestination: process.env.next_umami_serverScriptDestination,\n clientApiPath: process.env.next_umami_clientApiPath,\n serverApiDestination: process.env.next_umami_serverApiDestination,\n }\n : undefined\n\n const effectiveHostUrl = proxyOptions?.clientApiPath || hostUrl\n\n return (\n <>\n \n {children}\n \n )\n}\n","import useUmami from './src/useUmami'\nimport withUmamiProxy from './src/withUmamiProxy'\nimport UmamiProvider from './src/UmamiProvider'\n\nexport { useUmami, withUmamiProxy }\nexport default UmamiProvider\n"],"mappings":"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","names":["event","_a","_b","_a"]} \ No newline at end of file +{"version":3,"sources":["../index.ts","../src/useUmami.ts","../src/withUmamiProxy.ts","../src/UmamiProvider.tsx"],"sourcesContent":["import useUmami from './src/useUmami'\nimport withUmamiProxy from './src/withUmamiProxy'\nimport UmamiProvider from './src/UmamiProvider'\n\nexport { useUmami, withUmamiProxy }\nexport default UmamiProvider\n","'use client'\nimport { useCallback, useEffect, useState } from 'react'\n\ninterface PageView {\n // Hostname of server\n hostname: string\n // Browser language\n language: string\n // Page referrer\n referrer: string\n // Screen dimensions (eg. 1920x1080)\n screen: string\n // Page title\n title: string\n // Page url\n url: string\n // Website ID (required)\n website: string\n}\n\ntype EventName = string\ntype EventData = Record\n\ninterface QueuedEvent {\n type: 'pageView' | 'event'\n payload: {\n name?: EventName\n data?: Partial | EventData\n }\n timestamp: number\n}\n\n// https://umami.is/docs/tracker-functions\nexport default function useUmami() {\n const [isClient, setIsClient] = useState(false)\n const [eventQueue, setEventQueue] = useState([])\n\n useEffect(() => {\n setIsClient(true) // this will be set to true only in the client\n }, [])\n\n const isUmamiAvailable = useCallback(() => {\n return isClient && typeof (window as any).umami !== 'undefined'\n }, [isClient])\n\n useEffect(() => {\n if (!isClient) return\n\n const processQueue = () => {\n if (!isUmamiAvailable()) return\n\n while (eventQueue.length > 0) {\n const event = eventQueue[0]\n if (event.type === 'pageView') {\n ;(window as any).umami?.track(event.payload.data)\n } else {\n ;(window as any).umami?.track(\n event.payload.name as string,\n event.payload.data\n )\n }\n setEventQueue((queue) => queue.slice(1))\n }\n }\n\n const intervalId = setInterval(() => {\n if (isUmamiAvailable()) {\n processQueue()\n if (eventQueue.length === 0) {\n clearInterval(intervalId)\n }\n }\n }, 1000)\n\n return () => clearInterval(intervalId)\n }, [isClient, isUmamiAvailable, eventQueue])\n\n const pageView = useCallback(\n (data?: Partial) => {\n const fullData = {\n ...(data || {}),\n }\n\n if (!isUmamiAvailable()) {\n console.warn('UmamiProvider not found, queueing pageView')\n setEventQueue((queue) => [\n ...queue,\n {\n type: 'pageView',\n payload: { data: fullData },\n timestamp: Date.now(),\n },\n ])\n return fullData\n }\n\n ;(window as any).umami?.track(fullData)\n return fullData\n },\n [isUmamiAvailable]\n )\n\n const event = useCallback(\n (name: EventName, data?: EventData) => {\n if (!isUmamiAvailable()) {\n console.warn('UmamiProvider not found, queueing event')\n setEventQueue((queue) => [\n ...queue,\n {\n type: 'event',\n payload: { name, data },\n timestamp: Date.now(),\n },\n ])\n return { name, data }\n }\n\n ;(window as any).umami?.track(name, { ...(data && { ...data }) })\n return { name, data: { ...(data && { ...data }) } }\n },\n [isUmamiAvailable]\n )\n\n return { pageView, event }\n}\n","import type { NextConfig } from 'next'\nimport type { NextUmamiProxyOptions } from './common'\nimport type { Rewrite } from 'next/dist/lib/load-custom-routes'\n\ntype NextUmamiEnv = { next_umami_proxy: 'true' } & {\n [K in keyof Required as `next_umami_${K}`]:\n | string\n | undefined\n}\n\nexport default function withUmamiProxy(\n options: NextUmamiProxyOptions = {}\n): NextConfig {\n return (nextConfig: NextConfig): NextConfig => {\n const nextUmamiEnv: NextUmamiEnv = {\n next_umami_proxy: 'true',\n next_umami_clientScriptPath: options.clientScriptPath ?? '/script.js',\n next_umami_serverScriptDestination:\n options.serverScriptDestination ?? 'https://cloud.umami.is/script.js',\n next_umami_clientApiPath: options.clientApiPath ?? '/',\n next_umami_serverApiDestination:\n options.serverApiDestination ??\n 'https://api-gateway.umami.dev/api/send',\n }\n\n return {\n ...nextConfig,\n env: {\n ...nextConfig.env,\n ...(Object.fromEntries(\n Object.entries(nextUmamiEnv).filter(\n ([_, value]) => value !== undefined\n )\n ) as Record),\n },\n rewrites: async () => {\n const umamiRewrites = [\n {\n source: nextUmamiEnv.next_umami_clientScriptPath,\n destination: nextUmamiEnv.next_umami_serverScriptDestination,\n },\n {\n source: `${nextUmamiEnv.next_umami_clientApiPath?.replace(/\\/$/, '')}/api/send`,\n destination: nextUmamiEnv.next_umami_serverApiDestination,\n headers: {},\n },\n ] as const as Rewrite[]\n\n if (process.env.NEXT_UMAMI_DEBUG) {\n console.log('umamiRewrites = ', umamiRewrites)\n }\n\n const rewrites = await nextConfig.rewrites?.()\n\n if (!rewrites) {\n return umamiRewrites\n } else if (Array.isArray(rewrites)) {\n return rewrites.concat(umamiRewrites)\n } else if (rewrites.afterFiles) {\n rewrites.afterFiles = rewrites.afterFiles.concat(umamiRewrites)\n return rewrites\n } else {\n rewrites.afterFiles = umamiRewrites\n return rewrites\n }\n },\n }\n }\n}\n","import Script from 'next/script'\nimport React from 'react'\nimport type { NextUmamiProxyOptions, UmamiProps } from './common'\ntype RequiredKeys = {\n [K in keyof Required]-?: T[K] | undefined\n}\n\nexport default function UmamiProvider({\n src = 'https://cloud.umami.is/script.js',\n websiteId,\n autoTrack = true,\n hostUrl,\n domains,\n children,\n ...props\n}: UmamiProps) {\n const proxyOptions: RequiredKeys | undefined = process\n .env.next_umami_proxy\n ? {\n clientScriptPath: process.env.next_umami_clientScriptPath,\n serverScriptDestination: process.env.next_umami_serverScriptDestination,\n clientApiPath: process.env.next_umami_clientApiPath,\n serverApiDestination: process.env.next_umami_serverApiDestination,\n }\n : undefined\n\n const effectiveHostUrl = proxyOptions?.clientApiPath || hostUrl\n\n return (\n <>\n \n {children}\n \n )\n}\n"],"mappings":"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","names":["event","_a","_b","import_react","_a","React","Script"]} \ No newline at end of file diff --git a/package.json b/package.json index 1ba41fa..93697f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "next-umamii", - "version": "0.0.5", + "name": "next-umami", + "version": "1.0.0", "description": "Next.js Umami Analytics Integration", "main": "./dist/index.js", "module": "./dist/index.mjs",