reroute-js 0.25.2 → 0.26.0

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 +150 -52
  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 +2 -9
  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 +167 -185
  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 -382
  192. package/telemetry/browser.js.map +0 -10
  193. package/telemetry/index.d.ts.map +0 -1
  194. package/telemetry/index.js +0 -509
  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
@@ -185,7 +185,7 @@ Reroute is a dead-simple file-based routing framework for building full-stack Re
185
185
  - 📚 **Content API Routes** - Dynamic content endpoints
186
186
  - 🛠️ **Dev Mode Routes** - Development tooling and live reload
187
187
  - 📦 **Artifact Routes** - Serve generated content chunks and registry
188
- - 📊 **Optional OpenTelemetry** - Built-in tracing for SSR, 404s, cache hits (install `@elysiajs/opentelemetry` to enable)
188
+ - 📊 **Optional OpenTelemetry** - Built-in tracing for SSR, 404s, cache hits
189
189
 
190
190
  ### 🎯 Build System
191
191
  - 🔧 **Transpilation** - TypeScript/JSX to optimized JavaScript
@@ -1479,81 +1479,179 @@ If no `[og].tsx` exists for a route, uses built-in template with:
1479
1479
 
1480
1480
  ## 📊 OpenTelemetry (Optional)
1481
1481
 
1482
- Reroute has built-in support for OpenTelemetry tracing to help debug SSR, 404s, and cache behavior.
1482
+ ### Server Telemetry
1483
1483
 
1484
- ### Installation
1484
+ Track HTTP requests, errors, and system metrics.
1485
+
1486
+ **Installation:**
1485
1487
 
1486
1488
  ```bash
1487
- bun add @elysiajs/opentelemetry
1489
+ # Server telemetry packages
1490
+ bun add @opentelemetry/api \
1491
+ @opentelemetry/api-logs \
1492
+ @opentelemetry/exporter-logs-otlp-proto \
1493
+ @opentelemetry/exporter-metrics-otlp-proto \
1494
+ @opentelemetry/exporter-trace-otlp-proto \
1495
+ @opentelemetry/resources \
1496
+ @opentelemetry/sdk-logs \
1497
+ @opentelemetry/sdk-metrics \
1498
+ @opentelemetry/sdk-trace-node \
1499
+ @opentelemetry/semantic-conventions
1488
1500
  ```
1489
1501
 
1490
- That's it! Reroute automatically detects and uses it.
1502
+ **Configuration** in `reroute.config.ts`:
1491
1503
 
1492
- ### What Gets Traced
1504
+ ```typescript
1505
+ export default defineConfig({
1506
+ telemetry: {
1507
+ // Server telemetry
1508
+ enabled: true,
1509
+ environment: process.env.NODE_ENV || 'development',
1510
+ ignoreRoutes: [
1511
+ '/health',
1512
+ (pathname) => pathname.startsWith('/assets/'),
1513
+ /\.(js|css|png|jpg|svg|ico)$/,
1514
+ ],
1515
+ sampleRate: 1.0,
1516
+ captureHeaders: ['user-agent'],
1517
+
1518
+ // Browser telemetry proxy (avoids CORS and ad blockers)
1519
+ proxy: {
1520
+ enabled: true, // Default when proxy is an object
1521
+ pathname: '/api/telemetry', // Default
1522
+ verbose: false, // Log proxy requests
1523
+ },
1524
+
1525
+ // Browser telemetry
1526
+ browser: {
1527
+ enabled: true,
1528
+ serviceName: 'my-app-browser',
1529
+ environment: process.env.NODE_ENV || 'development',
1530
+ otlpEndpoint: '/api/telemetry', // Must match proxy.pathname
1531
+ enableConsoleCapture: true,
1532
+ },
1533
+ },
1534
+ });
1535
+ ```
1493
1536
 
1494
- Once installed, Reroute sends traces with detailed attributes:
1537
+ **Usage** - Config loaded automatically:
1495
1538
 
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`
1539
+ ```typescript
1540
+ import { telemetry } from 'reroute-js/telemetry/server';
1501
1541
 
