reroute-js 0.25.3 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (197) hide show
  1. package/README.md +153 -53
  2. package/cli/bin.d.ts +1 -1
  3. package/cli/bin.js +446 -150
  4. package/cli/bin.js.map +13 -9
  5. package/cli/index.d.ts +1 -1
  6. package/cli/index.js +4 -4
  7. package/cli/index.js.map +1 -1
  8. package/cli/src/cli.d.ts +1 -1
  9. package/cli/src/commands/analyze.d.ts +1 -1
  10. package/cli/src/commands/build.d.ts +1 -1
  11. package/cli/src/commands/dev.d.ts +1 -1
  12. package/cli/src/commands/gen.d.ts +1 -1
  13. package/cli/src/commands/gen.d.ts.map +1 -1
  14. package/cli/src/commands/index.d.ts +1 -1
  15. package/cli/src/commands/init.d.ts +1 -1
  16. package/cli/src/commands/lib/assets.d.ts +1 -1
  17. package/cli/src/commands/lib/bundler.d.ts +1 -1
  18. package/cli/src/commands/lib/command.d.ts +1 -1
  19. package/cli/src/commands/lib/env.d.ts +1 -1
  20. package/cli/src/commands/lib/index.d.ts +1 -1
  21. package/cli/src/commands/lib/log.d.ts +1 -1
  22. package/cli/src/commands/lib/markdown/availability.d.ts +1 -1
  23. package/cli/src/commands/lib/markdown/index.d.ts +1 -1
  24. package/cli/src/commands/lib/markdown/processor.d.ts +1 -1
  25. package/cli/src/commands/lib/production.d.ts +1 -1
  26. package/cli/src/commands/lib/server.d.ts +1 -1
  27. package/cli/src/commands/lib/streaming/analyzer.d.ts +1 -1
  28. package/cli/src/commands/lib/streaming/suspense.d.ts +1 -1
  29. package/cli/src/commands/lib/tailwind.d.ts +1 -1
  30. package/cli/src/commands/lib/terminal-ui.d.ts +1 -1
  31. package/cli/src/commands/lib/version.d.ts +1 -1
  32. package/cli/src/commands/og.d.ts +1 -1
  33. package/cli/src/commands/start.d.ts +1 -1
  34. package/cli/src/index.d.ts +1 -1
  35. package/core/index.d.ts +1 -1
  36. package/core/index.js +912 -589
  37. package/core/index.js.map +22 -14
  38. package/core/src/bundler/hash.d.ts +1 -1
  39. package/core/src/bundler/index.d.ts +1 -1
  40. package/core/src/config.d.ts +243 -2
  41. package/core/src/config.d.ts.map +1 -1
  42. package/core/src/content/discovery.d.ts +1 -1
  43. package/core/src/content/index.d.ts +1 -1
  44. package/core/src/content/metadata.d.ts +1 -1
  45. package/core/src/index.d.ts +1 -1
  46. package/core/src/llms/extractor.d.ts +1 -1
  47. package/core/src/llms/formatter.d.ts +1 -1
  48. package/core/src/llms/full-generator.d.ts +1 -1
  49. package/core/src/llms/index-generator.d.ts +1 -1
  50. package/core/src/llms/index.d.ts +1 -1
  51. package/core/src/og/discovery.d.ts +1 -1
  52. package/core/src/og/index.d.ts +1 -1
  53. package/core/src/og/meta.d.ts +1 -1
  54. package/core/src/og/render.d.ts +1 -1
  55. package/core/src/og/types.d.ts +1 -1
  56. package/core/src/robots/discovery.d.ts +1 -1
  57. package/core/src/robots/generator.d.ts +1 -1
  58. package/core/src/robots/index.d.ts +1 -1
  59. package/core/src/robots/policies.d.ts +1 -1
  60. package/core/src/rss/discovery.d.ts +1 -1
  61. package/core/src/rss/generator.d.ts +1 -1
  62. package/core/src/rss/index.d.ts +1 -1
  63. package/core/src/sitemap/discovery.d.ts +1 -1
  64. package/core/src/sitemap/generator.d.ts +1 -1
  65. package/core/src/sitemap/index.d.ts +1 -1
  66. package/core/src/ssr/index.d.ts +1 -1
  67. package/core/src/ssr/lib/cache.d.ts +1 -1
  68. package/core/src/ssr/lib/collections.d.ts +1 -1
  69. package/core/src/ssr/lib/compression.d.ts +1 -1
  70. package/core/src/ssr/lib/compute/content.d.ts +1 -1
  71. package/core/src/ssr/lib/compute/index.d.ts +1 -1
  72. package/core/src/ssr/lib/compute/layouts.d.ts +1 -1
  73. package/core/src/ssr/lib/compute/routes.d.ts +1 -1
  74. package/core/src/ssr/lib/data.d.ts +1 -1
  75. package/core/src/ssr/lib/html.d.ts +1 -1
  76. package/core/src/ssr/lib/imports.d.ts +1 -1
  77. package/core/src/ssr/lib/index.d.ts +1 -1
  78. package/core/src/ssr/lib/layouts.d.ts +1 -1
  79. package/core/src/ssr/lib/metadata.d.ts +1 -1
  80. package/core/src/ssr/lib/mime.d.ts +1 -1
  81. package/core/src/ssr/lib/modules.d.ts +1 -1
  82. package/core/src/ssr/lib/path.d.ts +1 -1
  83. package/core/src/ssr/lib/preload.d.ts +1 -1
  84. package/core/src/ssr/lib/scripts/collections.d.ts +1 -1
  85. package/core/src/ssr/lib/scripts/data.d.ts +2 -2
  86. package/core/src/ssr/lib/scripts/data.d.ts.map +1 -1
  87. package/core/src/ssr/lib/scripts/escape.d.ts +1 -1
  88. package/core/src/ssr/lib/scripts/feeds.d.ts +1 -1
  89. package/core/src/ssr/lib/scripts/index.d.ts +1 -1
  90. package/core/src/ssr/lib/seed.d.ts +1 -1
  91. package/core/src/ssr/lib/setup.d.ts +4 -2
  92. package/core/src/ssr/lib/setup.d.ts.map +1 -1
  93. package/core/src/ssr/lib/styles.d.ts +1 -1
  94. package/core/src/ssr/lib/template.d.ts +1 -1
  95. package/core/src/ssr/lib/types.d.ts +1 -1
  96. package/core/src/ssr/render.d.ts +4 -2
  97. package/core/src/ssr/render.d.ts.map +1 -1
  98. package/core/src/ssr/stream.d.ts +4 -2
  99. package/core/src/ssr/stream.d.ts.map +1 -1
  100. package/elysia/index.d.ts +1 -1
  101. package/elysia/index.js +715 -468
  102. package/elysia/index.js.map +15 -11
  103. package/elysia/src/index.d.ts +1 -1
  104. package/elysia/src/libs/assets.d.ts +1 -1
  105. package/elysia/src/libs/cache.d.ts +1 -1
  106. package/elysia/src/libs/caching.d.ts +1 -1
  107. package/elysia/src/libs/http.d.ts +1 -1
  108. package/elysia/src/libs/image.d.ts +1 -1
  109. package/elysia/src/libs/index.d.ts +1 -1
  110. package/elysia/src/libs/llms.d.ts +1 -1
  111. package/elysia/src/libs/response.d.ts +1 -1
  112. package/elysia/src/libs/serving.d.ts +1 -1
  113. package/elysia/src/plugin.d.ts +1 -1
  114. package/elysia/src/routes/artifacts.d.ts +1 -1
  115. package/elysia/src/routes/content.d.ts +1 -1
  116. package/elysia/src/routes/content.d.ts.map +1 -1
  117. package/elysia/src/routes/image.d.ts +1 -1
  118. package/elysia/src/routes/index.d.ts +1 -1
  119. package/elysia/src/routes/internal.d.ts +1 -1
  120. package/elysia/src/routes/llms.d.ts +1 -1
  121. package/elysia/src/routes/og.d.ts +1 -1
  122. package/elysia/src/routes/redirects.d.ts +1 -1
  123. package/elysia/src/routes/robots.d.ts +1 -1
  124. package/elysia/src/routes/rss.d.ts +1 -1
  125. package/elysia/src/routes/search.d.ts +1 -1
  126. package/elysia/src/routes/sitemap.d.ts +1 -1
  127. package/elysia/src/routes/ssr.d.ts +1 -1
  128. package/elysia/src/routes/ssr.d.ts.map +1 -1
  129. package/elysia/src/routes/static.d.ts +1 -1
  130. package/elysia/src/routes/static.d.ts.map +1 -1
  131. package/elysia/src/types.d.ts +1 -1
  132. package/package.json +4 -15
  133. package/react/index.d.ts +1 -1
  134. package/react/index.js +2 -2
  135. package/react/index.js.map +1 -1
  136. package/react/src/components/ClientOnly.d.ts +1 -1
  137. package/react/src/components/ContentRoute.d.ts +1 -1
  138. package/react/src/components/Image.d.ts +1 -1
  139. package/react/src/components/LazyRoute.d.ts +1 -1
  140. package/react/src/components/Link.d.ts +1 -1
  141. package/react/src/components/Markdown.d.ts +1 -1
  142. package/react/src/components/Outlet.d.ts +1 -1
  143. package/react/src/components/index.d.ts +1 -1
  144. package/react/src/hooks/index.d.ts +1 -1
  145. package/react/src/hooks/useContent.d.ts +1 -1
  146. package/react/src/hooks/useData.d.ts +1 -1
  147. package/react/src/hooks/useFeed.d.ts +1 -1
  148. package/react/src/hooks/useLayoutData.d.ts +1 -1
  149. package/react/src/hooks/useLlms.d.ts +1 -1
  150. package/react/src/hooks/useNavigate.d.ts +1 -1
  151. package/react/src/hooks/useParams.d.ts +1 -1
  152. package/react/src/hooks/useRouter.d.ts +1 -1
  153. package/react/src/hooks/useSearch.d.ts +1 -1
  154. package/react/src/hooks/useSearchParams.d.ts +1 -1
  155. package/react/src/hooks/useToc.d.ts +1 -1
  156. package/react/src/index.d.ts +1 -1
  157. package/react/src/lib/collection.d.ts +1 -1
  158. package/react/src/lib/content.d.ts +1 -1
  159. package/react/src/lib/head.d.ts +1 -1
  160. package/react/src/lib/index.d.ts +1 -1
  161. package/react/src/lib/lazy-route.d.ts +1 -1
  162. package/react/src/lib/route-loader.d.ts +1 -1
  163. package/react/src/providers/ContentProvider.d.ts +1 -1
  164. package/react/src/providers/RerouteProvider.d.ts +1 -1
  165. package/react/src/providers/RouterProvider.d.ts +1 -1
  166. package/react/src/providers/index.d.ts +1 -1
  167. package/react/src/types/any.d.ts +1 -1
  168. package/react/src/types/index.d.ts +1 -1
  169. package/react/src/types/router.d.ts +1 -1
  170. package/telemetry/react.d.ts +2 -2
  171. package/telemetry/react.d.ts.map +1 -1
  172. package/telemetry/react.js +164 -183
  173. package/telemetry/react.js.map +7 -6
  174. package/telemetry/{index.d.ts → server.d.ts} +2 -2
  175. package/telemetry/server.d.ts.map +1 -0
  176. package/telemetry/server.js +1134 -0
  177. package/telemetry/server.js.map +44 -0
  178. package/telemetry/src/{browser/react.d.ts → react/api.d.ts} +4 -12
  179. package/telemetry/src/react/api.d.ts.map +1 -0
  180. package/telemetry/{browser.d.ts → src/react/index.d.ts} +4 -3
  181. package/telemetry/src/react/index.d.ts.map +1 -0
  182. package/telemetry/src/{browser/index.d.ts → react/telemetry.d.ts} +13 -13
  183. package/telemetry/src/react/telemetry.d.ts.map +1 -0
  184. package/telemetry/src/server/index.d.ts +3 -101
  185. package/telemetry/src/server/index.d.ts.map +1 -1
  186. package/telemetry/src/server/instrumentation.d.ts +62 -0
  187. package/telemetry/src/server/instrumentation.d.ts.map +1 -0
  188. package/telemetry/src/server/plugin.d.ts +72 -0
  189. package/telemetry/src/server/plugin.d.ts.map +1 -0
  190. package/telemetry/browser.d.ts.map +0 -1
  191. package/telemetry/browser.js +0 -383
  192. package/telemetry/browser.js.map +0 -10
  193. package/telemetry/index.d.ts.map +0 -1
  194. package/telemetry/index.js +0 -525
  195. package/telemetry/index.js.map +0 -10
  196. package/telemetry/src/browser/index.d.ts.map +0 -1
  197. package/telemetry/src/browser/react.d.ts.map +0 -1
