chore: release new version (canary) - #603
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 18, 2026 09:09
3e82628 to
8d2b066
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 18, 2026 09:17
8d2b066 to
1903375
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 18, 2026 09:24
1903375 to
80cbc5f
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 18, 2026 09:38
80cbc5f to
f55247c
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 18, 2026 09:46
f55247c to
9e14e6f
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 18, 2026 09:51
9e14e6f to
f6546ac
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 18, 2026 09:58
f6546ac to
b065aaf
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 18, 2026 10:04
b065aaf to
67dbfc5
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 18, 2026 10:14
67dbfc5 to
5761df2
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 05:11
c391320 to
0bc46db
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 08:58
0bc46db to
9065c04
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 09:31
9065c04 to
d54966a
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 20, 2026 10:17
d54966a to
d458af8
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 20, 2026 10:45
d458af8 to
42c483d
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 20, 2026 10:50
42c483d to
10d5311
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 20, 2026 11:03
10d5311 to
5149708
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 20, 2026 11:07
5149708 to
10e8595
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 20, 2026 13:11
10e8595 to
f2e7d20
Compare
Codecov Report✅ All modified and coverable lines are covered by tests.
🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
mainis currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, runchangeset pre exitonmain.Releases
@codefast/tracking@1.0.0-canary.7
Minor Changes
#605
cb46bddThanks @thevuong! - Adds the shared ad-destination frame for consuming one{ ads, analytics }decision across ad platforms (spec-destinations §5):toAdConsentState(decision)normalizes it to the two independent levers —analyticsdrives whether events transmit,adsdrives Limited Data Use — so per-vendor mappings cannot drift. Ships a reference Meta destination (createMetaDestination,toMetaDataProcessingOptions) that maps each event and the liveadsdecision to Meta'sdataProcessingOptions(geolocated LDU whenadsis denied) and hands it to an injectedtransport. Consent-restriction mapping only — the Pixel/CAPI transport and credentials are the integrator's to supply; an ad sink is neverexempt.#612
1337fc3Thanks @thevuong! - Adds the TCF/GPP interop reconciler (spec-ad-consent-frameworks): the system reads an external CMP and reconciles it with the native{ ads, analytics }decision — it never becomes a CMP or mints TC/GPP strings.reconcileAdFrameworkConsent({ native, cmp, hasGlobalPrivacyControlSignal })applies the §3 precedence (a governing CMP overrides its categories; fail-closed to denied while the CMP is loading; a missing or out-of-scope CMP leaves native standing; GPC only tightensads), covering conformance vectors V1–V6.hasTcfApi/hasGppApidetect the__tcfapi/__gppread APIs without invoking them. TCF purpose ids and the Google vendor id are deliberately not hard-coded — that mapping is ad-ops policy, so the caller derives theCmpConsentSignalit passes in.#615
2bcd31fThanks @thevuong! - Letcodefast mirrorgeneratepackage.json#exportsfromdist/, the same as every other library package (di, theme), instead of hand-curating them under mirror's preserve mode. The per-module build output is unchanged, so mirror emits a subpath for each built module, and the root becomes the client entry.Breaking:
@codefast/trackingis now the client entry — it re-exports the isomorphic core plus the whole browser surface (createClientTracker,createConsentRuntime, the React bindings, the gtag + ad-network destinations). Server code must import the core it needs from@codefast/tracking/core/*, not from the root../client,./server,./core,./react, and./destinationsgroup barrels are gone. Use the client root for browser code, or a module's own subpath for granular/server imports (@codefast/tracking/server/initial-consent,@codefast/tracking/client/gpc, …).@codefast/tracking/adapters/tanstack-start(was/tanstack-start); the import-protection deny-list is@codefast/tracking/tooling/import-protection(was/import-protection).SERVER_ONLY_SUBPATHSnow deniesserver/**andadapters/**.#617
b979371Thanks @thevuong! - Harden the package from a full audit — correctness, coverage, and a leaner public surface.isConsentReceiptInputnow validatesmethodandsubjectIdTypeagainst their enums, not justtypeof === "string"— the untrusted-body guard no longer narrows a bogus value to a closed union member.CookieAnonymousIdgainscurrent()— a non-minting read of the existing id (undefinedwhen none) so a consent receipt stamps the id the visitor already carries instead of a throwaway that never correlates for erasure.coarsenIprejects out-of-range IPv4 octets ("999.…") rather than storing a malformed coarse value.toAdConsentStatead lever, so itsad_storagemapping can't drift from Meta/TikTok.InitialConsentno longer re-exported fromadapters/tanstack-startorserver/initial-consent(import it fromcore/consent), and theAnonymousIdResponseCookieOptionsalias is gone —setAnonymousIdResponseCookietakesAnonymousIdCookieOptionsfromserver/anonymous-id-cookiedirectly.TrackedEventenvelope to a single interface — the unusedTrackedEventBaseandTrackEventnames are gone (TrackedEventkeeps thetype: "track"discriminant for a future additive union).Also adds test coverage for the previously-untested
recordConsentReceiptFromRequestadapter path (no-store header, body-IP rejection, coarsened IP, PII-free ack).#617
b979371Thanks @thevuong! - Remove two leftover indirection layers in the server lane that no call site used.Breaking:
@codefast/tracking/adapters/request-contextsubpath is gone. ItsRequestContextseam (agetHeader/setHeaderinterface) plus the parallel*FromContext/*OnContexthelpers existed only to back a hypothetical future./next/./remixadapter, but there was exactly one adapter and it duplicated every signature and doc comment.@codefast/tracking/adapters/tanstack-startnow callsgetRequestHeader/setResponseHeaderdirectly; its public surface (resolveInitialConsentFromRequest,setAnonymousIdResponseCookie,clearAnonymousIdResponseCookie,recordConsentReceiptFromRequest) is unchanged.resolveRegion(headers)is removed from@codefast/tracking/server/region. It was a pre-fail-closed leftover with no production call site, and its missing-geo semantics (unknown region → opt-out) contradicted the fail-closed invariant the server-first path relies on. UseresolveRegionFromCountryCode(what the production path already uses viaresolveInitialConsent), orresolveInitialConsentFromRequestfor the full per-request resolution.#606
5a4ff42Thanks @thevuong! - AddscreateDurableReceiptStore({ backend })— a durableReceiptStoreover an injectedReceiptStoreBackend(a minimal id-keyedget/putprimitive). The package supplies the append-only contract and adaptation; the deployment supplies the backend client (Vercel KV, Postgres, an append-only log), so no database dependency is baked in.putMUST be idempotent-by-id so the append-only guarantee holds atomically under retries/concurrency (e.g. KV set-if-absent, PostgresINSERT … ON CONFLICT DO NOTHING) — the frame delegates rather than doing a racy get-then-put. Pair it with a real backend in production, wherecreateInMemoryReceiptStoreis not a lawful store on its own.#604
7bb4be7Thanks @thevuong! -createClientTrackernow accepts an optionalisExemptionAllowedgate, consulted before anexemptdestination receives an event while the consent gate is closed. ePrivacy audience-measurement exemption is jurisdiction-dependent (spec-destinations §2), so it must be gateable per region rather than assumed global — returningfalsewithholds even exempt sinks where exemption is not defensible. Omit it to keep the prior behavior (exempt everywhere). The gate is irrelevant once consent is granted, since every destination then receives the full envelope.#608
6cdd930Thanks @thevuong! - Adds GA4 DSR delegation (spec-data-subject-rights §3): the system delegates per-visitor deletion to the platform rather than building a deletion store.buildGa4UserDeletionRequest({ propertyId, clientId })returns the network-free request shape andsubmitGa4UserDeletion({ …, accessToken, transport? })POSTs it — targeting the current Analytics Admin APIproperties.submitUserDeletion(the legacy v3userDeletionRequests:upsertwas sunset with Universal Analytics), keyed by a flatclientId. Authorization is the caller's: pass a bearer token for theanalytics.editscope; no OAuth or HTTP client is baked in. Server-only (@codefast/tracking/server).#617
b979371Thanks @thevuong! - Adopt TanStack Start's first-class server helpers in the adapter instead of hand-rolling over raw request/response headers.setCookie/deleteCookie(from@tanstack/react-start/server) rather thansetResponseHeader("set-cookie", …). The raw header call replaces any existingSet-Cookieon the response — it would clobber a session or framework cookie set on the same response — whereassetCookieappends. No behavior change to the emitted cookie (stillPath=/; Max-Age=1y; SameSite=Lax; Secure, notHttpOnly).getRequestIP({ xForwardedFor: true })— the maintained, platform-aware path — instead of hand-parsingx-forwarded-for/x-real-ip.Breaking (
@codefast/tracking/server/anonymous-id-cookie): the string buildersbuildAnonymousIdSetCookie/buildClearAnonymousIdSetCookieare replaced byresolveAnonymousIdCookie/resolveClearAnonymousIdCookie, which return the validated name/value plus cookie attributes for a frameworksetCookie/deleteCookiecall.isValidAnonymousIdis unchanged; the cookie-name guard is now the exportedassertValidAnonymousIdCookieName.#607
749dd16Thanks @thevuong! - Adds server-side GA4 Measurement Protocol primitives for forwarding a server-owned event (re-added now that a consumer tracks one — a server-recorded consent decision):sendMeasurementProtocolEventsPOSTs{ client_id, events, consent? }to the credentialed/mp/collectendpoint through an injectedtransport(defaultfetch), so no HTTP client or credentials are baked in;extractGaClientIdderives the GA4client_idfrom a_gacookie;toMeasurementProtocolConsentmaps the packageConsentDecisionto the MPconsentsignals. Server-only (@codefast/tracking/server). The caller owns the credentials and the consent gate.#602
5ca04e2Thanks @thevuong! -createClientTrackernow accepts an optionalonDeliveryErrorhook, called once per failed delivery (a destination throwing synchronously or rejecting) with{ destination, error, event }. The tracker still swallows the failure so tracking never breaks the interaction — the hook is a metering seam for wiring delivery failures to a monitor in production. The hook is itself guarded, so a throwing observer can't break the interaction either. Exposes theDeliveryErrorContexttype from@codefast/tracking/client.#610
fdb8d7cThanks @thevuong! - Adds the per-destination erasure capability for DSR withdrawal (spec-data-subject-rights §3, DSR-V2/V4):Destinationgains an optionalonErasure(id)hook, andcreateClientTrackerreturns anerase(id)method that invokes each destination'sonErasureonce on withdrawal, swallowing failures so a destination can never break the flow. The referencecreateMetaDestinationimplementsonErasureas cookie-clear (via an injectedclearCookiesseam) plus stop-send — Meta exposes no per-visitor deletion API, so the binding never fabricates one. Destinations with nothing to erase omit the hook.#611
a5527c3Thanks @thevuong! - Extends the ad-destination frame with two more reference vendors (spec-destinations §5), consuming the same{ ads, analytics }decision:createMicrosoftUetDestination/toMicrosoftUetConsentmapadsto UET's only enforced signal,ad_storage(UET has noanalytics_storage);createTiktokDestination/toTiktokConsentmapadsto TikTok's singlelimited_data_useboolean (not Meta'sdataProcessingOptionsstructure). Both take an injectedtransport(no pixel id, tag id, or network client baked in) and implementonErasureas cookie-clear + stop-send, since neither exposes a per-visitor deletion API.consentRequirementstays"required".@codefast/typescript-config@1.0.0-canary.7
Minor Changes
71cf664Thanks @thevuong! - Add alibrary-build.jsonpreset holding the shared emit options for the nativetscpackage build (noEmit: false,declaration,declarationMap,sourceMap,types: ["node"]). Each package'stsconfig.build.jsonnow uses arrayextends(["./tsconfig.json", "@codefast/typescript-config/library-build.json"]) and keeps only its localoutDir/rootDirandinclude— dropping the duplicated emit block across all library packages. Path-relative options stay local becauseextendsresolves them against the file that declares them.@codefast/ui@1.0.0-canary.7
Patch Changes
#632
44035caThanks @thevuong! - AnnotateCheckboxGroupItem'sonCheckedChangecallback with aCheckedStatetype derived from the underlying Radix primitive. Radix'sradix-uiumbrella namespace merge dropped the contextual type for the inline callback parameter, trippingnoImplicitAnyduring the build; deriving the type fromRootkeeps it in lockstep with the primitive.Updated dependencies []:
@codefast/cli@1.0.0-canary.7
@codefast/di@1.0.0-canary.7
@codefast/tailwind-variants@1.0.0-canary.7
@codefast/theme@1.0.0-canary.7
@codefast/benchmark-di-inversify@1.0.0-canary.7
Patch Changes
@codefast/benchmark-tailwind-variants@1.0.0-canary.7
Patch Changes
@codefast/benchmark-viewer@1.0.0-canary.7
Patch Changes
@codefast/benchmark-harness@1.0.0-canary.7