@rangojs/router 0.0.0-experimental.3 → 0.0.0-experimental.31

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 (300) hide show
  1. package/AGENTS.md +5 -0
  2. package/README.md +883 -4
  3. package/dist/bin/rango.js +1601 -0
  4. package/dist/vite/index.js +4655 -747
  5. package/package.json +78 -50
  6. package/skills/breadcrumbs/SKILL.md +206 -0
  7. package/skills/cache-guide/SKILL.md +262 -0
  8. package/skills/caching/SKILL.md +54 -25
  9. package/skills/composability/SKILL.md +172 -0
  10. package/skills/debug-manifest/SKILL.md +12 -8
  11. package/skills/document-cache/SKILL.md +23 -21
  12. package/skills/fonts/SKILL.md +167 -0
  13. package/skills/hooks/SKILL.md +389 -64
  14. package/skills/host-router/SKILL.md +218 -0
  15. package/skills/intercept/SKILL.md +133 -10
  16. package/skills/layout/SKILL.md +102 -5
  17. package/skills/links/SKILL.md +239 -0
  18. package/skills/loader/SKILL.md +366 -29
  19. package/skills/middleware/SKILL.md +173 -36
  20. package/skills/mime-routes/SKILL.md +128 -0
  21. package/skills/parallel/SKILL.md +80 -3
  22. package/skills/prerender/SKILL.md +643 -0
  23. package/skills/rango/SKILL.md +86 -16
  24. package/skills/response-routes/SKILL.md +411 -0
  25. package/skills/route/SKILL.md +227 -15
  26. package/skills/router-setup/SKILL.md +225 -32
  27. package/skills/tailwind/SKILL.md +129 -0
  28. package/skills/theme/SKILL.md +12 -11
  29. package/skills/typesafety/SKILL.md +415 -87
  30. package/skills/use-cache/SKILL.md +324 -0
  31. package/src/__internal.ts +10 -4
  32. package/src/bin/rango.ts +321 -0
  33. package/src/browser/action-coordinator.ts +97 -0
  34. package/src/browser/action-response-classifier.ts +99 -0
  35. package/src/browser/event-controller.ts +87 -64
  36. package/src/browser/history-state.ts +80 -0
  37. package/src/browser/intercept-utils.ts +52 -0
  38. package/src/browser/link-interceptor.ts +20 -4
  39. package/src/browser/logging.ts +55 -0
  40. package/src/browser/merge-segment-loaders.ts +20 -12
  41. package/src/browser/navigation-bridge.ts +201 -553
  42. package/src/browser/navigation-client.ts +124 -71
  43. package/src/browser/navigation-store.ts +33 -50
  44. package/src/browser/navigation-transaction.ts +295 -0
  45. package/src/browser/network-error-handler.ts +61 -0
  46. package/src/browser/partial-update.ts +267 -317
  47. package/src/browser/prefetch/cache.ts +146 -0
  48. package/src/browser/prefetch/fetch.ts +135 -0
  49. package/src/browser/prefetch/observer.ts +65 -0
  50. package/src/browser/prefetch/policy.ts +42 -0
  51. package/src/browser/prefetch/queue.ts +88 -0
  52. package/src/browser/rango-state.ts +112 -0
  53. package/src/browser/react/Link.tsx +173 -73
  54. package/src/browser/react/NavigationProvider.tsx +138 -27
  55. package/src/browser/react/context.ts +6 -0
  56. package/src/browser/react/filter-segment-order.ts +11 -0
  57. package/src/browser/react/index.ts +12 -12
  58. package/src/browser/react/location-state-shared.ts +95 -53
  59. package/src/browser/react/location-state.ts +60 -15
  60. package/src/browser/react/mount-context.ts +37 -0
  61. package/src/browser/react/nonce-context.ts +23 -0
  62. package/src/browser/react/shallow-equal.ts +27 -0
  63. package/src/browser/react/use-action.ts +29 -51
  64. package/src/browser/react/use-client-cache.ts +5 -3
  65. package/src/browser/react/use-handle.ts +49 -65
  66. package/src/browser/react/use-href.tsx +20 -188
  67. package/src/browser/react/use-link-status.ts +6 -5
  68. package/src/browser/react/use-mount.ts +31 -0
  69. package/src/browser/react/use-navigation.ts +27 -78
  70. package/src/browser/react/use-params.ts +65 -0
  71. package/src/browser/react/use-pathname.ts +47 -0
  72. package/src/browser/react/use-router.ts +63 -0
  73. package/src/browser/react/use-search-params.ts +56 -0
  74. package/src/browser/react/use-segments.ts +80 -97
  75. package/src/browser/response-adapter.ts +73 -0
  76. package/src/browser/rsc-router.tsx +111 -26
  77. package/src/browser/scroll-restoration.ts +92 -16
  78. package/src/browser/segment-reconciler.ts +216 -0
  79. package/src/browser/segment-structure-assert.ts +83 -0
  80. package/src/browser/server-action-bridge.ts +504 -584
  81. package/src/browser/shallow.ts +6 -1
  82. package/src/browser/types.ts +92 -57
  83. package/src/browser/validate-redirect-origin.ts +29 -0
  84. package/src/build/generate-manifest.ts +438 -0
  85. package/src/build/generate-route-types.ts +36 -0
  86. package/src/build/index.ts +35 -0
  87. package/src/build/route-trie.ts +265 -0
  88. package/src/build/route-types/ast-helpers.ts +25 -0
  89. package/src/build/route-types/ast-route-extraction.ts +98 -0
  90. package/src/build/route-types/codegen.ts +102 -0
  91. package/src/build/route-types/include-resolution.ts +411 -0
  92. package/src/build/route-types/param-extraction.ts +48 -0
  93. package/src/build/route-types/per-module-writer.ts +128 -0
  94. package/src/build/route-types/router-processing.ts +469 -0
  95. package/src/build/route-types/scan-filter.ts +78 -0
  96. package/src/build/runtime-discovery.ts +231 -0
  97. package/src/cache/background-task.ts +34 -0
  98. package/src/cache/cache-key-utils.ts +44 -0
  99. package/src/cache/cache-policy.ts +125 -0
  100. package/src/cache/cache-runtime.ts +338 -0
  101. package/src/cache/cache-scope.ts +120 -303
  102. package/src/cache/cf/cf-cache-store.ts +119 -7
  103. package/src/cache/cf/index.ts +8 -2
  104. package/src/cache/document-cache.ts +101 -72
  105. package/src/cache/handle-capture.ts +81 -0
  106. package/src/cache/handle-snapshot.ts +41 -0
  107. package/src/cache/index.ts +0 -15
  108. package/src/cache/memory-segment-store.ts +191 -13
  109. package/src/cache/profile-registry.ts +73 -0
  110. package/src/cache/read-through-swr.ts +134 -0
  111. package/src/cache/segment-codec.ts +256 -0
  112. package/src/cache/taint.ts +98 -0
  113. package/src/cache/types.ts +72 -122
  114. package/src/client.rsc.tsx +12 -15
  115. package/src/client.tsx +115 -135
  116. package/src/component-utils.ts +4 -4
  117. package/src/components/DefaultDocument.tsx +5 -1
  118. package/src/context-var.ts +86 -0
  119. package/src/debug.ts +17 -7
  120. package/src/errors.ts +108 -2
  121. package/src/handle.ts +34 -19
  122. package/src/handles/MetaTags.tsx +73 -20
  123. package/src/handles/breadcrumbs.ts +66 -0
  124. package/src/handles/index.ts +1 -0
  125. package/src/handles/meta.ts +30 -13
  126. package/src/host/cookie-handler.ts +165 -0
  127. package/src/host/errors.ts +97 -0
  128. package/src/host/index.ts +53 -0
  129. package/src/host/pattern-matcher.ts +214 -0
  130. package/src/host/router.ts +352 -0
  131. package/src/host/testing.ts +79 -0
  132. package/src/host/types.ts +146 -0
  133. package/src/host/utils.ts +25 -0
  134. package/src/href-client.ts +135 -49
  135. package/src/index.rsc.ts +183 -17
  136. package/src/index.ts +241 -24
  137. package/src/internal-debug.ts +11 -0
  138. package/src/loader.rsc.ts +27 -142
  139. package/src/loader.ts +27 -10
  140. package/src/network-error-thrower.tsx +3 -1
  141. package/src/outlet-provider.tsx +45 -0
  142. package/src/prerender/param-hash.ts +37 -0
  143. package/src/prerender/store.ts +185 -0
  144. package/src/prerender.ts +463 -0
  145. package/src/reverse.ts +330 -0
  146. package/src/root-error-boundary.tsx +41 -29
  147. package/src/route-content-wrapper.tsx +9 -11
  148. package/src/route-definition/dsl-helpers.ts +934 -0
  149. package/src/route-definition/helper-factories.ts +200 -0
  150. package/src/route-definition/helpers-types.ts +430 -0
  151. package/src/route-definition/index.ts +52 -0
  152. package/src/route-definition/redirect.ts +93 -0
  153. package/src/route-definition.ts +1 -1388
  154. package/src/route-map-builder.ts +241 -112
  155. package/src/route-name.ts +53 -0
  156. package/src/route-types.ts +70 -9
  157. package/src/router/content-negotiation.ts +116 -0
  158. package/src/router/debug-manifest.ts +72 -0
  159. package/src/router/error-handling.ts +9 -9
  160. package/src/router/find-match.ts +158 -0
  161. package/src/router/handler-context.ts +371 -81
  162. package/src/router/intercept-resolution.ts +395 -0
  163. package/src/router/lazy-includes.ts +234 -0
  164. package/src/router/loader-resolution.ts +215 -122
  165. package/src/router/logging.ts +248 -0
  166. package/src/router/manifest.ts +155 -32
  167. package/src/router/match-api.ts +620 -0
  168. package/src/router/match-context.ts +5 -3
  169. package/src/router/match-handlers.ts +440 -0
  170. package/src/router/match-middleware/background-revalidation.ts +80 -93
  171. package/src/router/match-middleware/cache-lookup.ts +382 -9
  172. package/src/router/match-middleware/cache-store.ts +51 -22
  173. package/src/router/match-middleware/intercept-resolution.ts +55 -17
  174. package/src/router/match-middleware/segment-resolution.ts +24 -6
  175. package/src/router/match-pipelines.ts +10 -45
  176. package/src/router/match-result.ts +34 -29
  177. package/src/router/metrics.ts +235 -15
  178. package/src/router/middleware-cookies.ts +55 -0
  179. package/src/router/middleware-types.ts +222 -0
  180. package/src/router/middleware.ts +324 -367
  181. package/src/router/pattern-matching.ts +321 -30
  182. package/src/router/prerender-match.ts +400 -0
  183. package/src/router/preview-match.ts +170 -0
  184. package/src/router/revalidation.ts +137 -38
  185. package/src/router/router-context.ts +36 -21
  186. package/src/router/router-interfaces.ts +452 -0
  187. package/src/router/router-options.ts +592 -0
  188. package/src/router/router-registry.ts +24 -0
  189. package/src/router/segment-resolution/fresh.ts +570 -0
  190. package/src/router/segment-resolution/helpers.ts +263 -0
  191. package/src/router/segment-resolution/loader-cache.ts +198 -0
  192. package/src/router/segment-resolution/revalidation.ts +1241 -0
  193. package/src/router/segment-resolution/static-store.ts +67 -0
  194. package/src/router/segment-resolution.ts +21 -0
  195. package/src/router/segment-wrappers.ts +289 -0
  196. package/src/router/telemetry-otel.ts +299 -0
  197. package/src/router/telemetry.ts +300 -0
  198. package/src/router/timeout.ts +148 -0
  199. package/src/router/trie-matching.ts +239 -0
  200. package/src/router/types.ts +77 -3
  201. package/src/router.ts +688 -3656
  202. package/src/rsc/handler-context.ts +45 -0
  203. package/src/rsc/handler.ts +786 -760
  204. package/src/rsc/helpers.ts +140 -6
  205. package/src/rsc/index.ts +5 -25
  206. package/src/rsc/loader-fetch.ts +209 -0
  207. package/src/rsc/manifest-init.ts +86 -0
  208. package/src/rsc/nonce.ts +14 -0
  209. package/src/rsc/origin-guard.ts +141 -0
  210. package/src/rsc/progressive-enhancement.ts +379 -0
  211. package/src/rsc/response-error.ts +37 -0
  212. package/src/rsc/response-route-handler.ts +347 -0
  213. package/src/rsc/rsc-rendering.ts +235 -0
  214. package/src/rsc/runtime-warnings.ts +42 -0
  215. package/src/rsc/server-action.ts +348 -0
  216. package/src/rsc/ssr-setup.ts +128 -0
  217. package/src/rsc/types.ts +40 -14
  218. package/src/search-params.ts +230 -0
  219. package/src/segment-system.tsx +57 -61
  220. package/src/server/context.ts +202 -51
  221. package/src/server/cookie-store.ts +190 -0
  222. package/src/server/fetchable-loader-store.ts +37 -0
  223. package/src/server/handle-store.ts +94 -15
  224. package/src/server/loader-registry.ts +15 -56
  225. package/src/server/request-context.ts +422 -70
  226. package/src/server.ts +36 -120
  227. package/src/ssr/index.tsx +157 -26
  228. package/src/static-handler.ts +114 -0
  229. package/src/theme/ThemeProvider.tsx +21 -15
  230. package/src/theme/ThemeScript.tsx +5 -5
  231. package/src/theme/constants.ts +5 -2
  232. package/src/theme/index.ts +4 -14
  233. package/src/theme/theme-context.ts +4 -30
  234. package/src/theme/theme-script.ts +21 -18
  235. package/src/types/boundaries.ts +158 -0
  236. package/src/types/cache-types.ts +198 -0
  237. package/src/types/error-types.ts +192 -0
  238. package/src/types/global-namespace.ts +100 -0
  239. package/src/types/handler-context.ts +687 -0
  240. package/src/types/index.ts +88 -0
  241. package/src/types/loader-types.ts +183 -0
  242. package/src/types/route-config.ts +170 -0
  243. package/src/types/route-entry.ts +102 -0
  244. package/src/types/segments.ts +148 -0
  245. package/src/types.ts +1 -1577
  246. package/src/urls/include-helper.ts +197 -0
  247. package/src/urls/index.ts +53 -0
  248. package/src/urls/path-helper-types.ts +339 -0
  249. package/src/urls/path-helper.ts +329 -0
  250. package/src/urls/pattern-types.ts +95 -0
  251. package/src/urls/response-types.ts +106 -0
  252. package/src/urls/type-extraction.ts +372 -0
  253. package/src/urls/urls-function.ts +98 -0
  254. package/src/urls.ts +1 -726
  255. package/src/use-loader.tsx +85 -77
  256. package/src/vite/discovery/bundle-postprocess.ts +184 -0
  257. package/src/vite/discovery/discover-routers.ts +344 -0
  258. package/src/vite/discovery/prerender-collection.ts +385 -0
  259. package/src/vite/discovery/route-types-writer.ts +258 -0
  260. package/src/vite/discovery/self-gen-tracking.ts +47 -0
  261. package/src/vite/discovery/state.ts +110 -0
  262. package/src/vite/discovery/virtual-module-codegen.ts +203 -0
  263. package/src/vite/index.ts +11 -782
  264. package/src/vite/plugin-types.ts +131 -0
  265. package/src/vite/plugins/cjs-to-esm.ts +93 -0
  266. package/src/vite/plugins/client-ref-dedup.ts +115 -0
  267. package/src/vite/plugins/client-ref-hashing.ts +105 -0
  268. package/src/vite/{expose-action-id.ts → plugins/expose-action-id.ts} +72 -51
  269. package/src/vite/plugins/expose-id-utils.ts +287 -0
  270. package/src/vite/plugins/expose-ids/export-analysis.ts +296 -0
  271. package/src/vite/plugins/expose-ids/handler-transform.ts +179 -0
  272. package/src/vite/plugins/expose-ids/loader-transform.ts +74 -0
  273. package/src/vite/plugins/expose-ids/router-transform.ts +110 -0
  274. package/src/vite/plugins/expose-ids/types.ts +45 -0
  275. package/src/vite/plugins/expose-internal-ids.ts +569 -0
  276. package/src/vite/plugins/refresh-cmd.ts +65 -0
  277. package/src/vite/plugins/use-cache-transform.ts +323 -0
  278. package/src/vite/plugins/version-injector.ts +83 -0
  279. package/src/vite/plugins/version-plugin.ts +254 -0
  280. package/src/vite/{virtual-entries.ts → plugins/virtual-entries.ts} +29 -15
  281. package/src/vite/plugins/virtual-stub-plugin.ts +29 -0
  282. package/src/vite/rango.ts +510 -0
  283. package/src/vite/router-discovery.ts +785 -0
  284. package/src/vite/utils/ast-handler-extract.ts +517 -0
  285. package/src/vite/utils/banner.ts +36 -0
  286. package/src/vite/utils/bundle-analysis.ts +137 -0
  287. package/src/vite/utils/manifest-utils.ts +70 -0
  288. package/src/vite/{package-resolution.ts → utils/package-resolution.ts} +25 -29
  289. package/src/vite/utils/prerender-utils.ts +189 -0
  290. package/src/vite/utils/shared-utils.ts +169 -0
  291. package/CLAUDE.md +0 -3
  292. package/src/browser/lru-cache.ts +0 -69
  293. package/src/browser/request-controller.ts +0 -164
  294. package/src/cache/memory-store.ts +0 -253
  295. package/src/href-context.ts +0 -33
  296. package/src/href.ts +0 -255
  297. package/src/vite/expose-handle-id.ts +0 -209
  298. package/src/vite/expose-loader-id.ts +0 -357
  299. package/src/vite/expose-location-state-id.ts +0 -177
  300. /package/src/vite/{version.d.ts → plugins/version.d.ts} +0 -0