1502
- - **404 Not Found** (When routes don't exist)
1503
- - `reroute.not_found`: `true`
1504
- - `reroute.pathname`: `/missing-page`
1505
- - `reroute.method`: `GET`
1542
+ new Elysia()
1543
+ .use(telemetry())
1544
+ .use(reroute({ app: createElement(App) }))
1545
+ .listen(3000);
1546
+ ```
1506
1547
 
1507
- - **SSR Data Loading** (`reroute.data.compute`)
1508
- - `reroute.data.path`: `/products/123`
1509
- - `reroute.data.cache_hit`: `true`/`false`
1548
+ **Browser telemetry** - Track client-side events and errors.
1510
1549
 
1511
- - **Errors** (SSR failures, data loading errors)
1512
- - `reroute.error`: `true`
1513
- - `reroute.error.type`: `SSRRenderError`, `SSRDataError`, etc.
1514
- - `reroute.error.collection`: `blog`
1550
+ **Installation:**
1515
1551
 
1516
- ### Usage with Your App Telemetry
1552
+ ```bash
1553
+ # Browser telemetry packages
1554
+ bun add @opentelemetry/api \
1555
+ @opentelemetry/auto-instrumentations-web \
1556
+ @opentelemetry/context-zone \
1557
+ @opentelemetry/exporter-trace-otlp-http \
1558
+ @opentelemetry/instrumentation \
1559
+ @opentelemetry/resources \
1560
+ @opentelemetry/sdk-trace-base \
1561
+ @opentelemetry/sdk-trace-web \
1562
+ @opentelemetry/semantic-conventions
1563
+ ```
1517
1564
 
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';
1565
+ **Usage:**
1524
1566
 
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);
1567
+ ```tsx
1568
+ import { TelemetryProvider } from 'reroute-js/telemetry/react/react';
1569
+
1570
+ // Auto-loads from telemetry.browser config
1571
+ <TelemetryProvider>
1572
+ <RerouteProvider {...bundle} />
1573
+ </TelemetryProvider>
1574
+
1575
+ // Or override config values
1576
+ <TelemetryProvider enabled={true} serviceName="custom-name">
1577
+ <RerouteProvider {...bundle} />
1578
+ </TelemetryProvider>
1538
1579
  ```
1539
1580
 
1540
- Reroute traces will appear nested under your request spans. Filter by `reroute.*` attributes in SigNoz/Jaeger.
1581
+ See [examples/landing](./examples/landing) for a complete example.
1541
1582
 
1542
- **Best Practice:** Use named functions (not arrow functions) for better span names:
1583
+ ### Custom Instrumentation
1584
+
1585
+ Create custom spans for API calls, database queries, or any operation:
1543
1586
 
1544
1587
  ```typescript
1545
- // Bad: Shows as "N/A" or "anonymous" in traces
1546
- .get('/api/users', async ({ params }) => {
1547
- return await getUsers();
1588
+ import { withSpan } from 'reroute-js/telemetry/server';
1589
+
1590
+ // Instrument API endpoints
1591
+ app.get('/api/products', async () => {
1592
+ return withSpan('api.get_products', async (span) => {
1593
+ span.setAttribute('api.operation', 'list_products');
1594
+
1595
+ const products = await fetchProducts();
1596
+ span.setAttribute('api.result_count', products.length);
1597
+
1598
+ return products;
1599
+ });
1548
1600
  });
1549
1601
 
1550
- // Good: Shows as "fetchUsers" in traces
1551
- .get('/api/users', async function fetchUsers({ params }) {
1552
- return await getUsers();
1602
+ // Nested spans automatically create parent-child relationships
1603
+ app.get('/api/orders', async () => {
1604
+ return withSpan('api.get_orders', async (span) => {
1605
+ span.setAttribute('api.operation', 'list_orders');
1606
+
1607
+ // Child span
1608
+ const user = await withSpan('api.fetch_user', async (childSpan) => {
1609
+ childSpan.setAttribute('user.id', userId);
1610
+ return await getUser(userId);
1611
+ });
1612
+
1613
+ return { user, orders: await getOrders(user.id) };
1614
+ });
1553
1615
  });
1554
1616
  ```
1555
1617
 
1556
- See [examples/landing/src/plugins/telemetry.ts](./examples/landing/src/plugins/telemetry.ts) for a complete telemetry setup.
1618
+ **Error Handling:**
1619
+
1620
+ Errors are automatically tracked and the span is properly closed:
1621
+
1622
+ ```typescript
1623
+ app.get('/api/user/:id', async ({ params }) => {
1624
+ return withSpan('api.get_user', async (span) => {
1625
+ span.setAttribute('user.id', params.id);
1626
+
1627
+ const user = await getUser(params.id);
1628
+
1629
+ if (!user) {
1630
+ // Error is automatically captured in the span
1631
+ throw new Error('User not found');
1632
+ }
1633
+
1634
+ return user;
1635
+ });
1636
+ });
1637
+ ```
1638
+
1639
+ When an error occurs inside a span:
1640
+ 1. **Error is recorded** - `span.recordException()` captures the full error details
1641
+ 2. **Status is set** - Span status automatically set to `ERROR` with error message
1642
+ 3. **Span is closed** - Span properly ended even when errors occur
1643
+ 4. **Error is re-thrown** - Error propagates normally (not swallowed)
1644
+
1645
+ This means errors appear in your traces with full context while maintaining normal error handling behavior.
1646
+
1647
+ **Key Features:**
1648
+ - **Automatic error tracking** - Errors are captured and recorded in spans
1649
+ - **Nested spans** - Child spans automatically linked to parent context
1650
+ - **Zero overhead when disabled** - No-op implementation when OpenTelemetry not installed
1651
+
1652
+ ### Reroute SSR Tracing
1653
+
1654
+ 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
1655
 
1558
1656
  ## 📖 Learn More
1559
1657
 
package/cli/bin.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * reroute-js v0.25.2
2
+ * reroute-js v0.26.0
3
3
  *
4
4
  * @license MIT
5
5
  * @copyright 2025 stewones <hi@stewan.io>