diff --git a/.env-default b/.env-default index 7196c8fc..89cfcbd0 100644 --- a/.env-default +++ b/.env-default @@ -14,3 +14,6 @@ DEV_BROWSER_VERSION= DEV_OS=ios DEV_DEVICE= DEV_OS_VERSION=12 + +# Command that records GitHub deployments, for example a token broker (defaults to gh) +DEPLOY_GH_COMMAND= diff --git a/.github/workflows/browserstack.yml b/.github/workflows/browserstack.yml index 91651ce5..49a90438 100644 --- a/.github/workflows/browserstack.yml +++ b/.github/workflows/browserstack.yml @@ -3,6 +3,12 @@ name: Browserstack on: pull_request: types: [opened, synchronize, unlabeled] + workflow_call: + inputs: + upload-dist: + description: Upload the tested dist files as the "dist" artifact + type: boolean + default: false jobs: build: @@ -55,7 +61,7 @@ jobs: run: pnpm run test:matrix - name: Run unit tests - run: pnpm run build && pnpm run test:unit && pnpm run test:deploy + run: pnpm run test:unit && pnpm run test:deploy - name: Prettier check (report only, no writes or commits) if: always() @@ -81,6 +87,14 @@ jobs: BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + - name: Upload tested dist files + if: inputs.upload-dist + uses: actions/upload-artifact@v7 + with: + name: dist + path: dist/ + if-no-files-found: error + - name: "Stop BrowserStackLocal" if: always() && steps.browserstack.outputs.skip != 'true' uses: "browserstack/github-actions/setup-local@master" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..83b88148 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,86 @@ +name: Release + +# Bumping VERSION in compile.js on main publishes GitHub Release vN with the +# BrowserStack-tested build. Deploying it stays a manual `pnpm run deploy`. +on: + push: + branches: [main] + paths: [compile.js] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: release + cancel-in-progress: false + +jobs: + version: + # workflow_dispatch can run on any branch, but only main is released + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + outputs: + tag: ${{ steps.version.outputs.tag }} + released: ${{ steps.version.outputs.released }} + steps: + - uses: actions/checkout@v7 + + - name: Read the script version + id: version + env: + GH_TOKEN: ${{ github.token }} + run: | + version=$(sed -n 's/^const VERSION = \([0-9][0-9]*\);$/\1/p' compile.js) + if [ -z "$version" ]; then + echo "::error file=compile.js::Unable to read const VERSION" + exit 1 + fi + tag="v$version" + echo "tag=$tag" >> "$GITHUB_OUTPUT" + # A draft doesn't count (publishing can fail after it's created), and + # this read-only token can't see drafts anyway + if gh release view "$tag" --repo "$GITHUB_REPOSITORY" --json isDraft \ + --jq ".isDraft | not" 2> /dev/null | grep -qx true; then + echo "released=true" >> "$GITHUB_OUTPUT" + echo "$tag is already released; bump VERSION in compile.js to release." >> "$GITHUB_STEP_SUMMARY" + fi + + test: + needs: version + if: needs.version.outputs.released != 'true' + uses: ./.github/workflows/browserstack.yml + with: + upload-dist: true + secrets: inherit + + publish: + needs: [version, test] + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/download-artifact@v8 + with: + name: dist + path: dist + + - name: Publish ${{ needs.version.outputs.tag }} + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ needs.version.outputs.tag }} + run: | + tar -czf "scripts-$TAG.tar.gz" dist + # Reuse the draft of an earlier run whose publish failed + if gh release view "$TAG" --repo "$GITHUB_REPOSITORY" > /dev/null 2>&1; then + gh release upload "$TAG" "scripts-$TAG.tar.gz" --repo "$GITHUB_REPOSITORY" --clobber + else + gh release create "$TAG" "scripts-$TAG.tar.gz" \ + --repo "$GITHUB_REPOSITORY" \ + --target "$GITHUB_SHA" \ + --title "$TAG" \ + --generate-notes \ + --draft + fi + gh release edit "$TAG" --repo "$GITHUB_REPOSITORY" \ + --target "$GITHUB_SHA" --draft=false --latest diff --git a/.gitignore b/.gitignore index 1373ff3f..a9bad691 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules *.log .env +/dist diff --git a/AGENTS.md b/AGENTS.md index b0a73749..0a3bb329 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,8 @@ Before working here, read the shared [Simple Analytics instructions](https://git ## Dist -- `dist/` is generated output. Builds and `pnpm test` rewrite it (each build stamps the date), and a maintainer builds and commits it separately before deploying. Never commit `dist/` changes in feature work; restore it with `git checkout HEAD -- dist` before committing, and skip `dist/` when reviewing or validating changes. +- `dist/` is gitignored build output. Builds and `pnpm test` write it locally; never commit it. +- Releases are cut by bumping `VERSION` in `compile.js` on `main`. The Release workflow then builds, tests, and publishes GitHub Release `vN` with `scripts-vN.tar.gz`, which `pnpm run deploy` uploads. Published `vN` SRI files never change. ## Tracker changes diff --git a/README.md b/README.md index 4151c02d..53655f8b 100644 --- a/README.md +++ b/README.md @@ -28,17 +28,24 @@ Install the pinned Node and pnpm versions, run `pnpm install --frozen-lockfile`, The most important file of the repository is [`/src/default.js`](src/default.js) -## Deploy +## Release + +Each release is one script version, `vN`. Its SRI file (`sri/vN.js`) never changes after publication, and the `latest` files serve the newest deployed release. `dist/` is build output and is not committed. -Build and commit the distribution files before deploying. The deployment command itself never builds or changes local distribution files. +1. Open a pull request on `main` that bumps `VERSION` in [`compile.js`](compile.js). +2. Merging it runs the [Release workflow](.github/workflows/release.yml). It builds the scripts once, runs the unit and BrowserStack tests on those files, and publishes GitHub Release `vN` with `scripts-vN.tar.gz`. + +## Deploy ```sh pnpm run deploy ``` -The interactive CLI starts in dry-run mode by default. It lets you select scripts and destinations, reads the deployed files, and shows every affected path plus the first-line script-header diff. Choosing a real deployment requires a clean repository and a second confirmation. +The interactive CLI starts in dry-run mode by default. You pick a release (the newest by default), and the CLI downloads its `scripts-vN.tar.gz` and checks the file against the SHA-256 digest GitHub recorded. It then shows the release each destination runs now, every affected path, and the first-line script-header diff. It never builds or reads local `dist/` files. Choosing a real deployment requires a clean repository and a second confirmation. To roll back, deploy an older release; published SRI files are never overwritten. + +After a real deployment that includes `latest.js`, the CLI records a GitHub deployment for each destination (`cdn` and `custom-domains`), so [Deployments](https://github.com/simpleanalytics/scripts/deployments) shows what is live. Deployments of only auto-events, SRI or light aren't recorded, because the destination keeps running its recorded release. It runs `gh`, or the command in `DEPLOY_GH_COMMAND`. -CDN writes use `BUNNY_SCRIPTS_ACCESS_KEY` and `BUNNY_SCRIPTS_ACCOUNT_KEY` from `.env`. Custom-domain reads and writes require SSH access to `app@external.simpleanalytics.com`. +CDN writes use `BUNNY_SCRIPTS_ACCESS_KEY` and `BUNNY_SCRIPTS_ACCOUNT_KEY` from `.env`. Caddy reads and writes require SSH access to `user@esapp05.simpleanalytics.com`. ## Device testing is sponsored by BrowserStack diff --git a/deploy.mts b/deploy.mts index 8cc9eceb..bd4cd339 100644 --- a/deploy.mts +++ b/deploy.mts @@ -7,9 +7,11 @@ import { multiselect, note, outro, + select, spinner, } from "@clack/prompts"; import { spawn } from "node:child_process"; +import { createHash } from "node:crypto"; import { mkdtemp, readdir, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { basename, dirname, join, resolve } from "node:path"; @@ -69,6 +71,14 @@ interface DeploymentResult { failed: string[]; } +interface Release { + archiveDigest: string | null; + archiveUrl: string; + publishedAt: string; + tag: string; + url: string; +} + const ROOT = dirname(fileURLToPath(import.meta.url)); // Caddy injects the request hostname at serve time with its templates // directive, so the nginx SSI directives are rewritten to Go template @@ -98,6 +108,14 @@ const CDN_PUBLIC_ROOT = "https://scripts.simpleanalyticscdn.com"; const CDN_STORAGE_ROOT = "https://storage.bunnycdn.com/sa-cdn"; const CDN_PURGE_URL = "https://api.bunny.net/purge?url=https://simpleanalyticscdn.b-cdn.net/*"; +const GITHUB_REPOSITORY = "simpleanalytics/scripts"; +const GITHUB_API_ROOT = `https://api.github.com/repos/${GITHUB_REPOSITORY}`; +// GitHub deployment environments that record which release each destination +// runs, shown at github.com/simpleanalytics/scripts/deployments. +const ENVIRONMENTS: Record = { + caddy: { name: "custom-domains" }, + cdn: { name: "cdn", url: `${CDN_PUBLIC_ROOT}/latest.js` }, +}; export const HEADER_PATTERN = /^\/\* Simple Analytics - Privacy(?: friendly|-first) analytics \(docs\.simpleanalytics\.com\/[^;]+; \d{4}-\d{2}-\d{2}; [0-9a-f]{4}(?:; SRI-version)?(?:; v\d+)?\) \*\/$/; @@ -329,10 +347,10 @@ export function latestVersionFromNames(names: string[]): number | undefined { return versions[0]; } -async function discoverSriVersion(): Promise { - const version = latestVersionFromNames(await readdir(resolve(ROOT, "dist"))); +async function discoverSriVersion(root: string): Promise { + const version = latestVersionFromNames(await readdir(resolve(root, "dist"))); if (version === undefined) { - throw new Error("No versioned SRI directory exists in dist."); + throw new Error("No versioned SRI directory exists in the release."); } return version; } @@ -401,12 +419,15 @@ export function repositoryPolicy( ); } -async function prepareFiles(files: DeployFile[]): Promise { +async function prepareFiles( + files: DeployFile[], + root: string, +): Promise { return Promise.all( files.map(async (file) => { let source: Buffer; try { - source = await readFile(resolve(ROOT, file.localPath)); + source = await readFile(resolve(root, file.localPath)); } catch (error) { throw new Error(`Missing deployment artifact: ${file.localPath}`, { cause: error, @@ -507,6 +528,81 @@ async function readCdnFile( return Buffer.from(await response.arrayBuffer()); } +async function readGitHub(path: string): Promise { + const response = await fetch(`${GITHUB_API_ROOT}/${path}`, { + headers: { Accept: "application/vnd.github+json" }, + signal: AbortSignal.timeout(30_000), + }); + if (!response.ok) { + throw new Error(`Unable to read GitHub ${path}: HTTP ${response.status}`); + } + return (await response.json()) as T; +} + +async function listReleases(): Promise { + const releases = await readGitHub< + Array<{ + assets: Array<{ + browser_download_url: string; + digest: string | null; + name: string; + }>; + html_url: string; + published_at: string; + tag_name: string; + }> + >("releases?per_page=100"); + + return releases.flatMap((release) => { + const archive = release.assets.find( + (asset) => asset.name === `scripts-${release.tag_name}.tar.gz`, + ); + // Without a recorded digest the download can't be verified + if (!archive?.digest) return []; + return [ + { + archiveDigest: archive.digest, + archiveUrl: archive.browser_download_url, + publishedAt: release.published_at, + tag: release.tag_name, + url: release.html_url, + }, + ]; + }); +} + +// Downloads the release archive built and tested by the Release workflow, +// checks it against the digest GitHub recorded, and extracts it. +async function downloadRelease(release: Release): Promise { + const response = await fetch(release.archiveUrl, { + redirect: "follow", + signal: AbortSignal.timeout(60_000), + }); + if (!response.ok) { + throw new Error(`Unable to download ${release.tag}: HTTP ${response.status}`); + } + const archive = Buffer.from(await response.arrayBuffer()); + const digest = `sha256:${createHash("sha256").update(archive).digest("hex")}`; + if (digest !== release.archiveDigest) { + throw new Error( + `The ${release.tag} archive does not match the digest GitHub recorded (${ + release.archiveDigest ?? "none" + }).`, + ); + } + + const directory = await mkdtemp(join(tmpdir(), "sa-release-")); + try { + const archivePath = join(directory, "release.tar.gz"); + await writeFile(archivePath, archive); + await runCommand("tar", ["-xzf", archivePath, "-C", directory]); + return directory; + } catch (error) { + await rm(directory, { force: true, recursive: true }); + throw error; + } +} + function assertSafeRemotePath(remotePath: string): void { if (!/^[a-zA-Z0-9._/-]+$/.test(remotePath) || remotePath.startsWith("/")) { throw new Error(`Unsafe remote path: ${remotePath}`); @@ -685,6 +781,130 @@ function renderPreview( ); } +async function renderRelease( + release: Release, + destinations: Destination[], +): Promise { + const lines = [ + `${release.tag}, published ${release.publishedAt.slice(0, 10)}`, + release.url, + ]; + for (const destination of destinations) { + const environment = ENVIRONMENTS[destination].name; + const deployments = ( + await readGitHub>( + `deployments?environment=${environment}&per_page=10`, + ) + ).sort((a, b) => b.created_at.localeCompare(a.created_at)); + + // A failed attempt doesn't change what runs, so the newest success does + let current: (typeof deployments)[number] | undefined; + for (const deployment of deployments) { + const [status] = await readGitHub>( + `deployments/${deployment.id}/statuses?per_page=1`, + ); + if (status?.state === "success") { + current = deployment; + break; + } + lines.push( + `${environment}: ${deployment.ref} ${status?.state ?? "without status"} on ${deployment.created_at.slice( + 0, + 10, + )}`, + ); + } + if (!current) { + lines.push( + `${environment}: ${ + deployments.length + ? `no successful deployment in the last ${deployments.length}` + : "no recorded deployment" + } → ${release.tag}`, + ); + continue; + } + + lines.push( + `${environment}: ${current.ref} (deployed ${current.created_at.slice( + 0, + 10, + )}) → ${release.tag}`, + ); + if (current.ref !== release.tag) { + lines.push( + ` https://github.com/${GITHUB_REPOSITORY}/compare/${current.ref}...${release.tag}`, + ); + } + } + note(lines.join("\n"), "Release"); +} + +// Records the deployment per destination so GitHub shows what is live. The +// command defaults to gh; DEPLOY_GH_COMMAND can point to a token broker. +async function recordDeployments( + release: Release, + selections: DeploySelections, + state: "success" | "failure", +): Promise { + const [command, ...prefix] = (process.env.DEPLOY_GH_COMMAND || "gh") + .trim() + .split(/\s+/); + const description = [...selections.scripts, ...selections.variants].join(", "); + + for (const destination of selections.destinations) { + const environment = ENVIRONMENTS[destination]; + const progress = spinner(); + progress.start(`Recording ${release.tag} on ${environment.name} in GitHub`); + try { + const { stdout } = await runCommand( + command, + [ + ...prefix, + "api", + `repos/${GITHUB_REPOSITORY}/deployments`, + "-f", + `ref=${release.tag}`, + "-f", + `environment=${environment.name}`, + "-f", + `description=${description}`, + "-F", + "auto_merge=false", + "-F", + "production_environment=true", + "-f", + "required_contexts[]", + ], + { timeout: 120_000 }, + ); + const { id } = JSON.parse(stdout.toString("utf8")) as { id: number }; + await runCommand( + command, + [ + ...prefix, + "api", + `repos/${GITHUB_REPOSITORY}/deployments/${id}/statuses`, + "-f", + `state=${state}`, + "-f", + `log_url=${release.url}`, + ...(environment.url ? ["-f", `environment_url=${environment.url}`] : []), + ], + { timeout: 120_000 }, + ); + progress.stop(`Recorded ${release.tag} on ${environment.name} as ${state}`); + } catch (error) { + progress.error(`Unable to record ${release.tag} on ${environment.name}`); + log.warn( + `${error instanceof Error ? error.message : String(error)}\nRun the deployment of ${ + release.tag + } again: unchanged files are skipped and the deployment is recorded.`, + ); + } + } +} + function cdnCredentials(): CdnCredentials { const accessKey = process.env.BUNNY_SCRIPTS_ACCESS_KEY; const accountKey = process.env.BUNNY_SCRIPTS_ACCOUNT_KEY; @@ -804,9 +1024,9 @@ class DeploymentFailure extends Error { async function deployFiles( previews: PreviewFile[], - credentials?: CdnCredentials, + credentials: CdnCredentials | undefined, + result: DeploymentResult, ): Promise { - const result: DeploymentResult = { completed: [], failed: [], skipped: [] }; const filesToWrite: PreparedFile[] = []; try { @@ -925,12 +1145,28 @@ async function main(): Promise { const dirty = await isRepositoryDirty(); if (repositoryPolicy(dryRun, dirty) === "warn") { log.warn( - "The repository has uncommitted changes. This dry run previews the current dist files only.", + "The repository has uncommitted changes. This dry run uses the local deployment code.", ); } + const releases = await listReleases(); + if (releases.length === 0) { + throw new Error("No GitHub release has a scripts-vN.tar.gz archive yet."); + } + const release = selectedValue( + await select({ + message: "Which release do you want to deploy?", + options: releases.map((release) => ({ + hint: `published ${release.publishedAt.slice(0, 10)}`, + label: release.tag, + value: release, + })), + }), + ); + const scripts = selectedValue( await multiselect({ + initialValues: ["default", "auto-events"], message: "Scripts to deploy", options: [ { label: "Default embed", value: "default" }, @@ -974,8 +1210,26 @@ async function main(): Promise { } const selections = { destinations, scripts, variants }; - const version = variants.includes("sri") ? await discoverSriVersion() : undefined; - const preparedFiles = await prepareFiles(createManifest(selections, version)); + const download = spinner(); + download.start(`Downloading ${release.tag}`); + let directory: string; + try { + directory = await downloadRelease(release); + download.stop(`Downloaded and verified ${release.tag}`); + } catch (error) { + download.error(`Unable to download ${release.tag}`); + throw error; + } + + let version: number | undefined; + let preparedFiles: PreparedFile[]; + try { + version = variants.includes("sri") ? await discoverSriVersion(directory) : undefined; + preparedFiles = await prepareFiles(createManifest(selections, version), directory); + } finally { + await rm(directory, { force: true, recursive: true }); + } + const inspection = spinner(); inspection.start("Inspecting deployed files"); let previews: PreviewFile[]; @@ -986,6 +1240,7 @@ async function main(): Promise { inspection.error("Unable to inspect deployed files"); throw error; } + await renderRelease(release, destinations); renderPreview(previews, selections, dryRun, version); const counts = summarize(previews); @@ -1016,8 +1271,37 @@ async function main(): Promise { return; } - const result = await deployFiles(previews, credentials); + // Deploy and record one destination at a time, so a failure on one doesn't + // mark the other as failed. Only deployments with latest.js change the + // release a destination runs. + const result: DeploymentResult = { completed: [], failed: [], skipped: [] }; + const recordRelease = + scripts.includes("default") && variants.includes("latest"); + for (const destination of destinations) { + let state: "success" | "failure" = "failure"; + try { + await deployFiles( + previews.filter((file) => file.destination === destination), + credentials, + result, + ); + state = "success"; + } finally { + if (recordRelease) { + await recordDeployments( + release, + { ...selections, destinations: [destination] }, + state, + ); + } + } + } renderDeploymentResult(result); + if (!recordRelease) { + log.info( + "Not recorded in GitHub: without latest.js the destinations keep running their recorded release.", + ); + } if (variants.includes("sri")) { log.warn( "Update https://docs.simpleanalytics.com/sri with the SRI version.", diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js deleted file mode 100644 index cd391b60..00000000 --- a/dist/latest/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 99ad; v12) */ - -function t(){try{for(var e=document.getElementsByTagName("a"),t=0;t -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (!useTitle || type === \"phone\") {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n if (useTitle) event = theTitle;\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/app.js b/dist/latest/custom/app.js deleted file mode 100644 index 44879e56..00000000 --- a/dist/latest/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; cd33; v12) */ - -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/latest/custom/app.js.map b/dist/latest/custom/app.js.map deleted file mode 100644 index 732d82e3..00000000 --- a/dist/latest/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/auto-events.js b/dist/latest/custom/auto-events.js deleted file mode 100644 index cd391b60..00000000 --- a/dist/latest/custom/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 99ad; v12) */ - -function t(){try{for(var e=document.getElementsByTagName("a"),t=0;t -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (!useTitle || type === \"phone\") {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n if (useTitle) event = theTitle;\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/e.js b/dist/latest/custom/e.js deleted file mode 100644 index b526a470..00000000 --- a/dist/latest/custom/e.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 3fc3; v12) */ - -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); -//# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/latest/custom/e.js.map b/dist/latest/custom/e.js.map deleted file mode 100644 index b6d84bfd..00000000 --- a/dist/latest/custom/e.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_events_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/latest.dev.js b/dist/latest/custom/latest.dev.js deleted file mode 100644 index e1d883b3..00000000 --- a/dist/latest/custom/latest.dev.js +++ /dev/null @@ -1,1085 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 306e; v12) */ -/* eslint-env browser */ - -(function ( - window, - baseUrl, - apiUrlPrefix, - version, - defaultNamespace, - sendError, - warn -) { - // Only initialize in a browser. - if (!window) return; - - try { - ///////////////////// - // PREDEFINED VARIABLES FOR BETTER MINIFICATION - // - - // This seems like a lot of repetition, but it makes our script available for - // multple destination which prevents us to need multiple scripts. The minified - // version stays small. - var undefinedVar = undefined; - var trueVar = true; - var falseVar = false; - var trueText = "true"; - var https = "https:"; - var pageviewText = "pageview"; - var eventText = "event"; - var errorText = "error"; - var slash = "/"; - var protocol = https + "//"; - var con = window.console; - var doNotTrack = "doNotTrack"; - var nav = window.navigator; - var loc = window.location; - var locationHostname = loc.host; - var doc = window.document; - var userAgent = nav.userAgent; - var notSending = "Not sending request "; - var notSendingWhen = notSending + "when "; - var fetchedHighEntropyValues = falseVar; - var encodeURIComponentFunc = encodeURIComponent; - var decodeURIComponentFunc = decodeURIComponent; - var stringify = JSON.stringify; - var thousand = 1000; - var addEventListenerFunc = window.addEventListener; - var fullApiUrl = protocol + apiUrlPrefix + baseUrl; - var documentElement = doc.documentElement || {}; - var language = "language"; - var Height = "Height"; - var Width = "Width"; - var scroll = "scroll"; - var uaData = nav.userAgentData; - var scrollHeight = scroll + Height; - var offsetHeight = "offset" + Height; - var clientHeight = "client" + Height; - var clientWidth = "client" + Width; - var pagehide = "pagehide"; - var platformText = "platform"; - var platformVersionText = "platformVersion"; - var docsUrl = "https://docs.simpleanalytics.com"; - var pages = 0; - var isBotAgent = - /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); - var screen = window.screen; - - // Find the script element where options can be set on - var scriptElement = - doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); - - ///////////////////// - // HELPER FUNCTIONS - // - - // A simple log function so the user knows why a request is not being send - warn = function () { - // 1. Convert args to a normal array - var args = [].slice.call(arguments); - - // 2. Prepend log prefix - args.unshift("Simple Analytics:"); - - // 3. Pass along arguments to console.warn - // Function.prototype.apply.call is needed for Internet Explorer - return Function.prototype.apply.call(con.warn, con, args); - }; - - var warnInFunction = function (name, error) { - warn("Error in your " + name + " function:", error); - }; - - var hasProp = function (obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); - }; - - var isString = function (string) { - return typeof string == "string"; - }; - - var filterRegex = function (item) { - return item.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - }; - - var attr = function (scriptElement, attribute) { - return scriptElement && scriptElement.getAttribute("data-" + attribute); - }; - - var convertCommaSeparatedToArray = function (csv) { - return Array.isArray(csv) - ? csv - : isString(csv) && csv.length - ? csv.split(/, ?/) - : []; - }; - - var isObject = function (object) { - return object && object.constructor === Object; - }; - - var assign = function () { - var to = {}; - var arg = arguments; - for (var index = 0; index < arg.length; index++) { - var nextSource = arg[index]; - if (isObject(nextSource)) { - for (var nextKey in nextSource) { - if (hasProp(nextSource, nextKey)) { - to[nextKey] = nextSource[nextKey]; - } - } - } - } - return to; - }; - - var settings = window.sa_settings; - var logSettings = settings; - settings = assign(settings); - - if (logSettings) warn("Settings", settings); - - // Customers can skip data points - var ignoreMetrics = convertCommaSeparatedToArray( - settings.ignoreMetrics || attr(scriptElement, "ignore-metrics") - ); - - var collectMetricByString = function (metricAbbreviation) { - // Can't use Array.find() here because we need to support IE9 - return ( - ignoreMetrics.filter(function (item) { - return new RegExp("^" + metricAbbreviation).test(item); - }).length === 0 - ); - }; - - var now = Date.now; - - var uuid = function () { - var cryptoObject = window.crypto || window.msCrypto; - var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11; - var uuidRegex = /[018]/g; - - try { - return emptyUUID.replace(uuidRegex, function (c) { - return ( - c ^ - (cryptoObject.getRandomValues(new Uint8Array(1))[0] & - (15 >> (c / 4))) - ).toString(16); - }); - } catch (error) { - return emptyUUID.replace(uuidRegex, function (c) { - var r = (Math.random() * 16) | 0, - v = c < 2 ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } - }; - - var isFunction = function (func) { - return typeof func == "function"; - }; - - // Define namespace for the library - var namespaceText = "namespace"; - var namespace = - settings[namespaceText] || - attr(scriptElement, namespaceText) || - defaultNamespace; - - var appendMetadata = function (metadata, data) { - var metadataObject = window[namespace + "_metadata"]; - if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); - var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) { - if (metadataCollector) - warn( - metadataCollector + " not found, set window." + metadataCollector - ); - return metadata; - } - try { - return assign( - metadata, - metadataCollectorFunction.call(window, assign(metadata, data)) - ); - } catch (error) { - warnInFunction("metadata", error); - } - }; - - var isBoolean = function (value) { - return !!value === value; - }; - - // By default we allow source, medium in the URLs. With strictUtm enabled - // we only allow it with the utm_ prefix: utm_source, utm_medium, ... - var strictUtm = - settings.strictUtm || attr(scriptElement, "strict-utm") == trueText; - - var k; - - var getQueryParams = function (ignoreSource, overwriteSearch) { - k = !ignoreSource && collectMetricByString("q") ? "" : falseVar; - var q = (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var i = keyValue.indexOf("="); - if (k !== falseVar && i > 0 && keyValue.slice(i + 1)) - k += (k ? "," : "") + keyValue.slice(0, i); - - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex, "i").test(keyValue); - }) - .join("&"); - - k = k || undefinedVar; - return q || undefinedVar; - }; - - // Ignore pages specified in data-ignore-pages - var shouldIgnore = function (path) { - for (var i in ignorePages) { - var ignorePageRaw = ignorePages[i]; - if (!ignorePageRaw) continue; - - // Prepend a slash when it's missing - var ignorePage = - ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw; - - if ( - ignorePage === path || - new RegExp( - "^" + filterRegex(ignorePage).replace(/\\\*/gi, "(.*)") + "$", - "i" - ).test(path) - ) - return trueVar; - } - return falseVar; - }; - - ///////////////////// - // Warn when using script twice - // - - // Only load our script once, customers can still send multiple page views - // with the sa_pageview function if they turn off auto collect. - var loadedVariable = namespace + "_loaded"; - if (window[loadedVariable] == trueVar) return warn(notSending + "twice"); - window.sa_event_loaded = trueVar; - window[loadedVariable] = trueVar; - - ///////////////////// - // SEND DATA VIA OUR PIXEL - // - - // Send data via image - var sendData = function (data, callback, onlyThisData, keepalive) { - data = onlyThisData ? data : assign(payload, page, data); - - if (nav.brave && !onlyThisData) data.brave = trueVar; - if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar; - - data.dev = trueVar; - - var image = new Image(); - if (callback) { - image.onerror = callback; - image.onload = callback; - } - var imageUrl = - fullApiUrl + - "/simple.gif?" + - Object.keys(data) - .filter(function (key) { - return data[key] != undefinedVar; - }) - .map(function (key) { - return ( - encodeURIComponentFunc(key) + - "=" + - encodeURIComponentFunc(data[key]) - ); - }) - .join("&") + - "&time=" + - Date.now(); - - // Events must survive navigation without taking over links or forms. - if (keepalive && window.fetch) { - try { - window - .fetch(imageUrl, { - keepalive: trueVar, - mode: "no-cors", - credentials: "omit", - }) - .catch(function () { - image.src = imageUrl; - }); - return; - } catch (error) {} - } - image.src = imageUrl; - }; - - // Customers can overwrite their hostname, here we check for that - var overwrittenHostname = - settings.hostname || attr(scriptElement, "hostname"); - var definedHostname = overwrittenHostname || locationHostname; - - var basePayload = { - version: version, - hostname: definedHostname, - }; - - ///////////////////// - // ERROR FUNCTIONS - // - - // Send errors - // no var because it's scoped outside of the try/catch - sendError = function (errorOrMessage) { - errorOrMessage = errorOrMessage.stack - ? errorOrMessage + " " + errorOrMessage.stack - : errorOrMessage; - warn(errorOrMessage); - sendData( - assign(basePayload, { - type: errorText, - error: errorOrMessage, - path: loc.pathname, - }), - undefinedVar, - trueVar - ); - }; - - // We listen for the error events and only send errors that are - // from our script (checked by filename) to our server. - addEventListenerFunc( - errorText, - function (event) { - if (event.filename && event.filename.indexOf(baseUrl) > -1) { - sendError(event.message); - } - }, - falseVar - ); - - ///////////////////// - // INITIALIZE VALUES - // - - var start = now(); - - var scrolled = 0; - - ///////////////////// - // GET SETTINGS - // - - // Script mode, this can be hash mode for example - var mode = settings.mode || attr(scriptElement, "mode"); - - // Should we record Do Not Track visits? - var collectDnt = isBoolean(settings.collectDnt) - ? settings.collectDnt - : attr(scriptElement, "ignore-dnt") == trueText || - attr(scriptElement, "skip-dnt") == trueText || - attr(scriptElement, "collect-dnt") == trueText; - - // Some customers want to collect page views manually - var autoCollect = !( - attr(scriptElement, "auto-collect") == "false" || - settings.autoCollect === falseVar - ); - - // Event function name - var eventFunctionName = - settings.saGlobal || - attr(scriptElement, "sa-global") || - namespace + "_" + eventText; - - // Customers can ignore certain pages - var ignorePages = convertCommaSeparatedToArray( - settings.ignorePages || attr(scriptElement, "ignore-pages") - ); - - // Customers can allow params - var allowParams = convertCommaSeparatedToArray( - settings.allowParams || attr(scriptElement, "allow-params") - ); - - // Customers can allow params - var nonUniqueHostnames = convertCommaSeparatedToArray( - settings.nonUniqueHostnames || attr(scriptElement, "non-unique-hostnames") - ); - - // Customers can overwrite certain values - var pathOverwriter = - settings.pathOverwriter || attr(scriptElement, "path-overwriter"); - - // Customers can add metadata to events and pageviews via a function - var metadataCollector = - settings.metadataCollector || attr(scriptElement, "metadata-collector"); - - // This code could error on (incomplete) implementations, that's why we use try...catch - var timezone; - try { - // c = countries - timezone = collectMetricByString("c") - ? Intl.DateTimeFormat().resolvedOptions().timeZone - : undefinedVar; - } catch (error) { - warn(error); - } - - ///////////////////// - // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS - // - - var phantom = window.phantom; - var bot = - nav.webdriver || - window.__nightmare || - window.callPhantom || - window._phantom || - (phantom && !phantom.solana) || - window.__polypane || - window._bot || - isBotAgent || - Math.random() == Math.random(); - - // t = timeonpage, scro = scrolled - var collectDataOnLeave = - collectMetricByString("t") || collectMetricByString("scro"); - - if (bot) basePayload.bot = trueVar; - - var payload = assign(basePayload, { - // us = useragent - ua: collectMetricByString("us") ? userAgent : undefinedVar, - - https: loc.protocol == https, - timezone: timezone, - page_id: collectDataOnLeave ? uuid() : undefinedVar, - - // se = sessions - session_id: collectMetricByString("se") ? uuid() : undefinedVar, - }); - - payload.sri = falseVar; - - // Use User-Agent Client Hints for better privacy - // https://web.dev/user-agent-client-hints/ - if (uaData) { - payload.mobile = uaData.mobile; - payload.brands = stringify(uaData.brands); - } - - ///////////////////// - // ADD WARNINGS - // - - warn("Using latest.dev.js, please change to latest.js on production."); - - // Warn when no document.doctype is defined (this breaks some documentElement dimensions) - if (!doc.doctype) warn("Add DOCTYPE html for accurate dimensions"); - - // When a customer overwrites the hostname, we need to know what the original - // hostname was to hide that domain from referrer traffic - if (definedHostname !== locationHostname) - payload.hostname_original = locationHostname; - - // Don't track when Do Not Track is set to true - if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == "1") - return warn( - notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt" - ); - - // Warn when sending from localhost and not having a hostname set - if ( - (locationHostname.indexOf(".") == -1 || - /^[0-9.:]+$/.test(locationHostname)) && - !overwrittenHostname - ) - warn( - "Set hostname on " + - locationHostname + - ". See " + - docsUrl + - "/overwrite-domain-name" - ); - - ///////////////////// - // SETUP INITIAL VARIABLES - // - - var page = {}; - var lastSendPath; - - var getReferrer = function (raw) { - // Customers can overwrite their referrer, here we check for that - var referrer = - settings.referrer || - attr(scriptElement, "referrer") || - doc.referrer || - ""; - - if (raw) return referrer; - return ( - referrer - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar - ); - }; - - // We don't want to end up with sensitive data so we clean the referrer URL - var referrer = getReferrer(); - - ///////////////////// - // TIME ON PAGE AND SCROLLED LOGIC - // - - // We don't put msHidden in if duration block, because it's used outside of that functionality - var msHidden = 0; - - var sendOnLeave = function (id, push) { - if (!collectDataOnLeave) return; - - var append = assign(basePayload, { - type: "append", - original_id: push ? id : payload.page_id, - }); - - // t = timeonpage - if (collectMetricByString("t")) { - append.duration = Math.round((now() - start - msHidden) / thousand); - } - msHidden = 0; - start = now(); - - // scro = scrolled - if (collectMetricByString("scro")) { - append.scrolled = Math.max(0, scrolled, position()); - } - - if (push || !nav.sendBeacon) { - // sendData will assign payload to request - sendData(append, undefinedVar, trueVar); - } else { - try { - nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); - } catch (e) { - // Fallback for browsers throwing "Illegal invocation" when the URL is invalid - sendData(append, undefinedVar, trueVar); - } - } - }; - - var hiddenStart; - addEventListenerFunc( - "visibilitychange", - function () { - if (doc.hidden) { - if (!("on" + pagehide in window)) sendOnLeave(); - hiddenStart = now(); - } else msHidden += now() - hiddenStart; - }, - falseVar - ); - - addEventListenerFunc(pagehide, sendOnLeave, falseVar); - - var body = doc.body || {}; - var position = function () { - try { - var documentClientHeight = documentElement[clientHeight] || 0; - var height = Math.max( - body[scrollHeight] || 0, - body[offsetHeight] || 0, - documentElement[clientHeight] || 0, - documentElement[scrollHeight] || 0, - documentElement[offsetHeight] || 0 - ); - return Math.min( - 100, - Math.round( - (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) / - height / - 5 - ) * 5 - ); - } catch (error) { - warn(error); - return 0; - } - }; - - addEventListenerFunc("load", function () { - scrolled = position(); - addEventListenerFunc( - scroll, - function () { - if (scrolled < position()) scrolled = position(); - }, - falseVar - ); - }); - - ///////////////////// - // ACTUAL PAGE VIEW LOGIC - // - - var getPath = function (overwrite) { - var path = ""; - - // decodeURIComponent can fail when having invalid characters - // https://github.com/simpleanalytics/roadmap/issues/462 - try { - path = overwrite || decodeURIComponentFunc(loc.pathname); - } catch (error) { - warn(error); - } - - var pathOverwriterFunction = window[pathOverwriter]; - if (isFunction(pathOverwriterFunction)) { - try { - path = pathOverwriterFunction.call(window, { path: path }) || path; - } catch (error) { - warnInFunction("path", error); - } - } - - // Ignore pages specified in data-ignore-pages - if (shouldIgnore(path)) { - warn(notSendingWhen + "ignoring " + path); - return; - } - - // Add hash to path when script is put in to hash mode - if (mode == "hash" && loc.hash) path += loc.hash.split("?")[0]; - - return path; - }; - - var previousReferrer; - - // Send page view and append data to it - var sendPageView = function ( - isPushState, - deleteSourceInfo, - sameSite, - search, - metadata, - callback - ) { - if (isPushState) sendOnLeave("" + payload.page_id, trueVar); - if (collectDataOnLeave) payload.page_id = uuid(); - - var currentPage = definedHostname + getPath(); - var query = getQueryParams(deleteSourceInfo, search); - - sendData( - { - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - k: k, - - metadata: stringify(metadata), - }, - callback - ); - - previousReferrer = referrer; - referrer = currentPage; - - pages++; - }; - - var sameSite, userNavigated; - - var pageview = function ( - isPushState, - pathOverwrite, - metadata, - callbackRaw - ) { - if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch = ""; - if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { - // keep query from manual path - var parts = pathOverwrite.split("?"); - pathOverwrite = parts.shift(); - querySearch = "?" + parts.join("?"); - } - // Obfuscate personal data in URL by dropping the search and hash - var path = getPath(pathOverwrite); - - // Don't send the last path again (this could happen when pushState is used to change the path hash or search) - var pathKey = path + querySearch; - if (!path || lastSendPath == pathKey) return; - - lastSendPath = pathKey; - page.path = path; - - // v = viewportsizes - if (collectMetricByString("v")) { - page.viewport_width = - Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) || - null; - page.viewport_height = - Math.max( - documentElement[clientHeight] || 0, - window.innerHeight || 0 - ) || null; - } - - // l = language - if (collectMetricByString("l")) { - if (nav[language]) page[language] = nav[language]; - } - - // scre = screensizes - if (screen && collectMetricByString("scre")) { - page.screen_width = screen.width; - page.screen_height = screen.height; - } - - // If a user does refresh we need to delete the referrer because otherwise it count double - var perf = window.performance; - var navigationText = "navigation"; - - // Check if back, forward or reload buttons are being used in modern browsers - var performaceEntryType; - try { - performaceEntryType = perf.getEntriesByType(navigationText)[0].type; - } catch (error) { - warn(error); - } - - userNavigated = performaceEntryType - ? ["reload", "back_forward"].indexOf(performaceEntryType) > -1 - : // Check if back, forward or reload buttons are being use in older browsers - // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD - perf && - perf[navigationText] && - [1, 2].indexOf(perf[navigationText].type) > -1; - - // Check if referrer is the same as current real hostname (not the defined hostname!) - var currentReferrerHostname = referrer - ? referrer.split(slash)[0] - : undefinedVar; - sameSite = referrer - ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 || - currentReferrerHostname == locationHostname - : falseVar; - - // Only the first pageview can use a Cloudflare referrer as a unique arrival. - page.unique = - isPushState || userNavigated - ? falseVar - : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar))); - - metadata = appendMetadata(metadata, { - type: pageviewText, - path: page.path, - }); - - var triggerSendPageView = function () { - fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); - }; - - if (!fetchedHighEntropyValues) { - // Request platform information if this is available - try { - if (uaData && isFunction(uaData.getHighEntropyValues)) { - uaData - .getHighEntropyValues([platformText, platformVersionText]) - .then(function (highEntropyValues) { - payload.os_name = highEntropyValues[platformText]; - payload.os_version = highEntropyValues[platformVersionText]; - triggerSendPageView(); - }) - .catch(triggerSendPageView); - } else { - triggerSendPageView(); - } - } catch (e) { - triggerSendPageView(); - } - } else { - triggerSendPageView(); - } - }; - - ///////////////////// - // AUTOMATED PAGE VIEW COLLECTION - // - - var his = window.history; - var hisPushState = his ? his.pushState : undefinedVar; - var dis = window.dispatchEvent; - var pushStateText = "pushState"; - - // Overwrite history pushState function to - // allow listening on the pushState event - if (autoCollect && hisPushState && Event && dis) { - var stateListener = function (type) { - var orig = his[type]; - return function () { - var arg = arguments; - var rv = orig.apply(this, arg); - var event; - if (isFunction(Event)) { - event = new Event(type); - } else { - // Fix for IE - // https://github.com/simpleanalytics/scripts/issues/8 - event = doc.createEvent("Event"); - event.initEvent(type, trueVar, trueVar); - } - event.arguments = arg; - dis(event); - return rv; - }; - }; - - his.pushState = stateListener(pushStateText); - - addEventListenerFunc( - pushStateText, - function () { - pageview(1); - }, - falseVar - ); - - addEventListenerFunc( - "popstate", - function () { - pageview(1); - }, - falseVar - ); - } - - // When in hash mode, we record a pageview based on the onhashchange function - if (autoCollect && mode == "hash" && "onhashchange" in window) { - addEventListenerFunc( - "hashchange", - function () { - pageview(1); - }, - falseVar - ); - } - - if (autoCollect) pageview(); - - var manualPageview = function (path, metadata, callback) { - pageview(0, path, metadata, callback); - }; - window[namespace + "_" + pageviewText] = manualPageview; - var defaultPageview = defaultNamespace + "_" + pageviewText; - if (!window[defaultPageview]) window[defaultPageview] = manualPageview; - - - ///////////////////// - // EVENTS - // - - var validTypes = ["string", "number"]; - - var sendEvent = function (event, metadata, callbackRaw, keepalive) { - if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; - - var eventIsFunction = isFunction(event); - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var eventType = typeof event; - - if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) { - warnInFunction(eventFunctionName, eventText + " can't be " + eventType); - return callback(); - } - - try { - if (eventIsFunction) { - var eventOutput = event(); - if (validTypes.indexOf(typeof eventOutput) < 0) { - warnInFunction( - eventFunctionName, - event + " returns no string: " + eventOutput - ); - return callback(); - } - event = eventOutput; - } - } catch (error) { - warnInFunction(eventFunctionName, error); - return callback(); - } - - event = ("" + event).replace(/[^a-z0-9]+/gi, "_").replace(/(^_|_$)/g, ""); - - var eventParams = { type: eventText, event: event }; - var firstPage = !userNavigated && pages < 2; - - metadata = appendMetadata(metadata, eventParams); - - if (event) { - sendData( - assign(eventParams, { - id: uuid(), - query: getQueryParams(!firstPage), - referrer: - (firstPage || sameSite) && collectMetricByString("r") - ? previousReferrer - : null, - - metadata: stringify(metadata), - }), - callback, - undefinedVar, - keepalive - ); - } - }; - - var defaultEventFunc = function (event, metadata, callback, keepalive) { - sendEvent(event, metadata, callback, keepalive); - }; - - // Set default function if user didn't define a function - if (!window[eventFunctionName]) - window[eventFunctionName] = defaultEventFunc; - - var eventFunc = window[eventFunctionName]; - - // Read queue of the user defined function - var queue = eventFunc && eventFunc.q ? eventFunc.q : []; - - // Overwrite user defined function - window[eventFunctionName] = defaultEventFunc; - - // Automated events wait for this variable, for example ba_event_loaded - window[eventFunctionName + "_loaded"] = trueVar; - - // Post events from the queue of the user defined function - for (var event in queue) { - if (hasProp(queue, event)) { - Array.isArray(queue[event]) - ? sendEvent.apply(null, queue[event]) - : sendEvent(queue[event]); - } - } - - var inlineEvent = function (event) { - var element = event.target; - while ( - element && - element !== doc && - (!element.getAttribute || attr(element, "simple-event") === null) - ) - element = element.parentNode; - - if (!element || element === doc) return; - var isForm = element.tagName === "FORM"; - var name = attr(element, "simple-event"); - if (!name || isForm !== (event.type === "submit")) return; - - var metadata = { tag: element.tagName.toLowerCase() }; - var attributes = element.attributes; - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - if (attribute.name.indexOf("data-simple-event-") === 0) - metadata[attribute.name.slice(18).replace(/-/g, "_")] = - attribute.value; - } - if (isForm) { - var button = event.submitter; - metadata.button_text = button - ? (button.textContent || button.value || "") - .replace(/\s+/g, " ") - .trim() - .slice(0, 200) - : ""; - } - sendEvent(name, metadata, undefinedVar, trueVar); - }; - - doc.addEventListener("click", inlineEvent, falseVar); - doc.addEventListener("submit", inlineEvent, falseVar); - - // 404 confirmation adds a request, so existing installs must opt in. - if ( - settings.detect404 === trueVar || - attr(scriptElement, "detect-404") == trueText - ) { - var detect404 = function () { - if ( - !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) - ) - return; - try { - var request = new window.XMLHttpRequest(); - request.open("HEAD", loc.href, trueVar); - request.onload = function () { - if (request.status === 404) - sendEvent("page_404", { - url: loc.protocol + "//" + definedHostname + loc.pathname, - status: 404, - }); - }; - request.send(); - } catch (error) {} - }; - if (doc.readyState === "loading") - doc.addEventListener("DOMContentLoaded", detect404, falseVar); - else detect404(); - } - } catch (e) { - sendError(e); - } -})( - typeof window != "undefined" && window, - "", - "", - "custom_latest_dev_12", - "sa" -); diff --git a/dist/latest/custom/latest.js b/dist/latest/custom/latest.js deleted file mode 100644 index e440527a..00000000 --- a/dist/latest/custom/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 654f; v12) */ - -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); -//# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/latest/custom/latest.js.map b/dist/latest/custom/latest.js.map deleted file mode 100644 index 4e8517c6..00000000 --- a/dist/latest/custom/latest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/light.js b/dist/latest/custom/light.js deleted file mode 100644 index a2ddf851..00000000 --- a/dist/latest/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 5075; v12) */ - -!function(f,e,m){if(f)try{var u=undefined,t="https:",n=f.console,r="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,a=g.userAgent,o="Not sending request ",v=!1,c=encodeURIComponent,s=decodeURIComponent,d=JSON.stringify,l=f.addEventListener,y="https://"+e,_=(i.documentElement,"language"),w=g.userAgentData,b="platform",O="platformVersion",S="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(a)&&!/(cubot)/i.test(a),k=i.currentScript||i.querySelector('script[src*="'+e+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(n.warn,n,e)};var x=function(e){return"string"==typeof e},E=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(e){return"function"==typeof e},N="namespace",R=q[N]||E(k,N)||"sa",U=q.strictUtm||"true"==E(k,"strict-utm"),V=R+"_loaded";if(1==f[V])return m(o+"twice");f.sa_event_loaded=!0,f[V]=!0;var B,C=function(t,e,n,r){t=n?t:A(z,L,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var i=new Image,a=y+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return c(e)+"="+c(t[e])}).join("&")+"&time="+Date.now();i.src=a},H=q.hostname||E(k,"hostname"),T=H||h,F={version:"custom_light_12",hostname:T};q.mode||E(k,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){m(W)}j&&(F.bot=!0);var z=A(F,{ua:a,https:p.protocol==t,timezone:B,page_id:D(),session_id:D()});if(z.sri=!1,w&&(z.mobile=w.mobile,z.brands=d(w.brands)),T!==h&&(z.hostname_original=h),r in g&&"1"==g[r])return m("Not sending request when "+r+" is enabled. See "+S+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||m("Set hostname on "+h+". See "+S+"/overwrite-domain-name");var J,L={},M=(q.referrer||E(k,"referrer")||i.referrer||"").replace(h,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,P=function(e,t){var n=A(F,{type:"append",original_id:t?e:z.page_id});if(t||!g.sendBeacon)C(n,0,!0);else try{g.sendBeacon.bind(g)(y+"/append",d(n))}catch(r){C(n,0,!0)}};l("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||s(p.pathname)}catch(W){m(W)}return t},Q=function(e,t,n,r,i,a){e&&P(""+z.page_id,!0),z.page_id=D();var o,c=T+K(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=","i").test(e)}).join("&")||u);C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:s}),M=c,0};!function(e,t,n,r){!r&&I(n)&&(r=n);I(r);var i,a="";x(t)&&-1"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/latest/custom/light.js.map b/dist/latest/custom/light.js.map deleted file mode 100644 index 9e9d78ee..00000000 --- a/dist/latest/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","logSettings","settings","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","keys","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/custom/proxy.js b/dist/latest/custom/proxy.js deleted file mode 100644 index eb2c037d..00000000 --- a/dist/latest/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 5383; v12) */ - -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/latest/custom/proxy.js.map b/dist/latest/custom/proxy.js.map deleted file mode 100644 index 788def32..00000000 --- a/dist/latest/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/embed.js b/dist/latest/embed.js deleted file mode 100644 index 7074f91a..00000000 --- a/dist/latest/embed.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; d2e8; v1) */ - -var o;o=document,NodeList.prototype.forEach=Array.prototype.forEach,o.addEventListener("DOMContentLoaded",function(){var n=1;o.querySelectorAll("[data-sa-graph-url]").forEach(function(e){var t=e.getAttribute("data-sa-graph-url"),a=-1 -1 ? \"&\" : \"?\";\n var iframe = document.createElement(\"iframe\");\n iframe.setAttribute(\n \"src\",\n url + append + \"embed=true&graph_id=\" + counter\n );\n iframe.setAttribute(\"id\", \"sa-graph-\" + counter);\n iframe.setAttribute(\"scrolling\", \"no\");\n iframe.style.width = \"100%\";\n iframe.style.border = \"none\";\n graph.innerHTML = iframe.outerHTML;\n counter = counter + 1;\n });\n\n window.onresize = function () {\n document\n .querySelectorAll(\"[data-sa-graph-url] iframe\")\n .forEach(function (iframe) {\n iframe.contentWindow.postMessage(\"true\", \"*\");\n });\n };\n\n window.addEventListener(\"message\", function (event) {\n if (typeof event.data !== \"object\") {\n return;\n } else if (event.data.type === \"resize\") {\n document.getElementById(\"sa-graph-\" + event.data.id).height =\n event.data.height + \"px\";\n } else if (event.data.type === \"pageviews\") {\n var graph = document.getElementById(\"sa-graph-\" + event.data.id);\n var selector = graph.parentNode.getAttribute(\n \"data-sa-page-views-selector\"\n );\n if (selector)\n document\n .querySelectorAll(selector)\n .forEach(function (pageViewsElement) {\n pageViewsElement.textContent = event.data.pageviews;\n });\n }\n });\n });\n})(document);\n"],"names":["document","NodeList","prototype","forEach","Array","addEventListener","counter","querySelectorAll","graph","url","getAttribute","append","indexOf","iframe","createElement","setAttribute","style","width","border","innerHTML","outerHTML","window","onresize","contentWindow","postMessage","event","selector","data","type","getElementById","id","height","parentNode","pageViewsElement","textContent","pageviews"],"mappings":";;AAAA,IAAWA,EAAAA,EAiDRA,SAhDDC,SAASC,UAAUC,QAAUC,MAAMF,UAAUC,QAE7CH,EAASK,iBAAiB,mBAAoB,WAC5C,IAAIC,EAAU,EACdN,EAASO,iBAAiB,uBAAuBJ,QAAQ,SAAUK,GACjE,IAAIC,EAAMD,EAAME,aAAa,qBACzBC,GAA6B,EAApBF,EAAIG,QAAQ,KAAY,IAAM,IACvCC,EAASb,EAASc,cAAc,UACpCD,EAAOE,aACL,MACAN,EAAME,EAAS,uBAAyBL,GAE1CO,EAAOE,aAAa,KAAM,YAAcT,GACxCO,EAAOE,aAAa,YAAa,MACjCF,EAAOG,MAAMC,MAAQ,OACrBJ,EAAOG,MAAME,OAAS,OACtBV,EAAMW,UAAYN,EAAOO,UACzBd,GAAoB,IAGtBe,OAAOC,SAAW,WAChBtB,EACGO,iBAAiB,8BACjBJ,QAAQ,SAAUU,GACjBA,EAAOU,cAAcC,YAAY,OAAQ,QAI/CH,OAAOhB,iBAAiB,UAAW,SAAUoB,GAC3C,IAOMC,EAPoB,iBAAfD,EAAME,OAEc,WAApBF,EAAME,KAAKC,KACpB5B,EAAS6B,eAAe,YAAcJ,EAAME,KAAKG,IAAIC,OACnDN,EAAME,KAAKI,OAAS,KACO,cAApBN,EAAME,KAAKC,OAEhBF,EADQ1B,EAAS6B,eAAe,YAAcJ,EAAME,KAAKG,IACxCE,WAAWtB,aAC9B,iCAGAV,EACGO,iBAAiBmB,GACjBvB,QAAQ,SAAU8B,GACjBA,EAAiBC,YAAcT,EAAME,KAAKQ"} \ No newline at end of file diff --git a/dist/latest/hello.js b/dist/latest/hello.js deleted file mode 100644 index 69c93c2f..00000000 --- a/dist/latest/hello.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 9995) */ - -!function(m,e,n,v){var r,a,t;if(m)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=m.console,u="doNotTrack",b=m.navigator,d=m.location,E=d.host,f=m.document,p=b.userAgent,h="Not sending request ",x=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,q=m.addEventListener,A="https://queue."+e,C=f.documentElement||{},D="language",$="Height",R="scroll",j=b.userAgentData,H=R+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=m.screen,z=f.currentScript||f.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){v("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},dt=et.strictUtm||Y(z,"strict-utm")==i,ft=function(i,t){nt=!i&&at("q")?"":_;var e=(t||d.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_hello_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/latest.dev.js b/dist/latest/latest.dev.js deleted file mode 100644 index c84c8e38..00000000 --- a/dist/latest/latest.dev.js +++ /dev/null @@ -1,1085 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 40d9; v12) */ -/* eslint-env browser */ - -(function ( - window, - baseUrl, - apiUrlPrefix, - version, - defaultNamespace, - sendError, - warn -) { - // Only initialize in a browser. - if (!window) return; - - try { - ///////////////////// - // PREDEFINED VARIABLES FOR BETTER MINIFICATION - // - - // This seems like a lot of repetition, but it makes our script available for - // multple destination which prevents us to need multiple scripts. The minified - // version stays small. - var undefinedVar = undefined; - var trueVar = true; - var falseVar = false; - var trueText = "true"; - var https = "https:"; - var pageviewText = "pageview"; - var eventText = "event"; - var errorText = "error"; - var slash = "/"; - var protocol = https + "//"; - var con = window.console; - var doNotTrack = "doNotTrack"; - var nav = window.navigator; - var loc = window.location; - var locationHostname = loc.host; - var doc = window.document; - var userAgent = nav.userAgent; - var notSending = "Not sending request "; - var notSendingWhen = notSending + "when "; - var fetchedHighEntropyValues = falseVar; - var encodeURIComponentFunc = encodeURIComponent; - var decodeURIComponentFunc = decodeURIComponent; - var stringify = JSON.stringify; - var thousand = 1000; - var addEventListenerFunc = window.addEventListener; - var fullApiUrl = protocol + apiUrlPrefix + baseUrl; - var documentElement = doc.documentElement || {}; - var language = "language"; - var Height = "Height"; - var Width = "Width"; - var scroll = "scroll"; - var uaData = nav.userAgentData; - var scrollHeight = scroll + Height; - var offsetHeight = "offset" + Height; - var clientHeight = "client" + Height; - var clientWidth = "client" + Width; - var pagehide = "pagehide"; - var platformText = "platform"; - var platformVersionText = "platformVersion"; - var docsUrl = "https://docs.simpleanalytics.com"; - var pages = 0; - var isBotAgent = - /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); - var screen = window.screen; - - // Find the script element where options can be set on - var scriptElement = - doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); - - ///////////////////// - // HELPER FUNCTIONS - // - - // A simple log function so the user knows why a request is not being send - warn = function () { - // 1. Convert args to a normal array - var args = [].slice.call(arguments); - - // 2. Prepend log prefix - args.unshift("Simple Analytics:"); - - // 3. Pass along arguments to console.warn - // Function.prototype.apply.call is needed for Internet Explorer - return Function.prototype.apply.call(con.warn, con, args); - }; - - var warnInFunction = function (name, error) { - warn("Error in your " + name + " function:", error); - }; - - var hasProp = function (obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); - }; - - var isString = function (string) { - return typeof string == "string"; - }; - - var filterRegex = function (item) { - return item.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); - }; - - var attr = function (scriptElement, attribute) { - return scriptElement && scriptElement.getAttribute("data-" + attribute); - }; - - var convertCommaSeparatedToArray = function (csv) { - return Array.isArray(csv) - ? csv - : isString(csv) && csv.length - ? csv.split(/, ?/) - : []; - }; - - var isObject = function (object) { - return object && object.constructor === Object; - }; - - var assign = function () { - var to = {}; - var arg = arguments; - for (var index = 0; index < arg.length; index++) { - var nextSource = arg[index]; - if (isObject(nextSource)) { - for (var nextKey in nextSource) { - if (hasProp(nextSource, nextKey)) { - to[nextKey] = nextSource[nextKey]; - } - } - } - } - return to; - }; - - var settings = window.sa_settings; - var logSettings = settings; - settings = assign(settings); - - if (logSettings) warn("Settings", settings); - - // Customers can skip data points - var ignoreMetrics = convertCommaSeparatedToArray( - settings.ignoreMetrics || attr(scriptElement, "ignore-metrics") - ); - - var collectMetricByString = function (metricAbbreviation) { - // Can't use Array.find() here because we need to support IE9 - return ( - ignoreMetrics.filter(function (item) { - return new RegExp("^" + metricAbbreviation).test(item); - }).length === 0 - ); - }; - - var now = Date.now; - - var uuid = function () { - var cryptoObject = window.crypto || window.msCrypto; - var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11; - var uuidRegex = /[018]/g; - - try { - return emptyUUID.replace(uuidRegex, function (c) { - return ( - c ^ - (cryptoObject.getRandomValues(new Uint8Array(1))[0] & - (15 >> (c / 4))) - ).toString(16); - }); - } catch (error) { - return emptyUUID.replace(uuidRegex, function (c) { - var r = (Math.random() * 16) | 0, - v = c < 2 ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } - }; - - var isFunction = function (func) { - return typeof func == "function"; - }; - - // Define namespace for the library - var namespaceText = "namespace"; - var namespace = - settings[namespaceText] || - attr(scriptElement, namespaceText) || - defaultNamespace; - - var appendMetadata = function (metadata, data) { - var metadataObject = window[namespace + "_metadata"]; - if (isObject(metadataObject)) metadata = assign(metadata, metadataObject); - var metadataCollectorFunction = window[metadataCollector]; - if (!isFunction(metadataCollectorFunction)) { - if (metadataCollector) - warn( - metadataCollector + " not found, set window." + metadataCollector - ); - return metadata; - } - try { - return assign( - metadata, - metadataCollectorFunction.call(window, assign(metadata, data)) - ); - } catch (error) { - warnInFunction("metadata", error); - } - }; - - var isBoolean = function (value) { - return !!value === value; - }; - - // By default we allow source, medium in the URLs. With strictUtm enabled - // we only allow it with the utm_ prefix: utm_source, utm_medium, ... - var strictUtm = - settings.strictUtm || attr(scriptElement, "strict-utm") == trueText; - - var k; - - var getQueryParams = function (ignoreSource, overwriteSearch) { - k = !ignoreSource && collectMetricByString("q") ? "" : falseVar; - var q = (overwriteSearch || loc.search) - .slice(1) - .split("&") - .filter(function (keyValue) { - var i = keyValue.indexOf("="); - if (k !== falseVar && i > 0 && keyValue.slice(i + 1)) - k += (k ? "," : "") + keyValue.slice(0, i); - - var ignore = ignoreSource || !collectMetricByString("ut"); - - var paramsRegexList = allowParams.map(filterRegex).join("|"); - var regex = ignore - ? "^(" + paramsRegexList + ")=" - : "^((utm_)" + - (strictUtm ? "" : "?") + - "(source|medium|content|term|campaign)" + - (strictUtm ? "" : "|ref") + - "|" + - paramsRegexList + - ")="; - if (ignore && !allowParams.length) return falseVar; - - // The prefix "utm_" is optional with "strictUtm" disabled - // "ref" is only collected when "strictUtm" is disabled - return new RegExp(regex, "i").test(keyValue); - }) - .join("&"); - - k = k || undefinedVar; - return q || undefinedVar; - }; - - // Ignore pages specified in data-ignore-pages - var shouldIgnore = function (path) { - for (var i in ignorePages) { - var ignorePageRaw = ignorePages[i]; - if (!ignorePageRaw) continue; - - // Prepend a slash when it's missing - var ignorePage = - ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw; - - if ( - ignorePage === path || - new RegExp( - "^" + filterRegex(ignorePage).replace(/\\\*/gi, "(.*)") + "$", - "i" - ).test(path) - ) - return trueVar; - } - return falseVar; - }; - - ///////////////////// - // Warn when using script twice - // - - // Only load our script once, customers can still send multiple page views - // with the sa_pageview function if they turn off auto collect. - var loadedVariable = namespace + "_loaded"; - if (window[loadedVariable] == trueVar) return warn(notSending + "twice"); - window.sa_event_loaded = trueVar; - window[loadedVariable] = trueVar; - - ///////////////////// - // SEND DATA VIA OUR PIXEL - // - - // Send data via image - var sendData = function (data, callback, onlyThisData, keepalive) { - data = onlyThisData ? data : assign(payload, page, data); - - if (nav.brave && !onlyThisData) data.brave = trueVar; - if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar; - - data.dev = trueVar; - - var image = new Image(); - if (callback) { - image.onerror = callback; - image.onload = callback; - } - var imageUrl = - fullApiUrl + - "/simple.gif?" + - Object.keys(data) - .filter(function (key) { - return data[key] != undefinedVar; - }) - .map(function (key) { - return ( - encodeURIComponentFunc(key) + - "=" + - encodeURIComponentFunc(data[key]) - ); - }) - .join("&") + - "&time=" + - Date.now(); - - // Events must survive navigation without taking over links or forms. - if (keepalive && window.fetch) { - try { - window - .fetch(imageUrl, { - keepalive: trueVar, - mode: "no-cors", - credentials: "omit", - }) - .catch(function () { - image.src = imageUrl; - }); - return; - } catch (error) {} - } - image.src = imageUrl; - }; - - // Customers can overwrite their hostname, here we check for that - var overwrittenHostname = - settings.hostname || attr(scriptElement, "hostname"); - var definedHostname = overwrittenHostname || locationHostname; - - var basePayload = { - version: version, - hostname: definedHostname, - }; - - ///////////////////// - // ERROR FUNCTIONS - // - - // Send errors - // no var because it's scoped outside of the try/catch - sendError = function (errorOrMessage) { - errorOrMessage = errorOrMessage.stack - ? errorOrMessage + " " + errorOrMessage.stack - : errorOrMessage; - warn(errorOrMessage); - sendData( - assign(basePayload, { - type: errorText, - error: errorOrMessage, - path: loc.pathname, - }), - undefinedVar, - trueVar - ); - }; - - // We listen for the error events and only send errors that are - // from our script (checked by filename) to our server. - addEventListenerFunc( - errorText, - function (event) { - if (event.filename && event.filename.indexOf(baseUrl) > -1) { - sendError(event.message); - } - }, - falseVar - ); - - ///////////////////// - // INITIALIZE VALUES - // - - var start = now(); - - var scrolled = 0; - - ///////////////////// - // GET SETTINGS - // - - // Script mode, this can be hash mode for example - var mode = settings.mode || attr(scriptElement, "mode"); - - // Should we record Do Not Track visits? - var collectDnt = isBoolean(settings.collectDnt) - ? settings.collectDnt - : attr(scriptElement, "ignore-dnt") == trueText || - attr(scriptElement, "skip-dnt") == trueText || - attr(scriptElement, "collect-dnt") == trueText; - - // Some customers want to collect page views manually - var autoCollect = !( - attr(scriptElement, "auto-collect") == "false" || - settings.autoCollect === falseVar - ); - - // Event function name - var eventFunctionName = - settings.saGlobal || - attr(scriptElement, "sa-global") || - namespace + "_" + eventText; - - // Customers can ignore certain pages - var ignorePages = convertCommaSeparatedToArray( - settings.ignorePages || attr(scriptElement, "ignore-pages") - ); - - // Customers can allow params - var allowParams = convertCommaSeparatedToArray( - settings.allowParams || attr(scriptElement, "allow-params") - ); - - // Customers can allow params - var nonUniqueHostnames = convertCommaSeparatedToArray( - settings.nonUniqueHostnames || attr(scriptElement, "non-unique-hostnames") - ); - - // Customers can overwrite certain values - var pathOverwriter = - settings.pathOverwriter || attr(scriptElement, "path-overwriter"); - - // Customers can add metadata to events and pageviews via a function - var metadataCollector = - settings.metadataCollector || attr(scriptElement, "metadata-collector"); - - // This code could error on (incomplete) implementations, that's why we use try...catch - var timezone; - try { - // c = countries - timezone = collectMetricByString("c") - ? Intl.DateTimeFormat().resolvedOptions().timeZone - : undefinedVar; - } catch (error) { - warn(error); - } - - ///////////////////// - // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS - // - - var phantom = window.phantom; - var bot = - nav.webdriver || - window.__nightmare || - window.callPhantom || - window._phantom || - (phantom && !phantom.solana) || - window.__polypane || - window._bot || - isBotAgent || - Math.random() == Math.random(); - - // t = timeonpage, scro = scrolled - var collectDataOnLeave = - collectMetricByString("t") || collectMetricByString("scro"); - - if (bot) basePayload.bot = trueVar; - - var payload = assign(basePayload, { - // us = useragent - ua: collectMetricByString("us") ? userAgent : undefinedVar, - - https: loc.protocol == https, - timezone: timezone, - page_id: collectDataOnLeave ? uuid() : undefinedVar, - - // se = sessions - session_id: collectMetricByString("se") ? uuid() : undefinedVar, - }); - - payload.sri = falseVar; - - // Use User-Agent Client Hints for better privacy - // https://web.dev/user-agent-client-hints/ - if (uaData) { - payload.mobile = uaData.mobile; - payload.brands = stringify(uaData.brands); - } - - ///////////////////// - // ADD WARNINGS - // - - warn("Using latest.dev.js, please change to latest.js on production."); - - // Warn when no document.doctype is defined (this breaks some documentElement dimensions) - if (!doc.doctype) warn("Add DOCTYPE html for accurate dimensions"); - - // When a customer overwrites the hostname, we need to know what the original - // hostname was to hide that domain from referrer traffic - if (definedHostname !== locationHostname) - payload.hostname_original = locationHostname; - - // Don't track when Do Not Track is set to true - if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == "1") - return warn( - notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt" - ); - - // Warn when sending from localhost and not having a hostname set - if ( - (locationHostname.indexOf(".") == -1 || - /^[0-9.:]+$/.test(locationHostname)) && - !overwrittenHostname - ) - warn( - "Set hostname on " + - locationHostname + - ". See " + - docsUrl + - "/overwrite-domain-name" - ); - - ///////////////////// - // SETUP INITIAL VARIABLES - // - - var page = {}; - var lastSendPath; - - var getReferrer = function (raw) { - // Customers can overwrite their referrer, here we check for that - var referrer = - settings.referrer || - attr(scriptElement, "referrer") || - doc.referrer || - ""; - - if (raw) return referrer; - return ( - referrer - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar - ); - }; - - // We don't want to end up with sensitive data so we clean the referrer URL - var referrer = getReferrer(); - - ///////////////////// - // TIME ON PAGE AND SCROLLED LOGIC - // - - // We don't put msHidden in if duration block, because it's used outside of that functionality - var msHidden = 0; - - var sendOnLeave = function (id, push) { - if (!collectDataOnLeave) return; - - var append = assign(basePayload, { - type: "append", - original_id: push ? id : payload.page_id, - }); - - // t = timeonpage - if (collectMetricByString("t")) { - append.duration = Math.round((now() - start - msHidden) / thousand); - } - msHidden = 0; - start = now(); - - // scro = scrolled - if (collectMetricByString("scro")) { - append.scrolled = Math.max(0, scrolled, position()); - } - - if (push || !nav.sendBeacon) { - // sendData will assign payload to request - sendData(append, undefinedVar, trueVar); - } else { - try { - nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append)); - } catch (e) { - // Fallback for browsers throwing "Illegal invocation" when the URL is invalid - sendData(append, undefinedVar, trueVar); - } - } - }; - - var hiddenStart; - addEventListenerFunc( - "visibilitychange", - function () { - if (doc.hidden) { - if (!("on" + pagehide in window)) sendOnLeave(); - hiddenStart = now(); - } else msHidden += now() - hiddenStart; - }, - falseVar - ); - - addEventListenerFunc(pagehide, sendOnLeave, falseVar); - - var body = doc.body || {}; - var position = function () { - try { - var documentClientHeight = documentElement[clientHeight] || 0; - var height = Math.max( - body[scrollHeight] || 0, - body[offsetHeight] || 0, - documentElement[clientHeight] || 0, - documentElement[scrollHeight] || 0, - documentElement[offsetHeight] || 0 - ); - return Math.min( - 100, - Math.round( - (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) / - height / - 5 - ) * 5 - ); - } catch (error) { - warn(error); - return 0; - } - }; - - addEventListenerFunc("load", function () { - scrolled = position(); - addEventListenerFunc( - scroll, - function () { - if (scrolled < position()) scrolled = position(); - }, - falseVar - ); - }); - - ///////////////////// - // ACTUAL PAGE VIEW LOGIC - // - - var getPath = function (overwrite) { - var path = ""; - - // decodeURIComponent can fail when having invalid characters - // https://github.com/simpleanalytics/roadmap/issues/462 - try { - path = overwrite || decodeURIComponentFunc(loc.pathname); - } catch (error) { - warn(error); - } - - var pathOverwriterFunction = window[pathOverwriter]; - if (isFunction(pathOverwriterFunction)) { - try { - path = pathOverwriterFunction.call(window, { path: path }) || path; - } catch (error) { - warnInFunction("path", error); - } - } - - // Ignore pages specified in data-ignore-pages - if (shouldIgnore(path)) { - warn(notSendingWhen + "ignoring " + path); - return; - } - - // Add hash to path when script is put in to hash mode - if (mode == "hash" && loc.hash) path += loc.hash.split("?")[0]; - - return path; - }; - - var previousReferrer; - - // Send page view and append data to it - var sendPageView = function ( - isPushState, - deleteSourceInfo, - sameSite, - search, - metadata, - callback - ) { - if (isPushState) sendOnLeave("" + payload.page_id, trueVar); - if (collectDataOnLeave) payload.page_id = uuid(); - - var currentPage = definedHostname + getPath(); - var query = getQueryParams(deleteSourceInfo, search); - - sendData( - { - id: payload.page_id, - type: pageviewText, - referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: query, - k: k, - - metadata: stringify(metadata), - }, - callback - ); - - previousReferrer = referrer; - referrer = currentPage; - - pages++; - }; - - var sameSite, userNavigated; - - var pageview = function ( - isPushState, - pathOverwrite, - metadata, - callbackRaw - ) { - if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var querySearch = ""; - if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { - // keep query from manual path - var parts = pathOverwrite.split("?"); - pathOverwrite = parts.shift(); - querySearch = "?" + parts.join("?"); - } - // Obfuscate personal data in URL by dropping the search and hash - var path = getPath(pathOverwrite); - - // Don't send the last path again (this could happen when pushState is used to change the path hash or search) - var pathKey = path + querySearch; - if (!path || lastSendPath == pathKey) return; - - lastSendPath = pathKey; - page.path = path; - - // v = viewportsizes - if (collectMetricByString("v")) { - page.viewport_width = - Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) || - null; - page.viewport_height = - Math.max( - documentElement[clientHeight] || 0, - window.innerHeight || 0 - ) || null; - } - - // l = language - if (collectMetricByString("l")) { - if (nav[language]) page[language] = nav[language]; - } - - // scre = screensizes - if (screen && collectMetricByString("scre")) { - page.screen_width = screen.width; - page.screen_height = screen.height; - } - - // If a user does refresh we need to delete the referrer because otherwise it count double - var perf = window.performance; - var navigationText = "navigation"; - - // Check if back, forward or reload buttons are being used in modern browsers - var performaceEntryType; - try { - performaceEntryType = perf.getEntriesByType(navigationText)[0].type; - } catch (error) { - warn(error); - } - - userNavigated = performaceEntryType - ? ["reload", "back_forward"].indexOf(performaceEntryType) > -1 - : // Check if back, forward or reload buttons are being use in older browsers - // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD - perf && - perf[navigationText] && - [1, 2].indexOf(perf[navigationText].type) > -1; - - // Check if referrer is the same as current real hostname (not the defined hostname!) - var currentReferrerHostname = referrer - ? referrer.split(slash)[0] - : undefinedVar; - sameSite = referrer - ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 || - currentReferrerHostname == locationHostname - : falseVar; - - // Only the first pageview can use a Cloudflare referrer as a unique arrival. - page.unique = - isPushState || userNavigated - ? falseVar - : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar))); - - metadata = appendMetadata(metadata, { - type: pageviewText, - path: page.path, - }); - - var triggerSendPageView = function () { - fetchedHighEntropyValues = trueVar; - var delSrc = - isPushState || userNavigated || !collectMetricByString("r"); - sendPageView( - isPushState, - delSrc, // r = referrers - sameSite, - querySearch, - metadata, - callback - ); - }; - - if (!fetchedHighEntropyValues) { - // Request platform information if this is available - try { - if (uaData && isFunction(uaData.getHighEntropyValues)) { - uaData - .getHighEntropyValues([platformText, platformVersionText]) - .then(function (highEntropyValues) { - payload.os_name = highEntropyValues[platformText]; - payload.os_version = highEntropyValues[platformVersionText]; - triggerSendPageView(); - }) - .catch(triggerSendPageView); - } else { - triggerSendPageView(); - } - } catch (e) { - triggerSendPageView(); - } - } else { - triggerSendPageView(); - } - }; - - ///////////////////// - // AUTOMATED PAGE VIEW COLLECTION - // - - var his = window.history; - var hisPushState = his ? his.pushState : undefinedVar; - var dis = window.dispatchEvent; - var pushStateText = "pushState"; - - // Overwrite history pushState function to - // allow listening on the pushState event - if (autoCollect && hisPushState && Event && dis) { - var stateListener = function (type) { - var orig = his[type]; - return function () { - var arg = arguments; - var rv = orig.apply(this, arg); - var event; - if (isFunction(Event)) { - event = new Event(type); - } else { - // Fix for IE - // https://github.com/simpleanalytics/scripts/issues/8 - event = doc.createEvent("Event"); - event.initEvent(type, trueVar, trueVar); - } - event.arguments = arg; - dis(event); - return rv; - }; - }; - - his.pushState = stateListener(pushStateText); - - addEventListenerFunc( - pushStateText, - function () { - pageview(1); - }, - falseVar - ); - - addEventListenerFunc( - "popstate", - function () { - pageview(1); - }, - falseVar - ); - } - - // When in hash mode, we record a pageview based on the onhashchange function - if (autoCollect && mode == "hash" && "onhashchange" in window) { - addEventListenerFunc( - "hashchange", - function () { - pageview(1); - }, - falseVar - ); - } - - if (autoCollect) pageview(); - - var manualPageview = function (path, metadata, callback) { - pageview(0, path, metadata, callback); - }; - window[namespace + "_" + pageviewText] = manualPageview; - var defaultPageview = defaultNamespace + "_" + pageviewText; - if (!window[defaultPageview]) window[defaultPageview] = manualPageview; - - - ///////////////////// - // EVENTS - // - - var validTypes = ["string", "number"]; - - var sendEvent = function (event, metadata, callbackRaw, keepalive) { - if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; - - var eventIsFunction = isFunction(event); - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - var eventType = typeof event; - - if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) { - warnInFunction(eventFunctionName, eventText + " can't be " + eventType); - return callback(); - } - - try { - if (eventIsFunction) { - var eventOutput = event(); - if (validTypes.indexOf(typeof eventOutput) < 0) { - warnInFunction( - eventFunctionName, - event + " returns no string: " + eventOutput - ); - return callback(); - } - event = eventOutput; - } - } catch (error) { - warnInFunction(eventFunctionName, error); - return callback(); - } - - event = ("" + event).replace(/[^a-z0-9]+/gi, "_").replace(/(^_|_$)/g, ""); - - var eventParams = { type: eventText, event: event }; - var firstPage = !userNavigated && pages < 2; - - metadata = appendMetadata(metadata, eventParams); - - if (event) { - sendData( - assign(eventParams, { - id: uuid(), - query: getQueryParams(!firstPage), - referrer: - (firstPage || sameSite) && collectMetricByString("r") - ? previousReferrer - : null, - - metadata: stringify(metadata), - }), - callback, - undefinedVar, - keepalive - ); - } - }; - - var defaultEventFunc = function (event, metadata, callback, keepalive) { - sendEvent(event, metadata, callback, keepalive); - }; - - // Set default function if user didn't define a function - if (!window[eventFunctionName]) - window[eventFunctionName] = defaultEventFunc; - - var eventFunc = window[eventFunctionName]; - - // Read queue of the user defined function - var queue = eventFunc && eventFunc.q ? eventFunc.q : []; - - // Overwrite user defined function - window[eventFunctionName] = defaultEventFunc; - - // Automated events wait for this variable, for example ba_event_loaded - window[eventFunctionName + "_loaded"] = trueVar; - - // Post events from the queue of the user defined function - for (var event in queue) { - if (hasProp(queue, event)) { - Array.isArray(queue[event]) - ? sendEvent.apply(null, queue[event]) - : sendEvent(queue[event]); - } - } - - var inlineEvent = function (event) { - var element = event.target; - while ( - element && - element !== doc && - (!element.getAttribute || attr(element, "simple-event") === null) - ) - element = element.parentNode; - - if (!element || element === doc) return; - var isForm = element.tagName === "FORM"; - var name = attr(element, "simple-event"); - if (!name || isForm !== (event.type === "submit")) return; - - var metadata = { tag: element.tagName.toLowerCase() }; - var attributes = element.attributes; - for (var i = 0; i < attributes.length; i++) { - var attribute = attributes[i]; - if (attribute.name.indexOf("data-simple-event-") === 0) - metadata[attribute.name.slice(18).replace(/-/g, "_")] = - attribute.value; - } - if (isForm) { - var button = event.submitter; - metadata.button_text = button - ? (button.textContent || button.value || "") - .replace(/\s+/g, " ") - .trim() - .slice(0, 200) - : ""; - } - sendEvent(name, metadata, undefinedVar, trueVar); - }; - - doc.addEventListener("click", inlineEvent, falseVar); - doc.addEventListener("submit", inlineEvent, falseVar); - - // 404 confirmation adds a request, so existing installs must opt in. - if ( - settings.detect404 === trueVar || - attr(scriptElement, "detect-404") == trueText - ) { - var detect404 = function () { - if ( - !/\b404\b/.test(doc.title + " " + (doc.body && doc.body.textContent)) - ) - return; - try { - var request = new window.XMLHttpRequest(); - request.open("HEAD", loc.href, trueVar); - request.onload = function () { - if (request.status === 404) - sendEvent("page_404", { - url: loc.protocol + "//" + definedHostname + loc.pathname, - status: 404, - }); - }; - request.send(); - } catch (error) {} - }; - if (doc.readyState === "loading") - doc.addEventListener("DOMContentLoaded", detect404, falseVar); - else detect404(); - } - } catch (e) { - sendError(e); - } -})( - typeof window != "undefined" && window, - "simpleanalyticscdn.com", - "queue.", - "cdn_latest_dev_12", - "sa" -); diff --git a/dist/latest/latest.js b/dist/latest/latest.js deleted file mode 100644 index 5e48fc9f..00000000 --- a/dist/latest/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; 88af; v12) */ - -!function(m,e,n,v){var r,a,t;if(m)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=m.console,u="doNotTrack",b=m.navigator,d=m.location,E=d.host,f=m.document,p=b.userAgent,h="Not sending request ",x=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,q=m.addEventListener,A="https://queue."+e,C=f.documentElement||{},D="language",$="Height",R="scroll",j=b.userAgentData,H=R+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=m.screen,z=f.currentScript||f.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){v("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},dt=et.strictUtm||Y(z,"strict-utm")==i,ft=function(i,t){nt=!i&&at("q")?"":_;var e=(t||d.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/latest/light.js b/dist/latest/light.js deleted file mode 100644 index c4b64988..00000000 --- a/dist/latest/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; b187; v12) */ - -!function(f,e,m){if(f)try{var u=undefined,t="https:",n=f.console,r="doNotTrack",g=f.navigator,p=f.location,h=p.host,a=f.document,i=g.userAgent,o="Not sending request ",v=!1,c=encodeURIComponent,s=decodeURIComponent,d=JSON.stringify,l=f.addEventListener,y="https://queue."+e,_=(a.documentElement,"language"),w=g.userAgentData,b="platform",O="platformVersion",S="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(i)&&!/(cubot)/i.test(i),k=a.currentScript||a.querySelector('script[src*="'+e+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(n.warn,n,e)};var E=function(e){return"string"==typeof e},q=function(e,t){return e&&e.getAttribute("data-"+t)},x=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(e){return"function"==typeof e},N="namespace",R=$[N]||q(k,N)||"sa",U=$.strictUtm||"true"==q(k,"strict-utm"),V=R+"_loaded";if(1==f[V])return m(o+"twice");f.sa_event_loaded=!0,f[V]=!0;var B,C=function(t,e,n,r){t=n?t:x(z,L,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=y+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return c(e)+"="+c(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=$.hostname||q(k,"hostname"),F=T||h,H={version:"cdn_light_12",hostname:F};$.mode||q(k,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){m(W)}j&&(H.bot=!0);var z=x(H,{ua:i,https:p.protocol==t,timezone:B,page_id:D(),session_id:D()});if(z.sri=!1,w&&(z.mobile=w.mobile,z.brands=d(w.brands)),F!==h&&(z.hostname_original=h),r in g&&"1"==g[r])return m("Not sending request when "+r+" is enabled. See "+S+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+S+"/overwrite-domain-name");var J,L={},M=($.referrer||q(k,"referrer")||a.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,P=function(e,t){var n=x(H,{type:"append",original_id:t?e:z.page_id});if(t||!g.sendBeacon)C(n,0,!0);else try{g.sendBeacon.bind(g)(y+"/append",d(n))}catch(r){C(n,0,!0)}};l("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||s(p.pathname)}catch(W){m(W)}return t},Q=function(e,t,n,r,a,i){e&&P(""+z.page_id,!0),z.page_id=D();var o,c=F+K(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=","i").test(e)}).join("&")||u);C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:s}),M=c,0};!function(e,t,n,r){!r&&I(n)&&(r=n);I(r);var a,i="";E(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = falseVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","logSettings","settings","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","keys","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v1/auto-events.js b/dist/v1/auto-events.js deleted file mode 100644 index 0603b4a3..00000000 --- a/dist/v1/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; 428a; SRI-version; v1) */ - -function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n // For minifying the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window.sa_event) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n var event;\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n sa_event(clean, callback);\n\n log(\"collected \" + clean);\n\n return window.setTimeout(callback, 5000);\n } else {\n log(\"sa_event is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var collect = false;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\")) {\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \".(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (collect) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n }\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","onClickAttribute","link","collect","getAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","setAttribute","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","type","console","warn","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","saAutomatedLink","element","sent","callback","sa_event","theTitle","useTitle","event","pop","clean","replace","setTimeout","readyState","addEventListener","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v1/cloudflare.js b/dist/v1/cloudflare.js deleted file mode 100644 index ded68c04..00000000 --- a/dist/v1/cloudflare.js +++ /dev/null @@ -1,648 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-25; f045) */ -/* eslint-env browser */ - -(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) { - if (!window) return; - try { - ///////////////////// - // PREDEFINED VARIABLES FOR BETTER MINIFICATION - // - - // This seems like a lot of repetition, but it makes our script available for - // multple destination which prevents us to need multiple scripts. The minified - // version stays small. - var https = "https:"; - var pageviewsText = "pageview"; - var errorText = "error"; - var protocol = https + "//"; - var con = window.console; - var doNotTrack = "doNotTrack"; - var slash = "/"; - var nav = window.navigator; - var loc = window.location; - var locationHostname = loc.hostname; - var doc = window.document; - var userAgent = nav.userAgent; - var notSending = "Not sending request "; - var encodeURIComponentFunc = encodeURIComponent; - var decodeURIComponentFunc = decodeURIComponent; - var stringify = JSON.stringify; - var thousand = 1000; - var addEventListenerFunc = window.addEventListener; - var fullApiUrl = protocol + apiUrlPrefix + baseUrl; - var undefinedVar = undefined; - var documentElement = doc.documentElement || {}; - var language = "language"; - var Height = "Height"; - var Width = "Width"; - var scroll = "scroll"; - var scrollHeight = scroll + Height; - var offsetHeight = "offset" + Height; - var clientHeight = "client" + Height; - var clientWidth = "client" + Width; - var screen = window.screen; - - ///////////////////// - // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS - // - - var bot = - nav.webdriver || - window.__nightmare || - "callPhantom" in window || - "_phantom" in window || - "phantom" in window || - /(bot|spider|crawl)/i.test(userAgent) || - (window.chrome && - (nav.languages === "" || !(nav.plugins instanceof PluginArray))); - - - var payload = { - version: version, - }; - if (bot) payload.bot = true; - - ///////////////////// - // HELPER FUNCTIONS - // - - // A simple log function so the user knows why a request is not being send - var warn = function (message) { - if (con && con.warn) con.warn("Simple Analytics:", message); - }; - - var now = Date.now; - - var uuid = function () { - var cryptoObject = window.crypto || window.msCrypto; - var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11; - var uuidRegex = /[018]/g; - - try { - return emptyUUID.replace(uuidRegex, function (c) { - return ( - c ^ - (cryptoObject.getRandomValues(new Uint8Array(1))[0] & - (15 >> (c / 4))) - ).toString(16); - }); - } catch (error) { - return emptyUUID.replace(uuidRegex, function (c) { - var r = (Math.random() * 16) | 0, - v = c < 2 ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } - }; - - var assign = function () { - var to = {}; - var arg = arguments; - for (var index = 0; index < arg.length; index++) { - var nextSource = arg[index]; - if (nextSource) { - for (var nextKey in nextSource) { - if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { - to[nextKey] = nextSource[nextKey]; - } - } - } - } - return to; - }; - - var isBoolean = function (value) { - return !!value === value; - }; - - var getParams = function (regex) { - // From the search we grab the utm_source and ref and save only that - var matches = loc.search.match( - new RegExp("[?&](" + regex + ")=([^?&]+)", "gi") - ); - var match = matches - ? matches.map(function (m) { - return m.split("=")[1]; - }) - : []; - if (match && match[0]) return match[0]; - }; - - // Ignore pages specified in data-ignore-pages - var shouldIgnore = function (path) { - for (var i in ignorePages) { - var ignorePageRaw = ignorePages[i]; - if (!ignorePageRaw) continue; - - // Prepend a slash when it's missing - var ignorePage = - ignorePageRaw[0] == "/" ? ignorePageRaw : "/" + ignorePageRaw; - - try { - if ( - ignorePage === path || - new RegExp(ignorePage.replace(/\*/gi, "(.*)"), "gi").test(path) - ) - return true; - } catch (error) { - return false; - } - } - return false; - }; - - ///////////////////// - // SEND DATA VIA OUR PIXEL - // - - // Send data via image - var sendData = function (data, callback) { - data = assign(payload, data); - var image = new Image(); - if (callback) { - image.onerror = callback; - image.onload = callback; - } - image.src = - fullApiUrl + - "/simple.gif?" + - Object.keys(data) - .filter(function (key) { - return data[key] != undefinedVar; - }) - .map(function (key) { - return ( - encodeURIComponentFunc(key) + - "=" + - encodeURIComponentFunc(data[key]) - ); - }) - .join("&"); - }; - - ///////////////////// - // ERROR FUNCTIONS - // - - // Send errors - var sendError = function (errorOrMessage) { - errorOrMessage = errorOrMessage.message || errorOrMessage; - warn(errorOrMessage); - sendData({ - type: errorText, - error: errorOrMessage, - url: definedHostname + loc.pathname, - }); - }; - - // We listen for the error events and only send errors that are - // from our script (checked by filename) to our server. - addEventListenerFunc( - errorText, - function (event) { - if (event.filename && event.filename.indexOf(baseUrl) > -1) { - sendError(event.message); - } - }, - false - ); - - ///////////////////// - // INITIALIZE VALUES - // - - var pushState = "pushState"; - var dis = window.dispatchEvent; - - var duration = "duration"; - var start = now(); - - var scrolled = 0; - - // This code could error on (incomplete) implementations, that's why we use try...catch - var timezone; - try { - timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; - } catch (e) { - /* Do nothing */ - } - - ///////////////////// - // GET SETTINGS - // - - // Find the script element where options can be set on - var scriptElement = doc.querySelector('script[src*="' + baseUrl + '"]'); - var attr = function (scriptElement, attribute) { - return scriptElement && scriptElement.getAttribute("data-" + attribute); - }; - - // Script mode, this can be hash mode for example - var mode = overwriteOptions.mode || attr(scriptElement, "mode"); - - // Should we record Do Not Track visits? - var recordDnt = isBoolean(overwriteOptions.skipDnt) - ? overwriteOptions.skipDnt - : attr(scriptElement, "ignore-dnt") == "true" || - attr(scriptElement, "skip-dnt") == "true"; - - // Customers can overwrite their hostname, here we check for that - var definedHostname = - overwriteOptions.hostname || - attr(scriptElement, "hostname") || - locationHostname; - - // Some customers want to collect page views manually - var autoCollect = !( - attr(scriptElement, "auto-collect") == "false" || - overwriteOptions.autoCollect === false - ); - - // Event function name - var functionName = - overwriteOptions.saGlobal || attr(scriptElement, "sa-global") || saGlobal; - - // Customers can ignore certain pages - var ignorePagesRaw = - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages"); - - // Make sure ignore pages is an array - var ignorePages = Array.isArray(ignorePagesRaw) - ? ignorePagesRaw - : typeof ignorePagesRaw == "string" && ignorePagesRaw.length - ? ignorePagesRaw.split(/, ?/) - : []; - - ///////////////////// - // ADD HOSTNAME TO PAYLOAD - // - - payload.hostname = definedHostname; - - ///////////////////// - // ADD WARNINGS - // - - // Warn when no document.doctype is defined (this breaks some documentElement dimensions) - if (!doc.doctype) warn("Add DOCTYPE html for more accurate dimensions"); - - // When a customer overwrites the hostname, we need to know what the original - // hostname was to hide that domain from referrer traffic - if (definedHostname !== locationHostname) - payload.hostname_original = locationHostname; - - // Don't track when Do Not Track is set to true - if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == "1") - return warn(notSending + "when " + doNotTrack + " is enabled"); - - // Don't track when localhost or when it's an IP address - if ( - locationHostname.indexOf(".") == -1 || - /^[0-9]+$/.test(locationHostname.replace(/\./g, "")) - ) - return warn(notSending + "from " + locationHostname); - - ///////////////////// - // SETUP INITIAL VARIABLES - // - - var page = {}; - var lastPageId = uuid(); - var lastSendPath; - - // We don't want to end up with sensitive data so we clean the referrer URL - var referrer = - (doc.referrer || "") - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar; - - // The prefix utm_ is optional - var utmRegexPrefix = "(utm_)?"; - var source = { - source: getParams(utmRegexPrefix + "source|ref"), - medium: getParams(utmRegexPrefix + "medium"), - campaign: getParams(utmRegexPrefix + "campaign"), - term: getParams(utmRegexPrefix + "term"), - content: getParams(utmRegexPrefix + "content"), - referrer: referrer, - }; - - ///////////////////// - // TIME ON PAGE AND SCROLLED LOGIC - // - - // We don't put msHidden in if duration block, because it's used outside of that functionality - var msHidden = 0; - - var hiddenStart; - window.addEventListener( - "visibilitychange", - function () { - if (doc.hidden) hiddenStart = now(); - else msHidden += now() - hiddenStart; - }, - false - ); - - var sendBeaconText = "sendBeacon"; - - var sendOnLeave = function (id, push) { - var append = { type: "append", original_id: push ? id : lastPageId }; - - append[duration] = Math.round((now() - start + msHidden) / thousand); - msHidden = 0; - start = now(); - - append.scrolled = Math.max(0, scrolled, position()); - - if (push || !(sendBeaconText in nav)) { - sendData(append); - } else { - nav[sendBeaconText]( - fullApiUrl + "/append", - stringify(assign(payload, append)) - ); - } - }; - - addEventListenerFunc("unload", sendOnLeave, false); - - var body = doc.body || {}; - var position = function () { - try { - var documentClientHeight = documentElement[clientHeight] || 0; - var height = Math.max( - body[scrollHeight] || 0, - body[offsetHeight] || 0, - documentElement[clientHeight] || 0, - documentElement[scrollHeight] || 0, - documentElement[offsetHeight] || 0 - ); - return Math.min( - 100, - Math.round( - (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) / - height / - 5 - ) * 5 - ); - } catch (error) { - return 0; - } - }; - - addEventListenerFunc("load", function () { - scrolled = position(); - addEventListenerFunc( - scroll, - function () { - if (scrolled < position()) scrolled = position(); - }, - false - ); - }); - - ///////////////////// - // ACTUAL PAGE VIEW LOGIC - // - - var getPath = function (overwrite) { - var path = overwrite || decodeURIComponentFunc(loc.pathname); - - // Ignore pages specified in data-ignore-pages - if (shouldIgnore(path)) { - warn(notSending + "because " + path + " is ignored"); - return; - } - - // Add hash to path when script is put in to hash mode - if (mode == "hash" && loc.hash) path += loc.hash.split("?")[0]; - - return path; - }; - - // Send page view and append data to it - var sendPageView = function (isPushState, deleteSourceInfo, sameSite) { - if (isPushState) sendOnLeave("" + lastPageId, true); - lastPageId = uuid(); - page.id = lastPageId; - - var currentPage = definedHostname + getPath(); - - sendData( - assign( - page, - deleteSourceInfo - ? { - referrer: sameSite ? referrer : null, - } - : source, - { - https: loc.protocol == https, - timezone: timezone, - type: pageviewsText, - } - ) - ); - - referrer = currentPage; - }; - - var pageview = function (isPushState, pathOverwrite) { - // Obfuscate personal data in URL by dropping the search and hash - var path = getPath(pathOverwrite); - - // Don't send the last path again (this could happen when pushState is used to change the path hash or search) - if (!path || lastSendPath == path) return; - - lastSendPath = path; - - var data = { - path: path, - viewport_width: - Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) || - null, - viewport_height: - Math.max( - documentElement[clientHeight] || 0, - window.innerHeight || 0 - ) || null, - }; - - if (nav[language]) data[language] = nav[language]; - - if (screen) { - data.screen_width = screen.width; - data.screen_height = screen.height; - } - - // If a user does refresh we need to delete the referrer because otherwise it count double - var perf = window.performance; - var navigation = "navigation"; - - // Check if back, forward or reload buttons are being used in modern browsers - var userNavigated = - perf && - perf.getEntriesByType && - perf.getEntriesByType(navigation)[0] && - perf.getEntriesByType(navigation)[0].type - ? ["reload", "back_forward"].indexOf( - perf.getEntriesByType(navigation)[0].type - ) > -1 - : // Check if back, forward or reload buttons are being use in older browsers - // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD - perf && - perf[navigation] && - [1, 2].indexOf(perf[navigation].type) > -1; - - // Check if referrer is the same as current hostname - var sameSite = referrer - ? referrer.split(slash)[0] == definedHostname - : false; - - // We set unique variable based on pushstate or back navigation, if no match we check the referrer - data.unique = isPushState || userNavigated ? false : !sameSite; - - page = data; - - sendPageView(isPushState, isPushState || userNavigated, sameSite); - }; - - ///////////////////// - // AUTOMATED PAGE VIEW COLLECTION - // - - var his = window.history; - var hisPushState = his ? his.pushState : undefinedVar; - - // Overwrite history pushState function to - // allow listening on the pushState event - if (autoCollect && hisPushState && Event && dis) { - var stateListener = function (type) { - var orig = his[type]; - return function () { - var arg = arguments; - var rv = orig.apply(this, arg); - var event; - if (typeof Event == "function") { - event = new Event(type); - } else { - // Fix for IE - event = doc.createEvent("Event"); - event.initEvent(type, true, true); - } - event.arguments = arg; - dis(event); - return rv; - }; - }; - - his.pushState = stateListener(pushState); - - addEventListenerFunc( - pushState, - function () { - pageview(1); - }, - false - ); - - addEventListenerFunc( - "popstate", - function () { - pageview(1); - }, - false - ); - } - - // When in hash mode, we record a pageview based on the onhashchange function - if (autoCollect && mode == "hash" && "onhashchange" in window) { - addEventListenerFunc( - "hashchange", - function () { - pageview(1); - }, - false - ); - } - - if (autoCollect) pageview(); - else - window.sa_pageview = function (path) { - pageview(0, path); - }; - - ///////////////////// - // EVENTS - // - - var sessionId = uuid(); - var validTypes = ["string", "number"]; - - var sendEvent = function (event, callbackRaw) { - var isFunction = event instanceof Function; - var callback = - callbackRaw instanceof Function ? callbackRaw : function () {}; - - if (validTypes.indexOf(typeof event) < 0 && !isFunction) { - warn("event is not a string: " + event); - return callback(); - } - - try { - if (isFunction) { - event = event(); - if (validTypes.indexOf(typeof event) < 0) { - warn("event function output is not a string: " + event); - return callback(); - } - } - } catch (error) { - warn("in your event function: " + error.message); - return callback(); - } - - event = ("" + event).replace(/[^a-z0-9]+/gi, "_").replace(/(^_|_$)/g, ""); - - if (event) - sendData( - assign(source, bot ? { bot: true } : {}, { - type: "event", - event: event, - page_id: page.id, - session_id: sessionId, - }), - callback - ); - }; - - var defaultEventFunc = function (event, callback) { - sendEvent(event, callback); - }; - - // Set default function if user didn't define a function - if (!window[functionName]) window[functionName] = defaultEventFunc; - - var eventFunc = window[functionName]; - - // Read queue of the user defined function - var queue = eventFunc && eventFunc.q ? eventFunc.q : []; - - // Overwrite user defined function - window[functionName] = defaultEventFunc; - - // Post events from the queue of the user defined function - for (var event in queue) sendEvent(queue[event]); - } catch (e) { - sendError(e); - } -})( - window, - {"saGlobal":INSTALL_OPTIONS.saGlobal,"mode":INSTALL_OPTIONS.mode,"skipDnt":INSTALL_OPTIONS.recordDnt}, - INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com", - "", - 1, - "sa_event" -); diff --git a/dist/v1/embed.js b/dist/v1/embed.js deleted file mode 100644 index f91b0651..00000000 --- a/dist/v1/embed.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-25; d2e8) */ - -var o;o=document,NodeList.prototype.forEach=Array.prototype.forEach,o.addEventListener("DOMContentLoaded",function(){var n=1;o.querySelectorAll("[data-sa-graph-url]").forEach(function(e){var t=e.getAttribute("data-sa-graph-url"),a=-1 -1 ? \"&\" : \"?\";\n var iframe = document.createElement(\"iframe\");\n iframe.setAttribute(\n \"src\",\n url + append + \"embed=true&graph_id=\" + counter\n );\n iframe.setAttribute(\"id\", \"sa-graph-\" + counter);\n iframe.setAttribute(\"scrolling\", \"no\");\n iframe.style.width = \"100%\";\n iframe.style.border = \"none\";\n graph.innerHTML = iframe.outerHTML;\n counter = counter + 1;\n });\n\n window.onresize = function () {\n document\n .querySelectorAll(\"[data-sa-graph-url] iframe\")\n .forEach(function (iframe) {\n iframe.contentWindow.postMessage(\"true\", \"*\");\n });\n };\n\n window.addEventListener(\"message\", function (event) {\n if (typeof event.data !== \"object\") {\n return;\n } else if (event.data.type === \"resize\") {\n document.getElementById(\"sa-graph-\" + event.data.id).height =\n event.data.height + \"px\";\n } else if (event.data.type === \"pageviews\") {\n var graph = document.getElementById(\"sa-graph-\" + event.data.id);\n var selector = graph.parentNode.getAttribute(\n \"data-sa-page-views-selector\"\n );\n if (selector)\n document\n .querySelectorAll(selector)\n .forEach(function (pageViewsElement) {\n pageViewsElement.textContent = event.data.pageviews;\n });\n }\n });\n });\n})(document);\n"],"names":["document","NodeList","prototype","forEach","Array","addEventListener","counter","querySelectorAll","graph","url","getAttribute","append","indexOf","iframe","createElement","setAttribute","style","width","border","innerHTML","outerHTML","window","onresize","contentWindow","postMessage","event","selector","data","type","getElementById","id","height","parentNode","pageViewsElement","textContent","pageviews"],"mappings":";;AAAA,IAAWA,EAAAA,EAiDRA,SAhDDC,SAASC,UAAUC,QAAUC,MAAMF,UAAUC,QAE7CH,EAASK,iBAAiB,mBAAoB,WAC5C,IAAIC,EAAU,EACdN,EAASO,iBAAiB,uBAAuBJ,QAAQ,SAAUK,GACjE,IAAIC,EAAMD,EAAME,aAAa,qBACzBC,GAA6B,EAApBF,EAAIG,QAAQ,KAAY,IAAM,IACvCC,EAASb,EAASc,cAAc,UACpCD,EAAOE,aACL,MACAN,EAAME,EAAS,uBAAyBL,GAE1CO,EAAOE,aAAa,KAAM,YAAcT,GACxCO,EAAOE,aAAa,YAAa,MACjCF,EAAOG,MAAMC,MAAQ,OACrBJ,EAAOG,MAAME,OAAS,OACtBV,EAAMW,UAAYN,EAAOO,UACzBd,GAAoB,IAGtBe,OAAOC,SAAW,WAChBtB,EACGO,iBAAiB,8BACjBJ,QAAQ,SAAUU,GACjBA,EAAOU,cAAcC,YAAY,OAAQ,QAI/CH,OAAOhB,iBAAiB,UAAW,SAAUoB,GAC3C,IAOMC,EAPoB,iBAAfD,EAAME,OAEc,WAApBF,EAAME,KAAKC,KACpB5B,EAAS6B,eAAe,YAAcJ,EAAME,KAAKG,IAAIC,OACnDN,EAAME,KAAKI,OAAS,KACO,cAApBN,EAAME,KAAKC,OAEhBF,EADQ1B,EAAS6B,eAAe,YAAcJ,EAAME,KAAKG,IACxCE,WAAWtB,aAC9B,iCAGAV,EACGO,iBAAiBmB,GACjBvB,QAAQ,SAAU8B,GACjBA,EAAiBC,YAAcT,EAAME,KAAKQ"} \ No newline at end of file diff --git a/dist/v10/app.js b/dist/v10/app.js deleted file mode 100644 index 87f07983..00000000 --- a/dist/v10/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 73b3; SRI-version; v10) */ - -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,q=f.addEventListener,A="https://queue."+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,R="offset"+D,H="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Ot];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(qt,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=A+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"cdn_latest_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},q(o,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = doc.referrer.split(slash)[2];\n var sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_10\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v10/auto-events.js b/dist/v10/auto-events.js deleted file mode 100644 index cde4e9b3..00000000 --- a/dist/v10/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; d8f9; SRI-version; v10) */ - -function n(t,e){var o,a=!1;b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp(".("+(b.downloadsExtensions||[]).join("|")+")","i").test(t.pathname)?a="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==c.location.hostname?a="outbound":b.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(o="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.on("click",function(){saAutomatedLink(a)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n var event;\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, callback);\n\n log(\"collected \" + clean);\n\n return window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \".(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.on(\"click\", function () {\n saAutomatedLink(collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n\n // Skip links that don't have an href\n if (!link.getAttribute(\"href\")) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\")) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","on","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","useTitle","event","pop","clean","replace","setTimeout","readyState","addEventListener","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v10/custom/app.js b/dist/v10/custom/app.js deleted file mode 100644 index b7713881..00000000 --- a/dist/v10/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; e9e8; SRI-version; v10) */ - -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,A=f.addEventListener,q="https://"+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,H="offset"+D,R="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Ot];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(At,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=q+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"custom_app_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},A(o,function(t){t.filename&&-1"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v10/custom/app.js.map b/dist/v10/custom/app.js.map deleted file mode 100644 index 659f2eaf..00000000 --- a/dist/v10/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics: \");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = doc.referrer.split(slash)[2];\n var sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_10\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v10/custom/auto-events.js b/dist/v10/custom/auto-events.js deleted file mode 100644 index cde4e9b3..00000000 --- a/dist/v10/custom/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; d8f9; SRI-version; v10) */ - -function n(t,e){var o,a=!1;b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp(".("+(b.downloadsExtensions||[]).join("|")+")","i").test(t.pathname)?a="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==c.location.hostname?a="outbound":b.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(o="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.on("click",function(){saAutomatedLink(a)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n var event;\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, callback);\n\n log(\"collected \" + clean);\n\n return window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \".(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.on(\"click\", function () {\n saAutomatedLink(collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n\n // Skip links that don't have an href\n if (!link.getAttribute(\"href\")) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\")) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","on","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","useTitle","event","pop","clean","replace","setTimeout","readyState","addEventListener","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v10/custom/light.js b/dist/v10/custom/light.js deleted file mode 100644 index ad54276e..00000000 --- a/dist/v10/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 6133; SRI-version; v10) */ - -!function(u,e,t,l){try{var i=undefined,n="https:",r=u.console,a="doNotTrack",d=u.navigator,c=u.location,m=c.host,f=u.document,o=d.userAgent,s="Not sending request ",g=!1,p=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=u.addEventListener,_="https://"+t,w=(f.documentElement,"language"),b=d.userAgentData,O="platform",S="platformVersion",E="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=f.currentScript||f.querySelector('script[src*="'+t+'"]');l=function(){var e=[].slice.call(arguments);e.unshift("Simple Analytics: "),Function.prototype.bind.call(r.warn,r).apply(r,e)};var A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},D="namespace",I=e[D]||A(x,D)||"sa",N=e.strictUtm||"true"==A(x,"strict-utm"),R=I+"_loaded";if(1==u[R])return l(s+"twice");u.sa_event_loaded=!0,u[R]=!0;var U,V=function(t,e,n){t=n?t:$(H,F,t),d.brave&&!n&&(t.brave=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return p(e)+"="+p(t[e])}).join("&")+"&time="+Date.now()},k=e.hostname||A(x,"hostname"),B=k||m,C={version:"custom_light_10",hostname:B};e.mode||A(x,"mode");try{U=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(P){l(P)}j&&(C.bot=!0);var H=$(C,{ua:o,https:c.protocol==n,timezone:U,page_id:q(),session_id:q()});if(H.sri=!0,b&&(H.mobile=b.mobile,H.brands=v(b.brands)),B!==m&&(H.hostname_original=m),a in d&&"1"==d[a])return l("Not sending request when "+a+" is enabled. See "+E+"/dnt");-1!=m.indexOf(".")&&!/^[0-9.:]+$/.test(m)||k||l("Set hostname on "+m+". See "+E+"/overwrite-domain-name");var T,F={},z=(f.referrer||"").replace(m,B).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,J=function(e,t){var n=$(C,{type:"append",original_id:t?e:H.page_id});t||!d.sendBeacon?V(n,0,!0):d.sendBeacon(_+"/append",v(n))};y("pagehide",J,!1);var L=function(e){var t="";try{t=e||h(c.pathname)}catch(P){l(P)}return t},M=function(e,t,n,r){e&&J(""+H.page_id,!0),H.page_id=q();var a,o=B+L();V({id:H.page_id,type:"pageview",referrer:!t||n?z:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(N?"":"?")+"(source|medium|content|term|campaign)"+(N?"":"|ref")+")=").test(e)}).join("&")||i)}),z=o};!function(e,t){var n=L(t);if(n&&T!=n){T=n,F.path=n,d[w]&&(F[w]=d[w]);var r,a=u.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(P){l(P)}var i=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),c=!!z&&f.referrer.split("/")[2]==m,s=function(){g=!0,M(e,e||i||!1,c)};if(g)s();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){H.os_name=e[O],H.os_version=e[S],s()})["catch"](s):s()}catch(p){s()}}}()}catch(Z){l(Z)}}(window,{},""); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v10/custom/light.js.map b/dist/v10/custom/light.js.map deleted file mode 100644 index 9cb31bb3..00000000 --- a/dist/v10/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics: \");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_10\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","Image","src","keys","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","sameSite","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":";;CAEA,SACEA,EACAC,EACAC,EAKAC,GAEA,IAQE,IAAIC,EAAeC,UAIfC,EAAQ,SAKRC,EAAMP,EAAOQ,QACbC,EAAa,aACbC,EAAMV,EAAOW,UACbC,EAAMZ,EAAOa,SACbC,EAAmBF,EAAIG,KACvBC,EAAMhB,EAAOiB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBAEbC,GAhBW,EAiBXC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB3B,EAAO4B,iBAC9BC,EAhBWvB,WAgB4BJ,EAEvC4B,GADkBd,EAAIe,gBACX,YAIXC,EAAStB,EAAIuB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EAAU,mCACVC,EACF,sBAAsBC,KAAKpB,KAAe,WAAWoB,KAAKpB,GAGxDqB,EACFvB,EAAIwB,eAAiBxB,EAAIyB,cAAc,gBAAkBvC,EAAU,MAOrEC,EAAO,WAEL,IAAIuC,EAAO,GAAGC,MAAMC,KAAKC,WAGzBH,EAAKI,QAAQ,sBAIHC,SAASC,UAAUC,KAAKL,KAAKrC,EAAIJ,KAAMI,GAC7C2C,MAAM3C,EAAKmC,IAGjB,IAgBIS,EAAO,SAAUZ,EAAea,GAClC,OAAOb,GAAiBA,EAAcc,aAAa,QAAUD,IAe3DE,EAAS,WAGX,IAFA,IA7BsBC,EAAKC,EAwBJC,EAKnBC,EAAK,GACLC,EAAMd,UACDe,EAAQ,EAAGA,EAAQD,EAAIE,OAAQD,IAAS,CAC/C,IAAIE,EAAaH,EAAIC,GACrB,IATqBH,EASRK,IAREL,EAAOM,cAAgBC,OASpC,IAAK,IAAIC,KAAWH,EAlCFP,EAmCJO,EAnCSN,EAmCGS,EAlCvBD,OAAOhB,UAAUkB,eAAetB,KAAKW,EAAKC,KAmCzCE,EAAGO,GAAWH,EAAWG,IAKjC,OAAOP,GAITzD,EAAmBqD,EAAOrD,EAAkBD,EAAOmE,aAOzCC,KAAKC,IAJf,IAMIC,EAAO,WACT,IAAIC,EAAevE,EAAOwE,QAAUxE,EAAOyE,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,QAUpBK,EAAgB,YAChBC,EACFrF,EAAiBoF,IACjBlC,EAAKZ,EAAe8C,IA6WxB,KAnWME,EACFtF,EAAiBsF,WAhKJ,QAiKbpC,EAAKZ,EAAe,cAiClBiD,EAAiBF,EAAY,UACjC,GArMc,GAqMVtF,EAAOwF,GAA4B,OAAOrF,EAAKgB,EAAa,SAChEnB,EAAOyF,iBAtMO,EAuMdzF,EAAOwF,IAvMO,EA8Md,IA2DIE,EA3DAC,EAAW,SAAUC,EAAMC,EAAUC,GACvCF,EAAOE,EAAeF,EAAOtC,EAAOyC,EAASC,EAAMJ,GAE/ClF,EAAIuF,QAAUH,IAAcF,EAAKK,OAjNzB,IAoNA,IAAIC,OACVC,IACJtE,EACA,eACAmC,OAAOoC,KAAKR,GACTS,OAAO,SAAUC,GAChB,OAAOV,EAAKU,IAAQlG,IAErBmG,IAAI,SAAUD,GACb,OACEjF,EAAuBiF,GACvB,IACAjF,EAAuBuE,EAAKU,MAG/BE,KAAK,KACR,SACApC,KAAKC,OAILoC,EACFxG,EAAiByG,UAAYvD,EAAKZ,EAAe,YAC/CoE,EAAkBF,GAAuB3F,EAEzC8F,EAAc,CAChBC,QAqRJ,kBApRIH,SAAUC,GAeD1G,EAAiB6G,MAAQ3D,EAAKZ,EAAe,QAYxD,IAEEmD,EACIqB,KAAKC,iBAAiBC,kBAAkBC,SAE5C,MAAOjC,GACP9E,EAAK8E,GAOG5C,IAMDuE,EAAYO,KA7RP,GA+Rd,IAAIpB,EAAUzC,EAAOsD,EAAa,CAEhCQ,GAAkClG,EAElCZ,MAAOM,EAAIyG,UAAY/G,EACvBoF,SAAUA,EACV4B,QAA8BhD,IAG9BiD,WAA0CjD,MAwB5C,GArBAyB,EAAQyB,KA3SM,EA+SVxF,IACF+D,EAAQ0B,OAASzF,EAAOyF,OACxB1B,EAAQ2B,OAASjG,EAAUO,EAAO0F,SAWhCf,IAAoB7F,IACtBiF,EAAQ4B,kBAAoB7G,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAON,EAjTYgB,4BAkTAV,EAAa,oBAAsB2B,EAAU,SAK7B,GAAlCtB,EAAiB8G,QAAQ,OACxB,aAAatF,KAAKxB,IACnB2F,GAEDtG,EACE,mBACEW,EACA,SACAsB,EACA,0BAON,IACIyF,EADA7B,EAAO,GAIP8B,GACD9G,EAAI8G,UAAY,IACdlD,QAAQ9D,EAAkB6F,GAC1B/B,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASxE,EAS/B2H,EAAc,SAAUC,EAAIC,GAG9B,IAAIC,EAAS5E,EAAOsD,EAAa,CAC/BuB,KAAM,SACNC,YAAaH,EAAOD,EAAKjC,EAAQuB,UAK/BW,IAASvH,EAAI2H,WAEf1C,EAASuC,EAAQ9H,GApXP,GAsXVM,EAAI2H,WAAWxG,EAAa,UAAWJ,EAAUyG,KAKrDvG,EAzVe,WAyVgBoG,GA1XhB,GAiYf,IAAIO,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAahH,EAAuBX,EAAI6H,UAC/C,MAAOxD,GACP9E,EAAK8E,GAMP,OAAOuD,GAILE,EAAe,SACjBC,EACAC,EACAC,EACAC,GAEIH,GAAaZ,EAAY,GAAKhC,EAAQuB,SA1Z9B,GA2ZYvB,EAAQuB,QAAUhD,IAE1C,IAxP6ByE,EAwPzBC,EAAcrC,EAAkB2B,IAEpC3C,EAAS,CACPqC,GAAIjC,EAAQuB,QACZa,KA7Ze,WA8ZfL,UAAWc,GAAoBC,EAAWf,EAAW,KACrDmB,OA9P2BF,EA8PLH,EA5PtBhI,EAAIsI,OACDvG,MAAM,GACNwG,MAAM,KACN9C,OAAO,SAAU+C,GAGhB,OAFaL,GAYN,IAAIM,OART,YACC9D,EAAY,GAAK,KAClB,yCACCA,EAAY,GAAK,QAClB,MAIuBjD,KAAK8G,KAE/B5C,KAAK,MAAQpG,KA8OlB0H,EAAWkB,IAGE,SAAUL,EAAaW,GAEpC,IAAId,EAAOF,EAAQgB,GAGnB,GAAKd,GAAQX,GAAgBW,EAA7B,CAEAX,EAAeW,EACfxC,EAAKwC,KAAOA,EAKN9H,EAAIoB,KAAWkE,EAAKlE,GAAYpB,EAAIoB,IAK1C,IAIIyH,EAJAC,EAAOxJ,EAAOyJ,YACdC,EAAiB,aAIrB,IACEH,EAAsBC,EAAKG,iBAAiBD,GAAgB,GAAGvB,KAC/D,MAAOlD,GACP9E,EAAK8E,GAGP,IAAI2E,EAAgBL,GAC2C,EAA3D,CAAC,SAAU,gBAAgB3B,QAAQ2B,GAGnCC,GACAA,EAAKE,KACwC,EAA7C,CAAC,EAAG,GAAG9B,QAAQ4B,EAAKE,GAAgBvB,MAGpCU,IAAWf,GACX9G,EAAI8G,SAASqB,MA3cP,KA2coB,IAAMrI,EAKhC+I,EAAsB,WACxBzI,GAvdU,EAwdVsH,EACEC,EACAA,GAAeiB,IAAiB,EAChCf,IAKJ,GAAKzH,EAmBHyI,SAjBA,IACM7H,GAnVc,mBAmVOA,EAAO8H,qBAC9B9H,EACG8H,qBAAqB,CAAC5H,EAAcC,IACpC4H,KAAK,SAAUC,GACdjE,EAAQkE,QAAUD,EAAkB9H,GACpC6D,EAAQmE,WAAaF,EAAkB7H,GACvC0H,MAEDM,SAAMN,GAETA,IAEF,MAAOO,GACPP,MASNQ,GAEA,MAAOD,GACPjK,EAAKiK,IA/gBT,CAkhBEpK,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v10/custom/proxy.js b/dist/v10/custom/proxy.js deleted file mode 100644 index 232e43f1..00000000 --- a/dist/v10/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 2d40; SRI-version; v10) */ - -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",x=m,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,A=f.addEventListener,q="https://"+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,H="offset"+D,P="client"+D,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Et];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(At,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=q+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"custom_proxy_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},A(o,function(t){t.filename&&-1"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v10/custom/proxy.js.map b/dist/v10/custom/proxy.js.map deleted file mode 100644 index 1e0c5b9e..00000000 --- a/dist/v10/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics: \");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = doc.referrer.split(slash)[2];\n var sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_10\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v10/light.js b/dist/v10/light.js deleted file mode 100644 index 8c01605c..00000000 --- a/dist/v10/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 5a98; SRI-version; v10) */ - -!function(u,e,t,l){try{var i=undefined,n="https:",r=u.console,a="doNotTrack",d=u.navigator,c=u.location,m=c.host,f=u.document,o=d.userAgent,s="Not sending request ",g=!1,p=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=u.addEventListener,_="https://queue."+t,w=(f.documentElement,"language"),b=d.userAgentData,O="platform",S="platformVersion",E="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),q=f.currentScript||f.querySelector('script[src*="'+t+'"]');l=function(){var e=[].slice.call(arguments);e.unshift("Simple Analytics: "),Function.prototype.bind.call(r.warn,r).apply(r,e)};var A=function(e,t){return e&&e.getAttribute("data-"+t)},$=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},D="namespace",I=e[D]||A(q,D)||"sa",N=e.strictUtm||"true"==A(q,"strict-utm"),R=I+"_loaded";if(1==u[R])return l(s+"twice");u.sa_event_loaded=!0,u[R]=!0;var U,V=function(t,e,n){t=n?t:$(T,H,t),d.brave&&!n&&(t.brave=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return p(e)+"="+p(t[e])}).join("&")+"&time="+Date.now()},k=e.hostname||A(q,"hostname"),B=k||m,C={version:"cdn_light_10",hostname:B};e.mode||A(q,"mode");try{U=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(P){l(P)}j&&(C.bot=!0);var T=$(C,{ua:o,https:c.protocol==n,timezone:U,page_id:x(),session_id:x()});if(T.sri=!0,b&&(T.mobile=b.mobile,T.brands=v(b.brands)),B!==m&&(T.hostname_original=m),a in d&&"1"==d[a])return l("Not sending request when "+a+" is enabled. See "+E+"/dnt");-1!=m.indexOf(".")&&!/^[0-9.:]+$/.test(m)||k||l("Set hostname on "+m+". See "+E+"/overwrite-domain-name");var F,H={},z=(f.referrer||"").replace(m,B).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,J=function(e,t){var n=$(C,{type:"append",original_id:t?e:T.page_id});t||!d.sendBeacon?V(n,0,!0):d.sendBeacon(_+"/append",v(n))};y("pagehide",J,!1);var L=function(e){var t="";try{t=e||h(c.pathname)}catch(P){l(P)}return t},M=function(e,t,n,r){e&&J(""+T.page_id,!0),T.page_id=x();var a,o=B+L();V({id:T.page_id,type:"pageview",referrer:!t||n?z:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(N?"":"?")+"(source|medium|content|term|campaign)"+(N?"":"|ref")+")=").test(e)}).join("&")||i)}),z=o};!function(e,t){var n=L(t);if(n&&F!=n){F=n,H.path=n,d[w]&&(H[w]=d[w]);var r,a=u.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(P){l(P)}var i=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),c=!!z&&f.referrer.split("/")[2]==m,s=function(){g=!0,M(e,e||i||!1,c)};if(g)s();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){T.os_name=e[O],T.os_version=e[S],s()})["catch"](s):s()}catch(p){s()}}}()}catch(Z){l(Z)}}(window,{},"simpleanalyticscdn.com"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v10/light.js.map b/dist/v10/light.js.map deleted file mode 100644 index 321e8d4f..00000000 --- a/dist/v10/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics: \");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, window.sa_settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_10\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","Image","src","keys","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","sameSite","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v10/v10.js b/dist/v10/v10.js deleted file mode 100644 index 9ee4fe2c..00000000 --- a/dist/v10/v10.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-09-05; 73b3; SRI-version; v10) */ - -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,q=f.addEventListener,A="https://queue."+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,R="offset"+D,H="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=function(t){return t&&t.constructor===Object},Y=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},tt=function(t){return"function"==typeof t},et="namespace",nt=t[et]||G(N,et)||"sa",rt=f[nt+"_metadata"],at=function(t,e){L(rt)&&(t=Y(t,rt));var n=f[Ot];if(!tt(n))return t;try{return Y(t,n.call(f,Y(t,e)))}catch(r){z("metadata",r)}},it=t.strictUtm||G(N,"strict-utm")==r,ot=function(a){return l.search.slice(1).split("&").filter(function(t){var e=a||!K("ut"),n=wt.map(W).join("|"),r=e?"^("+n+")=":"^((utm_)"+(it?"":"?")+"(source|medium|content|term|campaign)"+(it?"":"|ref")+"|"+n+")=";return e&&!wt.length?m:new RegExp(r).test(t)}).join("&")||i},ct=nt+"_loaded";if(f[ct]==d)return h(w+"twice");f.sa_event_loaded=d,f[ct]=d;var st=function(e,t,n){e=n?e:Y(qt,$t,e),v.brave&&!n&&(e.brave=d);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=A+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=i}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ut=t.hostname||G(N,"hostname"),lt=ut||y,pt={version:"cdn_latest_10",hostname:lt};n=function(t){t=t.stack?t+" "+t.stack:t,h(t),st(Y(pt,{type:o,error:t,path:l.pathname}),i,d)},q(o,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = doc.referrer.split(slash)[2];\n var sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_10\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","ignoreMetrics","sa_settings","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/app.js b/dist/v11/app.js deleted file mode 100644 index cb2d6747..00000000 --- a/dist/v11/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; f809; SRI-version; v11) */ - -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://queue."+e,q=y.documentElement||{},A="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,R="offset"+$,H="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(At,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"cdn_latest_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/auto-events.js b/dist/v11/auto-events.js deleted file mode 100644 index 451495d7..00000000 --- a/dist/v11/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 5dd7; SRI-version; v11) */ - -function r(t,e){var a,o=!1;p.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(p.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":p.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":p.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(){saAutomatedLink(this,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/app.js b/dist/v11/custom/app.js deleted file mode 100644 index bbb0adbf..00000000 --- a/dist/v11/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 23d3; SRI-version; v11) */ - -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",E=d,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,R="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Ot.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Ot.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return O(t)+"="+O(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_app_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v11/custom/app.js.map b/dist/v11/custom/app.js.map deleted file mode 100644 index b1e9ee83..00000000 --- a/dist/v11/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/auto-events.js b/dist/v11/custom/auto-events.js deleted file mode 100644 index 451495d7..00000000 --- a/dist/v11/custom/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; 5dd7; SRI-version; v11) */ - -function r(t,e){var a,o=!1;p.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(p.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?o="download":p.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?o="outbound":p.emails&&/^mailto:/i.test(t.href)&&(o="email"),o&&(e?(a="saAutomatedLink(this, '"+o+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(a+=" return false;"),t.setAttribute("onclick",a)):t.addEventListener("click",function(){saAutomatedLink(this,o)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (\n !sent &&\n (!element.hasAttribute(\"target\") ||\n element.getAttribute(\"target\") === \"_self\")\n )\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, callback);\n\n log(\"collected \" + clean);\n\n return type === \"email\"\n ? callback()\n : window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\") && !/^mailto:/.test(href)) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","addEventListener","saAutomatedLink","this","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","metadata","undefined","url","useTitle","event","pop","email","clean","replace","setTimeout","readyState","target"],"mappings":";;AAwJE,SAASA,EAAYC,EAAMC,GACzB,IA6BMC,EA7BFC,GAAU,EAIZC,EAAYC,WACZ,gBAAgBC,KAAKN,EAAKO,OAC1B,IAAIC,OACF,QAAUJ,EAAYK,qBAAuB,IAAIC,KAAK,KAAO,KAC7D,KACAJ,KAAKN,EAAKW,UAEZR,EAAU,WAIVC,EAAYQ,UACZ,gBAAgBN,KAAKN,EAAKO,OAC1BP,EAAKa,WAAaC,EAAOC,SAASF,SAElCV,EAAU,WAGDC,EAAYY,QAAU,YAAYV,KAAKN,EAAKO,QACrDJ,EAAU,SAGPA,IAEDF,GACEC,EAAmB,0BAA4BC,EAAU,MAG1DH,EAAKiB,aAAa,WACa,UAAhCjB,EAAKkB,aAAa,YAElBhB,GAAoB,kBAEtBF,EAAKmB,aAAa,UAAWjB,IAE7BF,EAAKoB,iBAAiB,QAAS,WAC7BC,gBAAgBC,KAAMnB,MAK5B,SAASoB,IACP,IAIE,IAHA,IAAIC,EAAIC,SAASC,qBAAqB,KAG7BC,EAAI,EAAGA,EAAIH,EAAEI,OAAQD,IAAK,CACjC,IAAI3B,EAAOwB,EAAEG,GACTpB,EAAOP,EAAKkB,aAAa,QAGxBX,IAGAP,EAAKkB,aAAa,YAAe,WAAWZ,KAAKC,GAGpDR,EAAYC,GAAM,GAFlBD,EAAYC,GAAM,KAKtB,MAAO6B,GACPC,EAAID,EAAME,QAAS,SA1NzB,IAA4BjB,EAItBgB,EAKAE,EAEAC,EAGAC,EAqBAC,EAKAC,EAEAC,EAyBAC,EAGAlC,OApEkB,KAFIU,EAqOzBA,UAjOGgB,EAAM,SAAUC,EAASQ,GAC3B,IAAIC,EAAkB,SAATD,EAAkBE,QAAQC,KAAOD,QAAQE,KACtD,OAAOH,GAAUA,EAAO,gCAAiCT,IAGvDC,EAAMlB,EAAOW,SAEbQ,EACFD,EAAIY,eAAiBZ,EAAIa,cAAc,iCAuBrCV,GArBAD,EAAU,SAAUY,EAAWP,EAAMQ,GACvC,IAAIC,EAAQf,GAAiBA,EAAcgB,QAAQH,GAGnD,MAAa,SAATP,GAA8B,SAAVS,GAA8B,UAAVA,EAE1B,SAATT,EAAwBQ,EAGpB,UAATR,GAAoBS,EACfA,EACJE,MAAM,KACNC,IAAI,SAAUC,GACb,OAAOA,EAAKC,SAEbC,OAAOC,SACM,UAAThB,GAEFS,GAF2BD,EAXf,SAAVC,IAgBgB,UAAW,QAAS,CAC7C,WACA,SACA,cAEEZ,EAAWF,EAAQ,WAAY,QAAQ,GAEvCG,EAAU,CAEZzB,UAA8C,EAApCuB,EAAaqB,QAAQ,YAC/BxC,QAA0C,EAAlCmB,EAAaqB,QAAQ,UAC7BnD,WAAgD,EAArC8B,EAAaqB,QAAQ,aAEhC/C,oBAAqByB,EAAQ,aAAc,QAAS,CAClD,MACA,MACA,OACA,OACA,MACA,MACA,QAKFuB,MAAOvB,EAAQ,WAAY,QAAQ,GAEnCwB,gBAAiBtB,EAEjBuB,iBAAkBvB,GAGhBE,EAAWJ,EAAQ,WAAY,SAAU,iBAKlB,KAFvB9B,EAAciC,IAGhBP,EAAI,2CAA4C,QAElDhB,EAAOO,gBAAkB,SAAyBuC,EAASrB,GACzD,IACE,IAAKqB,EAAS,OAAO9B,EAAI,oBACzB,IAAI+B,GAAO,EAEPC,EAAW,WAEVD,GACCD,EAAQ3C,aAAa,WACc,UAAnC2C,EAAQ1C,aAAa,YAEvBO,SAASV,SAAW6C,EAAQ1C,aAAa,SAC3C2C,GAAO,GAGT,GAAI/C,EAAOwB,IAAaxB,EAAOwB,EAAW,WAAY,CACpD,IAWMyB,EAXFlD,EAAW+C,EAAQ/C,SACnBF,EAAWiD,EAAQjD,SAGnBqD,EAAW,CACbP,MAAOG,EAAQ1C,aAAa,UAAY+C,WAEtCC,EAAMN,EAAQrD,MAAQ0D,UAEtBE,GAAW,EAMf,GALI/D,EAAYqD,OAASG,EAAQ3C,aAAa,WAE5B,KADZ8C,EAAWH,EAAQ1C,aAAa,SAASmC,UACzBc,GAAW,IAG7BA,EACFC,EAAQL,OAER,OAAQxB,GACN,IAAK,WACH6B,EAAQvD,GAAYT,EAAYsD,gBAAkB/C,EAAW,IAC7DqD,EAASE,IAAMA,EACf,MAEF,IAAK,WACHE,EAAQhE,EAAYuD,iBAChB9C,EAAWF,EACXA,EAASuC,MAAM,KAAKmB,MACxBL,EAASE,IAAMA,EACf,MAEF,IAAK,QACH,IACAE,GADWR,EAAQ1C,aAAa,QAClBgC,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GAC9Cc,EAASM,MAAQF,EAMvB,IAAIG,EACFhC,EACA,IACA6B,EAAMI,QAAQ,eAAgB,KAAKA,QAAQ,aAAc,IAM3D,OAJA1D,EAAOwB,GAAUiC,EAAOP,EAAUF,GAElChC,EAAI,aAAeyC,GAEH,UAAThC,EACHuB,IACAhD,EAAO2D,WAAWX,EAAU,KAGhC,OADAhC,EAAIQ,EAAW,kBAAmB,QAC3BwB,IAET,MAAOjC,GACPC,EAAID,EAAME,QAAS,UA0EA,UAAnBC,EAAI0C,YAA6C,aAAnB1C,EAAI0C,WACpCnD,IAEAE,SAASL,iBAAiB,mBAAoB,SAAUgD,GACtB,aAA5BA,EAAMO,OAAOD,YAA2BnD"} \ No newline at end of file diff --git a/dist/v11/custom/light.js b/dist/v11/custom/light.js deleted file mode 100644 index 7ac8d22e..00000000 --- a/dist/v11/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; ab84; SRI-version; v11) */ - -!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://"+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var x=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||x(E,I)||"sa",R=e.strictUtm||"true"==x(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(F,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||x(E,"hostname"),H=C||d,T={version:"custom_light_11",hostname:H};e.mode||x(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(T.bot=!0);var F=A(T,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(F.sri=!0,b&&(F.mobile=b.mobile,F.brands=v(b.brands)),H!==d&&(F.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,H).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(T,{type:"append",original_id:t?e:F.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+F.page_id,!0),F.page_id=D();var a,o=H+G();B({id:F.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){F.os_name=e[O],F.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},""); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v11/custom/light.js.map b/dist/v11/custom/light.js.map deleted file mode 100644 index 5ce47fe9..00000000 --- a/dist/v11/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/custom/proxy.js b/dist/v11/custom/proxy.js deleted file mode 100644 index f7889145..00000000 --- a/dist/v11/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; b0f0; SRI-version; v11) */ - -!function(l,t,e,n,p){try{var h=undefined,f=!0,d=!1,r="true",a="https:",m="pageview",u="event",i="error",o=l.console,c="doNotTrack",g=l.navigator,s=l.location,v=s.host,y=l.document,_=g.userAgent,w="Not sending request ",b=w+"when ",x=d,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,M=l.addEventListener,k="https://"+e,A=y.documentElement||{},q="language",$="Height",j="scroll",D=g.userAgentData,C=j+$,H="offset"+$,P="client"+$,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(_)&&!/(cubot)/i.test(_),N=l.screen,z=y.currentScript||y.querySelector('script[src*="'+e+'"]');p=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(o.warn,o,t)};var F=function(t,e){p("Error in your "+t+" function:",e)},W=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},G=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},J=function(t,e){return t&&t.getAttribute("data-"+e)},L=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},Y=function(t){return t&&t.constructor===Object},Z=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},rt=function(t){return"function"==typeof t},at="namespace",it=t[at]||J(z,at)||"sa",ot=l[it+"_metadata"],ct=function(t,e){Y(ot)&&(t=Z(t,ot));var n=l[Mt];if(!rt(n))return t;try{return Z(t,n.call(l,Z(t,e)))}catch(r){F("metadata",r)}},st=t.strictUtm||J(z,"strict-utm")==r,ut=function(a){return s.search.slice(1).split("&").filter(function(t){var e=a||!tt("ut"),n=Et.map(G).join("|"),r=e?"^("+n+")=":"^((utm_)"+(st?"":"?")+"(source|medium|content|term|campaign)"+(st?"":"|ref")+"|"+n+")=";return e&&!Et.length?d:new RegExp(r).test(t)}).join("&")||h},lt=it+"_loaded";if(l[lt]==f)return p(w+"twice");l.sa_event_loaded=f,l[lt]=f;var pt=function(e,t,n){e=n?e:Z(qt,Dt,e),g.brave&&!n&&(e.brave=f),g._duckduckgoloader_&&!n&&(e.duck=f);var r=new Image;t&&(r.onerror=t,r.onload=t),r.src=k+"/simple.gif?"+Object.keys(e).filter(function(t){return e[t]!=h}).map(function(t){return E(t)+"="+E(e[t])}).join("&")+"&time="+Date.now()},ht=t.hostname||J(z,"hostname"),ft=ht||v,dt={version:"custom_proxy_11",hostname:ft};n=function(t){t=t.stack?t+" "+t.stack:t,p(t),pt(Z(dt,{type:i,error:t,path:s.pathname}),h,f)},M(i,function(t){t.filename&&-1"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v11/custom/proxy.js.map b/dist/v11/custom/proxy.js.map deleted file mode 100644 index cbf0496f..00000000 --- a/dist/v11/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback) {\n sendEvent(event, metadata, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","settings","sa_settings","logSettings","keys","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","src","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v11/light.js b/dist/v11/light.js deleted file mode 100644 index 3b791380..00000000 --- a/dist/v11/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2026-08-17; bf3d; SRI-version; v11) */ - -!function(s,e,t,u){try{var i=undefined,n="https:",r=s.console,a="doNotTrack",p=s.navigator,c=s.location,d=c.host,o=s.document,l=p.userAgent,m="Not sending request ",f=!1,g=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=s.addEventListener,_="https://queue."+t,w=(o.documentElement,"language"),b=p.userAgentData,O="platform",S="platformVersion",k="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(l)&&!/(cubot)/i.test(l),E=o.currentScript||o.querySelector('script[src*="'+t+'"]');u=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(r.warn,r,e)};var q=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},a=arguments,o=0;o>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I="namespace",N=e[I]||q(E,I)||"sa",R=e.strictUtm||"true"==q(E,"strict-utm"),U=N+"_loaded";if(1==s[U])return u(m+"twice");s.sa_event_loaded=!0,s[U]=!0;var V,B=function(t,e,n){t=n?t:A(H,J,t),p.brave&&!n&&(t.brave=!0),p._duckduckgoloader_&&!n&&(t.duck=!0),(new Image).src=_+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=i}).map(function(e){return g(e)+"="+g(t[e])}).join("&")+"&time="+Date.now()},C=e.hostname||q(E,"hostname"),T=C||d,F={version:"cdn_light_11",hostname:T};e.mode||q(E,"mode");try{V=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(Q){u(Q)}j&&(F.bot=!0);var H=A(F,{ua:l,https:c.protocol==n,timezone:V,page_id:D(),session_id:D()});if(H.sri=!0,b&&(H.mobile=b.mobile,H.brands=v(b.brands)),T!==d&&(H.hostname_original=d),a in p&&"1"==p[a])return u("Not sending request when "+a+" is enabled. See "+k+"/dnt");-1!=d.indexOf(".")&&!/^[0-9.:]+$/.test(d)||C||u("Set hostname on "+d+". See "+k+"/overwrite-domain-name");var z,J={},L=(o.referrer||"").replace(d,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||i,M=function(e,t){var n=A(F,{type:"append",original_id:t?e:H.page_id});t||!p.sendBeacon?B(n,0,!0):p.sendBeacon(_+"/append",v(n))};y("pagehide",M,!1);var P,Z,G=function(e){var t="";try{t=e||h(c.pathname)}catch(Q){u(Q)}return t},K=function(e,t,n,r){e&&M(""+H.page_id,!0),H.page_id=D();var a,o=T+G();B({id:H.page_id,type:"pageview",referrer:!t||n?L:null,query:(a=t,c.search.slice(1).split("&").filter(function(e){return!a&&new RegExp("^((utm_)"+(R?"":"?")+"(source|medium|content|term|campaign)"+(R?"":"|ref")+")=").test(e)}).join("&")||i)}),L=o,0};!function(e,t){var n=G(t);if(n&&z!=n){z=n,J.path=n,p[w]&&(J[w]=p[w]);var r,a=s.performance,o="navigation";try{r=a.getEntriesByType(o)[0].type}catch(Q){u(Q)}Z=r?-1<["reload","back_forward"].indexOf(r):a&&a[o]&&-1<[1,2].indexOf(a[o].type),P=!!L&&L.split("/")[0]==d;var i=function(){f=!0,K(e,e||Z||!1,P)};if(f)i();else try{b&&"function"==typeof b.getHighEntropyValues?b.getHighEntropyValues([O,S]).then(function(e){H.os_name=e[O],H.os_version=e[S],i()})["catch"](i):i()}catch(c){i()}}}()}catch(W){u(W)}}(window,{},"simpleanalyticscdn.com"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v11/light.js.map b/dist/v11/light.js.map deleted file mode 100644 index ff6b4be1..00000000 --- a/dist/v11/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings || Object.keys(overwriteOptions).length;\n\n // Merge overwriteOptions with sa_settings\n overwriteOptions = assign(overwriteOptions, settings);\n\n if (logSettings) warn(\"Settings\", overwriteOptions);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function () {\n return (\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_11\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","settings","sa_settings","logSettings","keys","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","_duckduckgoloader_","duck","Image","src","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pages","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/app.js b/dist/v12/app.js deleted file mode 100644 index a6565d5c..00000000 --- a/dist/v12/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; a423; SRI-version; v12) */ - -!function(m,e,n,v){var r,a,t;if(m)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=m.console,u="doNotTrack",b=m.navigator,d=m.location,E=d.host,f=m.document,p=b.userAgent,h="Not sending request ",x=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,q=m.addEventListener,A="https://queue."+e,C=f.documentElement||{},D="language",$="Height",R="scroll",j=b.userAgentData,H=R+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=m.screen,z=f.currentScript||f.querySelector('script[src*="'+e+'"]');v=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){v("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=m[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=m[At];if(!ct(r))return At&&v(At+" not found, set window."+At),t;try{return Q(t,r.call(m,Q(t,e)))}catch(a){W("metadata",a)}},dt=et.strictUtm||Y(z,"strict-utm")==i,ft=function(i,t){nt=!i&&at("q")?"":_;var e=(t||d.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/auto-events.js b/dist/v12/auto-events.js deleted file mode 100644 index b6b0f60a..00000000 --- a/dist/v12/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 99ad; SRI-version; v12) */ - -function t(){try{for(var e=document.getElementsByTagName("a"),t=0;t -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (!useTitle || type === \"phone\") {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n if (useTitle) event = theTitle;\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/app.js b/dist/v12/custom/app.js deleted file mode 100644 index 3b665792..00000000 --- a/dist/v12/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; aa25; SRI-version; v12) */ - -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v12/custom/app.js.map b/dist/v12/custom/app.js.map deleted file mode 100644 index dff565ff..00000000 --- a/dist/v12/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_app_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/auto-events.js b/dist/v12/custom/auto-events.js deleted file mode 100644 index b6b0f60a..00000000 --- a/dist/v12/custom/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; 99ad; SRI-version; v12) */ - -function t(){try{for(var e=document.getElementsByTagName("a"),t=0;t -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n phones: collectTypes.indexOf(\"phones\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n var saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n\n var event;\n var metadata = {\n title: element.getAttribute(\"title\") || undefined,\n };\n var url = element.href || undefined;\n\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n if (!useTitle || type === \"phone\") {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n metadata.url = url;\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n metadata.url = url;\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.email = event;\n break;\n }\n case \"phone\": {\n var hrefPhone = element.getAttribute(\"href\");\n event = (hrefPhone.split(\":\")[1] || \"\").split(\"?\")[0];\n metadata.phone = event;\n break;\n }\n }\n }\n if (useTitle) event = theTitle;\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, metadata, function () {}, true);\n\n log(\"collected \" + clean);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n window.saAutomatedLink = saAutomatedLink;\n\n function collectLink(link) {\n if (link.hasAttribute(\"data-simple-event\")) return;\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \"\\\\.(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")$\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n\n // Collect telephone clicks\n } else if (optionsLink.phones && /^tel:/i.test(link.href)) {\n collect = \"phone\";\n }\n\n if (!collect) return;\n\n link.addEventListener(\"click\", function () {\n saAutomatedLink(this, collect);\n });\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var href = link.getAttribute(\"href\");\n\n // Skip links that don't have an href\n if (!href) continue;\n\n collectLink(link);\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","link","getAttribute","collect","hasAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","phones","addEventListener","saAutomatedLink","this","collectLink","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","theTitle","metadata","undefined","url","useTitle","event","pop","email","phone","clean","replace","readyState","target"],"mappings":";;AAwLE,SAASA,IACP,IAIE,IAHA,IAAIC,EAAIC,SAASC,qBAAqB,KAG7BC,EAAI,EAAGA,EAAIH,EAAEI,OAAQD,IAAK,CACjC,IAAIE,EAAOL,EAAEG,GACFE,EAAKC,aAAa,SA9CnC,SAAqBD,GACnB,IACIE,EADAF,EAAKG,aAAa,uBAClBD,GAAU,EAIZE,EAAYC,WACZ,gBAAgBC,KAAKN,EAAKO,OAC1B,IAAIC,OACF,QAAUJ,EAAYK,qBAAuB,IAAIC,KAAK,KAAO,KAC7D,KACAJ,KAAKN,EAAKW,UAEZT,EAAU,WAIVE,EAAYQ,UACZ,gBAAgBN,KAAKN,EAAKO,OAC1BP,EAAKa,WAAaC,EAAOC,SAASF,SAElCX,EAAU,WAGDE,EAAYY,QAAU,YAAYV,KAAKN,EAAKO,MACrDL,EAAU,QAGDE,EAAYa,QAAU,SAASX,KAAKN,EAAKO,QAClDL,EAAU,SAGPA,GAELF,EAAKkB,iBAAiB,QAAS,WAC7BC,EAAgBC,KAAMlB,MAgBpBmB,CAAYrB,IAEd,MAAOsB,GACPC,EAAID,EAAME,QAAS,SAvMzB,IAA4BV,EAItBS,EAKAE,EAEAC,EAGAC,EAqBAC,EAMAC,EAEAC,EA0BAC,EAGA3B,EAKAe,OA3EkB,KAFIL,EAkNzBA,UA9MGS,EAAM,SAAUC,EAASQ,GAC3B,IAAIC,EAAkB,SAATD,EAAkBE,QAAQC,KAAOD,QAAQE,KACtD,OAAOH,GAAUA,EAAO,gCAAiCT,IAGvDC,EAAMX,EAAOlB,SAEb8B,EACFD,EAAIY,eAAiBZ,EAAIa,cAAc,iCAuBrCV,GArBAD,EAAU,SAAUY,EAAWP,EAAMQ,GACvC,IAAIC,EAAQf,GAAiBA,EAAcgB,QAAQH,GAGnD,MAAa,SAATP,GAA8B,SAAVS,GAA8B,UAAVA,EAE1B,SAATT,EAAwBQ,EAGpB,UAATR,GAAoBS,EACfA,EACJE,MAAM,KACNC,IAAI,SAAUC,GACb,OAAOA,EAAKC,SAEbC,OAAOC,SACM,UAAThB,GAEFS,GAF2BD,EAXf,SAAVC,IAgBgB,UAAW,QAAS,CAC7C,WACA,SACA,YACA,WAEEZ,EAAWF,EAAQ,WAAY,QAAQ,GAEvCG,EAAU,CAEZlB,UAA8C,EAApCgB,EAAaqB,QAAQ,YAC/BjC,QAA0C,EAAlCY,EAAaqB,QAAQ,UAC7B5C,WAAgD,EAArCuB,EAAaqB,QAAQ,aAChChC,QAA0C,EAAlCW,EAAaqB,QAAQ,UAE7BxC,oBAAqBkB,EAAQ,aAAc,QAAS,CAClD,MACA,MACA,OACA,OACA,MACA,MACA,QAKFuB,MAAOvB,EAAQ,WAAY,QAAQ,GAEnCwB,gBAAiBtB,EAEjBuB,iBAAkBvB,GAGhBE,EAAWJ,EAAQ,WAAY,SAAU,iBAKlB,KAFvBvB,EAAc0B,IAGhBP,EAAI,2CAA4C,QAE9CJ,EAAkB,SAASA,EAAgBkC,EAASrB,GACtD,IACE,IAAKqB,EAAS,OAAO9B,EAAI,oBAEzB,GAAIT,EAAOiB,IAAajB,EAAOiB,EAAW,WAAY,CACpD,IAWMuB,EAXFzC,EAAWwC,EAAQxC,SACnBF,EAAW0C,EAAQ1C,SAGnB4C,EAAW,CACbL,MAAOG,EAAQpD,aAAa,UAAYuD,WAEtCC,EAAMJ,EAAQ9C,MAAQiD,UAEtBE,GAAW,EAMf,GALItD,EAAY8C,OAASG,EAAQlD,aAAa,WAE5B,KADZmD,EAAWD,EAAQpD,aAAa,SAAS6C,UACzBY,GAAW,KAG5BA,GAAqB,UAAT1B,EACf,OAAQA,GACN,IAAK,WACH2B,EAAQ9C,GAAYT,EAAY+C,gBAAkBxC,EAAW,IAC7D4C,EAASE,IAAMA,EACf,MAEF,IAAK,WACHE,EAAQvD,EAAYgD,iBAChBvC,EAAWF,EACXA,EAASgC,MAAM,KAAKiB,MACxBL,EAASE,IAAMA,EACf,MAEF,IAAK,QACH,IACAE,GADWN,EAAQpD,aAAa,QAClB0C,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GAC9CY,EAASM,MAAQF,EACjB,MAEF,IAAK,QAEHA,GADgBN,EAAQpD,aAAa,QAClB0C,MAAM,KAAK,IAAM,IAAIA,MAAM,KAAK,GACnDY,EAASO,MAAQH,EAKnBD,IAAUC,EAAQL,GAEtB,IAAIS,EACF/B,EACA,IACA2B,EAAMK,QAAQ,eAAgB,KAAKA,QAAQ,aAAc,IAE3DlD,EAAOiB,GAAUgC,EAAOR,EAAU,cAAgB,GAElDhC,EAAI,aAAewC,QAEnBxC,EAAIQ,EAAW,kBAAmB,QAEpC,MAAOT,GACPC,EAAID,EAAME,QAAS,UAIvBV,EAAOK,gBAAkBA,EA4DF,UAAnBM,EAAIwC,YAA6C,aAAnBxC,EAAIwC,WACpCvE,IAEAE,SAASsB,iBAAiB,mBAAoB,SAAUyC,GACtB,aAA5BA,EAAMO,OAAOD,YAA2BvE"} \ No newline at end of file diff --git a/dist/v12/custom/light.js b/dist/v12/custom/light.js deleted file mode 100644 index 51ab72ba..00000000 --- a/dist/v12/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; edd8; SRI-version; v12) */ - -!function(f,e,m){if(f)try{var u=undefined,t="https:",n=f.console,r="doNotTrack",g=f.navigator,p=f.location,h=p.host,i=f.document,a=g.userAgent,o="Not sending request ",v=!1,c=encodeURIComponent,s=decodeURIComponent,d=JSON.stringify,l=f.addEventListener,y="https://"+e,_=(i.documentElement,"language"),w=g.userAgentData,b="platform",O="platformVersion",S="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(a)&&!/(cubot)/i.test(a),k=i.currentScript||i.querySelector('script[src*="'+e+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(n.warn,n,e)};var x=function(e){return"string"==typeof e},E=function(e,t){return e&&e.getAttribute("data-"+t)},A=function(){for(var e,t,n,r={},i=arguments,a=0;a>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(e){return"function"==typeof e},N="namespace",R=q[N]||E(k,N)||"sa",U=q.strictUtm||"true"==E(k,"strict-utm"),V=R+"_loaded";if(1==f[V])return m(o+"twice");f.sa_event_loaded=!0,f[V]=!0;var B,C=function(t,e,n,r){t=n?t:A(z,L,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var i=new Image,a=y+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return c(e)+"="+c(t[e])}).join("&")+"&time="+Date.now();i.src=a},H=q.hostname||E(k,"hostname"),T=H||h,F={version:"custom_light_12",hostname:T};q.mode||E(k,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){m(W)}j&&(F.bot=!0);var z=A(F,{ua:a,https:p.protocol==t,timezone:B,page_id:D(),session_id:D()});if(z.sri=!0,w&&(z.mobile=w.mobile,z.brands=d(w.brands)),T!==h&&(z.hostname_original=h),r in g&&"1"==g[r])return m("Not sending request when "+r+" is enabled. See "+S+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||H||m("Set hostname on "+h+". See "+S+"/overwrite-domain-name");var J,L={},M=(q.referrer||E(k,"referrer")||i.referrer||"").replace(h,T).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,P=function(e,t){var n=A(F,{type:"append",original_id:t?e:z.page_id});if(t||!g.sendBeacon)C(n,0,!0);else try{g.sendBeacon.bind(g)(y+"/append",d(n))}catch(r){C(n,0,!0)}};l("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||s(p.pathname)}catch(W){m(W)}return t},Q=function(e,t,n,r,i,a){e&&P(""+z.page_id,!0),z.page_id=D();var o,c=T+K(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=","i").test(e)}).join("&")||u);C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:s}),M=c,0};!function(e,t,n,r){!r&&I(n)&&(r=n);I(r);var i,a="";x(t)&&-1"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v12/custom/light.js.map b/dist/v12/custom/light.js.map deleted file mode 100644 index 97df90a2..00000000 --- a/dist/v12/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n\n var collectMetricByString = function (metricAbbreviation) {\n // eslint-disable-next-line no-unreachable\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_light_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","logSettings","settings","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","keys","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/custom/proxy.js b/dist/v12/custom/proxy.js deleted file mode 100644 index b194028a..00000000 --- a/dist/v12/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-18; a1b1; SRI-version; v12) */ - -!function(v,e,n,m){var r,a,t;if(v)try{var g=undefined,y=!0,_=!1,i="true",o="https:",w="pageview",l="event",c="error",s=v.console,u="doNotTrack",b=v.navigator,f=v.location,x=f.host,d=v.document,p=b.userAgent,h="Not sending request ",E=h+"when ",O=_,M=encodeURIComponent,S=decodeURIComponent,k=JSON.stringify,A=v.addEventListener,q="https://"+e,C=d.documentElement||{},D="language",$="Height",H="scroll",R=b.userAgentData,j=H+$,L="offset"+$,N="client"+$,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=0,B=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),F=v.screen,z=d.currentScript||d.querySelector('script[src*="'+e+'"]');m=function(){var t=[].slice.call(arguments);return t.unshift("Simple Analytics:"),Function.prototype.apply.call(s.warn,s,t)};var W=function(t,e){m("Error in your "+t+" function:",e)},G=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},J=function(t){return"string"==typeof t},X=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},Y=function(t,e){return t&&t.getAttribute("data-"+e)},Z=function(t){return Array.isArray(t)?t:J(t)&&t.length?t.split(/, ?/):[]},K=function(t){return t&&t.constructor===Object},Q=function(){for(var t={},e=arguments,n=0;n>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},ct=function(t){return"function"==typeof t},st="namespace",ut=et[st]||Y(z,st)||"sa",lt=function(t,e){var n=v[ut+"_metadata"];K(n)&&(t=Q(t,n));var r=v[qt];if(!ct(r))return qt&&m(qt+" not found, set window."+qt),t;try{return Q(t,r.call(v,Q(t,e)))}catch(a){W("metadata",a)}},ft=et.strictUtm||Y(z,"strict-utm")==i,dt=function(i,t){nt=!i&&at("q")?"":_;var e=(t||f.search).slice(1).split("&").filter(function(t){var e=t.indexOf("=");nt!==_&&0"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v12/custom/proxy.js.map b/dist/v12/custom/proxy.js.map deleted file mode 100644 index 3c341909..00000000 --- a/dist/v12/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n // Only initialize in a browser.\n if (!window) return;\n\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var pages = 0;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics:\");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.apply.call is needed for Internet Explorer\n return Function.prototype.apply.call(con.warn, con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var settings = window.sa_settings;\n var logSettings = settings;\n settings = assign(settings);\n\n if (logSettings) warn(\"Settings\", settings);\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n settings.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var appendMetadata = function (metadata, data) {\n var metadataObject = window[namespace + \"_metadata\"];\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) {\n if (metadataCollector)\n warn(\n metadataCollector + \" not found, set window.\" + metadataCollector\n );\n return metadata;\n }\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n var k;\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n k = !ignoreSource && collectMetricByString(\"q\") ? \"\" : falseVar;\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var i = keyValue.indexOf(\"=\");\n if (k !== falseVar && i > 0 && keyValue.slice(i + 1))\n k += (k ? \",\" : \"\") + keyValue.slice(0, i);\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n k = k || undefinedVar;\n return q || undefinedVar;\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n // Events must survive navigation without taking over links or forms.\n if (keepalive && window.fetch) {\n try {\n window\n .fetch(imageUrl, {\n keepalive: trueVar,\n mode: \"no-cors\",\n credentials: \"omit\",\n })\n .catch(function () {\n image.src = imageUrl;\n });\n return;\n } catch (error) {}\n }\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(settings.collectDnt)\n ? settings.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n settings.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n settings.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n settings.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n settings.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n settings.nonUniqueHostnames || attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n settings.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n settings.metadataCollector || attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var phantom = window.phantom;\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n (phantom && !phantom.solana) ||\n window.__polypane ||\n window._bot ||\n isBotAgent ||\n Math.random() == Math.random();\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n if (raw) return referrer;\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n k: k,\n\n metadata: stringify(metadata),\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // scre = screensizes\n if (screen && collectMetricByString(\"scre\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = referrer\n ? referrer.split(slash)[0]\n : undefinedVar;\n sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // Only the first pageview can use a Cloudflare referrer as a unique arrival.\n page.unique =\n isPushState || userNavigated\n ? falseVar\n : !sameSite || (!pages && /[?&]__cf_/.test(getReferrer(trueVar)));\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n\n var manualPageview = function (path, metadata, callback) {\n pageview(0, path, metadata, callback);\n };\n window[namespace + \"_\" + pageviewText] = manualPageview;\n var defaultPageview = defaultNamespace + \"_\" + pageviewText;\n if (!window[defaultPageview]) window[defaultPageview] = manualPageview;\n\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw, keepalive) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n var firstPage = !userNavigated && pages < 2;\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n id: uuid(),\n query: getQueryParams(!firstPage),\n referrer:\n (firstPage || sameSite) && collectMetricByString(\"r\")\n ? previousReferrer\n : null,\n\n metadata: stringify(metadata),\n }),\n callback,\n undefinedVar,\n keepalive\n );\n }\n };\n\n var defaultEventFunc = function (event, metadata, callback, keepalive) {\n sendEvent(event, metadata, callback, keepalive);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Automated events wait for this variable, for example ba_event_loaded\n window[eventFunctionName + \"_loaded\"] = trueVar;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n\n var inlineEvent = function (event) {\n var element = event.target;\n while (\n element &&\n element !== doc &&\n (!element.getAttribute || attr(element, \"simple-event\") === null)\n )\n element = element.parentNode;\n\n if (!element || element === doc) return;\n var isForm = element.tagName === \"FORM\";\n var name = attr(element, \"simple-event\");\n if (!name || isForm !== (event.type === \"submit\")) return;\n\n var metadata = { tag: element.tagName.toLowerCase() };\n var attributes = element.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n if (attribute.name.indexOf(\"data-simple-event-\") === 0)\n metadata[attribute.name.slice(18).replace(/-/g, \"_\")] =\n attribute.value;\n }\n if (isForm) {\n var button = event.submitter;\n metadata.button_text = button\n ? (button.textContent || button.value || \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 200)\n : \"\";\n }\n sendEvent(name, metadata, undefinedVar, trueVar);\n };\n\n doc.addEventListener(\"click\", inlineEvent, falseVar);\n doc.addEventListener(\"submit\", inlineEvent, falseVar);\n\n // 404 confirmation adds a request, so existing installs must opt in.\n if (\n settings.detect404 === trueVar ||\n attr(scriptElement, \"detect-404\") == trueText\n ) {\n var detect404 = function () {\n if (\n !/\\b404\\b/.test(doc.title + \" \" + (doc.body && doc.body.textContent))\n )\n return;\n try {\n var request = new window.XMLHttpRequest();\n request.open(\"HEAD\", loc.href, trueVar);\n request.onload = function () {\n if (request.status === 404)\n sendEvent(\"page_404\", {\n url: loc.protocol + \"//\" + definedHostname + loc.pathname,\n status: 404,\n });\n };\n request.send();\n } catch (error) {}\n };\n if (doc.readyState === \"loading\")\n doc.addEventListener(\"DOMContentLoaded\", detect404, falseVar);\n else detect404();\n }\n } catch (e) {\n sendError(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"\",\n \"\",\n \"custom_proxy_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","sendError","warn","type","orig","value","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","pages","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","isString","string","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","logSettings","settings","sa_settings","k","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","namespaceText","namespace","appendMetadata","metadata","data","metadataObject","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","overwriteSearch","q","search","keyValue","i","indexOf","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","onerror","onload","imageUrl","keys","key","fetch","mode","credentials","catch","src","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","path","pathname","event","filename","message","timezone","start","scrolled","collectDnt","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","phantom","bot","webdriver","__nightmare","callPhantom","_phantom","solana","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","getReferrer","raw","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","bind","e","hidden","body","documentClientHeight","height","min","scrollTop","previousReferrer","sameSite","userNavigated","getPath","overwrite","pathOverwriterFunction","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","currentReferrerHostname","unique","triggerSendPageView","delSrc","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","rv","this","createEvent","initEvent","manualPageview","defaultPageview","defaultNamespace","validTypes","sendEvent","eventIsFunction","eventType","eventOutput","eventParams","firstPage","defaultEventFunc","eventFunc","queue","detect404","inlineEvent","element","target","parentNode","isForm","tagName","button","tag","toLowerCase","attributes","submitter","button_text","textContent","trim","title","request","XMLHttpRequest","open","href","status","url","send","readyState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v12/light.js b/dist/v12/light.js deleted file mode 100644 index b24ba6e6..00000000 --- a/dist/v12/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2026-10-15; d74a; SRI-version; v12) */ - -!function(f,e,m){if(f)try{var u=undefined,t="https:",n=f.console,r="doNotTrack",g=f.navigator,p=f.location,h=p.host,a=f.document,i=g.userAgent,o="Not sending request ",v=!1,c=encodeURIComponent,s=decodeURIComponent,d=JSON.stringify,l=f.addEventListener,y="https://queue."+e,_=(a.documentElement,"language"),w=g.userAgentData,b="platform",O="platformVersion",S="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(i)&&!/(cubot)/i.test(i),k=a.currentScript||a.querySelector('script[src*="'+e+'"]');m=function(){var e=[].slice.call(arguments);return e.unshift("Simple Analytics:"),Function.prototype.apply.call(n.warn,n,e)};var E=function(e){return"string"==typeof e},q=function(e,t){return e&&e.getAttribute("data-"+t)},x=function(){for(var e,t,n,r={},a=arguments,i=0;i>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(e){return"function"==typeof e},N="namespace",R=$[N]||q(k,N)||"sa",U=$.strictUtm||"true"==q(k,"strict-utm"),V=R+"_loaded";if(1==f[V])return m(o+"twice");f.sa_event_loaded=!0,f[V]=!0;var B,C=function(t,e,n,r){t=n?t:x(z,L,t),g.brave&&!n&&(t.brave=!0),g._duckduckgoloader_&&!n&&(t.duck=!0);var a=new Image,i=y+"/simple.gif?"+Object.keys(t).filter(function(e){return t[e]!=u}).map(function(e){return c(e)+"="+c(t[e])}).join("&")+"&time="+Date.now();a.src=i},T=$.hostname||q(k,"hostname"),F=T||h,H={version:"cdn_light_12",hostname:F};$.mode||q(k,"mode");try{B=Intl.DateTimeFormat().resolvedOptions().timeZone}catch(W){m(W)}j&&(H.bot=!0);var z=x(H,{ua:i,https:p.protocol==t,timezone:B,page_id:D(),session_id:D()});if(z.sri=!0,w&&(z.mobile=w.mobile,z.brands=d(w.brands)),F!==h&&(z.hostname_original=h),r in g&&"1"==g[r])return m("Not sending request when "+r+" is enabled. See "+S+"/dnt");-1!=h.indexOf(".")&&!/^[0-9.:]+$/.test(h)||T||m("Set hostname on "+h+". See "+S+"/overwrite-domain-name");var J,L={},M=($.referrer||q(k,"referrer")||a.referrer||"").replace(h,F).replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/,"$4").replace(/^([^/]+)$/,"$1")||u,P=function(e,t){var n=x(H,{type:"append",original_id:t?e:z.page_id});if(t||!g.sendBeacon)C(n,0,!0);else try{g.sendBeacon.bind(g)(y+"/append",d(n))}catch(r){C(n,0,!0)}};l("pagehide",P,!1);var Z,G,K=function(e){var t="";try{t=e||s(p.pathname)}catch(W){m(W)}return t},Q=function(e,t,n,r,a,i){e&&P(""+z.page_id,!0),z.page_id=D();var o,c=F+K(),s=(o=t,(r||p.search).slice(1).split("&").filter(function(e){return!o&&new RegExp("^((utm_)"+(U?"":"?")+"(source|medium|content|term|campaign)"+(U?"":"|ref")+")=","i").test(e)}).join("&")||u);C({id:z.page_id,type:"pageview",referrer:!t||n?M:null,query:s}),M=c,0};!function(e,t,n,r){!r&&I(n)&&(r=n);I(r);var a,i="";E(t)&&-1> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n settings[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n settings.strictUtm || attr(scriptElement, \"strict-utm\") == trueText;\n\n\n var getQueryParams = function (ignoreSource, overwriteSearch) {\n var q = (overwriteSearch || loc.search)\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n // eslint-disable-next-line no-redeclare\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex, \"i\").test(keyValue);\n })\n .join(\"&\");\n\n return q || undefinedVar;\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData, keepalive) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n if (nav._duckduckgoloader_ && !onlyThisData) data.duck = trueVar;\n\n\n var image = new Image();\n var imageUrl =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n\n image.src = imageUrl;\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n settings.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = settings.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n // eslint-disable-next-line no-redeclare\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n var getReferrer = function (raw) {\n // Customers can overwrite their referrer, here we check for that\n var referrer =\n settings.referrer ||\n attr(scriptElement, \"referrer\") ||\n doc.referrer ||\n \"\";\n\n return (\n referrer\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar\n );\n };\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer = getReferrer();\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n try {\n nav.sendBeacon.bind(nav)(fullApiUrl + \"/append\", stringify(append));\n } catch (e) {\n // Fallback for browsers throwing \"Illegal invocation\" when the URL is invalid\n sendData(append, undefinedVar, trueVar);\n }\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n var previousReferrer;\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n search,\n metadata,\n callback\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n var query = getQueryParams(deleteSourceInfo, search);\n\n sendData(\n {\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: query,\n\n },\n callback\n );\n\n previousReferrer = referrer;\n referrer = currentPage;\n\n pages++;\n };\n\n var sameSite, userNavigated;\n\n var pageview = function (\n isPushState,\n pathOverwrite,\n metadata,\n callbackRaw\n ) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var querySearch = \"\";\n if (isString(pathOverwrite) && pathOverwrite.indexOf(\"?\") > -1) {\n // keep query from manual path\n var parts = pathOverwrite.split(\"?\");\n pathOverwrite = parts.shift();\n querySearch = \"?\" + parts.join(\"?\");\n }\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n var pathKey = path + querySearch;\n if (!path || lastSendPath == pathKey) return;\n\n lastSendPath = pathKey;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n sameSite = referrer\n ? referrer.split(slash)[0] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n var delSrc =\n isPushState || userNavigated || !collectMetricByString(\"r\");\n sendPageView(\n isPushState,\n delSrc, // r = referrers\n sameSite,\n querySearch,\n metadata,\n callback\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n typeof window != \"undefined\" && window,\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_12\",\n \"sa\"\n);\n"],"names":["window","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","apply","isString","string","attr","attribute","getAttribute","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","logSettings","settings","sa_settings","Date","now","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","keepalive","payload","page","brave","_duckduckgoloader_","duck","image","Image","imageUrl","keys","filter","key","map","join","src","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","bind","e","sameSite","userNavigated","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","search","metadata","ignoreSource","currentPage","query","split","keyValue","RegExp","pages","pathOverwrite","callbackRaw","parts","querySearch","shift","pathKey","performaceEntryType","perf","performance","navigationText","getEntriesByType","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v2/cloudflare.js b/dist/v2/cloudflare.js deleted file mode 100644 index bf5a05cb..00000000 --- a/dist/v2/cloudflare.js +++ /dev/null @@ -1,723 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; 49af; SRI-version; v2) */ -/* eslint-env browser */ - -(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) { - try { - // Only load our script once, customers can still send multiple page views - // with the sa_pageview function if they turn off auto collect. - var loadedVariable = saGlobal + "_loaded"; - if (!window || window[loadedVariable] === true) return; - window[loadedVariable] = true; - - ///////////////////// - // PREDEFINED VARIABLES FOR BETTER MINIFICATION - // - - // This seems like a lot of repetition, but it makes our script available for - // multple destination which prevents us to need multiple scripts. The minified - // version stays small. - var https = "https:"; - var pageviewsText = "pageview"; - var errorText = "error"; - var slash = "/"; - var protocol = https + "//"; - var con = window.console; - var doNotTrack = "doNotTrack"; - var nav = window.navigator; - var loc = window.location; - var locationHostname = loc.hostname; - var doc = window.document; - var userAgent = nav.userAgent; - var notSending = "Not sending request "; - var fetchedHighEntropyValues = false; - var encodeURIComponentFunc = encodeURIComponent; - var decodeURIComponentFunc = decodeURIComponent; - var stringify = JSON.stringify; - var thousand = 1000; - var addEventListenerFunc = window.addEventListener; - var fullApiUrl = protocol + apiUrlPrefix + baseUrl; - var undefinedVar = undefined; - var documentElement = doc.documentElement || {}; - var language = "language"; - var Height = "Height"; - var Width = "Width"; - var scroll = "scroll"; - var trueText = "true"; - var uaData = nav.userAgentData; - var scrollHeight = scroll + Height; - var offsetHeight = "offset" + Height; - var clientHeight = "client" + Height; - var clientWidth = "client" + Width; - var pagehide = "pagehide"; - var platformText = "platform"; - var platformVersionText = "platformVersion"; - var isBotAgent = - /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent); - var screen = window.screen; - - ///////////////////// - // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS - // - - var bot = - nav.webdriver || - window.__nightmare || - "callPhantom" in window || - "_phantom" in window || - "phantom" in window || - isBotAgent; - - - var payload = { - version: version, - ua: userAgent, - }; - if (bot) payload.bot = true; - - payload.sri = false; - - // Use User-Agent Client Hints for better privacy - // https://web.dev/user-agent-client-hints/ - if (uaData) { - payload.mobile = uaData.mobile; - payload.brands = stringify(uaData.brands); - } - - ///////////////////// - // HELPER FUNCTIONS - // - - // A simple log function so the user knows why a request is not being send - var warn = function (message) { - if (con && con.warn) con.warn("Simple Analytics:", message); - }; - - var now = Date.now; - - var uuid = function () { - var cryptoObject = window.crypto || window.msCrypto; - var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11; - var uuidRegex = /[018]/g; - - try { - return emptyUUID.replace(uuidRegex, function (c) { - return ( - c ^ - (cryptoObject.getRandomValues(new Uint8Array(1))[0] & - (15 >> (c / 4))) - ).toString(16); - }); - } catch (error) { - return emptyUUID.replace(uuidRegex, function (c) { - var r = (Math.random() * 16) | 0, - v = c < 2 ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); - } - }; - - var isFunction = function (func) { - return typeof func == "function"; - }; - - var isString = function (string) { - return typeof string == "string"; - }; - - var assign = function () { - var to = {}; - var arg = arguments; - for (var index = 0; index < arg.length; index++) { - var nextSource = arg[index]; - if (nextSource) { - for (var nextKey in nextSource) { - if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { - to[nextKey] = nextSource[nextKey]; - } - } - } - } - return to; - }; - - var isBoolean = function (value) { - return !!value === value; - }; - - var getParams = function (regex) { - // From the search we grab the utm_source and ref and save only that - var matches = loc.search.match( - new RegExp("[?&](" + regex + ")=([^?&]+)", "gi") - ); - var match = matches - ? matches.map(function (m) { - return m.split("=")[1]; - }) - : []; - if (match && match[0]) return match[0]; - }; - - // Ignore pages specified in data-ignore-pages - var shouldIgnore = function (path) { - for (var i in ignorePages) { - var ignorePageRaw = ignorePages[i]; - if (!ignorePageRaw) continue; - - // Prepend a slash when it's missing - var ignorePage = - ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw; - - try { - if ( - ignorePage === path || - new RegExp(ignorePage.replace(/\*/gi, "(.*)"), "gi").test(path) - ) - return true; - } catch (error) { - return false; - } - } - return false; - }; - - ///////////////////// - // SEND DATA VIA OUR PIXEL - // - - // Send data via image - var sendData = function (data, callback) { - data = assign(payload, data); - - var image = new Image(); - if (callback) { - image.onerror = callback; - image.onload = callback; - } - image.src = - fullApiUrl + - "/simple.gif?" + - Object.keys(data) - .filter(function (key) { - return data[key] != undefinedVar; - }) - .map(function (key) { - return ( - encodeURIComponentFunc(key) + - "=" + - encodeURIComponentFunc(data[key]) - ); - }) - .join("&") + - "&time=" + - Date.now(); - }; - - ///////////////////// - // ERROR FUNCTIONS - // - - // Send errors - var sendError = function (errorOrMessage) { - errorOrMessage = errorOrMessage.message || errorOrMessage; - warn(errorOrMessage); - sendData({ - type: errorText, - error: errorOrMessage, - url: definedHostname + loc.pathname, - }); - }; - - // We listen for the error events and only send errors that are - // from our script (checked by filename) to our server. - addEventListenerFunc( - errorText, - function (event) { - if (event.filename && event.filename.indexOf(baseUrl) > -1) { - sendError(event.message); - } - }, - false - ); - - ///////////////////// - // INITIALIZE VALUES - // - - var pushState = "pushState"; - var dis = window.dispatchEvent; - - var duration = "duration"; - var start = now(); - - var scrolled = 0; - - // This code could error on (incomplete) implementations, that's why we use try...catch - var timezone; - try { - timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; - } catch (e) { - /* Do nothing */ - } - - ///////////////////// - // GET SETTINGS - // - - // Find the script element where options can be set on - var scriptElement = - doc.currentScript || doc.querySelector('script[src*="' + baseUrl + '"]'); - var attr = function (scriptElement, attribute) { - return scriptElement && scriptElement.getAttribute("data-" + attribute); - }; - - // Script mode, this can be hash mode for example - var mode = overwriteOptions.mode || attr(scriptElement, "mode"); - - // Should we record Do Not Track visits? - var collectDnt = isBoolean(overwriteOptions.collectDnt) - ? overwriteOptions.collectDnt - : attr(scriptElement, "ignore-dnt") == trueText || - attr(scriptElement, "skip-dnt") == trueText || - attr(scriptElement, "collect-dnt") == trueText; - - // Customers can overwrite their hostname, here we check for that - var definedHostname = - overwriteOptions.hostname || - attr(scriptElement, "hostname") || - locationHostname; - - // Some customers want to collect page views manually - var autoCollect = !( - attr(scriptElement, "auto-collect") == "false" || - overwriteOptions.autoCollect === false - ); - - // Event function name - var functionName = - overwriteOptions.saGlobal || attr(scriptElement, "sa-global") || saGlobal; - - // Customers can ignore certain pages - var ignorePagesRaw = - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages"); - - // Make sure ignore pages is an array - var ignorePages = Array.isArray(ignorePagesRaw) - ? ignorePagesRaw - : isString(ignorePagesRaw) && ignorePagesRaw.length - ? ignorePagesRaw.split(/, ?/) - : []; - - ///////////////////// - // ADD HOSTNAME TO PAYLOAD - // - - payload.hostname = definedHostname; - - ///////////////////// - // ADD WARNINGS - // - - // Warn when no document.doctype is defined (this breaks some documentElement dimensions) - if (!doc.doctype) warn("Add DOCTYPE html for more accurate dimensions"); - - // When a customer overwrites the hostname, we need to know what the original - // hostname was to hide that domain from referrer traffic - if (definedHostname !== locationHostname) - payload.hostname_original = locationHostname; - - // Don't track when Do Not Track is set to true - if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == "1") - return warn(notSending + "when " + doNotTrack + " is enabled"); - - // Don't track when localhost or when it's an IP address - if ( - locationHostname.indexOf(".") == -1 || - /^[0-9]+$/.test(locationHostname.replace(/\./g, "")) - ) - return warn(notSending + "from " + locationHostname); - - ///////////////////// - // SETUP INITIAL VARIABLES - // - - var page = {}; - var lastPageId = uuid(); - var lastSendPath; - - // We don't want to end up with sensitive data so we clean the referrer URL - var referrer = - (doc.referrer || "") - .replace(locationHostname, definedHostname) - .replace(/^https?:\/\/((m|l|w{2,3}([0-9]+)?)\.)?([^?#]+)(.*)$/, "$4") - .replace(/^([^/]+)$/, "$1") || undefinedVar; - - // The prefix utm_ is optional - var utmRegexPrefix = "(utm_)?"; - var source = { - source: getParams(utmRegexPrefix + "source|ref"), - medium: getParams(utmRegexPrefix + "medium"), - campaign: getParams(utmRegexPrefix + "campaign"), - term: getParams(utmRegexPrefix + "term"), - content: getParams(utmRegexPrefix + "content"), - referrer: referrer, - }; - - ///////////////////// - // TIME ON PAGE AND SCROLLED LOGIC - // - - // We don't put msHidden in if duration block, because it's used outside of that functionality - var msHidden = 0; - - var sendBeaconText = "sendBeacon"; - - var sendOnLeave = function (id, push) { - var append = { type: "append", original_id: push ? id : lastPageId }; - - append[duration] = Math.round((now() - start - msHidden) / thousand); - msHidden = 0; - start = now(); - - append.scrolled = Math.max(0, scrolled, position()); - - if (push || !(sendBeaconText in nav)) { - sendData(append); - } else { - nav[sendBeaconText]( - fullApiUrl + "/append", - stringify(assign(payload, append)) - ); - } - }; - - var hiddenStart; - window.addEventListener( - "visibilitychange", - function () { - if (doc.hidden) { - if (!("on" + pagehide in window)) sendOnLeave(); - hiddenStart = now(); - } else msHidden += now() - hiddenStart; - }, - false - ); - - addEventListenerFunc(pagehide, sendOnLeave, false); - - var body = doc.body || {}; - var position = function () { - try { - var documentClientHeight = documentElement[clientHeight] || 0; - var height = Math.max( - body[scrollHeight] || 0, - body[offsetHeight] || 0, - documentElement[clientHeight] || 0, - documentElement[scrollHeight] || 0, - documentElement[offsetHeight] || 0 - ); - return Math.min( - 100, - Math.round( - (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) / - height / - 5 - ) * 5 - ); - } catch (error) { - return 0; - } - }; - - addEventListenerFunc("load", function () { - scrolled = position(); - addEventListenerFunc( - scroll, - function () { - if (scrolled < position()) scrolled = position(); - }, - false - ); - }); - - ///////////////////// - // ACTUAL PAGE VIEW LOGIC - // - - var getPath = function (overwrite) { - var path = ""; - - // decodeURIComponent can fail when having invalid characters - // https://github.com/simpleanalytics/roadmap/issues/462 - try { - path = overwrite || decodeURIComponentFunc(loc.pathname); - } catch (e) { - // Do nothing - } - - // Ignore pages specified in data-ignore-pages - if (shouldIgnore(path)) { - warn(notSending + "because " + path + " is ignored"); - return; - } - - // Add hash to path when script is put in to hash mode - if (mode == "hash" && loc.hash) path += loc.hash.split("?")[0]; - - return path; - }; - - // Send page view and append data to it - var sendPageView = function (isPushState, deleteSourceInfo, sameSite) { - if (isPushState) sendOnLeave("" + lastPageId, true); - lastPageId = uuid(); - page.id = lastPageId; - - var currentPage = definedHostname + getPath(); - - sendData( - assign( - page, - deleteSourceInfo - ? { - referrer: sameSite ? referrer : null, - } - : source, - { - https: loc.protocol == https, - timezone: timezone, - type: pageviewsText, - } - ) - ); - - referrer = currentPage; - }; - - var pageview = function (isPushState, pathOverwrite) { - // Obfuscate personal data in URL by dropping the search and hash - var path = getPath(pathOverwrite); - - // Don't send the last path again (this could happen when pushState is used to change the path hash or search) - if (!path || lastSendPath == path) return; - - lastSendPath = path; - - var data = { - path: path, - viewport_width: - Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) || - null, - viewport_height: - Math.max( - documentElement[clientHeight] || 0, - window.innerHeight || 0 - ) || null, - }; - - if (nav[language]) data[language] = nav[language]; - - if (screen) { - data.screen_width = screen.width; - data.screen_height = screen.height; - } - - // If a user does refresh we need to delete the referrer because otherwise it count double - var perf = window.performance; - var navigation = "navigation"; - - // Check if back, forward or reload buttons are being used in modern browsers - var userNavigated = - perf && - perf.getEntriesByType && - perf.getEntriesByType(navigation)[0] && - perf.getEntriesByType(navigation)[0].type - ? ["reload", "back_forward"].indexOf( - perf.getEntriesByType(navigation)[0].type - ) > -1 - : // Check if back, forward or reload buttons are being use in older browsers - // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD - perf && - perf[navigation] && - [1, 2].indexOf(perf[navigation].type) > -1; - - // Check if referrer is the same as current real hostname (not the defined hostname!) - var sameSite = referrer - ? doc.referrer.split(slash)[2] == locationHostname - : false; - - // We set unique variable based on pushstate or back navigation, if no match we check the referrer - data.unique = isPushState || userNavigated ? false : !sameSite; - - page = data; - - var triggerSendPageView = function () { - fetchedHighEntropyValues = true; - sendPageView(isPushState, isPushState || userNavigated, sameSite); - }; - - if (!fetchedHighEntropyValues) { - // Request platform information if this is available - try { - if (uaData && isFunction(uaData.getHighEntropyValues)) { - uaData - .getHighEntropyValues([platformText, platformVersionText]) - .then(function (highEntropyValues) { - payload.os_name = highEntropyValues[platformText]; - payload.os_version = highEntropyValues[platformVersionText]; - triggerSendPageView(); - }) - .catch(triggerSendPageView); - } else { - triggerSendPageView(); - } - } catch (e) { - triggerSendPageView(); - } - } else { - triggerSendPageView(); - } - }; - - ///////////////////// - // AUTOMATED PAGE VIEW COLLECTION - // - - var his = window.history; - var hisPushState = his ? his.pushState : undefinedVar; - - // Overwrite history pushState function to - // allow listening on the pushState event - if (autoCollect && hisPushState && Event && dis) { - var stateListener = function (type) { - var orig = his[type]; - return function () { - var arg = arguments; - var rv = orig.apply(this, arg); - var event; - if (typeof Event == "function") { - event = new Event(type); - } else { - // Fix for IE - event = doc.createEvent("Event"); - event.initEvent(type, true, true); - } - event.arguments = arg; - dis(event); - return rv; - }; - }; - - his.pushState = stateListener(pushState); - - addEventListenerFunc( - pushState, - function () { - pageview(1); - }, - false - ); - - addEventListenerFunc( - "popstate", - function () { - pageview(1); - }, - false - ); - } - - // When in hash mode, we record a pageview based on the onhashchange function - if (autoCollect && mode == "hash" && "onhashchange" in window) { - addEventListenerFunc( - "hashchange", - function () { - pageview(1); - }, - false - ); - } - - if (autoCollect) pageview(); - else - window.sa_pageview = function (path) { - pageview(0, path); - }; - - ///////////////////// - // EVENTS - // - - var sessionId = uuid(); - var validTypes = ["string", "number"]; - - var sendEvent = function (event, callbackRaw) { - var eventIsFunction = isFunction(event); - var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; - - if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) { - warn("event is not a string: " + event); - return callback(); - } - - try { - if (eventIsFunction) { - event = event(); - if (validTypes.indexOf(typeof event) < 0) { - warn("event function output is not a string: " + event); - return callback(); - } - } - } catch (error) { - warn("in your event function: " + error.message); - return callback(); - } - - event = ("" + event).replace(/[^a-z0-9]+/gi, "_").replace(/(^_|_$)/g, ""); - - if (event) { - sendData( - assign(source, bot ? { bot: true } : {}, { - type: "event", - event: event, - page_id: page.id, - session_id: sessionId, - }), - callback - ); - } - }; - - var defaultEventFunc = function (event, callback) { - sendEvent(event, callback); - }; - - // Set default function if user didn't define a function - if (!window[functionName]) window[functionName] = defaultEventFunc; - - var eventFunc = window[functionName]; - - // Read queue of the user defined function - var queue = eventFunc && eventFunc.q ? eventFunc.q : []; - - // Overwrite user defined function - window[functionName] = defaultEventFunc; - - // Post events from the queue of the user defined function - for (var event in queue) { - if (Object.prototype.hasOwnProperty.call(queue, event)) { - Array.isArray(queue[event]) - ? sendEvent.apply(null, queue[event]) - : sendEvent(queue[event]); - } - } - } catch (e) { - sendError(e); - } -})( - window, - {"saGlobal":INSTALL_OPTIONS.sa_global,"mode":INSTALL_OPTIONS.hash_mode ? 'hash' : null,"collectDnt":INSTALL_OPTIONS.collect_dnt}, - INSTALL_OPTIONS.custom_domain || "queue.simpleanalyticscdn.com", - "", - "cloudflare_2", - "sa_event" -); diff --git a/dist/v2/custom/app.js b/dist/v2/custom/app.js deleted file mode 100644 index c78c647e..00000000 --- a/dist/v2/custom/app.js +++ /dev/null @@ -1,3 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-03-02; d491) */ - -!function(o,n){if(o){function c(){var n=o.crypto||o.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11;return n?e.replace(/[018]/g,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)}):e.replace(/[018]/g,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}var s,u="https:",t="error",r=o.console,e="doNotTrack",i=o.navigator,f=o.location,p=o.document,a="Not sending requests ",h=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,m=o.addEventListener,v="https://"+n,g=undefined,y={version:2},w=function(e){r&&r.warn&&r.warn("Simple Analytics:",e)},E=Date.now,O=function(){for(var e={},n=0;n"); \ No newline at end of file diff --git a/dist/v2/custom/e.js b/dist/v2/custom/e.js deleted file mode 100644 index afb906cf..00000000 --- a/dist/v2/custom/e.js +++ /dev/null @@ -1,3 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-03-02; cb90) */ - -!function(o,n){if(o){function c(){var n=o.crypto||o.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11;return n?e.replace(/[018]/g,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)}):e.replace(/[018]/g,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}var s,u="https:",t="error",r=o.console,e="doNotTrack",i=o.navigator,f=o.location,p=o.document,a="Not sending requests ",h=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,m=o.addEventListener,v="https://"+n,g=undefined,y={version:2},w=function(e){r&&r.warn&&r.warn("Simple Analytics:",e)},E=Date.now,O=function(){for(var e={},n=0;n"); \ No newline at end of file diff --git a/dist/v2/custom/latest.js b/dist/v2/custom/latest.js deleted file mode 100644 index c78c647e..00000000 --- a/dist/v2/custom/latest.js +++ /dev/null @@ -1,3 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-03-02; d491) */ - -!function(o,n){if(o){function c(){var n=o.crypto||o.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11;return n?e.replace(/[018]/g,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)}):e.replace(/[018]/g,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}var s,u="https:",t="error",r=o.console,e="doNotTrack",i=o.navigator,f=o.location,p=o.document,a="Not sending requests ",h=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,m=o.addEventListener,v="https://"+n,g=undefined,y={version:2},w=function(e){r&&r.warn&&r.warn("Simple Analytics:",e)},E=Date.now,O=function(){for(var e={},n=0;n"); \ No newline at end of file diff --git a/dist/v2/custom/light.js b/dist/v2/custom/light.js deleted file mode 100644 index db324481..00000000 --- a/dist/v2/custom/light.js +++ /dev/null @@ -1,3 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-03-02; e4e6) */ - -!function(o,n){if(o){function c(){var n=o.crypto||o.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11;return n?e.replace(/[018]/g,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)}):e.replace(/[018]/g,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}var s,p="https:",t="error",r=o.console,e="doNotTrack",a=o.navigator,u=o.location,i=o.document,f="Not sending requests ",h=encodeURIComponent,m=decodeURIComponent,d=JSON.stringify,l=o.addEventListener,g="https://"+n,y=undefined,v={version:2},w=function(e){r&&r.warn&&r.warn("Simple Analytics:",e)},E=(Date.now,function(){for(var e={},n=0;n"); \ No newline at end of file diff --git a/dist/v2/latest.js b/dist/v2/latest.js deleted file mode 100644 index 252d27bb..00000000 --- a/dist/v2/latest.js +++ /dev/null @@ -1,3 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-03-02; 21e2) */ - -!function(o,n){if(o){function c(){var n=o.crypto||o.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11;return n?e.replace(/[018]/g,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)}):e.replace(/[018]/g,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}var s,u="https:",t="error",r=o.console,e="doNotTrack",i=o.navigator,f=o.location,p=o.document,a="Not sending requests ",h=encodeURIComponent,d=decodeURIComponent,l=JSON.stringify,m=o.addEventListener,v="https://queue."+n,g=undefined,y={version:2},w=function(e){r&&r.warn&&r.warn("Simple Analytics:",e)},E=Date.now,O=function(){for(var e={},n=0;n>e/4).toString(16)}):e.replace(/[018]/g,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}var s,p="https:",t="error",r=o.console,e="doNotTrack",a=o.navigator,u=o.location,i=o.document,f="Not sending requests ",h=encodeURIComponent,m=decodeURIComponent,d=JSON.stringify,l=o.addEventListener,g="https://"+n,y=undefined,v={version:2},w=function(e){r&&r.warn&&r.warn("Simple Analytics:",e)},E=(Date.now,function(){for(var e={},n=0;n"); \ No newline at end of file diff --git a/dist/v3/custom/app.js b/dist/v3/custom/app.js deleted file mode 100644 index 4120310f..00000000 --- a/dist/v3/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-25; a262) */ - -!function(s,e,n){var r,i,t;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,h=f.hostname,l=s.document,d=p.userAgent,g="Not sending request ",m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://"+n,E=undefined,b=l.documentElement||{},x="language",O="Height",A="scroll",M=A+O,S="offset"+O,T="client"+O,k=s.screen,$=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||/(bot|spider|crawl)/i.test(d)||s.chrome&&(""===p.languages||!(p.plugins instanceof PluginArray)),q={version:3};$&&(q.bot=!0);var B=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},C=Date.now,D=function(){var n=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,t=/[018]/g;try{return e.replace(t,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(t,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}},P=function(){for(var e={},n=arguments,t=0;t"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v3/custom/app.js.map b/dist/v3/custom/app.js.map deleted file mode 100644 index f91175a5..00000000 --- a/dist/v3/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n /(bot|spider|crawl)/i.test(userAgent) ||\n (window.chrome &&\n (nav.languages === \"\" || !(nav.plugins instanceof PluginArray)));\n\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 3,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","screen","bot","webdriver","__nightmare","test","chrome","languages","plugins","PluginArray","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","protocol","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v3/custom/e.js b/dist/v3/custom/e.js deleted file mode 100644 index 397443a3..00000000 --- a/dist/v3/custom/e.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-25; bf65) */ - -!function(s,e,n){var r,i,t;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,h=f.hostname,l=s.document,d=p.userAgent,g="Not sending request ",m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,E="https://"+n,_=undefined,b=l.documentElement||{},x="language",O="Height",A="scroll",M=A+O,S="offset"+O,T="client"+O,k=s.screen,$=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||/(bot|spider|crawl)/i.test(d)||s.chrome&&(""===p.languages||!(p.plugins instanceof PluginArray)),q={version:3};$&&(q.bot=!0);var B=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},C=Date.now,D=function(){var n=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,t=/[018]/g;try{return e.replace(t,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(t,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}},P=function(){for(var e={},n=arguments,t=0;t"); -//# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/v3/custom/e.js.map b/dist/v3/custom/e.js.map deleted file mode 100644 index 14eedc61..00000000 --- a/dist/v3/custom/e.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n /(bot|spider|crawl)/i.test(userAgent) ||\n (window.chrome &&\n (nav.languages === \"\" || !(nav.plugins instanceof PluginArray)));\n\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 3,\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","screen","bot","webdriver","__nightmare","test","chrome","languages","plugins","PluginArray","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","protocol","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v3/custom/latest.js b/dist/v3/custom/latest.js deleted file mode 100644 index 04cb71d3..00000000 --- a/dist/v3/custom/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-25; a262) */ - -!function(s,e,n){var r,i,t;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,h=f.hostname,l=s.document,d=p.userAgent,g="Not sending request ",m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://"+n,E=undefined,b=l.documentElement||{},x="language",O="Height",A="scroll",M=A+O,S="offset"+O,T="client"+O,k=s.screen,$=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||/(bot|spider|crawl)/i.test(d)||s.chrome&&(""===p.languages||!(p.plugins instanceof PluginArray)),q={version:3};$&&(q.bot=!0);var B=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},C=Date.now,D=function(){var n=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,t=/[018]/g;try{return e.replace(t,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(t,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}},P=function(){for(var e={},n=arguments,t=0;t"); -//# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/v3/custom/latest.js.map b/dist/v3/custom/latest.js.map deleted file mode 100644 index ea5f34d0..00000000 --- a/dist/v3/custom/latest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n /(bot|spider|crawl)/i.test(userAgent) ||\n (window.chrome &&\n (nav.languages === \"\" || !(nav.plugins instanceof PluginArray)));\n\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 3,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","screen","bot","webdriver","__nightmare","test","chrome","languages","plugins","PluginArray","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","protocol","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v3/custom/light.js b/dist/v3/custom/light.js deleted file mode 100644 index c1bd9c88..00000000 --- a/dist/v3/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-25; dc9a) */ - -!function(o,e,t){var n,r,a,i,c,p,u,s;if(o)try{var m="https:",f=o.console,d="doNotTrack",l=o.navigator,g=o.location,y=g.hostname,v=o.document,h=l.userAgent,w="Not sending request ",O=encodeURIComponent,b=decodeURIComponent,E=JSON.stringify,T=o.addEventListener,x="https://"+t,B=undefined,S=(v.documentElement,"language"),$=/(bot|spider|crawl)/i.test(h),A={version:3};$&&(A.bot=!0);var I,R=function(e){f&&f.warn&&f.warn("Simple Analytics:",e)},_=(Date.now,function(){var t=o.crypto||o.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),j=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v3/custom/light.js.map b/dist/v3/custom/light.js.map deleted file mode 100644 index c70aeb5b..00000000 --- a/dist/v3/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = /(bot|spider|crawl)/i.test(userAgent);\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 3,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","isPushState","pathOverwrite","data","perf","navigation","userNavigated","sameSite","path","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","bot","test","payload","version","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","pathname","performance","getEntriesByType","deleteSourceInfo","currentPage","protocol","sendPageView"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v3/custom/proxy.js b/dist/v3/custom/proxy.js deleted file mode 100644 index d55ad569..00000000 --- a/dist/v3/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-25; 8900) */ - -!function(s,e,n){var r,i,t;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,h=f.hostname,l=s.document,d=p.userAgent,g="Not sending request ",m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://"+n,E=undefined,b=l.documentElement||{},x="language",O="Height",A="scroll",M=A+O,S="offset"+O,T="client"+O,k=s.screen,P=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||/(bot|spider|crawl)/i.test(d)||s.chrome&&(""===p.languages||!(p.plugins instanceof PluginArray)),$={version:3};P&&($.bot=!0);var q=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},B=Date.now,C=function(){var n=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,t=/[018]/g;try{return e.replace(t,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(t,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}},D=function(){for(var e={},n=arguments,t=0;t"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v3/custom/proxy.js.map b/dist/v3/custom/proxy.js.map deleted file mode 100644 index bb640445..00000000 --- a/dist/v3/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n /(bot|spider|crawl)/i.test(userAgent) ||\n (window.chrome &&\n (nav.languages === \"\" || !(nav.plugins instanceof PluginArray)));\n\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 3,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","screen","bot","webdriver","__nightmare","test","chrome","languages","plugins","PluginArray","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","protocol","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v3/latest.js b/dist/v3/latest.js deleted file mode 100644 index 2df30a44..00000000 --- a/dist/v3/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-25; 06c6) */ - -!function(s,e,n){var r,i,t;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,l=f.hostname,h=s.document,d=p.userAgent,g="Not sending request ",m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://queue."+n,E=undefined,b=h.documentElement||{},O="language",x="Height",A="scroll",M=A+x,S="offset"+x,T="client"+x,k=s.screen,q=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||/(bot|spider|crawl)/i.test(d)||s.chrome&&(""===p.languages||!(p.plugins instanceof PluginArray)),$={version:3};q&&($.bot=!0);var B=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},C=Date.now,D=function(){var n=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,t=/[018]/g;try{return e.replace(t,function(e){return(e^n.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(t,function(e){var n=16*Math.random()|0;return(e<2?n:3&n|8).toString(16)})}},P=function(){for(var e={},n=arguments,t=0;t> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n 3,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","screen","bot","webdriver","__nightmare","test","chrome","languages","plugins","PluginArray","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v3/light.js b/dist/v3/light.js deleted file mode 100644 index c1bd9c88..00000000 --- a/dist/v3/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-25; dc9a) */ - -!function(o,e,t){var n,r,a,i,c,p,u,s;if(o)try{var m="https:",f=o.console,d="doNotTrack",l=o.navigator,g=o.location,y=g.hostname,v=o.document,h=l.userAgent,w="Not sending request ",O=encodeURIComponent,b=decodeURIComponent,E=JSON.stringify,T=o.addEventListener,x="https://"+t,B=undefined,S=(v.documentElement,"language"),$=/(bot|spider|crawl)/i.test(h),A={version:3};$&&(A.bot=!0);var I,R=function(e){f&&f.warn&&f.warn("Simple Analytics:",e)},_=(Date.now,function(){var t=o.crypto||o.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),j=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v3/light.js.map b/dist/v3/light.js.map deleted file mode 100644 index c70aeb5b..00000000 --- a/dist/v3/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = /(bot|spider|crawl)/i.test(userAgent);\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 3,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","isPushState","pathOverwrite","data","perf","navigation","userNavigated","sameSite","path","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","bot","test","payload","version","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","pathname","performance","getEntriesByType","deleteSourceInfo","currentPage","protocol","sendPageView"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v4/custom/app.js b/dist/v4/custom/app.js deleted file mode 100644 index c6ccb4e1..00000000 --- a/dist/v4/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-29; 6f53) */ - -!function(s,e,t){var r,i,n;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,h=f.hostname,l=s.document,d=p.userAgent,g="Not sending request ",m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://"+t,E=undefined,b=l.documentElement||{},x="language",O="Height",M="scroll",S=M+O,T="offset"+O,A="client"+O,k=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),$=s.screen,q=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||k,B={version:4};q&&(B.bot=!0);var C=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},D=Date.now,R=function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v4/custom/app.js.map b/dist/v4/custom/app.js.map deleted file mode 100644 index 8b9c1333..00000000 --- a/dist/v4/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 4,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","protocol","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v4/custom/e.js b/dist/v4/custom/e.js deleted file mode 100644 index dc0e4e07..00000000 --- a/dist/v4/custom/e.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-29; 78f1) */ - -!function(s,e,t){var r,i,n;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,h=f.hostname,l=s.document,d=p.userAgent,g="Not sending request ",m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,E="https://"+t,_=undefined,b=l.documentElement||{},x="language",O="Height",M="scroll",S=M+O,T="offset"+O,A="client"+O,k=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),$=s.screen,q=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||k,B={version:4};q&&(B.bot=!0);var C=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},D=Date.now,R=function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/v4/custom/e.js.map b/dist/v4/custom/e.js.map deleted file mode 100644 index 10470ef7..00000000 --- a/dist/v4/custom/e.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 4,\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","protocol","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v4/custom/latest.js b/dist/v4/custom/latest.js deleted file mode 100644 index 03af538a..00000000 --- a/dist/v4/custom/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-29; 6f53) */ - -!function(s,e,t){var r,i,n;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,h=f.hostname,l=s.document,d=p.userAgent,g="Not sending request ",m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://"+t,E=undefined,b=l.documentElement||{},x="language",O="Height",M="scroll",S=M+O,T="offset"+O,A="client"+O,k=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),$=s.screen,q=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||k,B={version:4};q&&(B.bot=!0);var C=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},D=Date.now,R=function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/v4/custom/latest.js.map b/dist/v4/custom/latest.js.map deleted file mode 100644 index a941765f..00000000 --- a/dist/v4/custom/latest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 4,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","protocol","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v4/custom/light.js b/dist/v4/custom/light.js deleted file mode 100644 index d8b023f8..00000000 --- a/dist/v4/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-29; c90a) */ - -!function(o,e,t){var n,r,a,i,c,p,u,s;if(o)try{var m="https:",f=o.console,d="doNotTrack",l=o.navigator,g=o.location,y=g.hostname,v=o.document,h=l.userAgent,w="Not sending request ",O=encodeURIComponent,b=decodeURIComponent,E=JSON.stringify,T=o.addEventListener,x="https://"+t,B=undefined,S=(v.documentElement,"language"),$=/(bot|spider|crawl)/i.test(h)&&!/(cubot)/i.test(h),A={version:4};$&&(A.bot=!0);var I,R=function(e){f&&f.warn&&f.warn("Simple Analytics:",e)},_=(Date.now,function(){var t=o.crypto||o.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),j=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v4/custom/light.js.map b/dist/v4/custom/light.js.map deleted file mode 100644 index 9a671b10..00000000 --- a/dist/v4/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 4,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","isPushState","pathOverwrite","data","perf","navigation","userNavigated","sameSite","path","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","isBotAgent","test","payload","version","bot","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","pathname","performance","getEntriesByType","deleteSourceInfo","currentPage","protocol","sendPageView"],"mappings":";;CAEA,SAAWA,EAAQC,EAAkBC,GA+SlB,IAAUC,EAAaC,EAShCC,EAQAC,EACAC,EAGAC,EAeAC,EAlCAC,EAhTR,GAAKV,EACL,IAQE,IAAIW,EAAQ,SAGRC,EAAMZ,EAAOa,QACbC,EAAa,aAEbC,EAAMf,EAAOgB,UACbC,EAAMjB,EAAOkB,SACbC,EAAmBF,EAAIG,SACvBC,EAAMrB,EAAOsB,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuB/B,EAAOgC,iBAC9BC,EAfWtB,WAe4BT,EACvCgC,EAAeC,UAEfC,GADkBf,EAAIgB,gBACX,YAQXC,EACF,sBAAsBC,KAAKhB,KAAe,WAAWgB,KAAKhB,GAQxDiB,EAAU,CACZC,QAyTJ,GA5TYH,IAKDE,EAAQE,KAAM,GAOvB,IAgGIC,EAhGAC,EAAO,SAAUC,GACfjC,GAAOA,EAAIgC,MAAMhC,EAAIgC,KAAK,oBAAqBC,IAKjDC,GAFMC,KAAKC,IAEJ,WACT,IAAIC,EAAejD,EAAOkD,QAAUlD,EAAOmD,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,SAKpBK,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMC,UACDC,EAAQ,EAAGA,EAAQF,EAAIG,OAAQD,IAAS,CAC/C,IAAIE,EAAaJ,EAAIE,GACrB,GAAIE,EACF,IAAK,IAAIC,KAAWD,EACdE,OAAOC,UAAUC,eAAeC,KAAKL,EAAYC,KACnDN,EAAGM,GAAWD,EAAWC,IAKjC,OAAON,GAOLW,EAAY,SAAUC,GAExB,IAAIC,EAAU5D,EAAI6D,OAAOC,MACvB,IAAIC,OAAO,QAAUJ,EAAQ,aAAc,OAEzCG,EAAQF,EACRA,EAAQI,IAAI,SAAUC,GACpB,OAAOA,EAAEC,MAAM,KAAK,KAEtB,GACJ,GAAIJ,GAASA,EAAM,GAAI,OAAOA,EAAM,IASlCK,EAAW,SAAU/E,EAAMgF,GAC7BhF,EAAO0D,EAAOvB,EAASnC,IACX,IAAIiF,OACVC,IACJtD,EACA,eACAsC,OAAOiB,KAAKnF,GACToF,OAAO,SAAUC,GAChB,OAAOrF,EAAKqF,IAAQxD,IAErB+C,IAAI,SAAUS,GACb,OACEjE,EAAuBiE,GACvB,IACAjE,EAAuBpB,EAAKqF,MAG/BC,KAAK,MAaZ,IACEhD,EAAWiD,KAAKC,iBAAiBC,kBAAkBC,SACnD,MAAOC,IAST,IAAIC,EAAgB5E,EAAI6E,cAAc,gBAAkBhG,EAAU,MAC9DiG,EAAO,SAAUF,EAAeG,GAClC,OAAOH,GAAiBA,EAAcI,aAAa,QAAUD,IAQ3DE,GAJOrG,EAAiBsG,MAAQJ,EAAKF,EAAe,QAKtDhG,EAAiBmB,UACjB+E,EAAKF,EAAe,aACpB9E,GAsBF,IAbAqB,EAAQpB,SAAWkF,KASKnF,IACtBqB,EAAQgE,kBAAoBrF,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAO8B,EAAKpB,EAAa,QAAUV,EAAa,eAGlD,IACoC,GAAlCK,EAAiBsF,QAAQ,MACzB,WAAWlE,KAAKpB,EAAiBmC,QAAQ,MAAO,KAEhD,OAAOV,EAAKpB,EAAa,QAAUL,GAMrC,IAEIuF,EAFAC,EAAO,GACPC,EAAa9D,IAIb+D,GACDxF,EAAIwF,UAAY,IACdvD,QAAQnC,EAAkBmF,GAC1BhD,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAASpB,EAG/B4E,EAAiB,UACjBC,EAAS,CACXA,OAAQpC,EAAUmC,EAAiB,cACnCE,OAAQrC,EAAUmC,EAAiB,UACnCG,SAAUtC,EAAUmC,EAAiB,YACrCI,KAAMvC,EAAUmC,EAAiB,QACjCK,QAASxC,EAAUmC,EAAiB,WACpCD,SAAUA,GAWRO,EAAiB,aAEjBC,EAAc,SAAUC,EAAIC,GAC9B,IAAIC,EAAS,CAAEC,KAAM,SAAUC,YAAaH,EAAOD,EAAKV,IAIpDW,GAAUH,KAAkBrG,EAG9BA,EAAIqG,GACFnF,EAAa,UACbJ,EAAUkC,EAAOvB,EAASgF,KAJ5BpC,EAASoC,IASbzF,EAAqB,SAAUsF,GAAa,GAO5C,IAAIM,EAAU,SAAUC,GAKtB,OAJWA,GAAajG,EAAuBV,EAAI4G,YAoC/CnH,EAAOiH,EAAQvH,KAGNsG,GAAgBhG,IAIzBL,EAAO,CACTK,KAHFgG,EAAehG,GAMXK,EAAIqB,KAAW/B,EAAK+B,GAAYrB,EAAIqB,IAKpC7B,EAAa,aAGbC,GAJAF,EAAON,EAAO8H,cAMhBxH,EAAKyH,kBACLzH,EAAKyH,iBAAiBxH,GAAY,IAClCD,EAAKyH,iBAAiBxH,GAAY,GAAGkH,MAG5B,EAFL,CAAC,SAAU,gBAAgBhB,QACzBnG,EAAKyH,iBAAiBxH,GAAY,GAAGkH,MAIvCnH,GACAA,EAAKC,KACoC,EAAzC,CAAC,EAAG,GAAGkG,QAAQnG,EAAKC,GAAYkH,MAGlChH,IAAWoG,GACXA,EAAS1B,MArUH,KAqUgB,IAAMmB,EAIhCK,EAAOtG,EAnEU,SAAUF,EAAa6H,EAAkBvH,GACtDN,GAAakH,EAAY,GAAKT,GAAY,GAC9CA,EAAa9D,IACb6D,EAAKW,GAAKV,EAEV,IAAIqB,EAAc3B,EAAkBqB,IAEpCvC,EACErB,EACE4C,EACAqB,EACI,CACEnB,SAAUpG,EAAWoG,EAAW,MAElCE,EACJ,CACEpG,MAAOM,EAAIiH,UAAYvH,EACvBgC,SAAUA,EACV8E,KA5RY,cAiSlBZ,EAAWoB,EA8CXE,CAAahI,EAAaA,GAAeK,EAAeC,IAO1D,MAAOuF,GACPpD,EAAKoD,IAlWT,CAqWEhG,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v4/custom/proxy.js b/dist/v4/custom/proxy.js deleted file mode 100644 index 85aa8320..00000000 --- a/dist/v4/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-29; 0a2a) */ - -!function(s,e,t){var r,i,n;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,h=f.hostname,l=s.document,d=p.userAgent,g="Not sending request ",m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://"+t,E=undefined,b=l.documentElement||{},x="language",O="Height",M="scroll",S=M+O,T="offset"+O,A="client"+O,k=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),$=s.screen,q=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||k,B={version:4};q&&(B.bot=!0);var C=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},D=Date.now,P=function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},R=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v4/custom/proxy.js.map b/dist/v4/custom/proxy.js.map deleted file mode 100644 index fd3a6094..00000000 --- a/dist/v4/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 4,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","protocol","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v4/latest.js b/dist/v4/latest.js deleted file mode 100644 index bd26ef86..00000000 --- a/dist/v4/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-29; bb25) */ - -!function(s,e,t){var r,i,n;if(s)try{var u="https:",a="error",o=s.console,c="doNotTrack",p=s.navigator,f=s.location,h=f.hostname,l=s.document,d=p.userAgent,m="Not sending request ",g=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://queue."+t,E=undefined,b=l.documentElement||{},O="language",x="Height",M="scroll",S=M+x,T="offset"+x,A="client"+x,k=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),q=s.screen,$=p.webdriver||s.__nightmare||"callPhantom"in s||"_phantom"in s||"phantom"in s||k,B={version:4};$&&(B.bot=!0);var C=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},D=Date.now,R=function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},I=function(){for(var e={},t=arguments,n=0;n> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var recordDnt = isBoolean(overwriteOptions.skipDnt)\n ? overwriteOptions.skipDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!recordDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) hiddenStart = now();\n else msHidden += now() - hiddenStart;\n },\n false\n );\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start + msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var isFunction = event instanceof Function;\n var callback =\n callbackRaw instanceof Function ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !isFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (isFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n 4,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","undefinedVar","undefined","documentElement","language","Height","scroll","scrollHeight","offsetHeight","clientHeight","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","recordDnt","skipDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","hidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","perf","navigation","userNavigated","sameSite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performance","getEntriesByType","unique","deleteSourceInfo","currentPage","sendPageView","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","isFunction","Function","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v4/light.js b/dist/v4/light.js deleted file mode 100644 index d8b023f8..00000000 --- a/dist/v4/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2020-06-29; c90a) */ - -!function(o,e,t){var n,r,a,i,c,p,u,s;if(o)try{var m="https:",f=o.console,d="doNotTrack",l=o.navigator,g=o.location,y=g.hostname,v=o.document,h=l.userAgent,w="Not sending request ",O=encodeURIComponent,b=decodeURIComponent,E=JSON.stringify,T=o.addEventListener,x="https://"+t,B=undefined,S=(v.documentElement,"language"),$=/(bot|spider|crawl)/i.test(h)&&!/(cubot)/i.test(h),A={version:4};$&&(A.bot=!0);var I,R=function(e){f&&f.warn&&f.warn("Simple Analytics:",e)},_=(Date.now,function(){var t=o.crypto||o.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),j=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v4/light.js.map b/dist/v4/light.js.map deleted file mode 100644 index 9a671b10..00000000 --- a/dist/v4/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n };\n if (bot) payload.bot = true;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n addEventListenerFunc(\"unload\", sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = overwrite || decodeURIComponentFunc(loc.pathname);\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n\n page = data;\n\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n 4,\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","isPushState","pathOverwrite","data","perf","navigation","userNavigated","sameSite","path","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","isBotAgent","test","payload","version","bot","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","pathname","performance","getEntriesByType","deleteSourceInfo","currentPage","protocol","sendPageView"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v5/custom/app.js b/dist/v5/custom/app.js deleted file mode 100644 index bb210fe4..00000000 --- a/dist/v5/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-07; 3696) */ - -!function(u,e,t){var r,i,n;if(u)try{var p="https:",a="error",o=u.console,c="doNotTrack",f=u.navigator,l=u.location,s=l.hostname,h=u.document,d=f.userAgent,g="Not sending request ",m=!1,v=encodeURIComponent,y=decodeURIComponent,w=JSON.stringify,_=u.addEventListener,b="https://"+t,E=undefined,x=h.documentElement||{},O="language",A="Height",M="scroll",S=f.userAgentData,T=M+A,D="offset"+A,$="client"+A,q="pagehide",B="platform",C="platformVersion",H=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),R=u.screen,k=f.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||H,I={version:"custom_app_5",ua:d};k&&(I.bot=!0),S&&(I.mobile=S.mobile,I.brands=w(S.brands));var P=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v5/custom/app.js.map b/dist/v5/custom/app.js.map deleted file mode 100644 index 0ce476fc..00000000 --- a/dist/v5/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_5\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v5/custom/latest.js b/dist/v5/custom/latest.js deleted file mode 100644 index f63b6efb..00000000 --- a/dist/v5/custom/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-07; bf5e) */ - -!function(u,e,t){var r,i,n;if(u)try{var p="https:",a="error",o=u.console,c="doNotTrack",f=u.navigator,l=u.location,s=l.hostname,h=u.document,d=f.userAgent,g="Not sending request ",m=!1,v=encodeURIComponent,y=decodeURIComponent,w=JSON.stringify,_=u.addEventListener,b="https://"+t,E=undefined,x=h.documentElement||{},O="language",A="Height",M="scroll",S=f.userAgentData,T=M+A,D="offset"+A,$="client"+A,q="pagehide",B="platform",C="platformVersion",H=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),R=u.screen,k=f.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||H,I={version:"custom_latest_5",ua:d};k&&(I.bot=!0),S&&(I.mobile=S.mobile,I.brands=w(S.brands));var P=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/v5/custom/latest.js.map b/dist/v5/custom/latest.js.map deleted file mode 100644 index f2fe22c1..00000000 --- a/dist/v5/custom/latest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_5\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v5/custom/light.js b/dist/v5/custom/light.js deleted file mode 100644 index 3529bd0a..00000000 --- a/dist/v5/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-07; 0f22) */ - -!function(p,e,t){if(p)try{var u="https:",n=p.console,r="doNotTrack",f=p.navigator,m=p.location,o=m.hostname,a=p.document,i=f.userAgent,c="Not sending request ",l=!1,s=encodeURIComponent,d=decodeURIComponent,g=JSON.stringify,y=p.addEventListener,h="https://"+t,v=undefined,w=(a.documentElement,"language"),b=f.userAgentData,E="platform",O="platformVersion",_=/(bot|spider|crawl)/i.test(i)&&!/(cubot)/i.test(i),T={version:"custom_light_5",ua:i};_&&(T.bot=!0),b&&(T.mobile=b.mobile,T.brands=g(b.brands));var x,A=function(e){n&&n.warn&&n.warn("Simple Analytics:",e)},B=(Date.now,function(){var t=p.crypto||p.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),S=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v5/custom/light.js.map b/dist/v5/custom/light.js.map deleted file mode 100644 index 9938744c..00000000 --- a/dist/v5/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_5\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","uaData","userAgentData","platformText","platformVersionText","isBotAgent","test","payload","version","ua","bot","mobile","brands","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","path","pathname","isPushState","pathOverwrite","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v5/custom/proxy.js b/dist/v5/custom/proxy.js deleted file mode 100644 index fb5a2070..00000000 --- a/dist/v5/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-07; 8294) */ - -!function(u,e,t){var r,i,n;if(u)try{var p="https:",a="error",o=u.console,c="doNotTrack",f=u.navigator,l=u.location,s=l.hostname,h=u.document,d=f.userAgent,g="Not sending request ",m=!1,v=encodeURIComponent,y=decodeURIComponent,w=JSON.stringify,_=u.addEventListener,b="https://"+t,E=undefined,x=h.documentElement||{},O="language",A="Height",M="scroll",S=f.userAgentData,T=M+A,D="offset"+A,$="client"+A,q="pagehide",B="platform",C="platformVersion",H=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),P=u.screen,R=f.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||H,k={version:"custom_proxy_5",ua:d};R&&(k.bot=!0),S&&(k.mobile=S.mobile,k.brands=w(S.brands));var I=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v5/custom/proxy.js.map b/dist/v5/custom/proxy.js.map deleted file mode 100644 index f892b17e..00000000 --- a/dist/v5/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_5\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v5/latest.js b/dist/v5/latest.js deleted file mode 100644 index 0ef280a0..00000000 --- a/dist/v5/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-07; 1650) */ - -!function(u,e,t){var r,i,n;if(u)try{var p="https:",a="error",o=u.console,c="doNotTrack",f=u.navigator,l=u.location,s=l.hostname,h=u.document,d=f.userAgent,g="Not sending request ",m=!1,v=encodeURIComponent,y=decodeURIComponent,w=JSON.stringify,_=u.addEventListener,b="https://queue."+t,E=undefined,O=h.documentElement||{},x="language",A="Height",M="scroll",S=f.userAgentData,T=M+A,q="offset"+A,D="client"+A,$="pagehide",B="platform",C="platformVersion",R=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),k=u.screen,H=f.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||R,I={version:"cdn_latest_5",ua:d};H&&(I.bot=!0),S&&(I.mobile=S.mobile,I.brands=w(S.brands));var P=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_5\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","undefinedVar","undefined","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v5/light.js b/dist/v5/light.js deleted file mode 100644 index 9af9178e..00000000 --- a/dist/v5/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-07; 196a) */ - -!function(s,e,t){if(s)try{var u="https:",n=s.console,r="doNotTrack",f=s.navigator,m=s.location,o=m.hostname,a=s.document,i=f.userAgent,c="Not sending request ",l=!1,p=encodeURIComponent,d=decodeURIComponent,g=JSON.stringify,y=s.addEventListener,h="https://"+t,v=undefined,w=(a.documentElement,"language"),b=f.userAgentData,E="platform",O="platformVersion",_=/(bot|spider|crawl)/i.test(i)&&!/(cubot)/i.test(i),T={version:"cdn_light_5",ua:i};_&&(T.bot=!0),b&&(T.mobile=b.mobile,T.brands=g(b.brands));var x,A=function(e){n&&n.warn&&n.warn("Simple Analytics:",e)},B=(Date.now,function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),S=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v5/light.js.map b/dist/v5/light.js.map deleted file mode 100644 index 1653ed0a..00000000 --- a/dist/v5/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current hostname\n var sameSite = referrer\n ? referrer.split(slash)[0] == definedHostname\n : false;\n\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"cdn_light_5\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","uaData","userAgentData","platformText","platformVersionText","isBotAgent","test","payload","version","ua","bot","mobile","brands","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","path","pathname","isPushState","pathOverwrite","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v6/custom/app.js b/dist/v6/custom/app.js deleted file mode 100644 index 88ed45a8..00000000 --- a/dist/v6/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-26; 5120) */ - -!function(u,e,t){var r,i,n;if(u)try{var p="https:",a="error",o=u.console,c="doNotTrack",f=u.navigator,l=u.location,h=l.hostname,d=u.document,s=f.userAgent,g="Not sending request ",m=!1,v=encodeURIComponent,y=decodeURIComponent,w=JSON.stringify,_=u.addEventListener,b="https://"+t,E=undefined,x=d.documentElement||{},O="language",A="Height",M="scroll",S=f.userAgentData,T=M+A,D="offset"+A,$="client"+A,q="pagehide",B="platform",C="platformVersion",H=/(bot|spider|crawl)/i.test(s)&&!/(cubot)/i.test(s),R=u.screen,k=f.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||H,I={version:"custom_app_6",ua:s};k&&(I.bot=!0),S&&(I.mobile=S.mobile,I.brands=w(S.brands));var P=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v6/custom/app.js.map b/dist/v6/custom/app.js.map deleted file mode 100644 index 824cfdf6..00000000 --- a/dist/v6/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(\"/\")[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_6\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v6/custom/latest.js b/dist/v6/custom/latest.js deleted file mode 100644 index c75032ea..00000000 --- a/dist/v6/custom/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-26; 14b7) */ - -!function(u,e,t){var r,i,n;if(u)try{var p="https:",a="error",o=u.console,c="doNotTrack",f=u.navigator,l=u.location,h=l.hostname,d=u.document,s=f.userAgent,g="Not sending request ",m=!1,v=encodeURIComponent,y=decodeURIComponent,w=JSON.stringify,_=u.addEventListener,b="https://"+t,E=undefined,x=d.documentElement||{},O="language",A="Height",M="scroll",S=f.userAgentData,T=M+A,D="offset"+A,$="client"+A,q="pagehide",B="platform",C="platformVersion",H=/(bot|spider|crawl)/i.test(s)&&!/(cubot)/i.test(s),R=u.screen,k=f.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||H,I={version:"custom_latest_6",ua:s};k&&(I.bot=!0),S&&(I.mobile=S.mobile,I.brands=w(S.brands));var P=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/v6/custom/latest.js.map b/dist/v6/custom/latest.js.map deleted file mode 100644 index 4662d055..00000000 --- a/dist/v6/custom/latest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(\"/\")[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_6\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v6/custom/light.js b/dist/v6/custom/light.js deleted file mode 100644 index 346d854c..00000000 --- a/dist/v6/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-26; 2a50) */ - -!function(p,e,t){if(p)try{var u="https:",n=p.console,r="doNotTrack",f=p.navigator,m=p.location,l=m.hostname,d=p.document,o=f.userAgent,a="Not sending request ",g=!1,i=encodeURIComponent,c=decodeURIComponent,s=JSON.stringify,y=p.addEventListener,h="https://"+t,v=undefined,w=(d.documentElement,"language"),b=f.userAgentData,E="platform",O="platformVersion",_=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),T={version:"custom_light_6",ua:o};_&&(T.bot=!0),b&&(T.mobile=b.mobile,T.brands=s(b.brands));var x,A=function(e){n&&n.warn&&n.warn("Simple Analytics:",e)},B=(Date.now,function(){var t=p.crypto||p.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),S=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v6/custom/light.js.map b/dist/v6/custom/light.js.map deleted file mode 100644 index 308be46b..00000000 --- a/dist/v6/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(\"/\")[2] == locationHostname\n : false;\n\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_6\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","uaData","userAgentData","platformText","platformVersionText","isBotAgent","test","payload","version","ua","bot","mobile","brands","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","path","pathname","isPushState","pathOverwrite","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":";;CAEA,SAAWA,EAAQC,EAAkBC,GACnC,GAAKF,EACL,IAQE,IAAIG,EAAQ,SAGRC,EAAMJ,EAAOK,QACbC,EAAa,aAEbC,EAAMP,EAAOQ,UACbC,EAAMT,EAAOU,SACbC,EAAmBF,EAAIG,SACvBC,EAAMb,EAAOc,SACbC,EAAYR,EAAIQ,UAChBC,EAAa,uBACbC,GAA2B,EAC3BC,EAAyBC,mBACzBC,EAAyBC,mBACzBC,EAAYC,KAAKD,UAEjBE,EAAuBxB,EAAOyB,iBAC9BC,EAhBWvB,WAgB4BD,EACvCyB,EAAeC,UAEfC,GADkBhB,EAAIiB,gBACX,YAIXC,EAASxB,EAAIyB,cAMbC,EAAe,WACfC,EAAsB,kBACtBC,EACF,sBAAsBC,KAAKrB,KAAe,WAAWqB,KAAKrB,GAQxDsB,EAAU,CACZC,QAsWJ,iBArWIC,GAAIxB,GAJIoB,IAMDE,EAAQG,KAAM,GAInBT,IACFM,EAAQI,OAASV,EAAOU,OACxBJ,EAAQK,OAASpB,EAAUS,EAAOW,SAQpC,IAoGIC,EApGAC,EAAO,SAAUC,GACfzC,GAAOA,EAAIwC,MAAMxC,EAAIwC,KAAK,oBAAqBC,IAKjDC,GAFMC,KAAKC,IAEJ,WACT,IAAIC,EAAejD,EAAOkD,QAAUlD,EAAOmD,SACvCC,EAAY,CAAC,MAAQ,KAAO,KAAO,KAAO,KAC1CC,EAAY,SAEhB,IACE,OAAOD,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,OACEA,EACCN,EAAaO,gBAAgB,IAAIC,WAAW,IAAI,GAC9C,IAAOF,EAAI,GACdG,SAAS,MAEb,MAAOC,GACP,OAAOP,EAAUE,QAAQD,EAAW,SAAUE,GAC5C,IAAIK,EAAqB,GAAhBC,KAAKC,SAAiB,EAE/B,OADMP,EAAI,EAAIK,EAAS,EAAJA,EAAW,GACrBF,SAAS,SASpBK,EAAS,WAGX,IAFA,IAAIC,EAAK,GACLC,EAAMC,UACDC,EAAQ,EAAGA,EAAQF,EAAIG,OAAQD,IAAS,CAC/C,IAAIE,EAAaJ,EAAIE,GACrB,GAAIE,EACF,IAAK,IAAIC,KAAWD,EACdE,OAAOC,UAAUC,eAAeC,KAAKL,EAAYC,KACnDN,EAAGM,GAAWD,EAAWC,IAKjC,OAAON,GAOLW,EAAY,SAAUC,GAExB,IAAIC,EAAUpE,EAAIqE,OAAOC,MACvB,IAAIC,OAAO,QAAUJ,EAAQ,aAAc,OAEzCG,EAAQF,EACRA,EAAQI,IAAI,SAAUC,GACpB,OAAOA,EAAEC,MAAM,KAAK,KAEtB,GACJ,GAAIJ,GAASA,EAAM,GAAI,OAAOA,EAAM,IASlCK,EAAW,SAAUC,EAAMC,GAC7BD,EAAOtB,EAAO1B,EAASgD,IACX,IAAIE,OACVC,IACJ9D,EACA,eACA6C,OAAOkB,KAAKJ,GACTK,OAAO,SAAUC,GAChB,OAAON,EAAKM,IAAQhE,IAErBsD,IAAI,SAAUU,GACb,OACEzE,EAAuByE,GACvB,IACAzE,EAAuBmE,EAAKM,MAG/BC,KAAK,MAaZ,IACEjD,EAAWkD,KAAKC,iBAAiBC,kBAAkBC,SACnD,MAAOC,IAST,IAAIC,EAAgBrF,EAAIsF,cAAc,gBAAkBjG,EAAU,MAC9DkG,EAAO,SAAUF,EAAeG,GAClC,OAAOH,GAAiBA,EAAcI,aAAa,QAAUD,IAQ3DE,GAJOtG,EAAiBuG,MAAQJ,EAAKF,EAAe,QAKtDjG,EAAiBW,UACjBwF,EAAKF,EAAe,aACpBvF,GAsBF,IAbA0B,EAAQzB,SAAW2F,KASK5F,IACtB0B,EAAQoE,kBAAoB9F,GAG1BL,KAAcC,GAA0B,KAAnBA,EAAID,GAC3B,OAAOsC,EAAK5B,EAAa,QAAUV,EAAa,eAGlD,IACoC,GAAlCK,EAAiB+F,QAAQ,MACzB,WAAWtE,KAAKzB,EAAiB2C,QAAQ,MAAO,KAEhD,OAAOV,EAAK5B,EAAa,QAAUL,GAMrC,IAEIgG,EAFAC,EAAO,GACPC,EAAa/D,IAIbgE,GACDjG,EAAIiG,UAAY,IACdxD,QAAQ3C,EAAkB4F,GAC1BjD,QAAQ,sDAAuD,MAC/DA,QAAQ,YAAa,OAAS3B,EAG/BoF,EAAiB,UACjBC,EAAS,CACXA,OAAQrC,EAAUoC,EAAiB,cACnCE,OAAQtC,EAAUoC,EAAiB,UACnCG,SAAUvC,EAAUoC,EAAiB,YACrCI,KAAMxC,EAAUoC,EAAiB,QACjCK,QAASzC,EAAUoC,EAAiB,WACpCD,SAAUA,GAURO,EAAiB,aAEjBC,EAAc,SAAUC,EAAIC,GAC9B,IAAIC,EAAS,CAAEC,KAAM,SAAUC,YAAaH,EAAOD,EAAKV,IAIpDW,GAAUH,KAAkB9G,EAG9BA,EAAI8G,GACF3F,EAAa,UACbJ,EAAUyC,EAAO1B,EAASoF,KAJ5BrC,EAASqC,IAUbjG,EA9Oe,WA8OgB8F,GAAa,GAO5C,IAAIM,EAAU,SAAUC,GACtB,IAAIC,EAAO,GAIX,IACEA,EAAOD,GAAazG,EAAuBX,EAAIsH,UAC/C,MAAO9B,IAMT,OAAO6B,IA8BM,SAAUE,EAAaC,GAEpC,IAAIH,EAAOF,EAAQK,GAGnB,GAAKH,GAAQnB,GAAgBmB,EAA7B,CAIA,IAAIzC,EAAO,CACTyC,KAHFnB,EAAemB,GAMXvH,EAAIsB,KAAWwD,EAAKxD,GAAYtB,EAAIsB,IAIxC,IAAIqG,EAAOlI,EAAOmI,YACdC,EAAa,aAGbC,EACFH,GACAA,EAAKI,kBACLJ,EAAKI,iBAAiBF,GAAY,IAClCF,EAAKI,iBAAiBF,GAAY,GAAGV,MAG5B,EAFL,CAAC,SAAU,gBAAgBhB,QACzBwB,EAAKI,iBAAiBF,GAAY,GAAGV,MAIvCQ,GACAA,EAAKE,KACoC,EAAzC,CAAC,EAAG,GAAG1B,QAAQwB,EAAKE,GAAYV,MAGlCa,IAAWzB,GACXjG,EAAIiG,SAAS3B,MAAM,KAAK,IAAMxE,EAIlCiG,EAAOvB,EAEP,IAAImD,EAAsB,WACxBvH,GAA2B,EAtEZ,SAAU+G,EAAaS,EAAkBF,GACtDP,GAAaV,EAAY,GAAKT,GAAY,GAC9CA,EAAa/D,IACb8D,EAAKW,GAAKV,EAEV,IAAI6B,EAAcnC,EAAkBqB,IAEpCxC,EACErB,EACE6C,EACA6B,EACI,CACE3B,SAAUyB,EAAWzB,EAAW,MAElCE,EACJ,CACE7G,MAAOM,EAAIkI,UAAYxI,EACvBwC,SAAUA,EACV+E,KArTY,cA0TlBZ,EAAW4B,EAgDTE,CAAaZ,EAAaA,GAAeK,EAAeE,IAG1D,GAAKtH,EAmBHuH,SAjBA,IACMzG,GAxRc,mBAwROA,EAAO8G,qBAC9B9G,EACG8G,qBAAqB,CAAC5G,EAAcC,IACpC4G,KAAK,SAAUC,GACd1G,EAAQ2G,QAAUD,EAAkB9G,GACpCI,EAAQ4G,WAAaF,EAAkB7G,GACvCsG,MAEDU,SAAMV,GAETA,IAEF,MAAOvC,GACPuC,MASNW,GAEA,MAAOlD,GACPrD,EAAKqD,IApZT,CAuZEjG,OACA,uBACA"} \ No newline at end of file diff --git a/dist/v6/custom/proxy.js b/dist/v6/custom/proxy.js deleted file mode 100644 index ff624408..00000000 --- a/dist/v6/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-26; 59af) */ - -!function(u,e,t){var r,i,n;if(u)try{var p="https:",a="error",o=u.console,c="doNotTrack",f=u.navigator,l=u.location,h=l.hostname,d=u.document,s=f.userAgent,g="Not sending request ",m=!1,v=encodeURIComponent,y=decodeURIComponent,w=JSON.stringify,_=u.addEventListener,b="https://"+t,E=undefined,x=d.documentElement||{},O="language",A="Height",M="scroll",S=f.userAgentData,T=M+A,D="offset"+A,$="client"+A,q="pagehide",B="platform",C="platformVersion",H=/(bot|spider|crawl)/i.test(s)&&!/(cubot)/i.test(s),P=u.screen,R=f.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||H,k={version:"custom_proxy_6",ua:s};R&&(k.bot=!0),S&&(k.mobile=S.mobile,k.brands=w(S.brands));var I=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v6/custom/proxy.js.map b/dist/v6/custom/proxy.js.map deleted file mode 100644 index 266c7047..00000000 --- a/dist/v6/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(\"/\")[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_6\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v6/latest.js b/dist/v6/latest.js deleted file mode 100644 index 95bc3265..00000000 --- a/dist/v6/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-26; 86df) */ - -!function(u,e,t){var r,i,n;if(u)try{var p="https:",a="error",o=u.console,c="doNotTrack",f=u.navigator,l=u.location,h=l.hostname,d=u.document,s=f.userAgent,g="Not sending request ",m=!1,v=encodeURIComponent,y=decodeURIComponent,w=JSON.stringify,_=u.addEventListener,b="https://queue."+t,E=undefined,O=d.documentElement||{},x="language",A="Height",M="scroll",S=f.userAgentData,T=M+A,q="offset"+A,D="client"+A,$="pagehide",B="platform",C="platformVersion",R=/(bot|spider|crawl)/i.test(s)&&!/(cubot)/i.test(s),k=u.screen,H=f.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||R,I={version:"cdn_latest_6",ua:s};H&&(I.bot=!0),S&&(I.mobile=S.mobile,I.brands=w(S.brands));var P=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == \"/\" ? ignorePageRaw : \"/\" + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == \"true\" ||\n attr(scriptElement, \"skip-dnt\") == \"true\";\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : typeof ignorePagesRaw == \"string\" && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(\"/\")[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event)\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) sendEvent(queue[event]);\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_6\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","type","orig","value","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","undefinedVar","undefined","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","autoCollect","functionName","saGlobal","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v6/light.js b/dist/v6/light.js deleted file mode 100644 index d75f6740..00000000 --- a/dist/v6/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-02-26; e380) */ - -!function(s,e,t){if(s)try{var u="https:",n=s.console,r="doNotTrack",f=s.navigator,m=s.location,l=m.hostname,d=s.document,o=f.userAgent,a="Not sending request ",g=!1,i=encodeURIComponent,c=decodeURIComponent,p=JSON.stringify,y=s.addEventListener,h="https://"+t,v=undefined,w=(d.documentElement,"language"),b=f.userAgentData,E="platform",O="platformVersion",_=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),T={version:"cdn_light_6",ua:o};_&&(T.bot=!0),b&&(T.mobile=b.mobile,T.brands=p(b.brands));var x,A=function(e){n&&n.warn&&n.warn("Simple Analytics:",e)},B=(Date.now,function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),S=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v6/light.js.map b/dist/v6/light.js.map deleted file mode 100644 index 2dac8676..00000000 --- a/dist/v6/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n if (!window) return;\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var slash = \"/\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\");\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(\"/\")[2] == locationHostname\n : false;\n\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"cdn_light_6\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","uaData","userAgentData","platformText","platformVersionText","isBotAgent","test","payload","version","ua","bot","mobile","brands","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","path","pathname","isPushState","pathOverwrite","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v7/custom/app.js b/dist/v7/custom/app.js deleted file mode 100644 index 459c2de8..00000000 --- a/dist/v7/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; c016; SRI-version; v7) */ - -!function(u,e,t,n){try{var r=n+"_loaded";if(!u||!0===u[r])return;u[r]=!0;var p="https:",i="error",a=u.console,o="doNotTrack",l=u.navigator,f=u.location,h=f.hostname,d=u.document,c=l.userAgent,s="Not sending request ",g=!1,m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=u.addEventListener,_="https://"+t,b=undefined,E=d.documentElement||{},O="language",x="Height",A="scroll",S="true",M=l.userAgentData,T=A+x,D="offset"+x,$="client"+x,q="pagehide",B="platform",C="platformVersion",H=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),P=u.screen,R=l.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||H,j={version:"custom_app_7",ua:c};R&&(j.bot=!0),j.sri=!0,M&&(j.mobile=M.mobile,j.brands=y(M.brands));var k=function(e){a&&a.warn&&a.warn("Simple Analytics:",e)},I=Date.now,V=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n","sa_event"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v7/custom/app.js.map b/dist/v7/custom/app.js.map deleted file mode 100644 index 854c1e86..00000000 --- a/dist/v7/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : isString(ignorePagesRaw) && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (Object.prototype.hasOwnProperty.call(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_7\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","sri","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","mode","collectDnt","value","autoCollect","functionName","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v7/custom/latest.js b/dist/v7/custom/latest.js deleted file mode 100644 index c776191e..00000000 --- a/dist/v7/custom/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-04-20; f9eb; SRI-version; v7) */ - -!function(u,e,t,n){try{var r=n+"_loaded";if(!u||!0===u[r])return;u[r]=!0;var p="https:",i="error",a=u.console,o="doNotTrack",l=u.navigator,f=u.location,h=f.hostname,d=u.document,c=l.userAgent,s="Not sending request ",g=!1,m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=u.addEventListener,_="https://"+t,b=undefined,E=d.documentElement||{},x="language",O="Height",A="scroll",M="true",S=l.userAgentData,T=A+O,D="offset"+O,$="client"+O,q="pagehide",B="platform",C="platformVersion",H=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),R=u.screen,k=l.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||H,I={version:"custom_latest_7",ua:c};k&&(I.bot=!0),I.sri=!0,S&&(I.mobile=S.mobile,I.brands=y(S.brands));var P=function(e){a&&a.warn&&a.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n","sa_event"); -//# sourceMappingURL=latest.js.map \ No newline at end of file diff --git a/dist/v7/custom/latest.js.map b/dist/v7/custom/latest.js.map deleted file mode 100644 index f59800dd..00000000 --- a/dist/v7/custom/latest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"latest.source.js","sources":["latest.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : isString(ignorePagesRaw) && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_7\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","sri","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","value","autoCollect","functionName","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v7/custom/light.js b/dist/v7/custom/light.js deleted file mode 100644 index 06be653d..00000000 --- a/dist/v7/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; ecf1; SRI-version; v7) */ - -!function(p,e,t){try{var n="sa_event_loaded";if(!p||!0===p[n])return;p[n]=!0;var u="https:",r=p.console,a="doNotTrack",f=p.navigator,m=p.location,l=m.hostname,d=p.document,o=f.userAgent,i="Not sending request ",g=!1,c=encodeURIComponent,s=decodeURIComponent,y=JSON.stringify,h=p.addEventListener,v="https://"+t,w=undefined,b=(d.documentElement,"language"),_=f.userAgentData,E="platform",O="platformVersion",S=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),T={version:"custom_light_7",ua:o};S&&(T.bot=!0),T.sri=!0,_&&(T.mobile=_.mobile,T.brands=y(_.brands));var x,A=function(e){r&&r.warn&&r.warn("Simple Analytics:",e)},B=(Date.now,function(){var t=p.crypto||p.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),$=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v7/custom/light.js.map b/dist/v7/custom/light.js.map deleted file mode 100644 index 4970a5d2..00000000 --- a/dist/v7/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_7\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","loadedVariable","saGlobal","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","uaData","userAgentData","platformText","platformVersionText","isBotAgent","test","payload","version","ua","bot","sri","mobile","brands","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","path","pathname","isPushState","pathOverwrite","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v7/custom/proxy.js b/dist/v7/custom/proxy.js deleted file mode 100644 index f734be5f..00000000 --- a/dist/v7/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; 26b3; SRI-version; v7) */ - -!function(u,e,t,n){try{var r=n+"_loaded";if(!u||!0===u[r])return;u[r]=!0;var p="https:",i="error",a=u.console,o="doNotTrack",l=u.navigator,f=u.location,h=f.hostname,d=u.document,c=l.userAgent,s="Not sending request ",g=!1,m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=u.addEventListener,_="https://"+t,b=undefined,E=d.documentElement||{},x="language",O="Height",A="scroll",S="true",M=l.userAgentData,T=A+O,D="offset"+O,P="client"+O,$="pagehide",q="platform",B="platformVersion",C=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),H=u.screen,R=l.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||C,j={version:"custom_proxy_7",ua:c};R&&(j.bot=!0),j.sri=!0,M&&(j.mobile=M.mobile,j.brands=y(M.brands));var k=function(e){a&&a.warn&&a.warn("Simple Analytics:",e)},I=Date.now,V=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n","sa_event"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v7/custom/proxy.js.map b/dist/v7/custom/proxy.js.map deleted file mode 100644 index f74dbe88..00000000 --- a/dist/v7/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : isString(ignorePagesRaw) && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (Object.prototype.hasOwnProperty.call(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_7\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","sri","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","mode","collectDnt","value","autoCollect","functionName","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v7/custom/v7.js b/dist/v7/custom/v7.js deleted file mode 100644 index e1a119a7..00000000 --- a/dist/v7/custom/v7.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; ef44; SRI-version; v7) */ - -!function(u,e,t,n){try{var r=n+"_loaded";if(!u||!0===u[r])return;u[r]=!0;var p="https:",i="error",a=u.console,o="doNotTrack",l=u.navigator,f=u.location,h=f.hostname,d=u.document,c=l.userAgent,s="Not sending request ",g=!1,m=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=u.addEventListener,_="https://"+t,b=undefined,E=d.documentElement||{},O="language",x="Height",A="scroll",S="true",M=l.userAgentData,T=A+x,D="offset"+x,$="client"+x,q="pagehide",B="platform",C="platformVersion",H=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),P=u.screen,R=l.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||H,j={version:"custom_latest_7",ua:c};R&&(j.bot=!0),j.sri=!0,M&&(j.mobile=M.mobile,j.brands=y(M.brands));var k=function(e){a&&a.warn&&a.warn("Simple Analytics:",e)},I=Date.now,V=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n","sa_event"); -//# sourceMappingURL=v7.js.map \ No newline at end of file diff --git a/dist/v7/custom/v7.js.map b/dist/v7/custom/v7.js.map deleted file mode 100644 index 842690d0..00000000 --- a/dist/v7/custom/v7.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"v7.js","sources":["v7.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : isString(ignorePagesRaw) && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (Object.prototype.hasOwnProperty.call(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_7\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","sri","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","mode","collectDnt","value","autoCollect","functionName","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v7/latest.js b/dist/v7/latest.js deleted file mode 100644 index 8d7011df..00000000 --- a/dist/v7/latest.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-04-20; f5a9; SRI-version; v7) */ - -!function(u,e,t,n){try{var r=n+"_loaded";if(!u||!0===u[r])return;u[r]=!0;var l="https:",i="error",a=u.console,o="doNotTrack",p=u.navigator,f=u.location,h=f.hostname,d=u.document,c=p.userAgent,s="Not sending request ",m=!1,g=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=u.addEventListener,_="https://queue."+t,b=undefined,E=d.documentElement||{},O="language",x="Height",A="scroll",M="true",S=p.userAgentData,T=A+x,D="offset"+x,q="client"+x,$="pagehide",B="platform",C="platformVersion",R=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),k=u.screen,H=p.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||R,I={version:"cdn_latest_7",ua:c};H&&(I.bot=!0),I.sri=!0,S&&(I.mobile=S.mobile,I.brands=y(S.brands));var P=function(e){a&&a.warn&&a.warn("Simple Analytics:",e)},V=Date.now,j=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement = doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : isString(ignorePagesRaw) && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_7\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","sri","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","querySelector","attr","attribute","getAttribute","mode","collectDnt","value","autoCollect","functionName","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v7/light.js b/dist/v7/light.js deleted file mode 100644 index bcbd2a8c..00000000 --- a/dist/v7/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; 44b6; SRI-version; v7) */ - -!function(p,e,t){try{var n="sa_event_loaded";if(!p||!0===p[n])return;p[n]=!0;var u="https:",r=p.console,a="doNotTrack",f=p.navigator,m=p.location,l=m.hostname,d=p.document,o=f.userAgent,i="Not sending request ",g=!1,c=encodeURIComponent,s=decodeURIComponent,y=JSON.stringify,h=p.addEventListener,v="https://"+t,w=undefined,b=(d.documentElement,"language"),_=f.userAgentData,E="platform",O="platformVersion",S=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),T={version:"cdn_light_7",ua:o};S&&(T.bot=!0),T.sri=!0,_&&(T.mobile=_.mobile,T.brands=y(_.brands));var x,A=function(e){r&&r.warn&&r.warn("Simple Analytics:",e)},B=(Date.now,function(){var t=p.crypto||p.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),$=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v7/light.js.map b/dist/v7/light.js.map deleted file mode 100644 index 1c387e75..00000000 --- a/dist/v7/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n\n\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"cdn_light_7\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","loadedVariable","saGlobal","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","uaData","userAgentData","platformText","platformVersionText","isBotAgent","test","payload","version","ua","bot","sri","mobile","brands","timezone","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","definedHostname","mode","hostname_original","indexOf","lastSendPath","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","path","pathname","isPushState","pathOverwrite","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v7/v7.js b/dist/v7/v7.js deleted file mode 100644 index 754dc5bf..00000000 --- a/dist/v7/v7.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; d337; SRI-version; v7) */ - -!function(u,e,t,n){try{var r=n+"_loaded";if(!u||!0===u[r])return;u[r]=!0;var p="https:",a="error",i=u.console,o="doNotTrack",l=u.navigator,f=u.location,h=f.hostname,d=u.document,c=l.userAgent,s="Not sending request ",m=!1,g=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=u.addEventListener,_="https://queue."+t,b=undefined,E=d.documentElement||{},O="language",x="Height",A="scroll",S="true",M=l.userAgentData,T=A+x,D="offset"+x,q="client"+x,$="pagehide",B="platform",C="platformVersion",P=/(bot|spider|crawl)/i.test(c)&&!/(cubot)/i.test(c),R=u.screen,j=l.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||P,k={version:"cdn_latest_7",ua:c};j&&(k.bot=!0),k.sri=!0,M&&(k.mobile=M.mobile,k.brands=y(M.brands));var H=function(e){i&&i.warn&&i.warn("Simple Analytics:",e)},I=Date.now,V=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},N=function(e){return"function"==typeof e},U=function(){for(var e={},t=arguments,n=0;n> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : isString(ignorePagesRaw) && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (Object.prototype.hasOwnProperty.call(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_7\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","sri","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","mode","collectDnt","value","autoCollect","functionName","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v8/auto-events.js b/dist/v8/auto-events.js deleted file mode 100644 index 5881f899..00000000 --- a/dist/v8/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; 46e5; SRI-version; v8) */ - -function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For minifying the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n var event;\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, callback);\n\n log(\"collected \" + clean);\n\n return window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var collect = false;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\")) {\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \".(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (collect) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n }\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","onClickAttribute","link","collect","getAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","setAttribute","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","saAutomatedLink","element","sent","callback","theTitle","useTitle","event","pop","clean","replace","setTimeout","readyState","addEventListener","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v8/custom/app.js b/dist/v8/custom/app.js deleted file mode 100644 index 274c90e8..00000000 --- a/dist/v8/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; 44f7; SRI-version; v8) */ - -!function(s,e,t,n){try{var r=n+"_loaded";if(!s||!0===s[r])return;s[r]=!0;var a="https:",i="error",o=s.console,c="doNotTrack",u=s.navigator,p=s.location,l=p.hostname,f=s.document,h=u.userAgent,d="Not sending request ",m=!1,g=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://"+t,b=undefined,E=f.documentElement||{},O="language",x="Height",S="scroll",A="true",M=u.userAgentData,T=S+x,D="offset"+x,B="client"+x,P="pagehide",$="platform",k="platformVersion",q="https://docs.simpleanalytics.com",C=/(bot|spider|crawl)/i.test(h)&&!/(cubot)/i.test(h),H=s.screen,R=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},j=Date.now,I=function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V=function(){for(var e={},t=arguments,n=0;n","sa_event"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v8/custom/app.js.map b/dist/v8/custom/app.js.map deleted file mode 100644 index 0c3a1464..00000000 --- a/dist/v8/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var allowParams;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex, returnArray) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(/[?&=]/).slice(-2);\n })\n : [];\n\n if (match[0]) return returnArray ? match[0] : match[0][1];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, page, data);\n\n if (allowParams)\n data.params = stringify(\n allowParams\n .map(function (param) {\n var params = getParams(param, true);\n if (!params) return;\n return { key: params[0], value: params[1] };\n })\n .filter(Boolean)\n );\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm || attr(scriptElement, \"strict-utm\");\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n https: loc.protocol == https,\n timezone: timezone,\n hostname: definedHostname,\n page_id: uuid(),\n session_id: uuid(),\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSending +\n \"when \" +\n doNotTrack +\n \" is enabled. See \" +\n docsUrl +\n \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set a hostname when sending data from \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional with strictUtm disabled\n var utmRegexPrefix = \"(utm_)\" + (strictUtm ? \"\" : \"?\");\n var source = {\n source: getParams(utmRegexPrefix + \"source\" + (strictUtm ? \"\" : \"|ref\")),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : payload.page_id };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n // sendData will assign payload to request\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, true);\n payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n id: payload.page_id,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(documentElement[clientHeight] || 0, window.innerHeight || 0) ||\n null;\n\n if (nav[language]) page[language] = nav[language];\n\n if (screen) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? false : !sameSite;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, {\n type: \"event\",\n event: event,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (Object.prototype.hasOwnProperty.call(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_8\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","returnArray","matches","search","match","RegExp","map","m","split","slice","sendData","data","callback","payload","page","allowParams","params","param","key","value","filter","Boolean","image","Image","onerror","onload","src","keys","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","mode","collectDnt","overwrittenHostname","autoCollect","convertCommaSeparatedToArray","csv","Array","isArray","functionName","ignorePages","strictUtm","bot","webdriver","__nightmare","version","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v8/custom/auto-events.js b/dist/v8/custom/auto-events.js deleted file mode 100644 index 5881f899..00000000 --- a/dist/v8/custom/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; 46e5; SRI-version; v8) */ - -function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For minifying the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n var event;\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, callback);\n\n log(\"collected \" + clean);\n\n return window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n var collect = false;\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\")) {\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \".(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (collect) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n }\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["onDOMContentLoaded","a","document","getElementsByTagName","i","length","onClickAttribute","link","collect","getAttribute","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","setAttribute","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","saAutomatedLink","element","sent","callback","theTitle","useTitle","event","pop","clean","replace","setTimeout","readyState","addEventListener","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v8/custom/e.js b/dist/v8/custom/e.js deleted file mode 100644 index 7d442bd8..00000000 --- a/dist/v8/custom/e.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-11-25; 8242; SRI-version; v8) */ - -!function(u,e,t){try{var n="sa_loaded";if(!u||!0===u[n])return;u[n]=!0;var p="https:",r="error",i=u.console,a="doNotTrack",l=u.navigator,f=u.location,h=f.hostname,d=u.document,o=l.userAgent,c="Not sending request ",g=!1,s=encodeURIComponent,m=decodeURIComponent,v=JSON.stringify,y=u.addEventListener,w="https://"+t,_=undefined,b=d.documentElement||{},E="language",O="Height",x="scroll",A="true",S=l.userAgentData,M=x+O,T="offset"+O,D="client"+O,$="pagehide",q="platform",B="platformVersion",C=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),H=u.screen,P=l.webdriver||u.__nightmare||"callPhantom"in u||"_phantom"in u||"phantom"in u||C,R={version:"custom_events_8",ua:o};P&&(R.bot=!0),R.sri=!1,S&&(R.mobile=S.mobile,R.brands=v(S.brands));var j=function(e){i&&i.warn&&i.warn("Simple Analytics:",e)},k=Date.now,I=function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},V=function(e){return"function"==typeof e},N=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=e.js.map \ No newline at end of file diff --git a/dist/v8/custom/e.js.map b/dist/v8/custom/e.js.map deleted file mode 100644 index 86b0a34e..00000000 --- a/dist/v8/custom/e.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"e.source.js","sources":["e.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n\n var payload = {\n version: version,\n ua: userAgent,\n };\n if (bot) payload.bot = true;\n\n payload.sri = false;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(\"=\")[1];\n })\n : [];\n if (match && match[0]) return match[0];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, data);\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var definedHostname =\n overwriteOptions.hostname ||\n attr(scriptElement, \"hostname\") ||\n locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePagesRaw =\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\");\n\n // Make sure ignore pages is an array\n var ignorePages = Array.isArray(ignorePagesRaw)\n ? ignorePagesRaw\n : isString(ignorePagesRaw) && ignorePagesRaw.length\n ? ignorePagesRaw.split(/, ?/)\n : [];\n\n /////////////////////\n // ADD HOSTNAME TO PAYLOAD\n //\n\n payload.hostname = definedHostname;\n\n /////////////////////\n // ADD WARNINGS\n //\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(notSending + \"when \" + doNotTrack + \" is enabled\");\n\n // Don't track when localhost or when it's an IP address\n if (\n locationHostname.indexOf(\".\") == -1 ||\n /^[0-9]+$/.test(locationHostname.replace(/\\./g, \"\"))\n )\n return warn(notSending + \"from \" + locationHostname);\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastPageId = uuid();\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional\n var utmRegexPrefix = \"(utm_)?\";\n var source = {\n source: getParams(utmRegexPrefix + \"source|ref\"),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : lastPageId };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + lastPageId, true);\n lastPageId = uuid();\n page.id = lastPageId;\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n page,\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n https: loc.protocol == https,\n timezone: timezone,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n\n var data = {\n path: path,\n viewport_width:\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null,\n viewport_height:\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null,\n };\n\n if (nav[language]) data[language] = nav[language];\n\n if (screen) {\n data.screen_width = screen.width;\n data.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n data.unique = isPushState || userNavigated ? false : !sameSite;\n\n page = data;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var sessionId = uuid();\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, bot ? { bot: true } : {}, {\n type: \"event\",\n event: event,\n page_id: page.id,\n session_id: sessionId,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (Object.prototype.hasOwnProperty.call(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_events_8\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","loadedVariable","saGlobal","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","isBotAgent","test","screen","bot","webdriver","__nightmare","payload","version","ua","sri","mobile","brands","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","matches","search","match","RegExp","map","m","split","sendData","data","callback","image","Image","onerror","onload","src","keys","filter","key","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","mode","collectDnt","value","autoCollect","functionName","ignorePagesRaw","ignorePages","Array","isArray","doctype","hostname_original","lastSendPath","hiddenStart","page","lastPageId","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","protocol","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","sessionId","validTypes","sendEvent","callbackRaw","eventIsFunction","page_id","session_id","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v8/custom/light.js b/dist/v8/custom/light.js deleted file mode 100644 index 27daecc4..00000000 --- a/dist/v8/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; d7a6; SRI-version; v8) */ - -!function(s,e,t){try{var n="sa_event_loaded";if(!s||!0===s[n])return;s[n]=!0;var r,i="https:",a=s.console,o="doNotTrack",p=s.navigator,c=s.location,u=c.hostname,m=s.document,d=p.userAgent,f=!1,l=encodeURIComponent,g=decodeURIComponent,h=JSON.stringify,y=s.addEventListener,v="https://"+t,w=undefined,_=(m.documentElement,"language"),b=p.userAgentData,E="platform",O="platformVersion",S="https://docs.simpleanalytics.com",T=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),x=function(e){a&&a.warn&&a.warn("Simple Analytics:",e)},A=(Date.now,function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),B=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v8/custom/light.js.map b/dist/v8/custom/light.js.map deleted file mode 100644 index 8728f6d4..00000000 --- a/dist/v8/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var allowParams;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex, returnArray) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(/[?&=]/).slice(-2);\n })\n : [];\n\n if (match[0]) return returnArray ? match[0] : match[0][1];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, page, data);\n\n if (allowParams)\n data.params = stringify(\n allowParams\n .map(function (param) {\n var params = getParams(param, true);\n if (!params) return;\n return { key: params[0], value: params[1] };\n })\n .filter(Boolean)\n );\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n\n\n\n\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm || attr(scriptElement, \"strict-utm\");\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n https: loc.protocol == https,\n timezone: timezone,\n hostname: definedHostname,\n page_id: uuid(),\n session_id: uuid(),\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSending +\n \"when \" +\n doNotTrack +\n \" is enabled. See \" +\n docsUrl +\n \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set a hostname when sending data from \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional with strictUtm disabled\n var utmRegexPrefix = \"(utm_)\" + (strictUtm ? \"\" : \"?\");\n var source = {\n source: getParams(utmRegexPrefix + \"source\" + (strictUtm ? \"\" : \"|ref\")),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : payload.page_id };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n // sendData will assign payload to request\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, true);\n payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n id: payload.page_id,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n if (nav[language]) page[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_8\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","loadedVariable","saGlobal","timezone","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","returnArray","matches","search","match","RegExp","map","m","split","slice","sendData","data","callback","payload","page","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","overwrittenHostname","mode","definedHostname","strictUtm","bot","version","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","notSending","indexOf","lastSendPath","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","path","pathname","isPushState","pathOverwrite","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v8/custom/proxy.js b/dist/v8/custom/proxy.js deleted file mode 100644 index fd31a48c..00000000 --- a/dist/v8/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; 0cd8; SRI-version; v8) */ - -!function(s,e,t,n){try{var r=n+"_loaded";if(!s||!0===s[r])return;s[r]=!0;var a="https:",i="error",o=s.console,c="doNotTrack",u=s.navigator,p=s.location,l=p.hostname,f=s.document,h=u.userAgent,d="Not sending request ",m=!1,g=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://"+t,b=undefined,E=f.documentElement||{},x="language",O="Height",S="scroll",A="true",M=u.userAgentData,T=S+O,D="offset"+O,P="client"+O,B="pagehide",$="platform",k="platformVersion",q="https://docs.simpleanalytics.com",C=/(bot|spider|crawl)/i.test(h)&&!/(cubot)/i.test(h),H=s.screen,R=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},j=Date.now,I=function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V=function(){for(var e={},t=arguments,n=0;n","sa_event"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v8/custom/proxy.js.map b/dist/v8/custom/proxy.js.map deleted file mode 100644 index bdc73dcd..00000000 --- a/dist/v8/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var allowParams;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex, returnArray) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(/[?&=]/).slice(-2);\n })\n : [];\n\n if (match[0]) return returnArray ? match[0] : match[0][1];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, page, data);\n\n if (allowParams)\n data.params = stringify(\n allowParams\n .map(function (param) {\n var params = getParams(param, true);\n if (!params) return;\n return { key: params[0], value: params[1] };\n })\n .filter(Boolean)\n );\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm || attr(scriptElement, \"strict-utm\");\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n https: loc.protocol == https,\n timezone: timezone,\n hostname: definedHostname,\n page_id: uuid(),\n session_id: uuid(),\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSending +\n \"when \" +\n doNotTrack +\n \" is enabled. See \" +\n docsUrl +\n \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set a hostname when sending data from \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional with strictUtm disabled\n var utmRegexPrefix = \"(utm_)\" + (strictUtm ? \"\" : \"?\");\n var source = {\n source: getParams(utmRegexPrefix + \"source\" + (strictUtm ? \"\" : \"|ref\")),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : payload.page_id };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n // sendData will assign payload to request\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, true);\n payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n id: payload.page_id,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(documentElement[clientHeight] || 0, window.innerHeight || 0) ||\n null;\n\n if (nav[language]) page[language] = nav[language];\n\n if (screen) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? false : !sameSite;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, {\n type: \"event\",\n event: event,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (Object.prototype.hasOwnProperty.call(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_8\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","returnArray","matches","search","match","RegExp","map","m","split","slice","sendData","data","callback","payload","page","allowParams","params","param","key","value","filter","Boolean","image","Image","onerror","onload","src","keys","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","mode","collectDnt","overwrittenHostname","autoCollect","convertCommaSeparatedToArray","csv","Array","isArray","functionName","ignorePages","strictUtm","bot","webdriver","__nightmare","version","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v8/custom/v8.js b/dist/v8/custom/v8.js deleted file mode 100644 index 832e1e9f..00000000 --- a/dist/v8/custom/v8.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; a6c7; SRI-version; v8) */ - -!function(s,e,t,n){try{var r=n+"_loaded";if(!s||!0===s[r])return;s[r]=!0;var a="https:",i="error",o=s.console,c="doNotTrack",u=s.navigator,p=s.location,l=p.hostname,f=s.document,h=u.userAgent,d="Not sending request ",m=!1,g=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://"+t,b=undefined,E=f.documentElement||{},O="language",x="Height",S="scroll",A="true",M=u.userAgentData,T=S+x,D="offset"+x,B="client"+x,P="pagehide",$="platform",k="platformVersion",q="https://docs.simpleanalytics.com",C=/(bot|spider|crawl)/i.test(h)&&!/(cubot)/i.test(h),H=s.screen,R=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},j=Date.now,I=function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V=function(){for(var e={},t=arguments,n=0;n","sa_event"); -//# sourceMappingURL=v8.js.map \ No newline at end of file diff --git a/dist/v8/custom/v8.js.map b/dist/v8/custom/v8.js.map deleted file mode 100644 index 32b7b4b7..00000000 --- a/dist/v8/custom/v8.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"v8.js","sources":["v8.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var allowParams;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex, returnArray) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(/[?&=]/).slice(-2);\n })\n : [];\n\n if (match[0]) return returnArray ? match[0] : match[0][1];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, page, data);\n\n if (allowParams)\n data.params = stringify(\n allowParams\n .map(function (param) {\n var params = getParams(param, true);\n if (!params) return;\n return { key: params[0], value: params[1] };\n })\n .filter(Boolean)\n );\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm || attr(scriptElement, \"strict-utm\");\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n https: loc.protocol == https,\n timezone: timezone,\n hostname: definedHostname,\n page_id: uuid(),\n session_id: uuid(),\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSending +\n \"when \" +\n doNotTrack +\n \" is enabled. See \" +\n docsUrl +\n \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set a hostname when sending data from \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional with strictUtm disabled\n var utmRegexPrefix = \"(utm_)\" + (strictUtm ? \"\" : \"?\");\n var source = {\n source: getParams(utmRegexPrefix + \"source\" + (strictUtm ? \"\" : \"|ref\")),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : payload.page_id };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n // sendData will assign payload to request\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, true);\n payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n id: payload.page_id,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(documentElement[clientHeight] || 0, window.innerHeight || 0) ||\n null;\n\n if (nav[language]) page[language] = nav[language];\n\n if (screen) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? false : !sameSite;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, {\n type: \"event\",\n event: event,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (Object.prototype.hasOwnProperty.call(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_latest_8\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","returnArray","matches","search","match","RegExp","map","m","split","slice","sendData","data","callback","payload","page","allowParams","params","param","key","value","filter","Boolean","image","Image","onerror","onload","src","keys","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","mode","collectDnt","overwrittenHostname","autoCollect","convertCommaSeparatedToArray","csv","Array","isArray","functionName","ignorePages","strictUtm","bot","webdriver","__nightmare","version","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v8/light.js b/dist/v8/light.js deleted file mode 100644 index 39db6d47..00000000 --- a/dist/v8/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; 40d9; SRI-version; v8) */ - -!function(s,e,t){try{var n="sa_event_loaded";if(!s||!0===s[n])return;s[n]=!0;var r,i="https:",a=s.console,o="doNotTrack",p=s.navigator,c=s.location,u=c.hostname,m=s.document,d=p.userAgent,f=!1,l=encodeURIComponent,g=decodeURIComponent,h=JSON.stringify,y=s.addEventListener,v="https://"+t,w=undefined,_=(m.documentElement,"language"),b=p.userAgentData,E="platform",O="platformVersion",S="https://docs.simpleanalytics.com",T=/(bot|spider|crawl)/i.test(d)&&!/(cubot)/i.test(d),x=function(e){a&&a.warn&&a.warn("Simple Analytics:",e)},A=(Date.now,function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),B=function(){for(var e={},t=arguments,n=0;n"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v8/light.js.map b/dist/v8/light.js.map deleted file mode 100644 index f093b623..00000000 --- a/dist/v8/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (window, overwriteOptions, baseUrl, apiUrlPrefix, version, saGlobal) {\n try {\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = saGlobal + \"_loaded\";\n if (!window || window[loadedVariable] === true) return;\n window[loadedVariable] = true;\n\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var https = \"https:\";\n var pageviewsText = \"pageview\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.hostname;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var fetchedHighEntropyValues = false;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var undefinedVar = undefined;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var trueText = \"true\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var allowParams;\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n var warn = function (message) {\n if (con && con.warn) con.warn(\"Simple Analytics:\", message);\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex, returnArray) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(/[?&=]/).slice(-2);\n })\n : [];\n\n if (match[0]) return returnArray ? match[0] : match[0][1];\n };\n\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, page, data);\n\n if (allowParams)\n data.params = stringify(\n allowParams\n .map(function (param) {\n var params = getParams(param, true);\n if (!params) return;\n return { key: params[0], value: params[1] };\n })\n .filter(Boolean)\n );\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n\n\n\n\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm || attr(scriptElement, \"strict-utm\");\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n https: loc.protocol == https,\n timezone: timezone,\n hostname: definedHostname,\n page_id: uuid(),\n session_id: uuid(),\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSending +\n \"when \" +\n doNotTrack +\n \" is enabled. See \" +\n docsUrl +\n \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set a hostname when sending data from \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional with strictUtm disabled\n var utmRegexPrefix = \"(utm_)\" + (strictUtm ? \"\" : \"?\");\n var source = {\n source: getParams(utmRegexPrefix + \"source\" + (strictUtm ? \"\" : \"|ref\")),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : payload.page_id };\n\n\n\n if (push || !(sendBeaconText in nav)) {\n // sendData will assign payload to request\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, true);\n payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n id: payload.page_id,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n if (nav[language]) page[language] = nav[language];\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"cdn_light_8\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","loadedVariable","saGlobal","timezone","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","undefinedVar","undefined","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","warn","message","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","returnArray","matches","search","match","RegExp","map","m","split","slice","sendData","data","callback","payload","page","Image","src","keys","filter","key","join","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","overwrittenHostname","mode","definedHostname","strictUtm","bot","version","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","notSending","indexOf","lastSendPath","referrer","utmRegexPrefix","source","medium","campaign","term","content","sendBeaconText","sendOnLeave","id","push","append","type","original_id","getPath","overwrite","path","pathname","isPushState","pathOverwrite","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v8/v8.js b/dist/v8/v8.js deleted file mode 100644 index f58d8790..00000000 --- a/dist/v8/v8.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2021-12-30; 1f7c; SRI-version; v8) */ - -!function(s,e,t,n){try{var r=n+"_loaded";if(!s||!0===s[r])return;s[r]=!0;var a="https:",i="error",o=s.console,c="doNotTrack",u=s.navigator,p=s.location,l=p.hostname,f=s.document,h=u.userAgent,d="Not sending request ",m=!1,g=encodeURIComponent,v=decodeURIComponent,y=JSON.stringify,w=s.addEventListener,_="https://queue."+t,b=undefined,E=f.documentElement||{},O="language",x="Height",S="scroll",A="true",M=u.userAgentData,T=S+x,D="offset"+x,q="client"+x,B="pagehide",P="platform",$="platformVersion",k="https://docs.simpleanalytics.com",C=/(bot|spider|crawl)/i.test(h)&&!/(cubot)/i.test(h),R=s.screen,j=function(e){o&&o.warn&&o.warn("Simple Analytics:",e)},H=Date.now,I=function(){var t=s.crypto||s.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}},U=function(e){return"function"==typeof e},V=function(){for(var e={},t=arguments,n=0;n> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (nextSource) {\n for (var nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n var getParams = function (regex, returnArray) {\n // From the search we grab the utm_source and ref and save only that\n var matches = loc.search.match(\n new RegExp(\"[?&](\" + regex + \")=([^?&]+)\", \"gi\")\n );\n var match = matches\n ? matches.map(function (m) {\n return m.split(/[?&=]/).slice(-2);\n })\n : [];\n\n if (match[0]) return returnArray ? match[0] : match[0][1];\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n try {\n if (\n ignorePage === path ||\n new RegExp(ignorePage.replace(/\\*/gi, \"(.*)\"), \"gi\").test(path)\n )\n return true;\n } catch (error) {\n return false;\n }\n }\n return false;\n };\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback) {\n data = assign(payload, page, data);\n\n if (allowParams)\n data.params = stringify(\n allowParams\n .map(function (param) {\n var params = getParams(param, true);\n if (!params) return;\n return { key: params[0], value: params[1] };\n })\n .filter(Boolean)\n );\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n var sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.message || errorOrMessage;\n warn(errorOrMessage);\n sendData({\n type: errorText,\n error: errorOrMessage,\n url: definedHostname + loc.pathname,\n });\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n false\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var pushState = \"pushState\";\n var dis = window.dispatchEvent;\n\n var duration = \"duration\";\n var start = now();\n\n var scrolled = 0;\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {\n /* Do nothing */\n }\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === false\n );\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n // Event function name\n var functionName =\n overwriteOptions.saGlobal || attr(scriptElement, \"sa-global\") || saGlobal;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm || attr(scriptElement, \"strict-utm\");\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n \"callPhantom\" in window ||\n \"_phantom\" in window ||\n \"phantom\" in window ||\n isBotAgent;\n\n var payload = {\n version: version,\n ua: userAgent,\n https: loc.protocol == https,\n timezone: timezone,\n hostname: definedHostname,\n page_id: uuid(),\n session_id: uuid(),\n };\n if (bot) payload.bot = true;\n\n payload.sri = true;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for more accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSending +\n \"when \" +\n doNotTrack +\n \" is enabled. See \" +\n docsUrl +\n \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set a hostname when sending data from \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n // The prefix utm_ is optional with strictUtm disabled\n var utmRegexPrefix = \"(utm_)\" + (strictUtm ? \"\" : \"?\");\n var source = {\n source: getParams(utmRegexPrefix + \"source\" + (strictUtm ? \"\" : \"|ref\")),\n medium: getParams(utmRegexPrefix + \"medium\"),\n campaign: getParams(utmRegexPrefix + \"campaign\"),\n term: getParams(utmRegexPrefix + \"term\"),\n content: getParams(utmRegexPrefix + \"content\"),\n referrer: referrer,\n };\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendBeaconText = \"sendBeacon\";\n\n var sendOnLeave = function (id, push) {\n var append = { type: \"append\", original_id: push ? id : payload.page_id };\n\n append[duration] = Math.round((now() - start - msHidden) / thousand);\n msHidden = 0;\n start = now();\n\n append.scrolled = Math.max(0, scrolled, position());\n\n if (push || !(sendBeaconText in nav)) {\n // sendData will assign payload to request\n sendData(append);\n } else {\n nav[sendBeaconText](\n fullApiUrl + \"/append\",\n stringify(assign(payload, append))\n );\n }\n };\n\n var hiddenStart;\n window.addEventListener(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n false\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, false);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n false\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (e) {\n // Do nothing\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSending + \"because \" + path + \" is ignored\");\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (isPushState, deleteSourceInfo, sameSite) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, true);\n payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData(\n assign(\n deleteSourceInfo\n ? {\n referrer: sameSite ? referrer : null,\n }\n : source,\n {\n id: payload.page_id,\n type: pageviewsText,\n }\n )\n );\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(documentElement[clientHeight] || 0, window.innerHeight || 0) ||\n null;\n\n if (nav[language]) page[language] = nav[language];\n\n if (screen) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigation = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var userNavigated =\n perf &&\n perf.getEntriesByType &&\n perf.getEntriesByType(navigation)[0] &&\n perf.getEntriesByType(navigation)[0].type\n ? [\"reload\", \"back_forward\"].indexOf(\n perf.getEntriesByType(navigation)[0].type\n ) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigation] &&\n [1, 2].indexOf(perf[navigation].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : false;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? false : !sameSite;\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = true;\n sendPageView(isPushState, isPushState || userNavigated, sameSite);\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (typeof Event == \"function\") {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, true, true);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushState);\n\n addEventListenerFunc(\n pushState,\n function () {\n pageview(1);\n },\n false\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n false\n );\n }\n\n if (autoCollect) pageview();\n else\n window.sa_pageview = function (path) {\n pageview(0, path);\n };\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, callbackRaw) {\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n\n if (validTypes.indexOf(typeof event) < 0 && !eventIsFunction) {\n warn(\"event is not a string: \" + event);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n event = event();\n if (validTypes.indexOf(typeof event) < 0) {\n warn(\"event function output is not a string: \" + event);\n return callback();\n }\n }\n } catch (error) {\n warn(\"in your event function: \" + error.message);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n if (event) {\n sendData(\n assign(source, {\n type: \"event\",\n event: event,\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[functionName]) window[functionName] = defaultEventFunc;\n\n var eventFunc = window[functionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[functionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (Object.prototype.hasOwnProperty.call(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_8\",\n \"sa_event\"\n);\n"],"names":["window","overwriteOptions","baseUrl","saGlobal","loadedVariable","https","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","hostname","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","undefinedVar","undefined","documentElement","language","Height","scroll","trueText","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","warn","message","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","isFunction","func","assign","to","arg","arguments","index","length","nextSource","nextKey","Object","prototype","hasOwnProperty","call","getParams","regex","returnArray","matches","search","match","RegExp","map","m","split","slice","sendData","data","callback","payload","page","allowParams","params","param","key","value","filter","Boolean","image","Image","onerror","onload","src","keys","join","sendError","errorOrMessage","type","url","definedHostname","pathname","event","filename","indexOf","timezone","pushState","dis","dispatchEvent","start","scrolled","Intl","DateTimeFormat","resolvedOptions","timeZone","e","scriptElement","currentScript","querySelector","attr","attribute","getAttribute","mode","collectDnt","overwrittenHostname","autoCollect","convertCommaSeparatedToArray","csv","Array","isArray","functionName","ignorePages","strictUtm","bot","webdriver","__nightmare","version","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","utmRegexPrefix","source","medium","campaign","term","content","msHidden","sendBeaconText","sendOnLeave","id","push","append","original_id","round","max","position","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","path","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","perf","performance","navigation","userNavigated","getEntriesByType","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","his","history","hisPushState","Event","orig","rv","apply","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v9/app.js b/dist/v9/app.js deleted file mode 100644 index f0f8afa0..00000000 --- a/dist/v9/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-26; 3e5b; SRI-version; v9) */ - -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",v="pageview",s="event",o="error",c=f.console,u="doNotTrack",g=f.navigator,l=f.location,y=l.host,_=f.document,p=g.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,q=f.addEventListener,A="https://queue."+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=g.userAgentData,C=j+D,R="offset"+D,H="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=J(t.ignoreMetrics||G(N,"ignore-metrics")),Y=function(e){return 0===L.filter(function(t){return new RegExp("^"+e).test(t)}).length},Z=Date.now,K=function(){var e=f.crypto||f.msCrypto,t=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return t.replace(n,function(t){return(t^e.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},Q=function(t){return"function"==typeof t},X=function(t){return t&&t.constructor===Object},tt=function(){for(var t={},e=arguments,n=0;n> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = doc.referrer.split(slash)[2];\n var sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_latest_9\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v9/auto-events.js b/dist/v9/auto-events.js deleted file mode 100644 index f1896394..00000000 --- a/dist/v9/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-26; 74dc; SRI-version; v9) */ - -function n(t,e){var o,a=!1;b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp(".("+(b.downloadsExtensions||[]).join("|")+")","i").test(t.pathname)?a="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==c.location.hostname?a="outbound":b.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(o="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.on("click",function(){saAutomatedLink(a)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n var event;\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, callback);\n\n log(\"collected \" + clean);\n\n return window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \".(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.on(\"click\", function () {\n saAutomatedLink(collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\")) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","on","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","useTitle","event","pop","clean","replace","setTimeout","readyState","addEventListener","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v9/custom/app.js b/dist/v9/custom/app.js deleted file mode 100644 index a69401dd..00000000 --- a/dist/v9/custom/app.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-26; 2028; SRI-version; v9) */ - -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",E=m,O=encodeURIComponent,x=decodeURIComponent,S=JSON.stringify,A=f.addEventListener,q="https://"+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,H="offset"+D,R="client"+D,P="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=J(t.ignoreMetrics||G(N,"ignore-metrics")),Y=function(e){return 0===L.filter(function(t){return new RegExp("^"+e).test(t)}).length},Z=Date.now,K=function(){var e=f.crypto||f.msCrypto,t=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return t.replace(n,function(t){return(t^e.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},Q=function(t){return"function"==typeof t},X=function(t){return t&&t.constructor===Object},tt=function(){for(var t={},e=arguments,n=0;n"); -//# sourceMappingURL=app.js.map \ No newline at end of file diff --git a/dist/v9/custom/app.js.map b/dist/v9/custom/app.js.map deleted file mode 100644 index f1770a4c..00000000 --- a/dist/v9/custom/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"app.source.js","sources":["app.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics: \");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = doc.referrer.split(slash)[2];\n var sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_app_9\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v9/custom/auto-events.js b/dist/v9/custom/auto-events.js deleted file mode 100644 index f1896394..00000000 --- a/dist/v9/custom/auto-events.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-26; 74dc; SRI-version; v9) */ - -function n(t,e){var o,a=!1;b.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp(".("+(b.downloadsExtensions||[]).join("|")+")","i").test(t.pathname)?a="download":b.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==c.location.hostname?a="outbound":b.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(o="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(o+=" return false;"),t.setAttribute("onclick",o)):t.on("click",function(){saAutomatedLink(a)}))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1,\n emails: collectTypes.indexOf(\"emails\") > -1,\n downloads: collectTypes.indexOf(\"downloads\") > -1,\n // Downloads: enter file extensions you want to collect\n downloadsExtensions: setting(\"extensions\", \"array\", [\n \"pdf\",\n \"csv\",\n \"docx\",\n \"xlsx\",\n \"zip\",\n \"doc\",\n \"xls\",\n ]),\n\n // All: use title attribute if set for event name (for all events)\n // THIS TAKES PRECEDENCE OVER OTHER SETTINGS BELOW\n title: setting(\"useTitle\", \"bool\", true),\n // Outbound: use full URL of the links? false for just the hostname\n outboundFullUrl: fullUrls,\n // Downloads: if taking event name from URL, use full URL or just filename (default)\n downloadsFullUrl: fullUrls,\n };\n\n var saGlobal = setting(\"saGlobal\", \"string\", \"sa_event\");\n\n // For compiling the script\n var optionsLink = options;\n\n if (typeof optionsLink === \"undefined\")\n log(\"options object not found, please specify\", \"warn\");\n\n window.saAutomatedLink = function saAutomatedLink(element, type) {\n try {\n if (!element) return log(\"no element found\");\n var sent = false;\n\n var callback = function () {\n if (!sent && !element.hasAttribute(\"target\"))\n document.location = element.getAttribute(\"href\");\n sent = true;\n };\n\n if (window[saGlobal] && window[saGlobal + \"_loaded\"]) {\n var hostname = element.hostname;\n var pathname = element.pathname;\n var useTitle = false;\n if (optionsLink.title && element.hasAttribute(\"title\")) {\n var theTitle = element.getAttribute(\"title\").trim();\n if (theTitle != \"\") useTitle = true;\n }\n\n var event;\n\n if (useTitle) {\n event = theTitle;\n } else {\n switch (type) {\n case \"outbound\": {\n event = hostname + (optionsLink.outboundFullUrl ? pathname : \"\");\n break;\n }\n case \"download\": {\n event = optionsLink.downloadsFullUrl\n ? hostname + pathname\n : pathname.split(\"/\").pop();\n break;\n }\n case \"email\": {\n var href = element.getAttribute(\"href\");\n event = (href.split(\":\")[1] || \"\").split(\"?\")[0];\n break;\n }\n }\n }\n\n var clean =\n type +\n \"_\" +\n event.replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_+|_+$)/g, \"\");\n\n window[saGlobal](clean, callback);\n\n log(\"collected \" + clean);\n\n return window.setTimeout(callback, 5000);\n } else {\n log(saGlobal + \" is not defined\", \"warn\");\n return callback();\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n };\n\n function collectLink(link, onclick) {\n var collect = false;\n\n // Collect download clicks\n if (\n optionsLink.downloads &&\n /^https?:\\/\\//i.test(link.href) &&\n new RegExp(\n \".(\" + (optionsLink.downloadsExtensions || []).join(\"|\") + \")\",\n \"i\"\n ).test(link.pathname)\n ) {\n collect = \"download\";\n\n // Collect outbound links clicks\n } else if (\n optionsLink.outbound &&\n /^https?:\\/\\//i.test(link.href) &&\n link.hostname !== window.location.hostname\n ) {\n collect = \"outbound\";\n\n // Collect email clicks\n } else if (optionsLink.emails && /^mailto:/i.test(link.href)) {\n collect = \"email\";\n }\n\n if (!collect) return;\n\n if (onclick) {\n var onClickAttribute = \"saAutomatedLink(this, '\" + collect + \"');\";\n\n if (\n !link.hasAttribute(\"target\") ||\n link.getAttribute(\"target\") === \"_self\"\n )\n onClickAttribute += \" return false;\";\n\n link.setAttribute(\"onclick\", onClickAttribute);\n } else {\n link.on(\"click\", function () {\n saAutomatedLink(collect);\n });\n }\n }\n\n function onDOMContentLoaded() {\n try {\n var a = document.getElementsByTagName(\"a\");\n\n // Loop over all links on the page\n for (var i = 0; i < a.length; i++) {\n var link = a[i];\n\n // We don't want to overwrite website behaviour so we check for the onclick attribute\n if (!link.getAttribute(\"onclick\")) {\n collectLink(link, true);\n } else {\n collectLink(link, false);\n }\n }\n } catch (error) {\n log(error.message, \"warn\");\n }\n }\n\n if (doc.readyState === \"ready\" || doc.readyState === \"complete\") {\n onDOMContentLoaded();\n } else {\n document.addEventListener(\"readystatechange\", function (event) {\n if (event.target.readyState === \"complete\") onDOMContentLoaded();\n });\n }\n})(window);\n"],"names":["collectLink","link","onclick","onClickAttribute","collect","optionsLink","downloads","test","href","RegExp","downloadsExtensions","join","pathname","outbound","hostname","window","location","emails","hasAttribute","getAttribute","setAttribute","on","saAutomatedLink","onDOMContentLoaded","a","document","getElementsByTagName","i","length","error","log","message","doc","scriptElement","setting","collectTypes","fullUrls","options","saGlobal","type","logger","console","warn","info","currentScript","querySelector","attribute","defaultValue","value","dataset","split","map","item","trim","filter","Boolean","indexOf","title","outboundFullUrl","downloadsFullUrl","element","sent","callback","theTitle","useTitle","event","pop","clean","replace","setTimeout","readyState","addEventListener","target"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v9/custom/light.js b/dist/v9/custom/light.js deleted file mode 100644 index c3051476..00000000 --- a/dist/v9/custom/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-26; 1fd3; SRI-version; v9) */ - -!function(u,e,t,l){try{var i=undefined,n="https:",r=u.console,a="doNotTrack",d=u.navigator,c=u.location,m=c.host,f=u.document,o=d.userAgent,s="Not sending request ",g=!1,p=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=u.addEventListener,w="https://"+t,_=(f.documentElement,"language"),b=d.userAgentData,O="platform",S="platformVersion",E="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),x=f.currentScript||f.querySelector('script[src*="'+t+'"]');l=function(){var e=[].slice.call(arguments);e.unshift("Simple Analytics: "),Function.prototype.bind.call(r.warn,r).apply(r,e)};var A=function(e,t){return e&&e.getAttribute("data-"+t)},$=(Date.now,function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),q=function(){for(var e,t,n,r={},a=arguments,o=0;o"); -//# sourceMappingURL=light.js.map \ No newline at end of file diff --git a/dist/v9/custom/light.js.map b/dist/v9/custom/light.js.map deleted file mode 100644 index ff6a4fa7..00000000 --- a/dist/v9/custom/light.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"light.source.js","sources":["light.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics: \");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n\n var collectMetricByString = function (metricAbbreviation) {\n return true;\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_light_9\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","attr","attribute","getAttribute","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","Image","src","keys","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","protocol","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","sameSite","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v9/custom/proxy.js b/dist/v9/custom/proxy.js deleted file mode 100644 index bbdfdf50..00000000 --- a/dist/v9/custom/proxy.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-26; 6604; SRI-version; v9) */ - -!function(f,t,e,n,h){try{var i=undefined,d=!0,m=!1,r="true",a="https:",g="pageview",s="event",o="error",c=f.console,u="doNotTrack",v=f.navigator,l=f.location,y=l.host,_=f.document,p=v.userAgent,w="Not sending request ",b=w+"when ",x=m,E=encodeURIComponent,O=decodeURIComponent,S=JSON.stringify,A=f.addEventListener,q="https://"+e,M=_.documentElement||{},$="language",D="Height",j="scroll",k=v.userAgentData,C=j+D,H="offset"+D,P="client"+D,R="pagehide",T="platform",U="platformVersion",I="https://docs.simpleanalytics.com",V=/(bot|spider|crawl)/i.test(p)&&!/(cubot)/i.test(p),B=f.screen,N=_.currentScript||_.querySelector('script[src*="'+e+'"]');h=function(){var t=[].slice.call(arguments);t.unshift("Simple Analytics: "),Function.prototype.bind.call(c.warn,c).apply(c,t)};var z=function(t,e){h("Error in your "+t+" function:",e)},F=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},W=function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},G=function(t,e){return t&&t.getAttribute("data-"+e)},J=function(t){return Array.isArray(t)?t:"string"==typeof t&&t.length?t.split(/, ?/):[]},L=J(t.ignoreMetrics||G(N,"ignore-metrics")),Y=function(e){return 0===L.filter(function(t){return new RegExp("^"+e).test(t)}).length},Z=Date.now,K=function(){var e=f.crypto||f.msCrypto,t=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return t.replace(n,function(t){return(t^e.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)})}catch(r){return t.replace(n,function(t){var e=16*Math.random()|0;return(t<2?e:3&e|8).toString(16)})}},Q=function(t){return"function"==typeof t},X=function(t){return t&&t.constructor===Object},tt=function(){for(var t={},e=arguments,n=0;n"); -//# sourceMappingURL=proxy.js.map \ No newline at end of file diff --git a/dist/v9/custom/proxy.js.map b/dist/v9/custom/proxy.js.map deleted file mode 100644 index caa42b86..00000000 --- a/dist/v9/custom/proxy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"proxy.source.js","sources":["proxy.source.js"],"sourcesContent":["/* eslint-env browser */\n\n(function (\n window,\n overwriteOptions,\n baseUrl,\n apiUrlPrefix,\n version,\n defaultNamespace,\n sendError,\n warn\n) {\n try {\n /////////////////////\n // PREDEFINED VARIABLES FOR BETTER MINIFICATION\n //\n\n // This seems like a lot of repetition, but it makes our script available for\n // multple destination which prevents us to need multiple scripts. The minified\n // version stays small.\n var undefinedVar = undefined;\n var trueVar = true;\n var falseVar = false;\n var trueText = \"true\";\n var https = \"https:\";\n var pageviewText = \"pageview\";\n var eventText = \"event\";\n var errorText = \"error\";\n var slash = \"/\";\n var protocol = https + \"//\";\n var con = window.console;\n var doNotTrack = \"doNotTrack\";\n var nav = window.navigator;\n var loc = window.location;\n var locationHostname = loc.host;\n var doc = window.document;\n var userAgent = nav.userAgent;\n var notSending = \"Not sending request \";\n var notSendingWhen = notSending + \"when \";\n var fetchedHighEntropyValues = falseVar;\n var encodeURIComponentFunc = encodeURIComponent;\n var decodeURIComponentFunc = decodeURIComponent;\n var stringify = JSON.stringify;\n var thousand = 1000;\n var addEventListenerFunc = window.addEventListener;\n var fullApiUrl = protocol + apiUrlPrefix + baseUrl;\n var documentElement = doc.documentElement || {};\n var language = \"language\";\n var Height = \"Height\";\n var Width = \"Width\";\n var scroll = \"scroll\";\n var uaData = nav.userAgentData;\n var scrollHeight = scroll + Height;\n var offsetHeight = \"offset\" + Height;\n var clientHeight = \"client\" + Height;\n var clientWidth = \"client\" + Width;\n var pagehide = \"pagehide\";\n var platformText = \"platform\";\n var platformVersionText = \"platformVersion\";\n var docsUrl = \"https://docs.simpleanalytics.com\";\n var isBotAgent =\n /(bot|spider|crawl)/i.test(userAgent) && !/(cubot)/i.test(userAgent);\n var screen = window.screen;\n\n // Find the script element where options can be set on\n var scriptElement =\n doc.currentScript || doc.querySelector('script[src*=\"' + baseUrl + '\"]');\n\n /////////////////////\n // HELPER FUNCTIONS\n //\n\n // A simple log function so the user knows why a request is not being send\n warn = function () {\n // 1. Convert args to a normal array\n var args = [].slice.call(arguments);\n\n // 2. Prepend log prefix\n args.unshift(\"Simple Analytics: \");\n\n // 3. Pass along arguments to console.warn\n // Function.prototype.bind.call is needed for Internet Explorer\n var log = Function.prototype.bind.call(con.warn, con);\n log.apply(con, args);\n };\n\n var warnInFunction = function (name, error) {\n warn(\"Error in your \" + name + \" function:\", error);\n };\n\n var hasProp = function (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n };\n\n var isString = function (string) {\n return typeof string == \"string\";\n };\n\n var filterRegex = function (item) {\n return item.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n };\n\n var attr = function (scriptElement, attribute) {\n return scriptElement && scriptElement.getAttribute(\"data-\" + attribute);\n };\n\n var convertCommaSeparatedToArray = function (csv) {\n return Array.isArray(csv)\n ? csv\n : isString(csv) && csv.length\n ? csv.split(/, ?/)\n : [];\n };\n\n // Customers can skip data points\n var ignoreMetrics = convertCommaSeparatedToArray(\n overwriteOptions.ignoreMetrics || attr(scriptElement, \"ignore-metrics\")\n );\n\n var collectMetricByString = function (metricAbbreviation) {\n // Can't use Array.find() here because we need to support IE9\n return (\n ignoreMetrics.filter(function (item) {\n return new RegExp(\"^\" + metricAbbreviation).test(item);\n }).length === 0\n );\n };\n\n var now = Date.now;\n\n var uuid = function () {\n var cryptoObject = window.crypto || window.msCrypto;\n var emptyUUID = [1e7] + -1e3 + -4e3 + -8e3 + -1e11;\n var uuidRegex = /[018]/g;\n\n try {\n return emptyUUID.replace(uuidRegex, function (c) {\n return (\n c ^\n (cryptoObject.getRandomValues(new Uint8Array(1))[0] &\n (15 >> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n var metadataObject = window[namespace + \"_metadata\"];\n var appendMetadata = function (metadata, data) {\n if (isObject(metadataObject)) metadata = assign(metadata, metadataObject);\n var metadataCollectorFunction = window[metadataCollector];\n if (!isFunction(metadataCollectorFunction)) return metadata;\n try {\n return assign(\n metadata,\n metadataCollectorFunction.call(window, assign(metadata, data))\n );\n } catch (error) {\n warnInFunction(\"metadata\", error);\n }\n };\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n var paramsRegexList = allowParams.map(filterRegex).join(\"|\");\n var regex = ignore\n ? \"^(\" + paramsRegexList + \")=\"\n : \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \"|\" +\n paramsRegexList +\n \")=\";\n if (ignore && !allowParams.length) return falseVar;\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n // Ignore pages specified in data-ignore-pages\n var shouldIgnore = function (path) {\n for (var i in ignorePages) {\n var ignorePageRaw = ignorePages[i];\n if (!ignorePageRaw) continue;\n\n // Prepend a slash when it's missing\n var ignorePage =\n ignorePageRaw[0] == slash ? ignorePageRaw : slash + ignorePageRaw;\n\n if (\n ignorePage === path ||\n new RegExp(\n \"^\" + filterRegex(ignorePage).replace(/\\\\\\*/gi, \"(.*)\") + \"$\",\n \"i\"\n ).test(path)\n )\n return trueVar;\n }\n return falseVar;\n };\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n if (callback) {\n image.onerror = callback;\n image.onload = callback;\n }\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n /////////////////////\n // ERROR FUNCTIONS\n //\n\n // Send errors\n // no var because it's scoped outside of the try/catch\n sendError = function (errorOrMessage) {\n errorOrMessage = errorOrMessage.stack\n ? errorOrMessage + \" \" + errorOrMessage.stack\n : errorOrMessage;\n warn(errorOrMessage);\n sendData(\n assign(basePayload, {\n type: errorText,\n error: errorOrMessage,\n path: loc.pathname,\n }),\n undefinedVar,\n trueVar\n );\n };\n\n // We listen for the error events and only send errors that are\n // from our script (checked by filename) to our server.\n addEventListenerFunc(\n errorText,\n function (event) {\n if (event.filename && event.filename.indexOf(baseUrl) > -1) {\n sendError(event.message);\n }\n },\n falseVar\n );\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n var start = now();\n\n var scrolled = 0;\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n // Should we record Do Not Track visits?\n var collectDnt = isBoolean(overwriteOptions.collectDnt)\n ? overwriteOptions.collectDnt\n : attr(scriptElement, \"ignore-dnt\") == trueText ||\n attr(scriptElement, \"skip-dnt\") == trueText ||\n attr(scriptElement, \"collect-dnt\") == trueText;\n\n // Some customers want to collect page views manually\n var autoCollect = !(\n attr(scriptElement, \"auto-collect\") == \"false\" ||\n overwriteOptions.autoCollect === falseVar\n );\n\n // Event function name\n var eventFunctionName =\n overwriteOptions.saGlobal ||\n attr(scriptElement, \"sa-global\") ||\n namespace + \"_\" + eventText;\n\n // Customers can ignore certain pages\n var ignorePages = convertCommaSeparatedToArray(\n overwriteOptions.ignorePages || attr(scriptElement, \"ignore-pages\")\n );\n\n // Customers can allow params\n var allowParams = convertCommaSeparatedToArray(\n overwriteOptions.allowParams || attr(scriptElement, \"allow-params\")\n );\n\n // Customers can allow params\n var nonUniqueHostnames = convertCommaSeparatedToArray(\n overwriteOptions.nonUniqueHostnames ||\n attr(scriptElement, \"non-unique-hostnames\")\n );\n\n // Customers can overwrite certain values\n var pathOverwriter =\n overwriteOptions.pathOverwriter || attr(scriptElement, \"path-overwriter\");\n\n // Customers can add metadata to events and pageviews via a function\n var metadataCollector =\n overwriteOptions.metadataCollector ||\n attr(scriptElement, \"metadata-collector\");\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot =\n nav.webdriver ||\n window.__nightmare ||\n window.callPhantom ||\n window._phantom ||\n window.phantom ||\n window.__polypane ||\n window._bot ||\n isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n // Warn when no document.doctype is defined (this breaks some documentElement dimensions)\n if (!doc.doctype) warn(\"Add DOCTYPE html for accurate dimensions\");\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n // t = timeonpage\n if (collectMetricByString(\"t\")) {\n append.duration = Math.round((now() - start - msHidden) / thousand);\n }\n msHidden = 0;\n start = now();\n\n // scro = scrolled\n if (collectMetricByString(\"scro\")) {\n append.scrolled = Math.max(0, scrolled, position());\n }\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n var hiddenStart;\n addEventListenerFunc(\n \"visibilitychange\",\n function () {\n if (doc.hidden) {\n if (!(\"on\" + pagehide in window)) sendOnLeave();\n hiddenStart = now();\n } else msHidden += now() - hiddenStart;\n },\n falseVar\n );\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n var body = doc.body || {};\n var position = function () {\n try {\n var documentClientHeight = documentElement[clientHeight] || 0;\n var height = Math.max(\n body[scrollHeight] || 0,\n body[offsetHeight] || 0,\n documentElement[clientHeight] || 0,\n documentElement[scrollHeight] || 0,\n documentElement[offsetHeight] || 0\n );\n return Math.min(\n 100,\n Math.round(\n (100 * ((documentElement.scrollTop || 0) + documentClientHeight)) /\n height /\n 5\n ) * 5\n );\n } catch (error) {\n warn(error);\n return 0;\n }\n };\n\n addEventListenerFunc(\"load\", function () {\n scrolled = position();\n addEventListenerFunc(\n scroll,\n function () {\n if (scrolled < position()) scrolled = position();\n },\n falseVar\n );\n });\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n var pathOverwriterFunction = window[pathOverwriter];\n if (isFunction(pathOverwriterFunction)) {\n try {\n path = pathOverwriterFunction.call(window, { path: path }) || path;\n } catch (error) {\n warnInFunction(\"path\", error);\n }\n }\n\n // Ignore pages specified in data-ignore-pages\n if (shouldIgnore(path)) {\n warn(notSendingWhen + \"ignoring \" + path);\n return;\n }\n\n // Add hash to path when script is put in to hash mode\n if (mode == \"hash\" && loc.hash) path += loc.hash.split(\"?\")[0];\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n metadata: stringify(metadata),\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n // v = viewportsizes\n if (collectMetricByString(\"v\")) {\n page.viewport_width =\n Math.max(documentElement[clientWidth] || 0, window.innerWidth || 0) ||\n null;\n page.viewport_height =\n Math.max(\n documentElement[clientHeight] || 0,\n window.innerHeight || 0\n ) || null;\n }\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n // sc = screensizes\n if (screen && collectMetricByString(\"sc\")) {\n page.screen_width = screen.width;\n page.screen_height = screen.height;\n }\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var currentReferrerHostname = doc.referrer.split(slash)[2];\n var sameSite = referrer\n ? nonUniqueHostnames.indexOf(currentReferrerHostname) > -1 ||\n currentReferrerHostname == locationHostname\n : falseVar;\n\n // We set unique variable based on pushstate or back navigation, if no match we check the referrer\n page.unique = isPushState || userNavigated ? falseVar : !sameSite;\n\n metadata = appendMetadata(metadata, {\n type: pageviewText,\n path: page.path,\n });\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n /////////////////////\n // AUTOMATED PAGE VIEW COLLECTION\n //\n\n var his = window.history;\n var hisPushState = his ? his.pushState : undefinedVar;\n var dis = window.dispatchEvent;\n var pushStateText = \"pushState\";\n\n // Overwrite history pushState function to\n // allow listening on the pushState event\n if (autoCollect && hisPushState && Event && dis) {\n var stateListener = function (type) {\n var orig = his[type];\n return function () {\n var arg = arguments;\n var rv = orig.apply(this, arg);\n var event;\n if (isFunction(Event)) {\n event = new Event(type);\n } else {\n // Fix for IE\n // https://github.com/simpleanalytics/scripts/issues/8\n event = doc.createEvent(\"Event\");\n event.initEvent(type, trueVar, trueVar);\n }\n event.arguments = arg;\n dis(event);\n return rv;\n };\n };\n\n his.pushState = stateListener(pushStateText);\n\n addEventListenerFunc(\n pushStateText,\n function () {\n pageview(1);\n },\n falseVar\n );\n\n addEventListenerFunc(\n \"popstate\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n // When in hash mode, we record a pageview based on the onhashchange function\n if (autoCollect && mode == \"hash\" && \"onhashchange\" in window) {\n addEventListenerFunc(\n \"hashchange\",\n function () {\n pageview(1);\n },\n falseVar\n );\n }\n\n if (autoCollect) pageview();\n else {\n window.sa_pageview = function (path, metadata) {\n pageview(0, path, metadata);\n };\n }\n\n /////////////////////\n // EVENTS\n //\n\n var validTypes = [\"string\", \"number\"];\n\n var sendEvent = function (event, metadata, callbackRaw) {\n if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;\n\n var eventIsFunction = isFunction(event);\n var callback = isFunction(callbackRaw) ? callbackRaw : function () {};\n var eventType = typeof event;\n\n if (validTypes.indexOf(eventType) < 0 && !eventIsFunction) {\n warnInFunction(eventFunctionName, eventText + \" can't be \" + eventType);\n return callback();\n }\n\n try {\n if (eventIsFunction) {\n var eventOutput = event();\n if (validTypes.indexOf(typeof eventOutput) < 0) {\n warnInFunction(\n eventFunctionName,\n event + \" returns no string: \" + eventOutput\n );\n return callback();\n }\n event = eventOutput;\n }\n } catch (error) {\n warnInFunction(eventFunctionName, error);\n return callback();\n }\n\n event = (\"\" + event).replace(/[^a-z0-9]+/gi, \"_\").replace(/(^_|_$)/g, \"\");\n\n var eventParams = { type: eventText, event: event };\n\n metadata = appendMetadata(metadata, eventParams);\n\n if (event) {\n sendData(\n assign(eventParams, {\n query: getQueryParams(),\n\n metadata: stringify(metadata),\n }),\n callback\n );\n }\n };\n\n var defaultEventFunc = function (event, callback) {\n sendEvent(event, callback);\n };\n\n // Set default function if user didn't define a function\n if (!window[eventFunctionName])\n window[eventFunctionName] = defaultEventFunc;\n\n var eventFunc = window[eventFunctionName];\n\n // Read queue of the user defined function\n var queue = eventFunc && eventFunc.q ? eventFunc.q : [];\n\n // Overwrite user defined function\n window[eventFunctionName] = defaultEventFunc;\n\n // Post events from the queue of the user defined function\n for (var event in queue) {\n if (hasProp(queue, event)) {\n Array.isArray(queue[event])\n ? sendEvent.apply(null, queue[event])\n : sendEvent(queue[event]);\n }\n }\n } catch (e) {\n sendError(e);\n }\n})(\n window,\n {},\n \"\",\n \"\",\n \"custom_proxy_9\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","sendError","warn","undefinedVar","undefined","trueVar","falseVar","trueText","https","pageviewText","eventText","errorText","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","notSendingWhen","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","documentElement","language","Height","scroll","uaData","userAgentData","scrollHeight","offsetHeight","clientHeight","pagehide","platformText","platformVersionText","docsUrl","isBotAgent","test","screen","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","warnInFunction","name","error","hasProp","obj","prop","Object","hasOwnProperty","filterRegex","item","replace","attr","attribute","getAttribute","convertCommaSeparatedToArray","csv","Array","isArray","length","split","ignoreMetrics","collectMetricByString","metricAbbreviation","filter","RegExp","now","Date","uuid","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","c","getRandomValues","Uint8Array","toString","r","Math","random","isFunction","func","isObject","object","constructor","assign","to","arg","index","nextSource","nextKey","namespaceText","namespace","metadataObject","appendMetadata","metadata","data","metadataCollectorFunction","metadataCollector","strictUtm","getQueryParams","ignoreSource","search","keyValue","ignore","paramsRegexList","allowParams","map","join","regex","loadedVariable","sa_event_loaded","sendData","callback","onlyThisData","payload","page","brave","image","Image","onerror","onload","src","keys","key","overwrittenHostname","hostname","definedHostname","basePayload","version","errorOrMessage","stack","type","path","pathname","event","filename","indexOf","message","timezone","start","scrolled","mode","collectDnt","value","autoCollect","eventFunctionName","saGlobal","ignorePages","nonUniqueHostnames","pathOverwriter","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","webdriver","__nightmare","callPhantom","_phantom","phantom","__polypane","_bot","collectDataOnLeave","ua","protocol","page_id","session_id","sri","mobile","brands","doctype","hostname_original","lastSendPath","hiddenStart","referrer","msHidden","sendOnLeave","id","push","append","original_id","duration","round","max","position","sendBeacon","hidden","body","documentClientHeight","height","min","scrollTop","getPath","overwrite","pathOverwriterFunction","i","ignorePageRaw","ignorePage","shouldIgnore","hash","pageview","isPushState","pathOverwrite","viewport_width","innerWidth","viewport_height","innerHeight","screen_width","width","screen_height","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","currentReferrerHostname","sameSite","unique","triggerSendPageView","deleteSourceInfo","currentPage","query","sendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","his","history","hisPushState","pushState","dis","dispatchEvent","pushStateText","Event","orig","rv","this","createEvent","initEvent","sa_pageview","validTypes","sendEvent","callbackRaw","eventIsFunction","eventType","eventOutput","eventParams","defaultEventFunc","eventFunc","queue","q"],"mappings":"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"} \ No newline at end of file diff --git a/dist/v9/light.js b/dist/v9/light.js deleted file mode 100644 index 76da0374..00000000 --- a/dist/v9/light.js +++ /dev/null @@ -1,4 +0,0 @@ -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-26; 8723; SRI-version; v9) */ - -!function(u,e,t,l){try{var i=undefined,n="https:",r=u.console,a="doNotTrack",d=u.navigator,c=u.location,m=c.host,f=u.document,o=d.userAgent,s="Not sending request ",g=!1,p=encodeURIComponent,h=decodeURIComponent,v=JSON.stringify,y=u.addEventListener,w="https://queue."+t,_=(f.documentElement,"language"),b=d.userAgentData,O="platform",S="platformVersion",E="https://docs.simpleanalytics.com",j=/(bot|spider|crawl)/i.test(o)&&!/(cubot)/i.test(o),q=f.currentScript||f.querySelector('script[src*="'+t+'"]');l=function(){var e=[].slice.call(arguments);e.unshift("Simple Analytics: "),Function.prototype.bind.call(r.warn,r).apply(r,e)};var A=function(e,t){return e&&e.getAttribute("data-"+t)},$=(Date.now,function(){var t=u.crypto||u.msCrypto,e=[1e7]+-1e3+-4e3+-8e3+-1e11,n=/[018]/g;try{return e.replace(n,function(e){return(e^t.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)})}catch(r){return e.replace(n,function(e){var t=16*Math.random()|0;return(e<2?t:3&t|8).toString(16)})}}),x=function(){for(var e,t,n,r={},a=arguments,o=0;o> (c / 4)))\n ).toString(16);\n });\n } catch (error) {\n return emptyUUID.replace(uuidRegex, function (c) {\n var r = (Math.random() * 16) | 0,\n v = c < 2 ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n };\n\n var isFunction = function (func) {\n return typeof func == \"function\";\n };\n\n var isObject = function (object) {\n return object && object.constructor === Object;\n };\n\n var assign = function () {\n var to = {};\n var arg = arguments;\n for (var index = 0; index < arg.length; index++) {\n var nextSource = arg[index];\n if (isObject(nextSource)) {\n for (var nextKey in nextSource) {\n if (hasProp(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n\n // Define namespace for the library\n var namespaceText = \"namespace\";\n var namespace =\n overwriteOptions[namespaceText] ||\n attr(scriptElement, namespaceText) ||\n defaultNamespace;\n\n\n var isBoolean = function (value) {\n return !!value === value;\n };\n\n // By default we allow source, medium in the URLs. With strictUtm enabled\n // we only allow it with the utm_ prefix: utm_source, utm_medium, ...\n var strictUtm =\n overwriteOptions.strictUtm ||\n attr(scriptElement, \"strict-utm\") == trueText;\n\n var getQueryParams = function (ignoreSource) {\n return (\n loc.search\n .slice(1)\n .split(\"&\")\n .filter(function (keyValue) {\n var ignore = ignoreSource || !collectMetricByString(\"ut\");\n\n if (ignore) return falseVar;\n var regex =\n \"^((utm_)\" +\n (strictUtm ? \"\" : \"?\") +\n \"(source|medium|content|term|campaign)\" +\n (strictUtm ? \"\" : \"|ref\") +\n \")=\";\n\n // The prefix \"utm_\" is optional with \"strictUtm\" disabled\n // \"ref\" is only collected when \"strictUtm\" is disabled\n return new RegExp(regex).test(keyValue);\n })\n .join(\"&\") || undefinedVar\n );\n };\n\n\n /////////////////////\n // Warn when using script twice\n //\n\n // Only load our script once, customers can still send multiple page views\n // with the sa_pageview function if they turn off auto collect.\n var loadedVariable = namespace + \"_loaded\";\n if (window[loadedVariable] == trueVar) return warn(notSending + \"twice\");\n window.sa_event_loaded = trueVar;\n window[loadedVariable] = trueVar;\n\n /////////////////////\n // SEND DATA VIA OUR PIXEL\n //\n\n // Send data via image\n var sendData = function (data, callback, onlyThisData) {\n data = onlyThisData ? data : assign(payload, page, data);\n\n if (nav.brave && !onlyThisData) data.brave = trueVar;\n\n\n var image = new Image();\n image.src =\n fullApiUrl +\n \"/simple.gif?\" +\n Object.keys(data)\n .filter(function (key) {\n return data[key] != undefinedVar;\n })\n .map(function (key) {\n return (\n encodeURIComponentFunc(key) +\n \"=\" +\n encodeURIComponentFunc(data[key])\n );\n })\n .join(\"&\") +\n \"&time=\" +\n Date.now();\n };\n\n // Customers can overwrite their hostname, here we check for that\n var overwrittenHostname =\n overwriteOptions.hostname || attr(scriptElement, \"hostname\");\n var definedHostname = overwrittenHostname || locationHostname;\n\n var basePayload = {\n version: version,\n hostname: definedHostname,\n };\n\n\n /////////////////////\n // INITIALIZE VALUES\n //\n\n\n\n /////////////////////\n // GET SETTINGS\n //\n\n // Script mode, this can be hash mode for example\n var mode = overwriteOptions.mode || attr(scriptElement, \"mode\");\n\n\n\n\n\n\n\n\n\n // This code could error on (incomplete) implementations, that's why we use try...catch\n var timezone;\n try {\n // c = countries\n timezone = collectMetricByString(\"c\")\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : undefinedVar;\n } catch (error) {\n warn(error);\n }\n\n /////////////////////\n // PAYLOAD FOR BOTH PAGE VIEWS AND EVENTS\n //\n\n var bot = isBotAgent;\n\n // t = timeonpage, scro = scrolled\n var collectDataOnLeave =\n collectMetricByString(\"t\") || collectMetricByString(\"scro\");\n\n if (bot) basePayload.bot = trueVar;\n\n var payload = assign(basePayload, {\n // us = useragent\n ua: collectMetricByString(\"us\") ? userAgent : undefinedVar,\n\n https: loc.protocol == https,\n timezone: timezone,\n page_id: collectDataOnLeave ? uuid() : undefinedVar,\n\n // se = sessions\n session_id: collectMetricByString(\"se\") ? uuid() : undefinedVar,\n });\n\n payload.sri = trueVar;\n\n // Use User-Agent Client Hints for better privacy\n // https://web.dev/user-agent-client-hints/\n if (uaData) {\n payload.mobile = uaData.mobile;\n payload.brands = stringify(uaData.brands);\n }\n\n /////////////////////\n // ADD WARNINGS\n //\n\n\n\n // When a customer overwrites the hostname, we need to know what the original\n // hostname was to hide that domain from referrer traffic\n if (definedHostname !== locationHostname)\n payload.hostname_original = locationHostname;\n\n // Don't track when Do Not Track is set to true\n if (doNotTrack in nav && nav[doNotTrack] == \"1\")\n return warn(\n notSendingWhen + doNotTrack + \" is enabled. See \" + docsUrl + \"/dnt\"\n );\n\n // Warn when sending from localhost and not having a hostname set\n if (\n (locationHostname.indexOf(\".\") == -1 ||\n /^[0-9.:]+$/.test(locationHostname)) &&\n !overwrittenHostname\n )\n warn(\n \"Set hostname on \" +\n locationHostname +\n \". See \" +\n docsUrl +\n \"/overwrite-domain-name\"\n );\n\n /////////////////////\n // SETUP INITIAL VARIABLES\n //\n\n var page = {};\n var lastSendPath;\n\n // We don't want to end up with sensitive data so we clean the referrer URL\n var referrer =\n (doc.referrer || \"\")\n .replace(locationHostname, definedHostname)\n .replace(/^https?:\\/\\/((m|l|w{2,3}([0-9]+)?)\\.)?([^?#]+)(.*)$/, \"$4\")\n .replace(/^([^/]+)$/, \"$1\") || undefinedVar;\n\n /////////////////////\n // TIME ON PAGE AND SCROLLED LOGIC\n //\n\n // We don't put msHidden in if duration block, because it's used outside of that functionality\n var msHidden = 0;\n\n var sendOnLeave = function (id, push) {\n if (!collectDataOnLeave) return;\n\n var append = assign(basePayload, {\n type: \"append\",\n original_id: push ? id : payload.page_id,\n });\n\n\n\n if (push || !nav.sendBeacon) {\n // sendData will assign payload to request\n sendData(append, undefinedVar, trueVar);\n } else {\n nav.sendBeacon(fullApiUrl + \"/append\", stringify(append));\n }\n };\n\n\n addEventListenerFunc(pagehide, sendOnLeave, falseVar);\n\n\n /////////////////////\n // ACTUAL PAGE VIEW LOGIC\n //\n\n var getPath = function (overwrite) {\n var path = \"\";\n\n // decodeURIComponent can fail when having invalid characters\n // https://github.com/simpleanalytics/roadmap/issues/462\n try {\n path = overwrite || decodeURIComponentFunc(loc.pathname);\n } catch (error) {\n warn(error);\n }\n\n\n\n\n return path;\n };\n\n // Send page view and append data to it\n var sendPageView = function (\n isPushState,\n deleteSourceInfo,\n sameSite,\n metadata\n ) {\n if (isPushState) sendOnLeave(\"\" + payload.page_id, trueVar);\n if (collectDataOnLeave) payload.page_id = uuid();\n\n var currentPage = definedHostname + getPath();\n\n sendData({\n id: payload.page_id,\n type: pageviewText,\n referrer: !deleteSourceInfo || sameSite ? referrer : null,\n query: getQueryParams(deleteSourceInfo),\n\n });\n\n referrer = currentPage;\n };\n\n var pageview = function (isPushState, pathOverwrite, metadata) {\n // Obfuscate personal data in URL by dropping the search and hash\n var path = getPath(pathOverwrite);\n\n // Don't send the last path again (this could happen when pushState is used to change the path hash or search)\n if (!path || lastSendPath == path) return;\n\n lastSendPath = path;\n page.path = path;\n\n\n // l = language\n if (collectMetricByString(\"l\")) {\n if (nav[language]) page[language] = nav[language];\n }\n\n\n // If a user does refresh we need to delete the referrer because otherwise it count double\n var perf = window.performance;\n var navigationText = \"navigation\";\n\n // Check if back, forward or reload buttons are being used in modern browsers\n var performaceEntryType;\n try {\n performaceEntryType = perf.getEntriesByType(navigationText)[0].type;\n } catch (error) {\n warn(error);\n }\n\n var userNavigated = performaceEntryType\n ? [\"reload\", \"back_forward\"].indexOf(performaceEntryType) > -1\n : // Check if back, forward or reload buttons are being use in older browsers\n // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD\n perf &&\n perf[navigationText] &&\n [1, 2].indexOf(perf[navigationText].type) > -1;\n\n // Check if referrer is the same as current real hostname (not the defined hostname!)\n var sameSite = referrer\n ? doc.referrer.split(slash)[2] == locationHostname\n : falseVar;\n\n\n\n var triggerSendPageView = function () {\n fetchedHighEntropyValues = trueVar;\n sendPageView(\n isPushState,\n isPushState || userNavigated || !collectMetricByString(\"r\"), // r = referrers\n sameSite,\n metadata\n );\n };\n\n if (!fetchedHighEntropyValues) {\n // Request platform information if this is available\n try {\n if (uaData && isFunction(uaData.getHighEntropyValues)) {\n uaData\n .getHighEntropyValues([platformText, platformVersionText])\n .then(function (highEntropyValues) {\n payload.os_name = highEntropyValues[platformText];\n payload.os_version = highEntropyValues[platformVersionText];\n triggerSendPageView();\n })\n .catch(triggerSendPageView);\n } else {\n triggerSendPageView();\n }\n } catch (e) {\n triggerSendPageView();\n }\n } else {\n triggerSendPageView();\n }\n };\n\n\n\n pageview();\n\n } catch (e) {\n warn(e);\n }\n})(\n window,\n {},\n \"simpleanalyticscdn.com\",\n \"queue.\",\n \"cdn_light_9\",\n \"sa\"\n);\n"],"names":["window","overwriteOptions","baseUrl","warn","undefinedVar","undefined","https","con","console","doNotTrack","nav","navigator","loc","location","locationHostname","host","doc","document","userAgent","notSending","fetchedHighEntropyValues","encodeURIComponentFunc","encodeURIComponent","decodeURIComponentFunc","decodeURIComponent","stringify","JSON","addEventListenerFunc","addEventListener","fullApiUrl","protocol","language","documentElement","uaData","userAgentData","platformText","platformVersionText","docsUrl","isBotAgent","test","scriptElement","currentScript","querySelector","args","slice","call","arguments","unshift","Function","prototype","bind","apply","attr","attribute","getAttribute","uuid","Date","now","cryptoObject","crypto","msCrypto","emptyUUID","uuidRegex","replace","c","getRandomValues","Uint8Array","toString","error","r","Math","random","assign","obj","prop","object","to","arg","index","length","nextSource","constructor","Object","nextKey","hasOwnProperty","namespaceText","namespace","strictUtm","loadedVariable","sa_event_loaded","timezone","sendData","data","callback","onlyThisData","payload","page","brave","Image","src","keys","filter","key","map","join","overwrittenHostname","hostname","definedHostname","basePayload","version","mode","Intl","DateTimeFormat","resolvedOptions","timeZone","bot","ua","page_id","session_id","sri","mobile","brands","hostname_original","indexOf","lastSendPath","referrer","sendOnLeave","id","push","append","type","original_id","sendBeacon","getPath","overwrite","path","pathname","sendPageView","isPushState","deleteSourceInfo","sameSite","metadata","ignoreSource","currentPage","query","search","split","keyValue","RegExp","pathOverwrite","performaceEntryType","perf","performance","navigationText","getEntriesByType","userNavigated","triggerSendPageView","getHighEntropyValues","then","highEntropyValues","os_name","os_version","catch","e","pageview"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 41f384b2..f2c27f28 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,9 @@ "deploy": "node --env-file-if-exists=.env deploy.mts", "pretest": "pnpm run build:testing", "test": "node -r dotenv/config ./test/index.js", - "test:unit": "mocha \"test/unit/*.test.js\" --exit", + "test:unit": "pnpm run build && mocha \"test/unit/*.test.js\" --exit", "test:matrix": "mocha test/helpers/get-browsers.test.js", - "test:deploy": "node --test test/deploy.test.mts", + "test:deploy": "pnpm run build && node --test test/deploy.test.mts", "posttest": "pnpm run build", "typecheck": "tsc --noEmit" },