diff --git a/.changeset/lucky-donuts-repeat.md b/.changeset/lucky-donuts-repeat.md new file mode 100644 index 00000000..84e3c74a --- /dev/null +++ b/.changeset/lucky-donuts-repeat.md @@ -0,0 +1,5 @@ +--- +'@fingerprint/react': minor +--- + +Remove the `postinstall` script for detecting framework version. diff --git a/__tests__/detect-env.test.ts b/__tests__/detect-env.test.ts index 78d7f5e8..db39012a 100644 --- a/__tests__/detect-env.test.ts +++ b/__tests__/detect-env.test.ts @@ -1,3 +1,5 @@ +import { version as reactVersion } from 'react' + import { detectEnvironment } from '../src/detect-env' import { Env } from '../src/env.types' import { afterEach, describe, expect, it, vi } from 'vitest' @@ -33,6 +35,7 @@ describe('Detect user env', () => { expect(env).toEqual({ name: Env.React, + version: reactVersion, }) }) }) @@ -88,6 +91,7 @@ describe('Detect user env', () => { expect(env).toEqual({ name: Env.React, + version: reactVersion, }) } finally { if (originalWindowDescriptor) { @@ -99,63 +103,3 @@ describe('Detect user env', () => { }) }) }) - -describe('getEnvironment', () => { - afterEach(() => { - vi.resetModules() - vi.doUnmock('../src/env') - }) - - it('returns parsed env details when the build-time env placeholder is valid JSON', async () => { - vi.resetModules() - vi.doMock('../src/env', () => ({ - env: JSON.stringify({ name: 'react', version: '18.0.0' }), - })) - - const { getEnvironment: getEnvironmentFresh } = await import('../src/get-env') - - expect( - getEnvironmentFresh({ - context: { classRenderReceivesAnyArguments: false }, - }) - ).toEqual({ - name: 'react', - version: '18.0.0', - }) - }) - - it('falls back to detection when the build-time env JSON is not env details', async () => { - vi.resetModules() - vi.doMock('../src/env', () => ({ - env: JSON.stringify({ foo: 'bar' }), - })) - - const { getEnvironment: getEnvironmentFresh } = await import('../src/get-env') - - expect( - getEnvironmentFresh({ - // absence of classRenderReceivesAnyArguments is React signal - context: { classRenderReceivesAnyArguments: false }, - }) - ).toEqual({ - name: Env.React, - }) - }) - - it('falls back to detection when the build-time env is invalid', async () => { - vi.resetModules() - vi.doMock('../src/env', () => ({ - env: '%DETECTED_ENV%', - })) - - const { getEnvironment: getEnvironmentFresh } = await import('../src/get-env') - - expect( - getEnvironmentFresh({ - context: { classRenderReceivesAnyArguments: false }, - }) - ).toEqual({ - name: Env.React, - }) - }) -}) diff --git a/__tests__/fpjs-provider.test.tsx b/__tests__/fpjs-provider.test.tsx index a09068db..3c96e3cc 100644 --- a/__tests__/fpjs-provider.test.tsx +++ b/__tests__/fpjs-provider.test.tsx @@ -1,4 +1,4 @@ -import { PropsWithChildren, useContext } from 'react' +import { PropsWithChildren, useContext, version as reactVersion } from 'react' import { act, render, renderHook } from '@testing-library/react' import { FingerprintContext, FingerprintProvider, FingerprintProviderOptions, useVisitorData } from '../src' import { createWrapper, getDefaultStartOptions } from './helpers' @@ -7,6 +7,8 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import * as agent from '@fingerprint/agent' import type { GetOptions } from '@fingerprint/agent' import * as ssr from '../src/ssr' +import * as detectEnv from '../src/detect-env' +import { Env } from '../src/env.types' vi.mock('@fingerprint/agent', { spy: true }) @@ -67,7 +69,7 @@ describe('FingerprintProvider', () => { }) expect(mockStart).toHaveBeenCalledWith({ ...loadOptions, - integrationInfo: [`react-sdk/${version}/react`], + integrationInfo: [`react-sdk/${version}/react/${reactVersion}`], cache: { cachePrefix: 'cache', storage: 'sessionStorage', @@ -88,6 +90,18 @@ describe('FingerprintProvider', () => { ) }) + it('should omit the version in integrationInfo when the framework exposes none', () => { + vi.spyOn(detectEnv, 'detectEnvironment').mockReturnValue({ name: Env.Preact }) + + renderProvider() + + expect(mockStart).toHaveBeenCalledWith( + expect.objectContaining({ + integrationInfo: [`react-sdk/${version}/preact`], + }) + ) + }) + it('should rebuild the agent when forceRebuild is enabled and options change', () => { const { rerender } = renderProvider({ apiKey: 'key-a', forceRebuild: true }) diff --git a/__tests__/with-environment.preact.test.tsx b/__tests__/with-environment.preact.test.tsx index 690d9f78..94da9150 100644 --- a/__tests__/with-environment.preact.test.tsx +++ b/__tests__/with-environment.preact.test.tsx @@ -22,5 +22,18 @@ describe('WithEnvironment', () => { expect(container.innerHTML).toContain('preact') }) + + it('should not report a version', async () => { + const { WithEnvironment } = await import('../src/components/with-environment') + const PrintEnv = (props: { env: { version?: string } }) => + h('div', null, JSON.stringify(props.env.version ?? null)) + + // @ts-expect-error -- preact's render signature does not match React's @testing-library/react types + const { container } = preactRender(h(WithEnvironment, { children: (env) => h(PrintEnv, { env }) })) + + // `compat.version` is the hardcoded React-compatibility number and must never leak through + expect(compat.version).toBeDefined() + expect(container.innerHTML).toBe('