package/README.md CHANGED
@@ -48,6 +48,10 @@ Reroute is a dead-simple file-based routing framework for building full-stack Re
48
48
  - [CLI Preview](#cli-preview)
49
49
  - [URLs & Meta Tags](#urls--meta-tags)
50
50
  - [Default Template](#default-template)
51
+ - [📊 OpenTelemetry](#-opentelemetry-optional)
52
+ - [Server Telemetry](#server-telemetry)
53
+ - [Custom Instrumentation](#custom-instrumentation)
54
+ - [Reroute SSR Tracing](#reroute-ssr-tracing)
51
55
  - [📖 Learn More](#-learn-more)
52
56
  - [📝 License](#-license)
53
57
 
@@ -185,7 +189,7 @@ Reroute is a dead-simple file-based routing framework for building full-stack Re
185
189
  - 📚 **Content API Routes** - Dynamic content endpoints
186
190
  - 🛠️ **Dev Mode Routes** - Development tooling and live reload
187
191
  - 📦 **Artifact Routes** - Serve generated content chunks and registry
188
- - 📊 **Optional OpenTelemetry** - Built-in tracing for SSR, 404s, cache hits (install `@elysiajs/opentelemetry` to enable)
192
+ - 📊 **Optional OpenTelemetry** - Built-in tracing for SSR, 404s, cache hits
189
193
 
190
194
  ### 🎯 Build System
191
195
  - 🔧 **Transpilation** - TypeScript/JSX to optimized JavaScript
@@ -1477,83 +1481,179 @@ If no `[og].tsx` exists for a route, uses built-in template with:
1477
1481
  - Avatar and siteName from config
1478
1482
  - Clean black card design
1479
1483
 
1480
- ## 📊 OpenTelemetry (Optional)
1484
+ ## 📊 OpenTelemetry
1481
1485
 
1482
- Reroute has built-in support for OpenTelemetry tracing to help debug SSR, 404s, and cache behavior.
1486
+ ### Server Telemetry
1483
1487
 
1484
- ### Installation
1488
+ Track HTTP requests, errors, and system metrics.
1489
+
1490
+ **Installation:**
1485
1491
 
1486
1492
  ```bash
1487
- bun add @elysiajs/opentelemetry
1493
+ # Server telemetry packages
1494
+ bun add @opentelemetry/api \
1495
+ @opentelemetry/api-logs \
1496
+ @opentelemetry/exporter-logs-otlp-proto \
1497
+ @opentelemetry/exporter-metrics-otlp-proto \
1498
+ @opentelemetry/exporter-trace-otlp-proto \
1499
+ @opentelemetry/resources \
1500
+ @opentelemetry/sdk-logs \
1501
+ @opentelemetry/sdk-metrics \
1502
+ @opentelemetry/sdk-trace-node \
1503
+ @opentelemetry/semantic-conventions
1488
1504
  ```
1489
1505
 
1490
- That's it! Reroute automatically detects and uses it.
1506
+ **Configuration** in `reroute.config.ts`:
1491
1507
 
1492
- ### What Gets Traced
1508
+ ```typescript
1509
+ export default defineConfig({
1510
+ telemetry: {
1511
+ // Server telemetry
1512
+ enabled: true,
1513
+ environment: process.env.NODE_ENV || 'development',
1514
+ ignoreRoutes: [
1515
+ '/health',
1516
+ (pathname) => pathname.startsWith('/assets/'),
1517
+ /\.(js|css|png|jpg|svg|ico)$/,
1518
+ ],
1519
+ sampleRate: 1.0,
1520
+ captureHeaders: ['user-agent'],
1521
+
1522
+ // Browser telemetry proxy (avoids CORS and ad blockers)
1523
+ proxy: {
1524
+ enabled: true, // Default when proxy is an object
1525
+ pathname: '/api/telemetry', // Default
1526
+ verbose: false, // Log proxy requests
1527
+ },
1528
+
1529
+ // Browser telemetry
1530
+ browser: {
1531
+ enabled: true,
1532
+ serviceName: 'my-app-browser',
1533
+ environment: process.env.NODE_ENV || 'development',
1534
+ otlpEndpoint: '/api/telemetry', // Must match proxy.pathname
1535
+ enableConsoleCapture: true,
1536
+ },
1537
+ },
1538
+ });
1539
+ ```
1493
1540
 
1494
- Once installed, Reroute sends traces with detailed attributes:
1541
+ **Usage** - Config loaded automatically:
1495
1542
 
1496
- - **SSR Rendering** (`reroute.ssr.render_stream`, `reroute.ssr.render_sync`)
1497
- - `reroute.ssr.streaming`: `true`/`false`
1498
- - `reroute.pathname`: `/blog/my-post`
1499
- - `reroute.collection`: `blog`
1500
- - `reroute.cache.hit`: `true`/`false`
1543
+ ```typescript
1544
+ import { telemetry } from 'reroute-js/telemetry/server';
1501
1545
 
1502
- - **404 Not Found** (When routes don't exist)
1503
- - `reroute.not_found`: `true`
1504
- - `reroute.pathname`: `/missing-page`
1505
- - `reroute.method`: `GET`
1546
+ new Elysia()
1547
+ .use(telemetry())
1548
+ .use(reroute({ app: createElement(App) }))
1549
+ .listen(3000);
1550
+ ```
1506
1551
 
1507
- - **SSR Data Loading** (`reroute.data.compute`)
1508
- - `reroute.data.path`: `/products/123`
1509
- - `reroute.data.cache_hit`: `true`/`false`
1552
+ **Browser telemetry** - Track client-side events and errors.
1510
1553
 
1511
- - **Errors** (SSR failures, data loading errors)
1512
- - `reroute.error`: `true`
1513
- - `reroute.error.type`: `SSRRenderError`, `SSRDataError`, etc.
1514
- - `reroute.error.collection`: `blog`
1554
+ **Installation:**
1515
1555
 
1516
- ### Usage with Your App Telemetry
1556
+ ```bash
1557
+ # Browser telemetry packages
1558
+ bun add @opentelemetry/api \
1559
+ @opentelemetry/auto-instrumentations-web \
1560
+ @opentelemetry/context-zone \
1561
+ @opentelemetry/exporter-trace-otlp-http \
1562
+ @opentelemetry/instrumentation \
1563
+ @opentelemetry/resources \
1564
+ @opentelemetry/sdk-trace-base \
1565
+ @opentelemetry/sdk-trace-web \
1566
+ @opentelemetry/semantic-conventions
1567
+ ```
1517
1568
 
1518
- ```typescript
1519
- import { Elysia } from 'elysia';
1520
- import { reroute } from 'reroute-js/elysia';
1521
- import { opentelemetry } from '@elysiajs/opentelemetry';
1522
- import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-node';
1523
- import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';
1569
+ **Usage:**
1524
1570
 
1525
- new Elysia()
1526
- .use(opentelemetry({
1527
- serviceName: 'My App',
1528
- spanProcessors: [
1529
- new BatchSpanProcessor(
1530
- new OTLPTraceExporter({
1531
- url: 'http://localhost:4318/v1/traces',
1532
- })
1533
- )
1534
- ]
1535
- }))
1536
- .use(reroute({ app: createElement(App) }))
1537
- .listen(3000);
1571
+ ```tsx
1572
+ import { TelemetryProvider } from 'reroute-js/telemetry/react/react';
1573
+
1574
+ // Auto-loads from telemetry.browser config
1575
+ <TelemetryProvider>
1576
+ <RerouteProvider {...bundle} />
1577
+ </TelemetryProvider>
1578
+
1579
+ // Or override config values
1580
+ <TelemetryProvider enabled={true} serviceName="custom-name">
1581
+ <RerouteProvider {...bundle} />
1582
+ </TelemetryProvider>
1538
1583
  ```
1539
1584
 
1540
- Reroute traces will appear nested under your request spans. Filter by `reroute.*` attributes in SigNoz/Jaeger.
1585
+ ### Custom Instrumentation
1541
1586
 
1542
- **Best Practice:** Use named functions (not arrow functions) for better span names:
1587
+ Create custom spans for API calls, database queries, or any operation:
1543
1588
 
1544
1589
  ```typescript
1545
- // Bad: Shows as "N/A" or "anonymous" in traces
1546
- .get('/api/users', async ({ params }) => {
1547
- return await getUsers();
1590
+ import { withSpan } from 'reroute-js/telemetry/server';
1591
+
1592
+ // Instrument API endpoints
1593
+ app.get('/api/products', async () => {
1594
+ return withSpan('api.get_products', async (span) => {
1595
+ span.setAttribute('api.operation', 'list_products');
1596
+
1597
+ const products = await fetchProducts();
1598
+ span.setAttribute('api.result_count', products.length);
1599
+
1600
+ return products;
1601
+ });
1602
+ });
1603
+
1604
+ // Nested spans automatically create parent-child relationships
1605
+ app.get('/api/orders', async () => {
1606
+ return withSpan('api.get_orders', async (span) => {
1607
+ span.setAttribute('api.operation', 'list_orders');
1608
+
1609
+ // Child span
1610
+ const user = await withSpan('api.fetch_user', async (childSpan) => {
1611
+ childSpan.setAttribute('user.id', userId);
1612
+ return await getUser(userId);
1613
+ });
1614
+
1615
+ return { user, orders: await getOrders(user.id) };
1616
+ });
1548
1617
  });
1618
+ ```
1619
+
1620
+ **Error Handling:**
1549
1621
 
1550
- // Good: Shows as "fetchUsers" in traces
1551
- .get('/api/users', async function fetchUsers({ params }) {
1552
- return await getUsers();
1622
+ Errors are automatically tracked and the span is properly closed:
1623
+
1624
+ ```typescript
1625
+ app.get('/api/user/:id', async ({ params }) => {
1626
+ return withSpan('api.get_user', async (span) => {
1627
+ span.setAttribute('user.id', params.id);
1628
+
1629
+ const user = await getUser(params.id);
1630
+
1631
+ if (!user) {
1632
+ // Error is automatically captured in the span
1633
+ throw new Error('User not found');
1634
+ }
1635
+
1636
+ return user;
1637
+ });
1553
1638
  });
1554
1639
  ```
1555
1640
 
1556
- See [examples/landing/src/plugins/telemetry.ts](./examples/landing/src/plugins/telemetry.ts) for a complete telemetry setup.
1641
+ When an error occurs inside a span:
1642
+ 1. **Error is recorded** - `span.recordException()` captures the full error details
1643
+ 2. **Status is set** - Span status automatically set to `ERROR` with error message
1644
+ 3. **Span is closed** - Span properly ended even when errors occur
1645
+ 4. **Error is re-thrown** - Error propagates normally (not swallowed)
1646
+
1647
+ This means errors appear in your traces with full context while maintaining normal error handling behavior.
1648
+
1649
+ **Key Features:**
1650
+ - **Automatic error tracking** - Errors are captured and recorded in spans
1651
+ - **Nested spans** - Child spans automatically linked to parent context
1652
+ - **Zero overhead when disabled** - No-op implementation when OpenTelemetry not installed
1653
+
1654
+ ### Reroute SSR Tracing
1655
+
1656
+ Built-in tracing for debugging SSR, 404s, and cache behavior. Automatically traces SSR rendering, 404s, data loading, and errors. Filter by `reroute.*` attributes in SigNoz/Jaeger.
1557
1657
 
1558
1658
  ## 📖 Learn More
1559
1659
 
package/cli/bin.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.25.3
2
+ * reroute-js v0.26.1
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>