From 1151c52419d73a7e41dae93da4081149cdb73be7 Mon Sep 17 00:00:00 2001 From: David Newell Date: Tue, 11 Feb 2025 09:48:03 +0000 Subject: [PATCH 1/8] feat: override exception capture clientside (#1726) --- .../config-snapshot.test.ts.snap | 5 +++++ .../exception-observer.test.ts | 22 +++++++++++++------ src/extensions/exception-autocapture/index.ts | 20 +++++++++-------- src/types.ts | 7 ++++++ 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/__tests__/__snapshots__/config-snapshot.test.ts.snap b/src/__tests__/__snapshots__/config-snapshot.test.ts.snap index 968f8c813..7a11c38bb 100644 --- a/src/__tests__/__snapshots__/config-snapshot.test.ts.snap +++ b/src/__tests__/__snapshots__/config-snapshot.test.ts.snap @@ -437,6 +437,11 @@ exports[`config snapshot for PostHogConfig 1`] = ` \\"Pick\\" ] ], + \\"capture_exceptions\\": [ + \\"undefined\\", + \\"false\\", + \\"true\\" + ], \\"disable_scroll_properties\\": [ \\"undefined\\", \\"false\\", diff --git a/src/__tests__/extensions/exception-autocapture/exception-observer.test.ts b/src/__tests__/extensions/exception-autocapture/exception-observer.test.ts index 654a8da25..03b1950af 100644 --- a/src/__tests__/extensions/exception-autocapture/exception-observer.test.ts +++ b/src/__tests__/extensions/exception-autocapture/exception-observer.test.ts @@ -71,7 +71,7 @@ describe('Exception Observer', () => { }) it('should instrument handlers when started', () => { - expect(exceptionObserver.isCapturing).toBe(true) + expect(exceptionObserver.hasHandlers).toBe(true) expect(exceptionObserver.isEnabled).toBe(true) expect((window?.onerror as any).__POSTHOG_INSTRUMENTED__).toBe(true) @@ -84,7 +84,7 @@ describe('Exception Observer', () => { expect((window?.onerror as any)?.__POSTHOG_INSTRUMENTED__).not.toBeDefined() expect((window?.onunhandledrejection as any)?.__POSTHOG_INSTRUMENTED__).not.toBeDefined() - expect(exceptionObserver.isCapturing).toBe(false) + expect(exceptionObserver.hasHandlers).toBe(false) }) it('captures an event when an error is thrown', () => { @@ -162,9 +162,17 @@ describe('Exception Observer', () => { }) expect(request.batchKey).toBe('exceptionEvent') }) + + it('should instrument handlers when started', () => { + posthog.config.capture_exceptions = false + exceptionObserver = new ExceptionObserver(posthog) + + expect(exceptionObserver.hasHandlers).toBe(false) + expect(exceptionObserver.isEnabled).toBe(false) + }) }) - describe('when there are handlers already', () => { + describe('when there are handlers already present', () => { const originalOnError = jest.fn() const originalOnUnhandledRejection = jest.fn() @@ -224,9 +232,9 @@ describe('Exception Observer', () => { describe('when no decide response', () => { it('cannot be started', () => { expect(exceptionObserver.isEnabled).toBe(false) - expect(exceptionObserver.isCapturing).toBe(false) + expect(exceptionObserver.hasHandlers).toBe(false) exceptionObserver['startCapturing']() - expect(exceptionObserver.isCapturing).toBe(false) + expect(exceptionObserver.hasHandlers).toBe(false) }) }) @@ -237,9 +245,9 @@ describe('Exception Observer', () => { it('cannot be started', () => { expect(exceptionObserver.isEnabled).toBe(false) - expect(exceptionObserver.isCapturing).toBe(false) + expect(exceptionObserver.hasHandlers).toBe(false) exceptionObserver['startCapturing']() - expect(exceptionObserver.isCapturing).toBe(false) + expect(exceptionObserver.hasHandlers).toBe(false) }) }) }) diff --git a/src/extensions/exception-autocapture/index.ts b/src/extensions/exception-autocapture/index.ts index bb166bb4c..5187de263 100644 --- a/src/extensions/exception-autocapture/index.ts +++ b/src/extensions/exception-autocapture/index.ts @@ -4,13 +4,13 @@ import { Properties, RemoteConfig } from '../../types' import { createLogger } from '../../utils/logger' import { EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE } from '../../constants' +import { isBoolean, isUndefined } from '../../utils/type-utils' const logger = createLogger('[ExceptionAutocapture]') export class ExceptionObserver { instance: PostHog remoteEnabled: boolean | undefined - private originalOnUnhandledRejectionHandler: Window['onunhandledrejection'] | null | undefined = undefined private unwrapOnError: (() => void) | undefined private unwrapUnhandledRejection: (() => void) | undefined @@ -21,20 +21,19 @@ export class ExceptionObserver { this.startIfEnabled() } - get isEnabled() { + public get isEnabled(): boolean { + if (isBoolean(this.instance.config.capture_exceptions)) { + return this.instance.config.capture_exceptions + } return this.remoteEnabled ?? false } - get isCapturing() { - return !!(window?.onerror as any)?.__POSTHOG_INSTRUMENTED__ - } - get hasHandlers() { - return this.originalOnUnhandledRejectionHandler || this.unwrapOnError + return !isUndefined(this.unwrapOnError) } startIfEnabled(): void { - if (this.isEnabled && !this.isCapturing) { + if (this.isEnabled && !this.hasHandlers) { logger.info('enabled, starting...') this.loadScript(this.startCapturing) } @@ -59,7 +58,7 @@ export class ExceptionObserver { } private startCapturing = () => { - if (!window || !this.isEnabled || this.hasHandlers || this.isCapturing) { + if (!window || !this.isEnabled || this.hasHandlers) { return } @@ -83,7 +82,10 @@ export class ExceptionObserver { private stopCapturing() { this.unwrapOnError?.() + this.unwrapOnError = undefined + this.unwrapUnhandledRejection?.() + this.unwrapUnhandledRejection = undefined } onRemoteConfig(response: RemoteConfig) { diff --git a/src/types.ts b/src/types.ts index 99f978f70..0f8e28c22 100644 --- a/src/types.ts +++ b/src/types.ts @@ -782,6 +782,13 @@ export interface PostHogConfig { */ capture_dead_clicks?: boolean | DeadClicksAutoCaptureConfig + /** + * Determines whether to capture exceptions. + * + * @default undefined + */ + capture_exceptions?: boolean + /** * Determines whether to disable scroll properties. * These allow you to keep track of how far down someone scrolled in your website. From 9dd82c27a316a4025ce33d0c5be29cb18011a79c Mon Sep 17 00:00:00 2001 From: daibhin Date: Tue, 11 Feb 2025 09:48:54 +0000 Subject: [PATCH 2/8] chore: Bump version to 1.217.0 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10825f423..f335877a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.217.0 - 2025-02-11 + +- feat: override exception capture clientside (#1726) + ## 1.216.1 - 2025-02-10 - fix: capture when argument is not a string (#1724) diff --git a/package.json b/package.json index 7a4350812..6d6ad4585 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "posthog-js", - "version": "1.216.1", + "version": "1.217.0", "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.", "repository": "https://github.com/PostHog/posthog-js", "author": "hey@posthog.com", From 8142493881eb344fb6055677adb73badfae5ef4a Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Tue, 11 Feb 2025 17:06:06 +0000 Subject: [PATCH 3/8] fix: canvas quality value (#1727) * fix: canvas quality value * fix tests * Update src/extensions/replay/sessionrecording.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> * constantfy --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- .../replay/sessionrecording.test.ts | 33 +++++++++++++++++-- src/extensions/replay/sessionrecording.ts | 21 +++++++++--- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/__tests__/extensions/replay/sessionrecording.test.ts b/src/__tests__/extensions/replay/sessionrecording.test.ts index 255ee304d..e384f7776 100644 --- a/src/__tests__/extensions/replay/sessionrecording.test.ts +++ b/src/__tests__/extensions/replay/sessionrecording.test.ts @@ -344,10 +344,39 @@ describe('SessionRecording', () => { '%s', (_name: string, serverSide: boolean | undefined, clientSide: boolean | undefined, expected: boolean) => { posthog.persistence?.register({ - [SESSION_RECORDING_CANVAS_RECORDING]: { enabled: serverSide, fps: 4, quality: 0.1 }, + [SESSION_RECORDING_CANVAS_RECORDING]: { enabled: serverSide, fps: 4, quality: '0.1' }, }) posthog.config.session_recording.captureCanvas = { recordCanvas: clientSide } - expect(sessionRecording['canvasRecording']).toMatchObject({ enabled: expected }) + expect(sessionRecording['canvasRecording']).toMatchObject({ enabled: expected, fps: 4, quality: 0.1 }) + } + ) + + it.each([ + ['max fps and quality', 12, '1.0', 12, 1], + ['min fps and quality', 0, '0.0', 0, 0], + ['mid fps and quality', 6, '0.5', 6, 0.5], + ['null fps and quality', null, null, 4, 0.4], + ['undefined fps and quality', undefined, undefined, 4, 0.4], + ['string fps and quality', '12', '1.0', 4, 1], + ['over max fps and quality', 15, '1.5', 12, 1], + ])( + '%s', + ( + _name: string, + fps: number | string | null | undefined, + quality: string | null | undefined, + expectedFps: number, + expectedQuality: number + ) => { + posthog.persistence?.register({ + [SESSION_RECORDING_CANVAS_RECORDING]: { enabled: true, fps, quality }, + }) + + expect(sessionRecording['canvasRecording']).toMatchObject({ + enabled: true, + fps: expectedFps, + quality: expectedQuality, + }) } ) }) diff --git a/src/extensions/replay/sessionrecording.ts b/src/extensions/replay/sessionrecording.ts index ee4c2267f..74a6ab050 100644 --- a/src/extensions/replay/sessionrecording.ts +++ b/src/extensions/replay/sessionrecording.ts @@ -74,6 +74,10 @@ const PARTIAL_COMPRESSION_THRESHOLD = ONE_KB export const RECORDING_MAX_EVENT_SIZE = ONE_KB * ONE_KB * 0.9 // ~1mb (with some wiggle room) export const RECORDING_BUFFER_TIMEOUT = 2000 // 2 seconds export const SESSION_RECORDING_BATCH_KEY = 'recordings' +const DEFAULT_CANVAS_QUALITY = 0.4 +const DEFAULT_CANVAS_FPS = 4 +const MAX_CANVAS_FPS = 12 +const MAX_CANVAS_QUALITY = 1 const ACTIVE_SOURCES = [ IncrementalSource.MouseMove, @@ -337,14 +341,21 @@ export class SessionRecording { const canvasRecording_client_side = this.instance.config.session_recording.captureCanvas const canvasRecording_server_side = this.instance.get_property(SESSION_RECORDING_CANVAS_RECORDING) - const enabled = canvasRecording_client_side?.recordCanvas ?? canvasRecording_server_side?.enabled ?? false - const fps = canvasRecording_client_side?.canvasFps ?? canvasRecording_server_side?.fps ?? 0 - const quality = canvasRecording_client_side?.canvasQuality ?? canvasRecording_server_side?.quality ?? 0 + const enabled: boolean = + canvasRecording_client_side?.recordCanvas ?? canvasRecording_server_side?.enabled ?? false + const fps: number = + canvasRecording_client_side?.canvasFps ?? canvasRecording_server_side?.fps ?? DEFAULT_CANVAS_FPS + let quality: string | number = + canvasRecording_client_side?.canvasQuality ?? canvasRecording_server_side?.quality ?? DEFAULT_CANVAS_QUALITY + if (typeof quality === 'string') { + const parsed = parseFloat(quality) + quality = isNaN(parsed) ? 0.4 : parsed + } return { enabled, - fps: clampToRange(fps, 0, 12, 'canvas recording fps'), - quality: clampToRange(quality, 0, 1, 'canvas recording quality'), + fps: clampToRange(fps, 0, MAX_CANVAS_FPS, 'canvas recording fps', DEFAULT_CANVAS_FPS), + quality: clampToRange(quality, 0, MAX_CANVAS_QUALITY, 'canvas recording quality', DEFAULT_CANVAS_QUALITY), } } From 3a0e633b6e7f9b01ad24b0f67db1e355fc72d2fb Mon Sep 17 00:00:00 2001 From: pauldambra Date: Tue, 11 Feb 2025 17:06:33 +0000 Subject: [PATCH 4/8] chore: Bump version to 1.217.1 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f335877a2..5433a69ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.217.1 - 2025-02-11 + +- fix: canvas quality value (#1727) + ## 1.217.0 - 2025-02-11 - feat: override exception capture clientside (#1726) diff --git a/package.json b/package.json index 6d6ad4585..2decb43ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "posthog-js", - "version": "1.217.0", + "version": "1.217.1", "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.", "repository": "https://github.com/PostHog/posthog-js", "author": "hey@posthog.com", From d1050d983f15969be55830b710e61f822d8ba88c Mon Sep 17 00:00:00 2001 From: Juraj Majerik Date: Wed, 12 Feb 2025 10:43:16 +0100 Subject: [PATCH 5/8] fix(no-code experiments): refactor (6) (#1728) --- src/__tests__/web-experiments.test.ts | 109 ++++++++++++-------------- src/web-experiments.ts | 31 +------- 2 files changed, 52 insertions(+), 88 deletions(-) diff --git a/src/__tests__/web-experiments.test.ts b/src/__tests__/web-experiments.test.ts index 9e78aba57..b5ff35caf 100644 --- a/src/__tests__/web-experiments.test.ts +++ b/src/__tests__/web-experiments.test.ts @@ -11,30 +11,29 @@ describe('Web Experimentation', () => { let posthog: PostHog let persistence: PostHogPersistence let experimentsResponse: { status?: number; experiments?: WebExperiment[] } + const signupButtonWebExperimentWithFeatureFlag = { id: 3, name: 'Signup button test', feature_flag_key: 'signup-button-test', variants: { - Signup: { + 'variant-sign-up': { transforms: [ { selector: '#set-user-properties', - text: 'Sign me up', html: 'Sign me up', }, ], }, - 'Send-it': { + 'variant-send-it': { transforms: [ { selector: '#set-user-properties', - text: 'Send it', html: 'Send it', }, ], }, - 'css-transform': { + 'variant-css-transform': { transforms: [ { selector: '#set-user-properties', @@ -42,7 +41,7 @@ describe('Web Experimentation', () => { }, ], }, - 'innerhtml-transform': { + 'variant-inner-html-transform': { transforms: [ { selector: '#set-user-properties', @@ -54,7 +53,6 @@ describe('Web Experimentation', () => { transforms: [ { selector: '#set-user-properties', - text: 'Sign up', html: 'Sign up', }, ], @@ -66,7 +64,7 @@ describe('Web Experimentation', () => { id: 3, name: 'Signup button test', variants: { - Signup: { + 'variant-sign-up': { conditions: { url: 'https://example.com/Signup', urlMatchType: 'exact', @@ -74,27 +72,24 @@ describe('Web Experimentation', () => { transforms: [ { selector: '#set-user-properties', - text: 'Sign me up', html: 'Sign me up', }, ], }, - 'Send-it': { + 'variant-send-it': { conditions: { url: 'regex-url', urlMatchType: 'regex' }, transforms: [ { selector: '#set-user-properties', - text: 'Send it', html: 'Send it', }, ], }, - icontains: { + 'variant-icontains': { conditions: { url: 'checkout', urlMatchType: 'icontains' }, transforms: [ { selector: '#set-user-properties', - text: 'Sign up', html: 'Sign up', }, ], @@ -103,7 +98,6 @@ describe('Web Experimentation', () => { transforms: [ { selector: '#set-user-properties', - text: 'Sign up', html: 'Sign up', }, ], @@ -147,23 +141,15 @@ describe('Web Experimentation', () => { }) function createTestDocument() { - // eslint-disable-next-line no-restricted-globals - const elTarget = document.createElement('img') - elTarget.id = 'primary_button' - // eslint-disable-next-line no-restricted-globals const elParent = document.createElement('span') - elParent.innerText = 'original' - elParent.className = 'original' - elParent.appendChild(elTarget) - // eslint-disable-next-line no-restricted-globals + elParent.innerHTML = 'original' document.querySelectorAll = function () { return [elParent] as unknown as NodeListOf } - return elParent } - function testUrlMatch(testLocation: string, expectedText: string) { + function testUrlMatch(testLocation: string, expectedInnerHTML: string) { experimentsResponse = { experiments: [buttonWebExperimentWithUrlConditions], } @@ -176,7 +162,7 @@ describe('Web Experimentation', () => { } webExperiment.getWebExperimentsAndEvaluateDisplayLogic(false) - expect(elParent.innerText).toEqual(expectedText) + expect(elParent.innerHTML).toEqual(expectedInnerHTML) } function assertElementChanged(variant: string, expectedProperty: string, value: string) { @@ -191,11 +177,6 @@ describe('Web Experimentation', () => { case 'css': expect(elParent.getAttribute('style')).toEqual(value) break - - case 'innerText': - expect(elParent.innerText).toEqual(value) - break - case 'innerHTML': expect(elParent.innerHTML).toEqual(value) break @@ -212,45 +193,51 @@ describe('Web Experimentation', () => { const elParent = createTestDocument() simulateFeatureFlags({ - 'signup-button-test': 'Sign me up', + 'signup-button-test': 'variant-sign-up', }) - expect(elParent.innerText).toEqual('original') + expect(elParent.innerHTML).toEqual('original') }) }) describe('url match conditions', () => { it('exact location match', () => { + // Should match 'variant-sign-up' -> "Sign me up" const testLocation = 'https://example.com/Signup' - const expectedText = 'Sign me up' - testUrlMatch(testLocation, expectedText) + const expectedInnerHTML = 'Sign me up' + testUrlMatch(testLocation, expectedInnerHTML) }) it('regex location match', () => { + // Should match 'variant-send-it' -> "Send it" const testLocation = 'https://regex-url.com/test' - const expectedText = 'Send it' - testUrlMatch(testLocation, expectedText) + const expectedInnerHTML = 'Send it' + testUrlMatch(testLocation, expectedInnerHTML) }) it('icontains location match', () => { + // Should match 'variantIcontains' -> "Sign up" const testLocation = 'https://example.com/checkout' - const expectedText = 'Sign up' - testUrlMatch(testLocation, expectedText) + const expectedInnerHTML = 'Sign up' + testUrlMatch(testLocation, expectedInnerHTML) }) }) describe('utm match conditions', () => { it('can disqualify on utm terms', () => { const buttonWebExperimentWithUTMConditions = buttonWebExperimentWithUrlConditions - buttonWebExperimentWithUTMConditions.variants['Signup'].conditions = { + + // Attach UTM conditions to the 'variant-sign-up' variant + buttonWebExperimentWithUTMConditions.variants['variant-sign-up'].conditions = { utm: { utm_campaign: 'marketing', utm_medium: 'desktop', }, } + const testLocation = 'https://example.com/landing-page?utm_campaign=marketing&utm_medium=mobile' - const expectedText = 'original' - testUrlMatch(testLocation, expectedText) + const expectedInnerHTML = 'original' + testUrlMatch(testLocation, expectedInnerHTML) }) }) @@ -265,6 +252,7 @@ describe('Web Experimentation', () => { token: 'testtoken', autocapture: true, region: 'us-east-1', + // no disable_web_experiments set to false here, so it’s implicitly enabled } as unknown as PostHogConfig, persistence: persistence, get_property: jest.fn(), @@ -277,23 +265,15 @@ describe('Web Experimentation', () => { posthog.requestRouter = new RequestRouter(disabledPostHog) webExperiment = new WebExperiments(disabledPostHog) - assertElementChanged('control', 'innerText', 'original') - }) - - it('can set text of Span Element', async () => { - experimentsResponse = { - experiments: [signupButtonWebExperimentWithFeatureFlag], - } - - assertElementChanged('Signup', 'innerText', 'Sign me up') - expect(posthog.capture).not.toHaveBeenCalled() + assertElementChanged('control', 'innerHTML', 'original') }) it('makes no modifications if control variant', () => { experimentsResponse = { experiments: [signupButtonWebExperimentWithFeatureFlag], } - assertElementChanged('control', 'innerText', 'original') + // control => do nothing + assertElementChanged('control', 'innerHTML', 'original') expect(posthog.capture).not.toHaveBeenCalled() }) @@ -301,36 +281,49 @@ describe('Web Experimentation', () => { experimentsResponse = { experiments: [buttonWebExperimentWithUrlConditions], } + const webExperiment = new WebExperiments(posthog) const elParent = createTestDocument() const original = WebExperiments.getWindowLocation + WebExperiments.getWindowLocation = () => { // eslint-disable-next-line compat/compat return new URL( - 'https://example.com/landing-page?__experiment_id=3&__experiment_variant=Signup' + 'https://example.com/landing-page?__experiment_id=3&__experiment_variant=variant-sign-up' ) as unknown as Location } + // This forces a preview of 'variant-sign-up', ignoring real flags. webExperiment.previewWebExperiment() WebExperiments.getWindowLocation = original - expect(elParent.innerText).toEqual('Sign me up') + expect(elParent.innerHTML).toEqual('Sign me up') expect(posthog.capture).not.toHaveBeenCalled() }) - it('can set css of Span Element', async () => { + it('can set text of a element', async () => { experimentsResponse = { experiments: [signupButtonWebExperimentWithFeatureFlag], } + // 'variant-sign-up' => "Sign me up" + assertElementChanged('variant-sign-up', 'innerHTML', 'Sign me up') + expect(posthog.capture).not.toHaveBeenCalled() + }) - assertElementChanged('css-transform', 'css', 'font-size:40px') + it('can set child element of a element', async () => { + experimentsResponse = { + experiments: [signupButtonWebExperimentWithFeatureFlag], + } + // variantInnerHtmlTransform =>

hello world

+ assertElementChanged('variant-inner-html-transform', 'innerHTML', '

hello world

') }) - it('can set innerHTML of Span Element', async () => { + it('can set css of a element', async () => { experimentsResponse = { experiments: [signupButtonWebExperimentWithFeatureFlag], } - assertElementChanged('innerhtml-transform', 'innerHTML', '

hello world

') + // variantCssTransform => sets 'font-size:40px' + assertElementChanged('variant-css-transform', 'css', 'font-size:40px') }) }) diff --git a/src/web-experiments.ts b/src/web-experiments.ts index 8a43dc8ae..a23d9de70 100644 --- a/src/web-experiments.ts +++ b/src/web-experiments.ts @@ -260,37 +260,8 @@ export class WebExperiments { const elements = document?.querySelectorAll(transform.selector) elements?.forEach((element) => { const htmlElement = element as HTMLElement - if (transform.attributes) { - transform.attributes.forEach((attribute) => { - switch (attribute.name) { - case 'text': - htmlElement.innerText = attribute.value - break - - case 'html': - htmlElement.innerHTML = attribute.value - break - - case 'cssClass': - htmlElement.className = attribute.value - break - - default: - htmlElement.setAttribute(attribute.name, attribute.value) - } - }) - } - - if (transform.text) { - htmlElement.innerText = transform.text - } - if (transform.html) { - if (htmlElement.parentElement) { - htmlElement.parentElement.innerHTML = transform.html - } else { - htmlElement.innerHTML = transform.html - } + htmlElement.innerHTML = transform.html } if (transform.css) { From 9d39ae36e078e325bfae9c9af22b97c149c3c888 Mon Sep 17 00:00:00 2001 From: jurajmajerik Date: Wed, 12 Feb 2025 09:43:40 +0000 Subject: [PATCH 6/8] chore: Bump version to 1.217.2 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5433a69ae..9ceddb0c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.217.2 - 2025-02-12 + +- fix(no-code experiments): refactor (6) (#1728) + ## 1.217.1 - 2025-02-11 - fix: canvas quality value (#1727) diff --git a/package.json b/package.json index 2decb43ed..2f0d453db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "posthog-js", - "version": "1.217.1", + "version": "1.217.2", "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.", "repository": "https://github.com/PostHog/posthog-js", "author": "hey@posthog.com", From 5af41b4a0f18b8968c0cf195cf270c21305373eb Mon Sep 17 00:00:00 2001 From: Lucas Faria <12522524+lucasheriques@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:19:59 -0300 Subject: [PATCH 7/8] Revert "fix: check url match twice because of potential race condition (#1722)" (#1733) This reverts commit 57fe20234c6cf7dfc8848cdc04e75ecb5f38505f. --- src/extensions/surveys.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/extensions/surveys.tsx b/src/extensions/surveys.tsx index 9e817e8d1..583d833d1 100644 --- a/src/extensions/surveys.tsx +++ b/src/extensions/surveys.tsx @@ -12,7 +12,6 @@ import { import * as Preact from 'preact' import { useContext, useEffect, useMemo, useRef, useState } from 'preact/hooks' -import { addEventListener } from '../utils' import { document as _document, window as _window } from '../utils/globals' import { createLogger } from '../utils/logger' import { isNull, isNumber } from '../utils/type-utils' @@ -36,6 +35,7 @@ import { style, SurveyContext, } from './surveys/surveys-utils' +import { addEventListener } from '../utils' const logger = createLogger('[Surveys]') // We cast the types here which is dangerous but protected by the top level generateSurveys call @@ -228,10 +228,6 @@ export class SurveyManager { if (!isNull(this.surveyInFocus)) { return } - // Adding this duplicate check to see if there's some sort of race-condition between getActiveMatchingSurveys and actual URL changes, as sometimes Surveys are shown up when they shouldn't be - if (!doesSurveyUrlMatch(survey)) { - return - } if (survey.type === SurveyType.Widget) { if ( survey.appearance?.widgetType === 'tab' && From bb36201403e915f4ec02ec940524a44b7c396c51 Mon Sep 17 00:00:00 2001 From: lucasheriques Date: Thu, 13 Feb 2025 16:20:35 +0000 Subject: [PATCH 8/8] chore: Bump version to 1.217.3 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ceddb0c3..041afb8d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.217.3 - 2025-02-13 + +- Revert "fix: check url match twice because of potential race condition (#1722)" (#1733) + ## 1.217.2 - 2025-02-12 - fix(no-code experiments): refactor (6) (#1728) diff --git a/package.json b/package.json index 2f0d453db..64e6fbadb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "posthog-js", - "version": "1.217.2", + "version": "1.217.3", "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.", "repository": "https://github.com/PostHog/posthog-js", "author": "hey@posthog.com",