Commit Graph

15 Commits

Author SHA1 Message Date
Artur Pata a204c89066
Stop trying to compile detector and verifier on CE (#5857) 2025-11-03 09:22:55 +00:00
RobertJoonas a83b4f3583
Clean up legacy verification code and script v2 flag (#5824)
* add module name to service_error when check times out

Otherwise, it can sometimes remain unclear in the diagnostics, whether
it was InstallationV2 or InstallationV2CacheBust that timed out.

* Remove duplicate timeout logic

The current production logs show two types of verification timeouts:

* service_error: "Unhandled Browserless response status: 408" (vast
  majority of cases)
* service_error: :timeout (only a few cases)

The latter happens when we hit the Req receive_timeout
(endpoint_timeout + 2s). I've seen Browserless not respect the timeout
param from time to time, so it's better to keep the timeout logic
"in-house" only.

* make service_error into a map with code and extra

* interpret temporary service errors

...but still consider them "unhandled" for telemetry, also notifying Sentry
and logging the warning.

* separate sentry messages (verification)

* make Verification.ChecksTest more DRY

* organize tests into describe blocks

* test verification telemetry and logging

* fix codespell

* get rid of legacy verification

* rename Checks.InstallationV2 -> Checks.VerifyInstallation

* delete Live.Installation and rename Live.InstallationV2 -> Live.Installation

* rename installationv2 (live) files as well

* delete old change-domain routes

Also rename current liveview modules and routes, removing the v2 suffix

* rename domain_change_v2 files, removing v2 suffix

* remove legacy JS verifier code

Also fix dockerignore and elixir.yml referencing a wrong priv path

* rename verification_v2_test -> verification_test

* remove v2 prefix from logs and sentry messages

* clean up duplicate external_sites_controller_test.exs tests

* remove flag

* fix typespec

* pass timeout as query param to Browserless too

* Fixup external sites controller test module (#5826)

* fix test description

---------

Co-authored-by: Artur Pata <artur.pata@gmail.com>
2025-10-27 09:39:41 +00:00
Artur Pata cc5ca4b752
Script v2: Apply prettier (#5718)
* Apply prettier

* Fix issue with quotes in test setup

* Fix other issues with customSubmitHandlerStub

* Fix format with cookies fixtures
2025-09-15 11:21:27 +00:00
Artur Pata 757cf95070
Script v2: Adds linter and prettier, satisfies linter (#5691)
* Install deps and create config

* Satisfy linter in tests

* Silence redeclare warnings

* Remove shadowed/redeclared variables

* Update changelog
2025-09-04 04:56:42 +00:00
Artur Pata af06df806b
Script v2: Verifier accepts cookies (#5669)
* Accept cookies (WIP)

* Make resolving Plausible function call a priority

* Update tracker script version

* Remove cookieBannerLikely, replace with debug-only cookiesConsentResult

* Use compact rules

* Make verifier tests less flaky

* Add fixtures for accepting cookies

* Limit CMPs

* Fix dep position
2025-09-01 05:54:19 +00:00
Artur Pata bb17a17e5a
Script v2: Allow verifying that tracker installed correctly (1st iteration) (#5572)
* Sketch out verification for v2 installs

* WIP

* Fix naming

* Implement CSP check, refactor what test event output looks like

* Update error matcher

* Better typedefs

* Unify error format

* WIP diagnostics

* Delete superfluos doc

* Remove prettierrc

* Fix type

* Remove superfluous error file

* Remove foobar.md

* Fix format and variable names, ensure compliance for errors

* Add cache bust check, fix success diagnostics

* Fix v2 verifier spec and add moduledocs

* Make test not dependent on tracker script version

* Make verifier less CPU intensive

* Change the signature of checkDisallowedByCSP

* Fix unused service_errror matcher

* Refactor data_domain to expected_domain

* Ignore request URL

* Add case for for succeeding after cache bust

* Fix infinite recursion

* Relax CSP error interpretation

* Fix sentry message, ignore plausible.s
2025-07-31 08:10:44 +00:00
RobertJoonas 97dcc3fe7c
Refactor Verification module structure (#5570)
* detector.js

* refactor: organize modules better

* Renaming (Elixir + JS)

* lib/plausible/verification -> lib/plausible/installation_support
* test/plausible/verification -> test/plausible/installation_support
* priv/tracker/verifier -> priv/tracker/installation_support
* tracker/verifier -> tracker/installation_support
* tracker/test/verifier -> tracker/test/installation-support

* rename remaining test modules

* add documentation

* dialyzer: remove module refs that do not exist yet

* Fix CI

* fix tracker CI

* fix tracker CI for good
2025-07-15 10:50:34 +00:00
RobertJoonas b76996b3a4
Verification v2 (#5549)
* new verifier script with tests + telemetry

* dataDomainMismatch tests

* more tests for callbackStatus and plausibleInstalled

* create priv/verifier subfolder + fix Elixir CI

* bump CI cache version

* organize verifier tests

* Remove accidentally committed verifier

* Rework compilation: Make it a variant, always return new verifier code in tests

* Make priv/tracker/verifier/ exist

* Handle static checks with grace

* Fix paths

* Fix paths

* Add some tests

* Add one more test

* split up the JS

* proxyLikely + code structure refactor + unit tests

* fix telemetry fields

* move most telemetry to logs

* run verifier tests only on chromium

* detect wordpressPlugin and wordpressLikely

* detect GTM

* rename JS checks

* detect cookiebot

* include new fields in logs

* different logs for browserless request vs js failures

* detect manual extension

* detect unknown attrs + fix logging

* stick to Elixir checks for snippet detection

* fix codespell

* fix IO.inspect

* remove unnecessary fields from test mock

* cookiebot doc

* move test into verifier subfolder

* do not duplicate ts types

* comma -> semicolon in log

* test dynamically loaded snippet

* improve logging on Browserless error

---------

Co-authored-by: Karl-Aksel Puulmann <oxymaccy@gmail.com>
2025-07-14 14:32:21 +00:00
Karl-Aksel Puulmann 1f86ae55ef
ScriptV2: `callback`, file downloads and `logging` changes (#5514)
* Make logging in tracker script configurable

* Improved callbacks

* Improved fileDownloads

* Export DEFAULT_FILE_TYPES

* Cross-browser compatibility

* Rename

* Rename a test

* chore: Bump tracker_script_version to 20
2025-06-19 08:45:20 +00:00
Karl-Aksel Puulmann 595e71a399
ScriptV2: NPM library codebase (#5459)
* Compile NPM modules into commonjs and esm modules

Note that since the module uses only vanilla es5 outside the export,
it's safe to just append to the minified output

* package.json, Typescript definition, generation for commonjs

* Scrap commonjs for the moment

Running into too big rabbit holes trying to get it off the ground

* Shared tests for npm and web

* Better way to identify npm module in fixture

* Simplify code

* Add NPM library specific tests

* Fix a flaky test

* Standardize a callsite

* npm_package standardize on

* Make legacy variant code more explicit

* Wrap code pre and post

* analyze-sizes.js should work with npm_package

* Port test changes from PR #5432

* Update outbound link feature test

* Await callInit

* Smaller npm module - mangle variables

* Clean up wrapping code

* chore: Bump tracker_script_version to 15

* Add debug messaging to expect

* Remove dead code

* Refactor, account for initialization delays in tests

* Remove needless features from compiler

As the compiler currently manages to compile everything in ~3 seconds,
the `features`/`compileIds` feature serves no more point. Scrapping it

* Re-inline readOutput

* Update tracker/test/plausible-npm.spec.js

Co-authored-by: Artur Pata <artur.pata@gmail.com>

* Remove redundant comment

---------

Co-authored-by: Artur Pata <artur.pata@gmail.com>
2025-06-04 10:47:44 +00:00
Karl-Aksel Puulmann 426ae49ed1
Proposal: ScriptV2 bundler (#5449)
* Experiment with rollup bundler

* WIP: Unbundle

* Always allow overriding url with options.u

* fix conditional

* Update manual conditional #2

* Unbundle custom events code

* Unbundle autocapturing of pageviews

* Comment Object.assign

* Rename functions in compiler

* Rename trigger -> track, unbundle

* Dont rely on window.plausible in custom-events.js

* chore: Bump tracker_script_version to 14

* Cherry-pick PR #5462
2025-06-04 07:36:02 +00:00
Karl-Aksel Puulmann 98cdeb23dd
ScriptV2: Configuration renames, iteration (#5427)
* plausible-main -> plausible-web

* Change elixir workflow

* Update tracker option names in tracker.ex

* config.hash -> config.hashBasedRouting

* Enable revenue by default for plausible-web

* Enable taggedEvents by default

* config.local -> config.captureOnLocalhost

* manual -> autoCapturePageviews

* Update playwright tests

* Support adding/editing file types for download in plausible-web

Original docs: https://plausible.io/docs/file-downloads-tracking#what-if-i-want-to-track-a-different-file-type

* rebase: initialize-page-dynamically update

* chore: Bump tracker_script_version to 12

* Ignore pageviews in file-downloads.spec

* Phrasing in tests

* Remove unneeded conditional
2025-05-27 11:28:17 +00:00
Karl-Aksel Puulmann 844c118135
ScriptV2: `plausible.init`, `customProperties`, snippet compilation, double initialization protection, `swc` (#5391)
* WIP: init() for plausible.js

* Reformat whitespace

* Handle double-initialization gracefully

* Script customProperties option

* Remove pageview-props from tracker script interpolation - its now an advanced config

* Add compile option for compiling the web snippet. This can then be copied to e.g. onboarding

* Switch minification from uglify-js to swc

* Use 4 passes for optimal output

* Remove use strict to remove it from output. Uglifyjs already removed this

* Minor optimization: Remove nulls from output via runningEngagementStart

* Minor optimization: Reduce onIgnoredEvent

* config_json -> config_js

* Dead attribute

* Remove guard for engagements

* More protective customProperties

* Object.assign

* chore: Bump tracker_script_version to 10

* No need for default in Object.assign

* Remove dead guard
2025-05-20 06:57:35 +00:00
Karl-Aksel Puulmann 96abac2d4e
ScriptV2: plausible-main, script size measurements (#5375)
* analyze-sizes.js script

* Start work on plausible-main

Size changes:
```
Main variants:
|                                 | Brotli | Gzip  | Uncompressed |
| ------------------------------- | ------ | ----- | ------------ |
| plausible-main.js (new variant) | 2344B  | 2675B | 6062B        |

Important legacy variants:
|                                                                                                   | Brotli               | Gzip                 | Uncompressed          |
| ------------------------------------------------------------------------------------------------- | -------------------- | -------------------- | --------------------- |
| plausible.js                                                                                      | 1086B (-6B / -0.5%)  | 1283B (+5B / +0.4%)  | 2684B (+4B / +0.1%)   |
| plausible.hash.js                                                                                 | 1078B (+24B / +2.3%) | 1268B (+29B / +2.3%) | 2642B (+76B / +3%)    |
| plausible.pageview-props.tagged-events.js                                                         | 1846B (+57B / +3.2%) | 2158B (+63B / +3%)   | 4739B (+185B / +4.1%) |
| plausible.file-downloads.hash.pageview-props.revenue.js                                           | 1669B (+62B / +3.9%) | 1958B (+54B / +2.8%) | 4097B (+175B / +4.5%) |
| plausible.compat.exclusions.file-downloads.outbound-links.pageview-props.revenue.tagged-events.js | 2286B (+81B / +3.7%) | 2692B (+84B / +3.2%) | 5978B (+280B / +4.9%) |

Summary:
|                                                                                                                     | Brotli               | Gzip                 | Uncompressed            |
| ------------------------------------------------------------------------------------------------------------------- | -------------------- | -------------------- | ----------------------- |
| Largest variant (plausible.compat.exclusions.file-downloads.outbound-links.pageview-props.revenue.tagged-events.js) | 2286B (+81B / +3.7%) | 2692B (+84B / +3.2%) | 5978B (+280B / +4.9%)   |
| Max change (plausible.exclusions.hash.local.manual.outbound-links.pageview-props.js)                                | 1460B (+80B / +5.8%) | 1755B (+83B / +5%)   | 3557B (+241B / +7.3%)   |
| Min change (plausible.js)                                                                                           | 1086B (-6B / -0.5%)  | 1283B (+5B / +0.4%)  | 2684B (+4B / +0.1%)     |
| Median change                                                                                                       | 1723B (+65B / +3.9%) | 2037B (+70B / +3.6%) | 4335B (+220.5B / +5.3%) |
```

* Janky conditionals for COMPILE_CONFIG

Results in no size increase for historical scripts:

Main variants:
|                                 | Brotli | Gzip  | Uncompressed |
| ------------------------------- | ------ | ----- | ------------ |
| plausible-main.js (new variant) | 2339B  | 2672B | 6058B        |

Important legacy variants:
|                                                                                                   | Brotli          | Gzip                | Uncompressed    |
| ------------------------------------------------------------------------------------------------- | --------------- | ------------------- | --------------- |
| plausible.js                                                                                      | 1092B (0B / 0%) | 1280B (+2B / +0.2%) | 2680B (0B / 0%) |
| plausible.hash.js                                                                                 | 1054B (0B / 0%) | 1241B (+2B / +0.2%) | 2566B (0B / 0%) |
| plausible.pageview-props.tagged-events.js                                                         | 1789B (0B / 0%) | 2097B (+2B / +0.1%) | 4554B (0B / 0%) |
| plausible.file-downloads.hash.pageview-props.revenue.js                                           | 1607B (0B / 0%) | 1906B (+2B / +0.1%) | 3922B (0B / 0%) |
| plausible.compat.exclusions.file-downloads.outbound-links.pageview-props.revenue.tagged-events.js | 2205B (0B / 0%) | 2610B (+2B / +0.1%) | 5698B (0B / 0%) |

Summary:
|                                                                                                                     | Brotli                   | Gzip                     | Uncompressed             |
| ------------------------------------------------------------------------------------------------------------------- | ------------------------ | ------------------------ | ------------------------ |
| Largest variant (plausible.compat.exclusions.file-downloads.outbound-links.pageview-props.revenue.tagged-events.js) | 2205B (0B / 0%)          | 2610B (+2B / +0.1%)      | 5698B (0B / 0%)          |
| Max change (plausible.js)                                                                                           | 1092B (0B / 0%)          | 1280B (+2B / +0.2%)      | 2680B (0B / 0%)          |
| Median change                                                                                                       | 1655B (0B / 0%)          | 1969B (+2B / +0.1%)      | 4116B (0B / 0%)          |

* plausible-main: no COMPILE_EXCLUSIONS

Size change from this:
|                   | Brotli              | Gzip                  | Uncompressed          |
| ----------------- | ------------------- | --------------------- | --------------------- |
| plausible-main.js | 2223B (-116B / -5%) | 2533B (-139B / -5.2%) | 5710B (-348B / -5.7%) |

* Rework server.js to be less compiler-aware

* Add first test for plausible-main.js

* Tests for plausible-main variant

* Remove report-sizes.js

* Tracker - report size changes in a comment

* Update summary notes

* Handle outbound links not being captured by network tab in webkit

See: https://3.basecamp.com/5308029/buckets/39034214/card_tables/cards/8429433464

* Solve a TODO

* Sign in comment

* Update pin

* Mock file downloads

* Update base branch

* Pin add-and-commit as per cenk request

* Use bot for checkout

* Attempt to reduce permissions

* Smaller fetch depth

* Fix rebase
2025-05-12 06:55:54 +00:00
Karl-Aksel Puulmann 7265d04a8c
ScriptV2: Improved tracker compile.js (#5363)
* Add CLI arguments to compile.js and logging

* Rename folder

* Extract compile code, es modules

* Add a progress bar

* Remove handlebars

* Update report-sizes

* Remove debug code

* inline

* More generous split

* Allow positional arguments for compiling

* Add watch option to compile

* Add compileFile logic

* Most tests run under playwright

* All tests runnable

* Update playwright, remove hack

Note that upgrading to latest failed due to a new test failure. This
might be due to a chrome update.

* Compile script on the fly for tests

* Minor refactor for compileAll

* es module for generate-variants.js

* Allow passing suffix to compilation script - this can be used to generate separate files for comparison

* Fix positionals

* Switch from 2 passes to 1 pass

Did some data analysis on this data:
- Compared to master, 1 pass increased brotli size by 0.7%, 2 passes 0.4%.

Given the change is insignificant enough, we can ignore it for now

The increase is likely due to order of operations in compilation and
some inlined functions getting lost.

* Move customEvents.js to plausible.js

* Clean up API

* Suffix default

* Rework variants.json, globals stored there

* Add more variants under test

* Distribute work across multiple worker threads

Compile time went on my machine from 60s -> 30s

* Fixup server

* Update canSkipCompile

* chore: Bump tracker_script_version to 7

* Update scripts

* Update node-version

* Experiment with adding a small delay to page

* Casing

* rename variable

* Update help text

* features -> compileIds, backport functionality from other branch
2025-05-08 07:05:09 +00:00