@@ -1,177 +0,0 @@
1
- import type { Plugin, ResolvedConfig } from "vite";
2
- import MagicString from "magic-string";
3
- import path from "node:path";
4
- import crypto from "node:crypto";
5
-
6
- /**
7
- * Normalize path to forward slashes
8
- */
9
- function normalizePath(p: string): string {
10
- return p.split(path.sep).join("/");
11
- }
12
-
13
- /**
14
- * Generate a short hash for a location state key
15
- * Uses first 8 chars of SHA-256 hash for uniqueness while keeping keys short
16
- * Appends export name for easier debugging: "abc123#ProductState"
17
- */
18
- function hashLocationStateKey(filePath: string, exportName: string): string {
19
- const input = `${filePath}#${exportName}`;
20
- const hash = crypto.createHash("sha256").update(input).digest("hex");
21
- return `${hash.slice(0, 8)}#${exportName}`;
22
- }
23
-
24
- /**
25
- * Check if file imports createLocationState from rsc-router
26
- */
27
- function hasCreateLocationStateImport(code: string): boolean {
28
- // Match: import { createLocationState } from "@rangojs/router" or "@rangojs/router/client"
29
- const pattern =
30
- /import\s*\{[^}]*\bcreateLocationState\b[^}]*\}\s*from\s*["']@rangojs\/router(?:\/[^"']+)?["']/;
31
- return pattern.test(code);
32
- }
33
-
34
- /**
35
- * Transform export const X = createLocationState<...>() patterns to inject key
36
- *
37
- * The key is injected as the first parameter if not present:
38
- * - createLocationState() -> createLocationState("id")
39
- * - createLocationState<T>() -> createLocationState<T>("id")
40
- */
41
- function transformLocationStateExports(
42
- code: string,
43
- filePath: string,
44
- sourceId?: string,
45
- isBuild: boolean = false
46
- ): { code: string; map: ReturnType<MagicString["generateMap"]> } | null {
47
- // Quick bail-out
48
- if (!code.includes("createLocationState")) {
49
- return null;
50
- }
51
-
52
- // Must have direct import from rsc-router
53
- if (!hasCreateLocationStateImport(code)) {
54
- return null;
55
- }
56
-
57
- // Match: export const X = createLocationState<...>(
58
- // Captures the export name (X)
59
- const pattern = /export\s+const\s+(\w+)\s*=\s*createLocationState\s*(?:<[^>]*>)?\s*\(/g;
60
-
61
- const s = new MagicString(code);
62
- let hasChanges = false;
63
- let match: RegExpExecArray | null;
64
-
65
- while ((match = pattern.exec(code)) !== null) {
66
- const exportName = match[1];
67
- const matchEnd = match.index + match[0].length;
68
-
69
- // Find the end of the createLocationState(...) call
70
- let parenDepth = 1;
71
- let i = matchEnd;
72
- while (i < code.length && parenDepth > 0) {
73
- if (code[i] === "(") parenDepth++;
74
- if (code[i] === ")") parenDepth--;
75
- i++;
76
- }
77
-
78
- // i now points just after the closing )
79
- const closeParenPos = i - 1;
80
-
81
- // Check if there are any arguments (content between open and close paren)
82
- const content = code.slice(matchEnd, closeParenPos).trim();
83
- const hasArgs = content.length > 0;
84
-
85
- // Find the semicolon or end of statement
86
- let statementEnd = i;
87
- while (statementEnd < code.length && /\s/.test(code[statementEnd])) {
88
- statementEnd++;
89
- }
90
- if (code[statementEnd] === ";") {
91
- statementEnd++;
92
- }
93
-
94
- // Generate key: hashed in production, readable in dev
95
- const stateKey = isBuild
96
- ? hashLocationStateKey(filePath, exportName)
97
- : `${filePath}#${exportName}`;
98
-
99
- // Inject key as the first (and only) parameter
100
- // createLocationState() -> createLocationState("id")
101
- if (!hasArgs) {
102
- s.appendLeft(closeParenPos, `"${stateKey}"`);
103
- } else {
104
- // Already has a key, skip (shouldn't happen with new API, but be safe)
105
- continue;
106
- }
107
-
108
- // Also set __rsc_ls_key property for verification
109
- const propInjection = `\n${exportName}.__rsc_ls_key = "__rsc_ls_${stateKey}";`;
110
- s.appendRight(statementEnd, propInjection);
111
- hasChanges = true;
112
- }
113
-
114
- if (!hasChanges) {
115
- return null;
116
- }
117
-
118
- return {
119
- code: s.toString(),
120
- map: s.generateMap({ source: sourceId, includeContent: true }),
121
- };
122
- }
123
-
124
- /**
125
- * Vite plugin that exposes location state keys on createLocationState calls.
126
- *
127
- * When users create location states with createLocationState(), this plugin:
128
- * 1. Injects an auto-generated key as the first parameter
129
- * 2. Sets __rsc_ls_key property for verification
130
- *
131
- * This allows location states to be created without explicit keys:
132
- * - Before: export const ProductState = createLocationState<Product>("product")
133
- * - After: export const ProductState = createLocationState<Product>()
134
- *
135
- * The key is auto-generated from file path + export name.
136
- *
137
- * Requirements:
138
- * - Must use direct import: import { createLocationState } from "@rangojs/router"
139
- * - Must use named export: export const MyState = createLocationState(...)
140
- */
141
- export function exposeLocationStateId(): Plugin {
142
- let config: ResolvedConfig;
143
- let isBuild = false;
144
-
145
- return {
146
- name: "@rangojs/router:expose-location-state-id",
147
- enforce: "post",
148
-
149
- configResolved(resolvedConfig) {
150
- config = resolvedConfig;
151
- isBuild = config.command === "build";
152
- },
153
-
154
- transform(code, id) {
155
- // Skip node_modules
156
- if (id.includes("/node_modules/")) {
157
- return;
158
- }
159
-
160
- // Quick bail-out
161
- if (!code.includes("createLocationState")) {
162
- return;
163
- }
164
-
165
- // Must have direct import from rsc-router
166
- if (!hasCreateLocationStateImport(code)) {
167
- return;
168
- }
169
-
170
- // Get relative path for the key
171
- const relativePath = normalizePath(path.relative(config.root, id));
172
-
173
- // Transform: inject key
174
- return transformLocationStateExports(code, relativePath, id, isBuild);
175
- },
176
- };
177
- }
File without changes