Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,8 @@ export default defineNitroConfig({
})
```

> **Note**: For early Nitro v3 support, use `evlog/nitro/v3` instead of `evlog/nitro`.

Same API, same wide events:

```typescript
Expand Down
2 changes: 2 additions & 0 deletions apps/docs/content/1.getting-started/1.introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ Structured errors provide actionable context:
::code-group
```typescript [Code]
// server/api/checkout.post.ts
import { createError } from 'evlog' // Use 'evlog/nitro/v3' for Nitro v3

throw createError({
message: 'Payment failed',
status: 402,
Expand Down
4 changes: 4 additions & 0 deletions apps/docs/content/1.getting-started/2.installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,10 @@ export default defineNitroConfig({
})
```

::callout{icon="i-lucide-info" color="info"}
For early Nitro v3 support, use `evlog/nitro/v3` instead of `evlog/nitro`. When using Nitro v3, import `createError` from `evlog/nitro/v3` instead of `evlog`.
::

## Standalone TypeScript

Install evlog via your preferred package manager:
Expand Down
6 changes: 5 additions & 1 deletion apps/docs/content/1.getting-started/3.quick-start.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,14 @@ The logger automatically emits when the request ends. No manual `emit()` call ne

Use `createError()` to throw errors with actionable context:

::callout{icon="i-lucide-info" color="info"}
For Nitro v3, import from `evlog/nitro/v3` instead of `evlog`.
::

::code-group
```typescript [Code]
// server/api/checkout.post.ts
import { createError } from 'evlog'
import { createError } from 'evlog' // Use 'evlog/nitro/v3' for Nitro v3

throw createError({
message: 'Payment failed',
Expand Down
6 changes: 5 additions & 1 deletion apps/docs/content/2.core-concepts/2.structured-errors.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ description: Create errors that explain why they occurred and how to fix them.

evlog provides a `createError()` function that creates errors with rich, actionable context.

::callout{icon="i-lucide-info" color="info"}
For Nitro v3, import `createError` from `evlog/nitro/v3` instead of `evlog`.
::

## Why Structured Errors?

Traditional errors are often unhelpful:
Expand Down Expand Up @@ -60,7 +64,7 @@ throw createError({
::code-group
```typescript [Code]
// server/api/users/[id].get.ts
import { createError } from 'evlog'
import { createError } from 'evlog' // Use 'evlog/nitro/v3' for Nitro v3

throw createError({
message: 'User not found',
Expand Down
8 changes: 8 additions & 0 deletions apps/nitro-v3-playground/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
node_modules
dist
.data
.nitro
.cache
.output
.env
.env.local
18 changes: 18 additions & 0 deletions apps/nitro-v3-playground/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Nitro starter

Create your API and deploy it anywhere with this Nitro starter.

## Getting started

```bash
npm install
npm run dev
```

## Deploying

```bash
npm run build
```

Then checkout the [Nitro documentation](https://v3.nitro.build/deploy) to learn more about the different deployment presets.
171 changes: 171 additions & 0 deletions apps/nitro-v3-playground/bun.lock

Large diffs are not rendered by default.

113 changes: 113 additions & 0 deletions apps/nitro-v3-playground/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>evlog Nitro v3 Playground</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/styles.css">
</head>
<body>
<main class="card">
<h1><code>evlog</code> Nitro v3 Playground 🚀</h1>
<p>Test the evlog integration with different HTTP methods. Check your terminal for wide event logs!</p>
<div class="separator"></div>
<div class="demo-section">
<h2>Test API Endpoints</h2>

<div class="input-group">
<label for="itemName">Item Name (for POST request)</label>
<input type="text" id="itemName" placeholder="Enter item name" value="My Item">
</div>

<div class="buttons">
<button class="btn-get" onclick="testGet()">GET /api/test/success</button>
<button class="btn-post" onclick="testPost()">POST /api/test/create</button>
<button class="btn-delete" onclick="testPut()">PUT /api/test/update (Error Demo)</button>
<button class="btn-delete" onclick="testDelete()">DELETE /api/test/delete</button>
</div>

<div class="buttons">
<button class="btn-wide" onclick="testWide()">GET /api/test/wide-event (Full Wide Event Example)</button>
</div>

<div id="result"></div>
</div>

</main>

<script>
const resultEl = document.getElementById('result');

function showResult(data, status) {
resultEl.textContent = `Status: ${status}\n\n${JSON.stringify(data, null, 2)}`;
resultEl.classList.add('show');
}

async function testGet() {
try {
const response = await fetch('/api/test/success');
const data = await response.json();
showResult(data, response.status);
} catch (error) {
showResult({ error: error.message }, 'error');
}
}

async function testPost() {
try {
const itemName = document.getElementById('itemName').value;
const response = await fetch('/api/test/create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: itemName, type: 'demo' })
});
const data = await response.json();
showResult(data, response.status);
} catch (error) {
showResult({ error: error.message }, 'error');
}
}

async function testPut() {
try {
const itemName = document.getElementById('itemName').value;
const response = await fetch('/api/test/update', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: itemName, version: '2.0' })
});
const data = await response.json();
showResult(data, response.status);
} catch (error) {
showResult({ error: error.message }, 'error');
}
}

async function testDelete() {
try {
const response = await fetch('/api/test/delete', {
method: 'DELETE'
});
const data = await response.json();
showResult(data, response.status);
} catch (error) {
const errorData = error.data || error;
showResult(errorData, 'error');
}
}

async function testWide() {
try {
const response = await fetch('/api/test/wide-event');
const data = await response.json();
showResult(data, response.status);
} catch (error) {
showResult({ error: error.message }, 'error');
}
}
</script>
</body>
</html>
7 changes: 7 additions & 0 deletions apps/nitro-v3-playground/nitro.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { defineConfig } from 'nitro'

export default defineConfig({
serverDir: './',
// TODO: make playground work with evlog/nitro/v3
plugins: ['../../packages/evlog/src/nitro-v3/plugin.ts']
})
16 changes: 16 additions & 0 deletions apps/nitro-v3-playground/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "evlog-nitro-v3-playground",
"type": "module",
"scripts": {
"build": "nitro build",
"dev": "nitro dev",
"preview": "npx srvx --prod .output/"
},
"dependencies": {
"evlog": "workspace:*"
},
"devDependencies": {
"nitro": "latest",
"rolldown": "latest"
}
}
Loading