Astro integration that adds configured query parameters to external links at build time.
bun add @newgentdigital/auto-param-astro
# or
npm i @newgentdigital/auto-param-astro// astro.config.mjs
import autoParamAstro from "@newgentdigital/auto-param-astro";
import { defineConfig } from "astro/config";
export default defineConfig({
integrations: [
autoParamAstro({
params: {
utm_source: "newsletter",
utm_medium: "email",
},
paramMode: "replace",
exemptDataAttributes: ["data-auto-param-exempt"],
exemptDomains: ["example.com", "*.github.com"],
}),
],
});- Runs during the
astro:build:donehook. - Walks the build output directory and rewrites
*.htmlfiles. - Updates
<a href="https://...">links (and protocol-relative//...) by inserting/updatingparams. - Skips links that:
- have any configured
exemptDataAttributespresent on the<a>tag - point to a host in
exemptDomains(exact match or subdomain match; also supports leading-wildcard*.example.com)
- have any configured
params:Record<string, string | number | boolean>
paramMode:"preserve" | "override" | "replace"- Default:
"preserve" preserve(a): keep existing URL params, only add missing configured paramsoverride(b): keep existing URL params, but overwrite values for configured keysreplace(c): remove all existing URL params and add only configured params
- Default:
exemptDataAttributes:string[]- Default:
["data-auto-param-exempt"]
- Default:
exemptDomains:string[]- Default:
[]
- Default:
Assume you have the following integration config:
// astro.config.mjs
autoParamAstro({
params: {
utm_source: "newsletter",
utm_medium: "email",
utm_term: "winter",
ref: true,
v: 2,
},
});... and this incoming link in your code:
https://example.com/pricing?utm_source=twitter&utm_medium=social&utm_medium=ads&utm_campaign=sale#faq
What result the integration generates depends on your paramMode:
-
preserve(default)- Keeps existing values for any configured parameters that already exist.
- Only adds configured parameters that are missing.
- Result:
https://example.com/pricing?utm_source=twitter&utm_medium=social&utm_medium=ads&utm_campaign=sale&utm_term=winter&ref=true&v=2#faq
-
override- Overwrites configured parameters (and collapses duplicates for those parameters to a single value).
- Leaves non-configured parameters (like
utm_campaign) alone. - Result:
https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=sale&utm_term=winter&ref=true&v=2#faq
-
replace- Drops all existing query parameters, then adds only configured ones.
- Keeps the path and hash.
- Result:
https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_term=winter&ref=true&v=2#faq
A link with the default attribute data-auto-param-exempt or one of the configured exemptDataAttributes will prevent the integration from updating the href for that link.
<a href="https://example.com" data-auto-param-exempt>
This link will not be modified.
</a>