Skip to content

Commit 31b9ccb

Browse files
committed
fix: push artifacts always, diff artifacts correctly
1 parent 8ae15c6 commit 31b9ccb

36 files changed

+745
-252
lines changed

examples/with-express/.gitignore

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
/.pnp
6+
.pnp.js
7+
8+
# testing
9+
/coverage
10+
11+
# production
12+
/dist
13+
14+
# misc
15+
.DS_Store
16+
.rollup.cache
17+
*.pem
18+
19+
# debug
20+
npm-debug.log*
21+
yarn-debug.log*
22+
yarn-error.log*
23+
24+
# local env files
25+
.env*.local
26+
27+
# typescript
28+
*.tsbuildinfo
29+
next-env.d.ts

examples/with-express/README.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
## Flytrap Express Demo
2+
3+
This is a basic Express API app which demonstrates the capture and replay functionality of Flytrap.
4+
5+
To try out the demo, first [create a project](https://useflytrap.com/projects/create), then copy the configuration given by the Flytrap dashboard into the `flytrap.config.ts` file.
6+
7+
Build and run the Express API:
8+
9+
```bash
10+
pnpm build && node dist/index.cjs
11+
```
12+
13+
Then, run the demo bash script. The bash script `curl`:s the API causing an error, which gets sent to the Flytrap API. After that, you can view the captured error in the Flytrap Dashboard.
14+
15+
1. Run the demo
16+
```bash
17+
$ bash demo.sh
18+
```
19+
20+
## 🐛 Replay the bug
21+
22+
To replay the bug you have just captured, head over to the Flytrap Dashboard, and copy the `captureId` value. Place the `captureId` in your `flytrap.config.ts`, and change the `mode` from `'capture'` to `'replay'`.
23+
24+
```typescript
25+
export default defineFlytrapConfig({
26+
projectId: 'flytrap-nextjs-demo',
27+
publicApiKey: 'pk_MIIBI...',
28+
privateKey: 'sk_MIIEv...',
29+
secretApiKey: 'sk_lLSJJicAKC2gSLAj1BERqNTO3sOWFy3jpeaCCyi1AiTT-Vlr',
30+
captureId: 'c8a29ce0-c729-4d80-906f-6ab0c4ee0e65', // 👈 enter capture here
31+
mode: 'replay' // 👈 put mode as 'replay'
32+
})
33+
```
34+
35+
Due to safeguards in Flytrap preventing you from pushing a configuration that has replaying enabled when `NODE_ENV === production`, we must re-build with `NODE_ENV=development`.
36+
37+
Re-run the build with development environment, and run:
38+
39+
```bash
40+
$ NODE_ENV=development pnpm build && node dist/index.cjs
41+
```
42+
43+
Now, you can try a valid PUT statement like below, and your bug will be reproduced like magic. Now you can easily find the root of the problem!
44+
45+
```bash
46+
$ curl -X PUT -H "Content-Type: application/json" -d '{"title": "Updated Todo", "completed": true}' http://localhost:3000/todos/1
47+
```
48+
49+
## Learn More
50+
51+
To learn more about Flytrap, take a look at the following resources:
52+
53+
- [Flytrap Documentation](https://docs.useflytrap.com) - learn about Flytrap and its features

examples/with-express/demo.sh

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
printf "Retrieving all todos (curl -X GET http://localhost:3000/todos)\n\n"
3+
curl -X GET http://localhost:3000/todos
4+
printf "\n\n"
5+
6+
printf "Adding a new todo\n\n"
7+
curl -X POST -H "Content-Type: application/json" -d '{"id": 3, "title": "Test Todo", "completed": false}' http://localhost:3000/todos
8+
printf "\n\n"
9+
10+
printf "Updating a todo (with a bad ID value)\n\n"
11+
curl -X PUT -H "Content-Type: application/json" -d '{"title": "Updated Todo", "completed": true}' http://localhost:3000/todos/59
12+
printf "\n\n"
13+
14+
printf "Deleting a todo\n\n"
15+
curl -X DELETE http://localhost:3000/todos/1
16+
printf "\n\n"
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { defineFlytrapConfig } from 'useflytrap'
2+
3+
export default defineFlytrapConfig({
4+
projectId: 'express-api-demo',
5+
publicApiKey:
6+
'pk_MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoc+4JjU8eU34f3cExCl75uCjGcLkbwG6zEuI2ZCVpAvIWptMZyGivOK1BM004OBZ/k+MvGdZ6rV43AqgJLoDOoPNGziYX00St1vn4hz+peenQ7oMmB1yPqx7tGLSuMHtwWErShBKN2dJBMoSmQayt5bf0SbMblBY+NRLJTnGgMN7AzkHt4Lkt06lsl1mxrOVf54TgSNhGfKeRE/2tFq58cwsnVKHPNOp1z/JR5Z1YOeHDxgFT2shNztd+R36T+VSNAOq46DbX3eEWnrnN4Z8bnAvQuPa/4bKoHm0Zc+lIHtiH8cY3RMeZXd3HQKilHRxNMmKhFc5rbT5NKaxEbQCPwIDAQAB',
7+
secretApiKey: 'sk_BFcD8-vZvaB-hrPfonY9ZRrREkdSqdwMSRGjcOfsbdNynbbH',
8+
privateKey:
9+
'sk_MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQChz7gmNTx5Tfh/dwTEKXvm4KMZwuRvAbrMS4jZkJWkC8ham0xnIaK84rUEzTTg4Fn+T4y8Z1nqtXjcCqAkugM6g80bOJhfTRK3W+fiHP6l56dDugyYHXI+rHu0YtK4we3BYStKEEo3Z0kEyhKZBrK3lt/RJsxuUFj41EslOcaAw3sDOQe3guS3TqWyXWbGs5V/nhOBI2EZ8p5ET/a0WrnxzCydUoc806nXP8lHlnVg54cPGAVPayE3O135HfpP5VI0A6rjoNtfd4Raeuc3hnxucC9C49r/hsqgebRlz6Uge2IfxxjdEx5ld3cdAqKUdHE0yYqEVzmttPk0prERtAI/AgMBAAECggEABDVbVD8RNhR1kJcfXBy6GLyh8VMUzuBMI/EY+5ObmLsnuFeOqqYAzgnVbG0L4YdkP82A2wuTFpwmqw5psNrXp6dy57DWoa/m+zbcNpDLfLQkMQo/NpuZc5DX3M6vLVf534wv7Iq063D3wLSivDEk58p4Qr/QFFRpo/sdgzfX9lRUksCC9xLDaCEyDNvI2v4jas4v0edSoka0MQiXnaYlyVA9NlDIcjgHJNiYYNqYhktznDe63BSWN7nE9Xghbi5Ww8zxOKvK+mrOKiGfHEnRKcKSmF9bUlraCBTsVaTKGHmcMNi+SabgBkc9GurTDoHaS2GNblCP6DBJjKOx1nGsAQKBgQDiQKI/UQMw8cPXr9yzSQuEdZnPXgStM85llhv3Bcf1sK7i5C/JA9o61M9RIrai/7qbWruOpBzY28KQdzVvbyi5aiUK5Jb9AEv+hBjgj7DZKDlJUZ0fO1s4Io8F2D/zTAz19Lp/kLaeL12ZNog8xa1xyziKW9RsMcIjuNRbbriWPwKBgQC3FhUPgL92DzID2FLvmb47s6QzTWCOQuiZvjscQcuy1ozgNL5NIPKe3TsxaXCy7lu4KejOG86ALmqoOW2NKLZyeA9IkXjph4daJDa8GXbzKgSuYVNlOYSnAL1WOxaHqV7tkFzbBb9Mv3xozaHTn1SoRERbRNKruoyEsS2A8iGUAQKBgQCfwSmO8aICNkOlkUyR31rdjbgsPuOodLMg8cwPMSrO5ZGnLZ48HpdCAS/dx1gUYeOefIOApYqk6Q9JuJKne2LTAQrk1SFzxXjjXty9+1fRDeDdT15VRjETwvsgEmCdZy6joMjq+ACqUyGQ5HtwBdiBSBBFSbAFMWE2nfR8FwMJOwKBgGZJ8RRLQyzrim75gkSZKd5jHD8JYQO6QAf9bzr3S54sHmL5NMUUvlihk3ukxDFD2HyI9aeJg5K73B0GkL1H3L8RcsCBfgNDFAz5pJbsxzdN53WhrJ0mSIWhdSbjNlAvAXlKqYY4rMttRE2tbVc1cm/cTDCNwAHv5KgR8TFUlgwBAoGAUlG+5yAVPkWtP90wT7HBhVeRFl5ZGG9PI79Sdc7u/W0ksjJS+fhI5qbrHDMW4Son2/TM4qNLLyY3nSsdV8LgRAcbYBUXUvtW9dHi68ofND4Yqcg79cxLISg2Div5ldakslYIRRIsEfBALCJTKTxSDWAyXD8AaRXiVg5mIcYIlAw=',
10+
mode: 'capture',
11+
logging: ['api-calls', 'capture', 'storage']
12+
})

examples/with-express/package.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "with-express",
3+
"version": "0.1.0",
4+
"private": true,
5+
"type": "module",
6+
"scripts": {
7+
"build": "rollup -c"
8+
},
9+
"dependencies": {
10+
"@rollup/plugin-commonjs": "^25.0.0",
11+
"@rollup/plugin-node-resolve": "^15.1.0",
12+
"@rollup/plugin-typescript": "^11.1.1",
13+
"express": "^4.18.2",
14+
"typescript": "4.8.4",
15+
"useflytrap": "workspace:*"
16+
},
17+
"devDependencies": {
18+
"@types/express": "^4.17.17"
19+
}
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import typescript from '@rollup/plugin-typescript'
2+
import nodeResolve from '@rollup/plugin-node-resolve'
3+
import commonjs from '@rollup/plugin-commonjs'
4+
import { FlytrapTransformPlugin } from 'useflytrap/transform'
5+
6+
export default {
7+
input: 'src/index.ts',
8+
output: {
9+
file: 'dist/index.cjs',
10+
format: 'cjs'
11+
},
12+
plugins: [
13+
typescript(),
14+
// Add Flytrap code transform plugin
15+
FlytrapTransformPlugin.rollup(),
16+
nodeResolve({ preferBuiltins: true, extensions: ['.mjs', '.js', '.json', '.node', '.ts'] }),
17+
commonjs()
18+
],
19+
external: ['express']
20+
}

examples/with-express/src/index.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import express, { Request, Response } from 'express'
2+
3+
// Define the shape of a Todo item
4+
interface Todo {
5+
id: number
6+
title: string
7+
completed: boolean
8+
}
9+
10+
// Example array of Todos
11+
let todos: Todo[] = [
12+
{ id: 1, title: 'Write TypeScript', completed: false },
13+
{ id: 2, title: 'Write Express.js', completed: false }
14+
]
15+
16+
const app = express()
17+
app.use(express.json())
18+
19+
// CRUD operations
20+
app.get('/todos', (req: Request, res: Response) => {
21+
res.json(todos)
22+
})
23+
24+
app.post('/todos', (req: Request, res: Response) => {
25+
const newTodo: Todo = req.body
26+
todos.push(newTodo)
27+
res.status(201).json(newTodo)
28+
})
29+
30+
app.put('/todos/:id', (req: Request, res: Response) => {
31+
const id: number = parseInt(req.params.id, 10)
32+
33+
const foundTodo = todos.find((todo) => todo.id === id)
34+
35+
// @ts-expect-error
36+
foundTodo.completed = req.body.completed
37+
// @ts-expect-error
38+
foundTodo.title = req.body.title
39+
40+
res.json(foundTodo)
41+
})
42+
43+
app.delete('/todos/:id', (req: Request, res: Response) => {
44+
const id: number = parseInt(req.params.id, 10)
45+
todos = todos.filter((todo) => todo.id !== id)
46+
res.status(204).end()
47+
})
48+
49+
app.listen(3000, () => console.log('Server is listening on port 3000'))
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"compilerOptions": {
3+
"target": "esnext",
4+
"lib": ["dom", "dom.iterable", "esnext"],
5+
"allowJs": true,
6+
"skipLibCheck": true,
7+
"strict": true,
8+
"forceConsistentCasingInFileNames": true,
9+
"noEmit": true,
10+
"esModuleInterop": true,
11+
"module": "esnext",
12+
"moduleResolution": "node",
13+
"resolveJsonModule": true,
14+
"isolatedModules": true,
15+
"jsx": "preserve",
16+
"incremental": true
17+
},
18+
"include": ["**/*.ts"],
19+
"exclude": ["node_modules"]
20+
}

examples/with-nextjs-api/flytrap.config.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { defineFlytrapConfig } from "useflytrap"
1+
import { defineFlytrapConfig } from 'useflytrap'
22

33
export default defineFlytrapConfig({
44
projectId: 'nextjs-api-demo',
5-
publicApiKey: 'pk_MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu4exyVpW0JoHbSr/8r3jq053yV/WQN0xaU7bOfdW6mNeACJXhO3/T39vFeUpR8bQYtcF6OM833+MTpTGiA+nzd/UkLtabuiss6go86oUINP21HE5IKTAuA7LY2JUr/Jv9h5ATXJsHEBqtuefVfHIi8aMMNq+lgwNJ7llprse+/FXtqrFVDRdlD3SlO9I5xqHZ/28xzB0l0gNgGH7vSP2MiQ6Eox/qwWlQD3REmfp+kDNjF5bSQI6e19bFe187WNLHsqKhzdx5tnjcJCkLkhmIPoD5bIOlo/VHioVeBJ3FHDoDJyTud83Th5yaabEEesNTVyZSiAYoqPUO5xoJNlCIQIDAQAB',
5+
publicApiKey:
6+
'pk_MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu4exyVpW0JoHbSr/8r3jq053yV/WQN0xaU7bOfdW6mNeACJXhO3/T39vFeUpR8bQYtcF6OM833+MTpTGiA+nzd/UkLtabuiss6go86oUINP21HE5IKTAuA7LY2JUr/Jv9h5ATXJsHEBqtuefVfHIi8aMMNq+lgwNJ7llprse+/FXtqrFVDRdlD3SlO9I5xqHZ/28xzB0l0gNgGH7vSP2MiQ6Eox/qwWlQD3REmfp+kDNjF5bSQI6e19bFe187WNLHsqKhzdx5tnjcJCkLkhmIPoD5bIOlo/VHioVeBJ3FHDoDJyTud83Th5yaabEEesNTVyZSiAYoqPUO5xoJNlCIQIDAQAB',
67
secretApiKey: 'sk_BxQGJA-zs0l_moCLrINFw9YOc_0Ul433KEoCHSpZiIvvDj5a',
7-
privateKey: 'sk_MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7h7HJWlbQmgdtKv/yveOrTnfJX9ZA3TFpTts591bqY14AIleE7f9Pf28V5SlHxtBi1wXo4zzff4xOlMaID6fN39SQu1pu6KyzqCjzqhQg0/bUcTkgpMC4DstjYlSv8m/2HkBNcmwcQGq2559V8ciLxoww2r6WDA0nuWWmux778Ve2qsVUNF2UPdKU70jnGodn/bzHMHSXSA2AYfu9I/YyJDoSjH+rBaVAPdESZ+n6QM2MXltJAjp7X1sV7XztY0seyoqHN3Hm2eNwkKQuSGYg+gPlsg6Wj9UeKhV4EncUcOgMnJO53zdOHnJppsQR6w1NXJlKIBiio9Q7nGgk2UIhAgMBAAECggEAA8c+CKzvswK+HmU0zxwj0OZYaVUrZixUC/Iz3l+ydNpSgRqwBuSGVcCfHpgQJEXSxNcJDlzmXlNod9yCq9Ly7NCIbMUVk0alVMumeD2nllS8SaH2sRwYqkIEDN56OdRJjLIl1gRK6NPPF/HOkZxOOoC3f4l8uF20SyYEBgoJm7EDi5Bkl/jMugkvNvcGTMO4qD/wAZYXoCL/pTsi+BkdzGbAuwtRyHahkCf2aJbq+Cpu26HKYS6tdIsTC+AadfF46a/ObvYZHsZWnSvgTApeR+JLuI02tXpIeW/4HzHej+ZXltTJv99d4BVGGo9XfBG6wncj3LxEfxSa1XTLmh4h0QKBgQDbjP0cm4IRveGjXNzBHH7IOCoNh3PDR7wvlNrUIi6JFD8Ahv6uvfutvdYSVoJld5qYQ1nSdva5QqD8Wwa2Qm0KP4/GE0d4TWdS7yhhcneuJ1/dJ11D+MbMRFrmQHTXJeP3hcPh8oU9b4q8/Py/AIojyl9IgGoBmjTUJ2TPC59m2QKBgQDaqc/ARYVsZGzoBUdDLuuK+X2FTVJfvZSZ7/b7ztY7Xg8kOb5qhQHytCVtGeWBlgHskXuz4gM8/5N9SrKfTS+zmdO/DZywQd7/C+cgtUGKvH/gbXbhMshAkG/2bXeTJfhE+b47B40UXBWOAKLWcPerYme1FFRILZ9XT/SBQJH4iQKBgGl+CzituAfSVxLp0eCwUnLeGca6aPNSCqhKPANmETookkUsmD9aZg4Lg0r4alta5tt2sTghlVdbHoNjMYxtynr8I5cnOFYjyxvccmiwWbVCkhtviK7aYJtR1OOB4SJnwGv0yDRPFZp5eA5q+P7FwZqE6NerbEQs1mmCLDwX95WxAoGAAcj3GDO5Fhxvwykf3s2IQLcuriLmdD+g8ezCkGWs3Ak1iG8sPcReMrQDxjM662blFyBM6TgEHMBdXN16PdCsfgPYdavPxqSTBHP9bAfuxAor5RIfsVDvz48eSt2z5zCdKTr8sZCrNypVRrZ8ndGIRA7ml9TVp00wCs9tSIzVZDkCgYEAkfdtQcqjTgh0R+573iXBiEwPQhJNsLB4JQQIhhcjbZeHmWqqToe8Xp5/xeetbVixe2ne96JwVWIHjhqbGnMJrxCQfHKXOyeYcWbdqCwsA3/mDgw408HCpmwGG1dRv/ToDRc3vZV25Qi6ygzP9UZsFdZ+3Ku57jNAGcl/gDwbCLk=',
8+
privateKey:
9+
'sk_MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7h7HJWlbQmgdtKv/yveOrTnfJX9ZA3TFpTts591bqY14AIleE7f9Pf28V5SlHxtBi1wXo4zzff4xOlMaID6fN39SQu1pu6KyzqCjzqhQg0/bUcTkgpMC4DstjYlSv8m/2HkBNcmwcQGq2559V8ciLxoww2r6WDA0nuWWmux778Ve2qsVUNF2UPdKU70jnGodn/bzHMHSXSA2AYfu9I/YyJDoSjH+rBaVAPdESZ+n6QM2MXltJAjp7X1sV7XztY0seyoqHN3Hm2eNwkKQuSGYg+gPlsg6Wj9UeKhV4EncUcOgMnJO53zdOHnJppsQR6w1NXJlKIBiio9Q7nGgk2UIhAgMBAAECggEAA8c+CKzvswK+HmU0zxwj0OZYaVUrZixUC/Iz3l+ydNpSgRqwBuSGVcCfHpgQJEXSxNcJDlzmXlNod9yCq9Ly7NCIbMUVk0alVMumeD2nllS8SaH2sRwYqkIEDN56OdRJjLIl1gRK6NPPF/HOkZxOOoC3f4l8uF20SyYEBgoJm7EDi5Bkl/jMugkvNvcGTMO4qD/wAZYXoCL/pTsi+BkdzGbAuwtRyHahkCf2aJbq+Cpu26HKYS6tdIsTC+AadfF46a/ObvYZHsZWnSvgTApeR+JLuI02tXpIeW/4HzHej+ZXltTJv99d4BVGGo9XfBG6wncj3LxEfxSa1XTLmh4h0QKBgQDbjP0cm4IRveGjXNzBHH7IOCoNh3PDR7wvlNrUIi6JFD8Ahv6uvfutvdYSVoJld5qYQ1nSdva5QqD8Wwa2Qm0KP4/GE0d4TWdS7yhhcneuJ1/dJ11D+MbMRFrmQHTXJeP3hcPh8oU9b4q8/Py/AIojyl9IgGoBmjTUJ2TPC59m2QKBgQDaqc/ARYVsZGzoBUdDLuuK+X2FTVJfvZSZ7/b7ztY7Xg8kOb5qhQHytCVtGeWBlgHskXuz4gM8/5N9SrKfTS+zmdO/DZywQd7/C+cgtUGKvH/gbXbhMshAkG/2bXeTJfhE+b47B40UXBWOAKLWcPerYme1FFRILZ9XT/SBQJH4iQKBgGl+CzituAfSVxLp0eCwUnLeGca6aPNSCqhKPANmETookkUsmD9aZg4Lg0r4alta5tt2sTghlVdbHoNjMYxtynr8I5cnOFYjyxvccmiwWbVCkhtviK7aYJtR1OOB4SJnwGv0yDRPFZp5eA5q+P7FwZqE6NerbEQs1mmCLDwX95WxAoGAAcj3GDO5Fhxvwykf3s2IQLcuriLmdD+g8ezCkGWs3Ak1iG8sPcReMrQDxjM662blFyBM6TgEHMBdXN16PdCsfgPYdavPxqSTBHP9bAfuxAor5RIfsVDvz48eSt2z5zCdKTr8sZCrNypVRrZ8ndGIRA7ml9TVp00wCs9tSIzVZDkCgYEAkfdtQcqjTgh0R+573iXBiEwPQhJNsLB4JQQIhhcjbZeHmWqqToe8Xp5/xeetbVixe2ne96JwVWIHjhqbGnMJrxCQfHKXOyeYcWbdqCwsA3/mDgw408HCpmwGG1dRv/ToDRc3vZV25Qi6ygzP9UZsFdZ+3Ku57jNAGcl/gDwbCLk=',
810
mode: 'capture',
911
packageIgnores: ['next/font'],
1012
logging: ['api-calls', 'capture', 'storage']
Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
{
2-
"name": "with-nextjs-api",
3-
"version": "0.1.0",
4-
"private": true,
5-
"scripts": {
6-
"dev": "next dev",
7-
"build": "next build",
8-
"start": "next start",
9-
"lint": "next lint"
10-
},
11-
"dependencies": {
12-
"@faker-js/faker": "^8.0.2",
13-
"@types/node": "20.2.5",
14-
"@types/react": "18.2.6",
15-
"@types/react-dom": "18.2.4",
16-
"autoprefixer": "10.4.14",
17-
"next": "13.4.1",
18-
"postcss": "8.4.23",
19-
"react": "18.2.0",
20-
"react-dom": "18.2.0",
21-
"tailwindcss": "3.3.2",
22-
"typescript": "5.1.3",
23-
"useflytrap": "workspace:*"
24-
}
2+
"name": "with-nextjs-api",
3+
"version": "0.1.0",
4+
"private": true,
5+
"scripts": {
6+
"dev": "next dev",
7+
"build": "next build",
8+
"start": "next start",
9+
"lint": "next lint"
10+
},
11+
"dependencies": {
12+
"@faker-js/faker": "^8.0.2",
13+
"@types/node": "20.2.5",
14+
"@types/react": "18.2.6",
15+
"@types/react-dom": "18.2.4",
16+
"autoprefixer": "10.4.14",
17+
"next": "13.4.1",
18+
"postcss": "8.4.23",
19+
"react": "18.2.0",
20+
"react-dom": "18.2.0",
21+
"tailwindcss": "3.3.2",
22+
"typescript": "5.1.3",
23+
"useflytrap": "workspace:*"
24+
}
2525
}

0 commit comments

Comments
 (0)