Skip to content

Commit daaa2ab

Browse files
committed
test: add e2e tests for capturing, fix replay bug
1 parent 7944380 commit daaa2ab

File tree

17 files changed

+407
-73
lines changed

17 files changed

+407
-73
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,5 @@ jobs:
4646
- name: 💪 Test types
4747
run: pnpm test:types
4848

49-
- name: 🧪 Test project
50-
run: pnpm test
49+
- name: 🧪 Run unit tests
50+
run: pnpm test:unit

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ coverage
55
.env
66
/test/transform/generated-*/
77
/test/transform/ecosystem-repos
8+
/test-results/
89
# Transform
910
transform/*
1011
!transform/package.json

e2e/capture.spec.ts

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import { test, expect } from '@playwright/test'
2+
import { NEXTJS_API_PORT, NEXTJS_PORT, NUXT_PORT, SVELTE_PORT, fetchCaptures, getBaseUrl, getLatestCapture, waitMs } from './util'
3+
import { join } from 'path'
4+
import { existsSync, rmSync } from 'fs'
5+
6+
test.afterAll(() => {
7+
// Delete cache directories
8+
const cacheDirectories = [
9+
join(process.cwd(), 'examples', 'with-nextjs', '.next'),
10+
join(process.cwd(), 'examples', 'with-nextjs-api', '.next')
11+
]
12+
cacheDirectories.forEach((cacheFilePath) => {
13+
if (existsSync(cacheFilePath)) {
14+
rmSync(cacheFilePath, { recursive: true })
15+
}
16+
})
17+
})
18+
19+
test('should capture back-end bug in nextjs-api example', async ({ page }) => {
20+
const startTime = new Date();
21+
const capturesBefore = await fetchCaptures('sk_3X-otNR_ZxIdw8cVxNbFcDivQF9B5Vw_bGu564jR35GMyVXX');
22+
// Start from the index page (the baseURL is set via the webServer in the playwright.config.ts)
23+
await page.goto(getBaseUrl(NEXTJS_API_PORT));
24+
await page.reload()
25+
await waitMs(3_000)
26+
27+
// Find the input
28+
await page.locator('input').fill('user-1');
29+
30+
// Click the submit button
31+
await page.click('text=Fetch')
32+
33+
await waitMs(3_000)
34+
35+
// ^^ Happy path, we don't expect anything
36+
const capturesDuring = await fetchCaptures('sk_3X-otNR_ZxIdw8cVxNbFcDivQF9B5Vw_bGu564jR35GMyVXX');
37+
expect(capturesBefore.length).toBe(capturesDuring.length)
38+
39+
// Now error path
40+
41+
// Find the input
42+
await page.locator('input').fill('user-51');
43+
44+
// Click the submit button
45+
await page.click('text=Fetch')
46+
47+
await waitMs(5_000)
48+
49+
const capturesAfter = await fetchCaptures('sk_3X-otNR_ZxIdw8cVxNbFcDivQF9B5Vw_bGu564jR35GMyVXX');
50+
const latestCapture = getLatestCapture(capturesAfter, startTime)
51+
expect(latestCapture.capturedUserId).toEqual('user-51');
52+
expect(latestCapture.functionName).toEqual('User not found');
53+
expect(capturesAfter.length).toBeGreaterThan(capturesBefore.length);
54+
})
55+
56+
// @todo: refactor the client-side e2e
57+
58+
test('should capture front-end bug in nextjs example', async ({ page }) => {
59+
const startTime = new Date();
60+
const capturesBefore = await fetchCaptures('sk_Y8dYLe5VoNJfDI_CPEqF8AqMTEwWAvTwBi7Ml-pN9bzWsgsP');
61+
// Start from the index page (the baseURL is set via the webServer in the playwright.config.ts)
62+
await page.goto(getBaseUrl(NEXTJS_PORT));
63+
await page.reload()
64+
65+
// Find the input
66+
await page.locator('input').fill('wrong')
67+
68+
// Click the submit button
69+
await page.click('text=Submit')
70+
71+
// Wait for some console .log
72+
const consolePromise = await page.waitForEvent('console');
73+
const consoleLogsArgs = await consolePromise.args()
74+
// expect(await consoleLogsArgs[0]?.jsonValue()).toContain('[🐛 post] https://www.useflytrap.com/api/v1/captures')
75+
76+
await waitMs(10_000);
77+
78+
// Check the API for the capture
79+
const capturesAfter = await fetchCaptures('sk_Y8dYLe5VoNJfDI_CPEqF8AqMTEwWAvTwBi7Ml-pN9bzWsgsP');
80+
const latestCapture = getLatestCapture(capturesAfter, startTime)
81+
expect(latestCapture?.functionName).toEqual('Input value "wrong" is wrong!')
82+
expect(capturesAfter.length).toBeGreaterThan(capturesBefore.length)
83+
})
84+
85+
86+
test('should capture front-end bug in sveltekit example', async ({ page }) => {
87+
const startTime = new Date();
88+
const capturesBefore = await fetchCaptures('sk_K8zYjKVWq6himuvhrPROShSjsWwAsseEY7K4Y9GZsYTwNxLt');
89+
// Start from the index page (the baseURL is set via the webServer in the playwright.config.ts)
90+
await page.goto(getBaseUrl(SVELTE_PORT));
91+
await page.reload()
92+
await waitMs(1000)
93+
94+
// Find the input
95+
await page.locator('input').fill('wrong')
96+
await waitMs(1000)
97+
98+
// Click the submit button
99+
await page.click('text=Submit')
100+
const consolePromise = await page.waitForEvent('console')
101+
const consoleArgs = await consolePromise.args();
102+
103+
expect(await consoleArgs[0]?.jsonValue()).toContain('[🐛 post] https://www.useflytrap.com/api/v1/captures')
104+
await waitMs(3_000);
105+
106+
// Check the API for the capture
107+
const capturesAfter = await fetchCaptures('sk_K8zYjKVWq6himuvhrPROShSjsWwAsseEY7K4Y9GZsYTwNxLt');
108+
const latestCapture = getLatestCapture(capturesAfter, startTime)
109+
expect(latestCapture?.functionName).toEqual('Input value "wrong" is wrong!')
110+
expect(capturesAfter.length).toBeGreaterThan(capturesBefore.length);
111+
})
112+
113+
test('should capture front-end bug in nuxt example', async ({ page }) => {
114+
const startTime = new Date();
115+
const capturesBefore = await fetchCaptures('sk_TnBe2CSBNPGE-9jDtiQDvaoef8LOJ17T_xpIvKxVcBJuskGX');
116+
// Start from the index page (the baseURL is set via the webServer in the playwright.config.ts)
117+
await page.goto(getBaseUrl(NUXT_PORT));
118+
await page.reload()
119+
await waitMs(1000)
120+
121+
// Find the input
122+
await page.locator('input').fill('wrong')
123+
await waitMs(1000)
124+
125+
// Click the submit button
126+
await page.click('text=Submit')
127+
const consolePromise = await page.waitForEvent('console')
128+
const consoleArgs = await consolePromise.args();
129+
130+
expect(await consoleArgs[0]?.jsonValue()).toContain('[🐛 post] https://www.useflytrap.com/api/v1/captures')
131+
await waitMs(3_000);
132+
133+
// Check the API for the capture
134+
const capturesAfter = await fetchCaptures('sk_TnBe2CSBNPGE-9jDtiQDvaoef8LOJ17T_xpIvKxVcBJuskGX');
135+
const latestCapture = getLatestCapture(capturesAfter, startTime)
136+
expect(latestCapture?.functionName).toEqual('Input value "wrong" is wrong!')
137+
expect(capturesAfter.length).toBeGreaterThan(capturesBefore.length);
138+
})
139+
140+
test.skip('should navigate to the about page', async ({ page }) => {
141+
// Start from the index page (the baseURL is set via the webServer in the playwright.config.ts)
142+
await page.goto('/')
143+
// Find an element with the text 'About Page' and click on it
144+
await page.click('text=About Page')
145+
// The new url should be "/about" (baseURL is used there)
146+
await expect(page).toHaveURL('/about')
147+
// The new page should contain an h1 with "About Page"
148+
await expect(page.locator('h1')).toContainText('About Page')
149+
})

e2e/replay.spec.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { expect, test } from "@playwright/test";
2+
import { REPLAY_NEXTJS_PORT, getBaseUrl, waitMs } from "./util";
3+
4+
test('should replay front-end bug in nextjs example', async ({ page }) => {
5+
// const capturesBefore = await fetchCaptures('sk_Y8dYLe5VoNJfDI_CPEqF8AqMTEwWAvTwBi7Ml-pN9bzWsgsP');
6+
// Start from the index page (the baseURL is set via the webServer in the playwright.config.ts)
7+
await page.goto(getBaseUrl(REPLAY_NEXTJS_PORT));
8+
await waitMs(3_000)
9+
10+
// Reload the page
11+
await page.reload()
12+
13+
// Find input and make sure the content is replayed
14+
await expect(page.locator('input')).toHaveValue('wrong')
15+
16+
// Then, click on the "Submit ", and expect error popup to show up
17+
await page.click('text=Submit')
18+
19+
// Click on error popup
20+
await page.locator('text=error').click()
21+
await expect(page.locator('#nextjs__container_errors_desc')).toContainText('Error: Input value "wrong" is wrong!');
22+
});

e2e/util.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Capturing
2+
export const NEXTJS_API_PORT = 3000;
3+
export const NEXTJS_PORT = 3001;
4+
export const SVELTE_PORT = 3002;
5+
export const NUXT_PORT = 3003;
6+
// Replaying
7+
export const REPLAY_NEXTJS_API_PORT = 3004;
8+
export const REPLAY_NEXTJS_PORT = 3005;
9+
export const REPLAY_SVELTE_PORT = 3006;
10+
export const REPLAY_NUXT_PORT = 3007;
11+
12+
export const getBaseUrl = (port: number) => `http://localhost:${port}`;
13+
export const waitMs = (ms: number) => new Promise((res) => setTimeout(res, ms));
14+
15+
export async function fetchCaptures(secretApiKey: string): Promise<any[]> {
16+
const response = await (await fetch(`https://www.useflytrap.com/api/v1/captures`, {
17+
headers: new Headers({
18+
Authorization: `Bearer ${secretApiKey}`
19+
})
20+
})).json()
21+
return response as any[]
22+
}
23+
24+
export function getLatestCapture(captures: any[], testStartTime: Date): any | undefined {
25+
return captures.find((capture) => new Date(capture.createdAt).getTime() > testStartTime.getTime());
26+
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineFlytrapConfig } from 'useflytrap'
1+
import { FlytrapMode, defineFlytrapConfig } from 'useflytrap'
22

33
export default defineFlytrapConfig({
44
projectId: 'nextjs-demo',
@@ -7,7 +7,8 @@ export default defineFlytrapConfig({
77
secretApiKey: 'sk_Y8dYLe5VoNJfDI_CPEqF8AqMTEwWAvTwBi7Ml-pN9bzWsgsP',
88
privateKey:
99
'sk_MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCU5XslK9na97TDCDIgImB948aBBQcEflrFKDQ0lsRW/g6RnW/V+j+r6tQq/p+EA98hNfilfIm5M3WneoAAxniTsAKrYp4OOk5Arux0QY7EzwzDGqSQiwvz+r9+mWyKS9TNmRTpODLoSK1gPZI2QyGSvWMZztjgUvDv+4JgO1y9XtnnCHKCDgrnke1TwgxTBs7OXAy30h+UwbrPLPgLgFu680rXAZ3hkSymkqAO2CcYiEQZjnmngb9WTedv36oh9IumTySPZ+xc+zXfN4jk1x6zFcZ0wtaPRIpZcIn1Qixgmx5UFNerM0ac1RkRCv9DzzWOybloXP+4waqTQZMIIhI9AgMBAAECggEABsLk9KspGWhmLPUSUaM9/nl5aiJwTyPtu0Y4GKs//zNKNhKQIYdbnNLtD4bAd541Y6yvvdQJ7P8JOLG3XlGk6A/2DxJLWxoKs6U914mikg1U5wcuseGeiVW5nGYbJ6yJ3Uw2RuDmbuXd+aDSIuSpgaBX/7QE5SrfBgbFxNjtPSwftUJ/gS5dQ4HBdDnUjzzHJv3KbiS+mxLCtcdz/OsjP77G2qT++fooB8dGhEVcbqMHoNtDgde45nFXDU9kAbfRcNsMXfq8iRKpKccKCCV9MfN18csZTOcAqg9n2ZCzRje6mb8HVwGufJQ4E7Iw2T8czNttRNC066/Hn1BBvJi0AQKBgQDPiSUDiZ3k/g88NRajwuOCY24yZytRqioLA6n1gLc+PWfE7iZk3fRHUuzceU3nC1MGtR0xXsA1INkN97e8kFkjM5XEbLiggP2pRdK72YAaNybrYnIE62r8ynoszC2UaQgzBAuNsS5XgsUeRmG0E7WP8dQjShT/tIEhmOmgVwgu9QKBgQC3qsYe03XJiUAzW6JlB8PH9uQYmas2iMEq7mwl83aFKAmUPSuZck+l2TZtQfAKB7+2LSPU65MyR9gpadacROQVHxGzUN6QWU6PqIQhEkNKCaPanpzwm5DQ6GswWIRZb77kTdTk+/70wb5f9dIxbgn8q2QzAC0DFF0nVeF9+SY5KQKBgDka4o1ro3+sDKMjdHxRFur80wiZbMkGypTHSE/eQA2nNdNxOC1PCXVKsxQjaLUnX4wb79Fy4e58gF0giXUgPva5rf8jb1XyyFl4dfjsaxxLirEAIKGL6Z9vU1jaQbxxfikTdt5hH4BC4lxnP2EefzoBb77aFpcZouKMwdQ1vnG1AoGAZJZOcst0kq9sTbQ9t/8MphL80Mw4DGHRCOYSrKYtnrdSp7Dok90a6cWQHT4jbBraT7dhDFcIAl1+cQ/ZzTOdhkPBuebsPTnr4Jl143bRC1dEOZLseIl6Qi9HpO6VbTXZ4ccOdWndM8Z3sK48M34EUjC7a4MJI8qfSc+q8wbkfCECgYA72aNRAMIJ1grpHtyBSkkwJjQUUJ78e3uhYJXjdBMshBw1ZiaBOB2iY6CQ56uFvbnHGwdPW2uxxme/1drtTGXDvmJboTYZsl215rSRhLLzWEf0MBLhN8XwUoo4W8MBFyeqr5A+oUC2RgAAEEgV/7x2lGVPRBE/WoJWwWBfPvelzA==',
10-
mode: 'capture',
10+
mode: (process?.env?.FLYTRAP_MODE as FlytrapMode) ?? 'capture',
11+
captureId: process?.env?.FLYTRAP_CAPTURE_ID ?? undefined,
1112
logging: ['api-calls', 'capture', 'storage'],
1213
packageIgnores: ['next/font']
1314
})

examples/with-nuxt/app.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ let text = ''
33
44
function onSubmit() {
55
if (text === 'wrong') {
6-
throw new Error(`Input value "${text}"`)
6+
throw new Error(`Input value "${text}" is wrong!`)
77
}
88
}
99
</script>
Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
1-
import { defineFlytrapConfig } from 'useflytrap'
1+
import { FlytrapMode, defineFlytrapConfig } from 'useflytrap'
22

33
export default defineFlytrapConfig({
4-
projectId: 'nuxtjs-example',
4+
projectId: 'nuxt-demo',
55
publicApiKey:
6-
'pk_MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7k6HcOJ8hO2JggsjrhJfqGXF6YP8Tu5NkVM00FL6udRfUyBHcPeZzcO7YlKHFh1BvQBsOscVWMavCM8y6HSd2KPsuPdOx5PVlvOPjH4dTpR5L5sb4PZ/agnYD+GLaAzy6eF7LjaXK27+ffTz4gpsJXQmVu4z3Rd2rbW0zMrtR68XeKJYsl8H3egpJcitpraGSk2hDw0OYQXZcHCEStX+xzsb/uGiEbT41Yr5+ozIkzHkBUoNMHtSNRyetTBNt7WuN5oL6CVNIMMLhH1HOMX26NrByrCdr9yz9+snJrZ2EYIgquMn0PeaatJlTB9HjWTgrxnIf0e7v1NXYTuzf5O0IQIDAQAB',
6+
'pk_MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1RjIbpCCPfnPhHA51qGwqYpkTP5UQ98akcoMCHTijCK8I/Dvpu0NfP/yYdYUzl1JBW61kUI42+6aTAdPPT3OMl6CFeITHAzcuj7IyNY7l1n279kXsegu2ffFc0kkgi/SKy12ATQRfm52Ji6tf52ZJBydxowAuLhGfaQmiewcbH0O4BAbemX0jOxg+JUa4HvBFZo/R/pTVTsIMZWDwKfa0p/SiphDUeqRRz2j4qBeHPljsbxWmsXOIfy3vl4kpu+mYJP/Ixy16B1+kiWq37keAdwvDSBg61VAQC6TZ+tcRdYb5t2IHmrjOJWByR3BXzC6LqQZAO+//27Hu2S9j8w9RwIDAQAB',
77
privateKey:
8-
'sk_MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDuTodw4nyE7YmCCyOuEl+oZcXpg/xO7k2RUzTQUvq51F9TIEdw95nNw7tiUocWHUG9AGw6xxVYxq8IzzLodJ3Yo+y4907Hk9WW84+Mfh1OlHkvmxvg9n9qCdgP4YtoDPLp4XsuNpcrbv599PPiCmwldCZW7jPdF3attbTMyu1Hrxd4oliyXwfd6CklyK2mtoZKTaEPDQ5hBdlwcIRK1f7HOxv+4aIRtPjVivn6jMiTMeQFSg0we1I1HJ61ME23ta43mgvoJU0gwwuEfUc4xfbo2sHKsJ2v3LP36ycmtnYRgiCq4yfQ95pq0mVMH0eNZOCvGch/R7u/U1dhO7N/k7QhAgMBAAECggEAAfne2cTYBFxpoi1cWDF873MaGDbM5xzm4eJNLx/MBlHUcUaUjxNPiD8z8OOXLQvUr2f3LcjYNIhvu8CHlxm99BWeZTWARsuDFzWJcoBadvwIUfis21GB8pe2reGId9Y5Jq8057gCSoT46WOYSN7eIRSgq4J9xbrfxB6cS2EwpOIyxHBjRy19D3Lq7RjdxjdNmQJ0tes7pNdGJJie/7LGABJ4GJGYb85dhrbGYwiB8uuXlTPpd/DWHiHi4X+dwiLQFSx+o1pfV2eAJvCxzSUxSM5BWvgbVEX3XCj1KG6wHVrg/yQIye9rgJ9e6VpGzkhRz1mIYlptpWWMTh/u1UqdAQKBgQD6ivRwiD57KFcEENJxMUuCBYHQ/3Tomg7ch2yYdypzuVRuKyxRIY513XfC7w47blb5XzuiE34P9qSFsRT1eMPJa0GchDKBr+H4YbhLEwwNYr9lO+KcIKrdkQc891+4H6huqYLi0JcDG+Q20Q9oBvefqKYpJPoK2oNT1Nv03tVXgQKBgQDzf1hdBO8QHB/hcjb7NJRLSIKTFhGYttb2YFaFTklRmNLnKZ5oVQY7zJ+qblKaQBHiPImzWG/KdVj4mHesGKLxyd2DoU0PrOXgb02ZzCp5M+KyoSK3zeKax+Zip8VsKdo8fgUPsis2VcqR4+A/1QmMb22nPPMY/t2ji1HWmx2soQKBgCvGub0r4Rbtzn50XgDPJy1ZvvwAlrHJsU0REIV3VOCRglIZkw29+kFX6AQUdv0lY2cBH89K7pzlcIu3jDzz0+nOptEtPBHy5F3c3TGo61MvbNfIZej3wEMkgwpBAuWOCoUDc04kOi6d4fs9/h4kEYJBGn9X6aSZ15Z/O8uGX+qBAoGARFpCFtKUvUP32xRxxLCs1DlFlj6CsAjbbQv8Ha2tPT+WLJftRMJhXpYBWBliDLThkE2IJhU0RHQOhrJeHaxIyXDuQs4b0MOrQAZelUbPwXhEMfqzwT8FVoe474bDD6rr/UEu8IoGQVlx5ORABgsqhAaflGuynhilZQxt671dZiECgYEAtitYu9hfzCeyw4+Li/NvNNXscTvL3Kvxw/bUnacTE45Dyhd/wLqk/Jh/coD1yE4qEcYU4l503uBz53Ei1N/bh71PrM9G7Se06RoycKFDVYGizNQ7HkRhXpBYw65LRdyEDjlOsqiX2hUN6OQRu+Cotsx2UbPyjmhO06Z8dolxd7s=',
9-
secretApiKey: 'sk_LXOJx2GTUJOpimtbNPC9l_Yp2ZaeWkLpq0udzUOILBBGoS2f',
10-
mode: 'capture',
11-
logging: [
12-
'capture',
13-
'api-calls',
14-
'transform',
15-
'call-execution',
16-
'function-execution',
17-
'identify',
18-
'storage'
19-
],
8+
'sk_MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDVGMhukII9+c+EcDnWobCpimRM/lRD3xqRygwIdOKMIrwj8O+m7Q18//Jh1hTOXUkFbrWRQjjb7ppMB089Pc4yXoIV4hMcDNy6PsjI1juXWfbv2Rex6C7Z98VzSSSCL9IrLXYBNBF+bnYmLq1/nZkkHJ3GjAC4uEZ9pCaJ7BxsfQ7gEBt6ZfSM7GD4lRrge8EVmj9H+lNVOwgxlYPAp9rSn9KKmENR6pFHPaPioF4c+WOxvFaaxc4h/Le+XiSm76Zgk/8jHLXoHX6SJarfuR4B3C8NIGDrVUBALpNn61xF1hvm3YgeauM4lYHJHcFfMLoupBkA77//bse7ZL2PzD1HAgMBAAECggEAZmSWpn3cfzAidQZB3G5sB0Mex9orHkO9LhFSL9wOIXztPy3d0a01HnuTeUxXSgOL+0bDis0xqggf7ulSO2CPzCcaRa6QNRm/E+ToMIy0LJkHbR844fzpSkXig+9A0idtSt74xUJCJ6inL9ic+GV/ONlhPI54KEovYN63v+0KiVu7hdPjx+0S7ReKcHb8MxHeadrFNItps2OR57wxXF6nFDLYdh698AXugqsBuPZVBKdO0pAG1v9/7cufzvjsUs6wzbyvFtPemKdPqqjxn8XRnS6YXJWsF57XB1+tCSu8kMByvENPDoWGdKtw9HUjlqtqVB0JwDYnApJMqJP/r/nMJQKBgQDtQ+WrT69CTZi7p35ASQENgu7z/U6+tu0TLxWYXVbFOeacEpDFiD35vhvf0Ra4HipEDfegLmruZkhf51fQwpGovqxO/eT/qKCVOtQ4hVcVAbMJpd2UFo9Cp9GH4DoSRNzVsCT/Bn2bfhAcTB1TFiVFXbMwWly7k5XsJkhTv9xcuwKBgQDl7FfR4U5YDt0GXKI5PPxmC3RsiuZjCuldd2qbfck72MajIZl5qPI2T5VfFbxw+KHSj8A64Uk4swm98/e6mPROo4fw5GXdA1W9w3NxEidDqqyHlc07FIZlmfekrHGJPzE3kzJmu1Hai2yNR1SUBhMNpCYhFlarsNOwissf/Cg+5QKBgQCGhEweCBtxF9VT7u4hPEKgim83XZHbhpJ6oeM4cxLS1rTsH4p8s3WPtjzPdBfRYyjLVK/j3O07JDo8RUkATo+OgCvozQGcANqqQKQ5Nz/b5Q7AlY0+fFvUipi81F+YI/qgHDGddOyZz6sKoAywIooW/byt2U1h+5awQDQZZ1lkKQKBgEUYjJ+/NNsTxGp4BixrXnKQOLGx4GCdU9pJ29jUqVf54l/95fCAzCF0MzB7CMFuhrsPhjZro6SNcX0LR0RlWO4VCPJkwRP1P5wik5vEV9ZnAShR5XY+ydDYv2pWhFw5iGHqM3haDNQ/mCSw7gL5/FnaHbdNzkgUgNmKLFb1YWbdAoGAfztw1dzcRHwg/aMbledttoZTaGmzN3u079qSDMq+UfNojU9YmgEPGhOeXOdHQiDGRvF3ByYjtWKga7bIr2DzpM6QrLTrUjlopmaZRprRtMHWu/5xd9H/4+F8v28t98BZQXOY6c67sPO0jFlGWRkkbcqDaOdxR9z6ivNdbo/HlRc=',
9+
secretApiKey: 'sk_TnBe2CSBNPGE-9jDtiQDvaoef8LOJ17T_xpIvKxVcBJuskGX',
10+
mode: (process?.env?.FLYTRAP_MODE as FlytrapMode) ?? 'capture',
11+
captureId: process?.env?.FLYTRAP_CAPTURE_ID ?? undefined,
12+
logging: ['api-calls', 'capture', 'storage'],
2013
excludeDirectories: ['.nuxt']
2114
})

examples/with-nuxt/nuxt.config.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
// @ts-ignore
21
import { FlytrapTransformPlugin } from 'useflytrap/transform'
32

43
// https://nuxt.com/docs/api/configuration/nuxt-config
54
export default defineNuxtConfig({
65
vite: {
7-
plugins: [process.env.NODE_ENV === 'production' && FlytrapTransformPlugin.vite()]
6+
plugins: [FlytrapTransformPlugin.vite()]
87
}
98
})

0 commit comments

Comments
 (0)