@rangojs/router 0.0.0-experimental.d7eeaa75 → 0.0.0-experimental.d98a8e9d
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.
- package/README.md +120 -25
- package/dist/bin/rango.js +147 -57
- package/dist/testing/vitest.js +82 -0
- package/dist/vite/index.js +2154 -861
- package/dist/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/package.json +57 -11
- package/skills/api-client/SKILL.md +211 -0
- package/skills/breadcrumbs/SKILL.md +3 -1
- package/skills/bundle-analysis/SKILL.md +159 -0
- package/skills/cache-guide/SKILL.md +220 -30
- package/skills/caching/SKILL.md +116 -8
- package/skills/composability/SKILL.md +27 -2
- package/skills/document-cache/SKILL.md +78 -55
- package/skills/handler-use/SKILL.md +364 -0
- package/skills/hooks/SKILL.md +229 -20
- package/skills/host-router/SKILL.md +45 -20
- package/skills/i18n/SKILL.md +276 -0
- package/skills/intercept/SKILL.md +46 -4
- package/skills/layout/SKILL.md +28 -7
- package/skills/links/SKILL.md +247 -17
- package/skills/loader/SKILL.md +219 -9
- package/skills/middleware/SKILL.md +47 -12
- package/skills/migrate-nextjs/SKILL.md +562 -0
- package/skills/migrate-react-router/SKILL.md +769 -0
- package/skills/mime-routes/SKILL.md +27 -0
- package/skills/observability/SKILL.md +137 -0
- package/skills/parallel/SKILL.md +71 -6
- package/skills/prerender/SKILL.md +14 -33
- package/skills/rango/SKILL.md +243 -22
- package/skills/react-compiler/SKILL.md +168 -0
- package/skills/response-routes/SKILL.md +122 -47
- package/skills/route/SKILL.md +57 -4
- package/skills/router-setup/SKILL.md +3 -3
- package/skills/server-actions/SKILL.md +751 -0
- package/skills/streams-and-websockets/SKILL.md +283 -0
- package/skills/testing/SKILL.md +128 -0
- package/skills/testing/bindings.md +89 -0
- package/skills/testing/cache-prerender.md +98 -0
- package/skills/testing/client-components.md +121 -0
- package/skills/testing/e2e-parity.md +124 -0
- package/skills/testing/flight.md +89 -0
- package/skills/testing/handles.md +127 -0
- package/skills/testing/loader.md +108 -0
- package/skills/testing/middleware.md +97 -0
- package/skills/testing/render-handler.md +102 -0
- package/skills/testing/response-routes.md +94 -0
- package/skills/testing/reverse-and-types.md +83 -0
- package/skills/testing/server-actions.md +89 -0
- package/skills/testing/server-tree.md +128 -0
- package/skills/testing/setup.md +120 -0
- package/skills/typesafety/SKILL.md +319 -27
- package/skills/use-cache/SKILL.md +34 -5
- package/skills/view-transitions/SKILL.md +294 -0
- package/src/__augment-tests__/augment.ts +81 -0
- package/src/__augment-tests__/augmented.check.ts +116 -0
- package/src/browser/action-coordinator.ts +53 -36
- package/src/browser/app-shell.ts +52 -0
- package/src/browser/event-controller.ts +86 -70
- package/src/browser/history-state.ts +21 -0
- package/src/browser/index.ts +3 -3
- package/src/browser/navigation-bridge.ts +84 -11
- package/src/browser/navigation-client.ts +104 -68
- package/src/browser/navigation-store.ts +32 -9
- package/src/browser/navigation-transaction.ts +10 -28
- package/src/browser/partial-update.ts +64 -26
- package/src/browser/prefetch/cache.ts +183 -44
- package/src/browser/prefetch/fetch.ts +228 -37
- package/src/browser/prefetch/queue.ts +36 -5
- package/src/browser/rango-state.ts +53 -13
- package/src/browser/react/Link.tsx +30 -2
- package/src/browser/react/NavigationProvider.tsx +72 -31
- package/src/browser/react/filter-segment-order.ts +51 -7
- package/src/browser/react/index.ts +3 -0
- package/src/browser/react/location-state-shared.ts +175 -4
- package/src/browser/react/location-state.ts +39 -13
- package/src/browser/react/use-handle.ts +17 -9
- package/src/browser/react/use-navigation.ts +22 -2
- package/src/browser/react/use-params.ts +20 -8
- package/src/browser/react/use-reverse.ts +106 -0
- package/src/browser/react/use-router.ts +22 -2
- package/src/browser/react/use-segments.ts +11 -8
- package/src/browser/response-adapter.ts +32 -1
- package/src/browser/rsc-router.tsx +69 -22
- package/src/browser/scroll-restoration.ts +22 -14
- package/src/browser/segment-reconciler.ts +36 -14
- package/src/browser/segment-structure-assert.ts +2 -2
- package/src/browser/server-action-bridge.ts +23 -30
- package/src/browser/types.ts +21 -0
- package/src/build/collect-fallback-refs.ts +107 -0
- package/src/build/generate-manifest.ts +60 -35
- package/src/build/generate-route-types.ts +2 -0
- package/src/build/index.ts +8 -1
- package/src/build/prefix-tree-utils.ts +123 -0
- package/src/build/route-trie.ts +95 -25
- package/src/build/route-types/codegen.ts +4 -4
- package/src/build/route-types/include-resolution.ts +1 -1
- package/src/build/route-types/per-module-writer.ts +7 -4
- package/src/build/route-types/router-processing.ts +55 -14
- package/src/build/route-types/scan-filter.ts +1 -1
- package/src/build/route-types/source-scan.ts +118 -0
- package/src/build/runtime-discovery.ts +9 -20
- package/src/cache/cache-scope.ts +28 -42
- package/src/cache/cf/cf-cache-store.ts +54 -13
- package/src/client.rsc.tsx +3 -0
- package/src/client.tsx +96 -205
- package/src/context-var.ts +5 -5
- package/src/decode-loader-results.ts +36 -0
- package/src/errors.ts +30 -4
- package/src/handle.ts +32 -14
- package/src/host/index.ts +2 -2
- package/src/host/router.ts +129 -57
- package/src/host/types.ts +31 -2
- package/src/host/utils.ts +1 -1
- package/src/href-client.ts +140 -21
- package/src/index.rsc.ts +10 -6
- package/src/index.ts +54 -17
- package/src/loader-store.ts +500 -0
- package/src/loader.rsc.ts +25 -7
- package/src/loader.ts +16 -9
- package/src/missing-id-error.ts +68 -0
- package/src/outlet-context.ts +1 -1
- package/src/prerender.ts +27 -6
- package/src/response-utils.ts +37 -0
- package/src/reverse.ts +65 -36
- package/src/route-content-wrapper.tsx +6 -28
- package/src/route-definition/dsl-helpers.ts +384 -257
- package/src/route-definition/helper-factories.ts +29 -139
- package/src/route-definition/helpers-types.ts +100 -28
- package/src/route-definition/resolve-handler-use.ts +6 -0
- package/src/route-definition/use-item-types.ts +32 -0
- package/src/route-types.ts +26 -41
- package/src/router/basename.ts +14 -0
- package/src/router/content-negotiation.ts +15 -2
- package/src/router/error-handling.ts +1 -1
- package/src/router/find-match.ts +54 -6
- package/src/router/handler-context.ts +21 -38
- package/src/router/intercept-resolution.ts +4 -18
- package/src/router/lazy-includes.ts +41 -22
- package/src/router/loader-resolution.ts +82 -36
- package/src/router/manifest.ts +41 -19
- package/src/router/match-api.ts +4 -3
- package/src/router/match-handlers.ts +63 -20
- package/src/router/match-middleware/cache-lookup.ts +44 -91
- package/src/router/match-middleware/cache-store.ts +3 -2
- package/src/router/match-result.ts +53 -32
- package/src/router/metrics.ts +1 -1
- package/src/router/middleware-types.ts +15 -26
- package/src/router/middleware.ts +99 -84
- package/src/router/pattern-matching.ts +116 -19
- package/src/router/prerender-match.ts +1 -1
- package/src/router/preview-match.ts +3 -1
- package/src/router/request-classification.ts +4 -28
- package/src/router/revalidation.ts +58 -2
- package/src/router/router-interfaces.ts +45 -28
- package/src/router/router-options.ts +40 -1
- package/src/router/router-registry.ts +2 -5
- package/src/router/segment-resolution/fresh.ts +27 -6
- package/src/router/segment-resolution/revalidation.ts +147 -106
- package/src/router/segment-resolution/view-transition-default.ts +36 -0
- package/src/router/substitute-pattern-params.ts +56 -0
- package/src/router/telemetry.ts +99 -0
- package/src/router/trie-matching.ts +40 -16
- package/src/router/types.ts +8 -0
- package/src/router/url-params.ts +49 -0
- package/src/router.ts +52 -30
- package/src/rsc/handler-context.ts +2 -2
- package/src/rsc/handler.ts +28 -69
- package/src/rsc/helpers.ts +91 -43
- package/src/rsc/index.ts +1 -1
- package/src/rsc/manifest-init.ts +28 -41
- package/src/rsc/origin-guard.ts +28 -10
- package/src/rsc/progressive-enhancement.ts +4 -0
- package/src/rsc/response-error.ts +79 -12
- package/src/rsc/response-route-handler.ts +57 -61
- package/src/rsc/rsc-rendering.ts +35 -51
- package/src/rsc/runtime-warnings.ts +9 -10
- package/src/rsc/server-action.ts +17 -37
- package/src/rsc/ssr-setup.ts +16 -0
- package/src/rsc/types.ts +8 -2
- package/src/runtime-env.ts +18 -0
- package/src/search-params.ts +4 -4
- package/src/segment-content-promise.ts +67 -0
- package/src/segment-loader-promise.ts +122 -0
- package/src/segment-system.tsx +132 -116
- package/src/serialize.ts +243 -0
- package/src/server/context.ts +175 -53
- package/src/server/cookie-store.ts +28 -4
- package/src/server/request-context.ts +67 -51
- package/src/ssr/index.tsx +5 -1
- package/src/static-handler.ts +25 -3
- package/src/testing/cache-status.ts +166 -0
- package/src/testing/collect-handle.ts +63 -0
- package/src/testing/dispatch.ts +581 -0
- package/src/testing/dom.entry.ts +22 -0
- package/src/testing/e2e/fixture.ts +188 -0
- package/src/testing/e2e/index.ts +149 -0
- package/src/testing/e2e/matchers.ts +51 -0
- package/src/testing/e2e/page-helpers.ts +272 -0
- package/src/testing/e2e/parity.ts +326 -0
- package/src/testing/e2e/server.ts +195 -0
- package/src/testing/flight-matchers.ts +110 -0
- package/src/testing/flight-normalize.ts +38 -0
- package/src/testing/flight-runtime.d.ts +57 -0
- package/src/testing/flight-tree.ts +682 -0
- package/src/testing/flight.entry.ts +51 -0
- package/src/testing/flight.ts +234 -0
- package/src/testing/generated-routes.ts +223 -0
- package/src/testing/index.ts +106 -0
- package/src/testing/internal/context.ts +304 -0
- package/src/testing/internal/flight-client-globals.ts +30 -0
- package/src/testing/internal/seed-vars.ts +42 -0
- package/src/testing/render-handler.ts +323 -0
- package/src/testing/render-route.tsx +590 -0
- package/src/testing/run-loader.ts +363 -0
- package/src/testing/run-middleware.ts +205 -0
- package/src/testing/vitest-stubs/cloudflare-email.ts +9 -0
- package/src/testing/vitest-stubs/cloudflare-workers.ts +21 -0
- package/src/testing/vitest-stubs/plugin-rsc.ts +16 -0
- package/src/testing/vitest-stubs/version.ts +5 -0
- package/src/testing/vitest.ts +285 -0
- package/src/types/global-namespace.ts +39 -26
- package/src/types/handler-context.ts +68 -50
- package/src/types/index.ts +1 -0
- package/src/types/loader-types.ts +11 -9
- package/src/types/request-scope.ts +126 -0
- package/src/types/route-entry.ts +11 -0
- package/src/types/segments.ts +35 -2
- package/src/urls/include-helper.ts +34 -67
- package/src/urls/index.ts +1 -5
- package/src/urls/path-helper-types.ts +41 -7
- package/src/urls/path-helper.ts +17 -52
- package/src/urls/pattern-types.ts +36 -19
- package/src/urls/response-types.ts +22 -29
- package/src/urls/type-extraction.ts +58 -139
- package/src/urls/urls-function.ts +1 -5
- package/src/use-loader.tsx +413 -42
- package/src/vite/debug.ts +185 -0
- package/src/vite/discovery/bundle-postprocess.ts +6 -6
- package/src/vite/discovery/discover-routers.ts +106 -75
- package/src/vite/discovery/discovery-errors.ts +194 -0
- package/src/vite/discovery/gate-state.ts +171 -0
- package/src/vite/discovery/prerender-collection.ts +67 -26
- package/src/vite/discovery/route-types-writer.ts +40 -84
- package/src/vite/discovery/self-gen-tracking.ts +27 -1
- package/src/vite/discovery/state.ts +33 -0
- package/src/vite/discovery/virtual-module-codegen.ts +13 -23
- package/src/vite/index.ts +2 -0
- package/src/vite/plugin-types.ts +67 -0
- package/src/vite/plugins/cjs-to-esm.ts +8 -7
- package/src/vite/plugins/client-ref-dedup.ts +16 -0
- package/src/vite/plugins/client-ref-hashing.ts +28 -5
- package/src/vite/plugins/cloudflare-protocol-loader-hook.d.mts +23 -0
- package/src/vite/plugins/cloudflare-protocol-loader-hook.mjs +76 -0
- package/src/vite/plugins/cloudflare-protocol-stub.ts +214 -0
- package/src/vite/plugins/expose-action-id.ts +54 -30
- package/src/vite/plugins/expose-id-utils.ts +12 -8
- package/src/vite/plugins/expose-ids/export-analysis.ts +100 -20
- package/src/vite/plugins/expose-ids/handler-transform.ts +8 -61
- package/src/vite/plugins/expose-ids/loader-transform.ts +3 -5
- package/src/vite/plugins/expose-ids/router-transform.ts +20 -3
- package/src/vite/plugins/expose-internal-ids.ts +496 -486
- package/src/vite/plugins/performance-tracks.ts +29 -25
- package/src/vite/plugins/use-cache-transform.ts +65 -50
- package/src/vite/plugins/version-injector.ts +39 -23
- package/src/vite/plugins/version-plugin.ts +59 -2
- package/src/vite/plugins/virtual-entries.ts +2 -2
- package/src/vite/rango.ts +116 -29
- package/src/vite/router-discovery.ts +750 -100
- package/src/vite/utils/ast-handler-extract.ts +15 -15
- package/src/vite/utils/banner.ts +1 -1
- package/src/vite/utils/bundle-analysis.ts +4 -2
- package/src/vite/utils/client-chunks.ts +190 -0
- package/src/vite/utils/forward-user-plugins.ts +193 -0
- package/src/vite/utils/manifest-utils.ts +8 -59
- package/src/vite/utils/package-resolution.ts +41 -1
- package/src/vite/utils/prerender-utils.ts +21 -6
- package/src/vite/utils/shared-utils.ts +107 -26
- package/src/browser/action-response-classifier.ts +0 -99
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Plugin } from "vite";
|
|
1
|
+
import type { Plugin, ResolvedConfig } from "vite";
|
|
2
2
|
import * as Vite from "vite";
|
|
3
3
|
import { getPublishedPackageName } from "./package-resolution.js";
|
|
4
4
|
import { performanceTracksOptimizeDepsPlugin } from "../plugins/performance-tracks.js";
|
|
@@ -6,39 +6,52 @@ import {
|
|
|
6
6
|
VIRTUAL_ENTRY_BROWSER,
|
|
7
7
|
VIRTUAL_ENTRY_SSR,
|
|
8
8
|
getVirtualEntryRSC,
|
|
9
|
+
getVirtualVersionContent,
|
|
9
10
|
VIRTUAL_IDS,
|
|
10
11
|
} from "../plugins/virtual-entries.js";
|
|
11
12
|
|
|
13
|
+
// Cloudflare preset: @cloudflare/vite-plugin sets optimizeDeps.entries (string
|
|
14
|
+
// or array) on the rsc environment. Single source for both the discovery plugin
|
|
15
|
+
// and the version injector so they target the same entry.
|
|
16
|
+
export function resolveRscEntryFromConfig(
|
|
17
|
+
config: ResolvedConfig,
|
|
18
|
+
): string | undefined {
|
|
19
|
+
const entries = (config.environments as any)?.["rsc"]?.optimizeDeps?.entries;
|
|
20
|
+
if (typeof entries === "string") return entries;
|
|
21
|
+
if (Array.isArray(entries) && entries.length > 0) return entries[0];
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
12
25
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
26
|
+
* Rolldown plugin to provide the version virtual module during dependency
|
|
27
|
+
* optimization. Vite 8 optimizes deps with Rolldown (a Rollup-style plugin
|
|
28
|
+
* pipeline that is separate from the main plugin set), so this is a
|
|
29
|
+
* resolveId/load plugin under optimizeDeps.rolldownOptions. Any dep pulled into
|
|
30
|
+
* optimization that imports the version virtual module gets a "dev" stub here;
|
|
31
|
+
* the real VERSION is injected into runtime modules by the version plugin.
|
|
16
32
|
*/
|
|
17
|
-
const
|
|
33
|
+
const versionRolldownPlugin = {
|
|
18
34
|
name: "@rangojs/router-version",
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
loader: "js",
|
|
29
|
-
}),
|
|
30
|
-
);
|
|
35
|
+
resolveId(id: string): string | undefined {
|
|
36
|
+
if (id === VIRTUAL_IDS.version) return "\0" + VIRTUAL_IDS.version;
|
|
37
|
+
return undefined;
|
|
38
|
+
},
|
|
39
|
+
load(id: string): string | undefined {
|
|
40
|
+
if (id === "\0" + VIRTUAL_IDS.version) {
|
|
41
|
+
return getVirtualVersionContent("dev");
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
31
44
|
},
|
|
32
45
|
};
|
|
33
46
|
|
|
34
47
|
/**
|
|
35
|
-
* Shared
|
|
36
|
-
* Includes the version stub plugin
|
|
48
|
+
* Shared Rolldown options for dependency optimization (Vite 8).
|
|
49
|
+
* Includes the version stub plugin and the performance-tracks RSDW patch.
|
|
37
50
|
*/
|
|
38
|
-
export const
|
|
51
|
+
export const sharedRolldownOptions: {
|
|
39
52
|
plugins: any[];
|
|
40
53
|
} = {
|
|
41
|
-
plugins: [
|
|
54
|
+
plugins: [versionRolldownPlugin, performanceTracksOptimizeDepsPlugin()],
|
|
42
55
|
};
|
|
43
56
|
|
|
44
57
|
/**
|
|
@@ -103,14 +116,68 @@ export function createVirtualEntriesPlugin(
|
|
|
103
116
|
};
|
|
104
117
|
}
|
|
105
118
|
|
|
119
|
+
// Matches rollup's FILE_NAME_CONFLICT message and reports whether the colliding
|
|
120
|
+
// file is a content-hashed asset, e.g.
|
|
121
|
+
// The emitted file "assets/index-DlGNrvnU.css" overwrites a previously ...
|
|
122
|
+
// The emitted file "assets/inter-latin-Dx4kXJAl.woff2" overwrites a ...
|
|
123
|
+
// The match is UNANCHORED on purpose: by the time the warning reaches this user
|
|
124
|
+
// onwarn handler, Vite's logger has wrapped rollup's raw message with an ANSI
|
|
125
|
+
// color sequence and a "[CODE] " label, e.g.
|
|
126
|
+
// "[33m[FILE_NAME_CONFLICT] [0mThe emitted file \"...\" overwrites ..."
|
|
127
|
+
// A "^The emitted file" anchor sits behind that prefix and never matches; and
|
|
128
|
+
// Vite also strips the JSON.stringify quotes rollup puts around the filename, so
|
|
129
|
+
// the match is UNANCHORED and quote-OPTIONAL ("?...?"?). The non-whitespace
|
|
130
|
+
// capture stops at the space before "overwrites" (Vite's unquoted display form)
|
|
131
|
+
// or the closing quote (raw rollup form); either way it carries no ANSI.
|
|
132
|
+
// A content-hashed name ends with a "-" separator + a Vite content hash. The
|
|
133
|
+
// hash is a FIXED-LENGTH base64url run ([A-Za-z0-9_-], default 8), so it can
|
|
134
|
+
// itself contain "-"/"_": it CANNOT be located by splitting on the last "-"
|
|
135
|
+
// (that lands inside the hash whenever it carries a dash, e.g. "...-Cabi7G8-" ->
|
|
136
|
+
// "" or "...-CkhJZR-_" -> "_", which let those conflicts leak). Instead take the
|
|
137
|
+
// trailing HASH_LEN chars and require the "-" separator right before them. The
|
|
138
|
+
// hash must hold an uppercase letter or digit (a real hash is never an
|
|
139
|
+
// all-lowercase word), so stable names like "assets/manifest.json" or
|
|
140
|
+
// "assets/loading-skeleton.css" still surface as potential genuine overwrites.
|
|
141
|
+
function isContentHashedAssetConflict(message: string | undefined): boolean {
|
|
142
|
+
if (!message) return false;
|
|
143
|
+
const match =
|
|
144
|
+
/The emitted file "?([^"\s]+)"? overwrites a previously emitted file/.exec(
|
|
145
|
+
message,
|
|
146
|
+
);
|
|
147
|
+
if (!match) return false;
|
|
148
|
+
const fileName = match[1];
|
|
149
|
+
const base = fileName.slice(fileName.lastIndexOf("/") + 1);
|
|
150
|
+
const dot = base.lastIndexOf(".");
|
|
151
|
+
if (dot <= 0) return false;
|
|
152
|
+
const stem = base.slice(0, dot);
|
|
153
|
+
// HASH_LEN tracks Vite's default [hash] width; bump it if an app sets a custom
|
|
154
|
+
// assetFileNames hash length.
|
|
155
|
+
const HASH_LEN = 8;
|
|
156
|
+
if (stem.length < HASH_LEN + 1 || stem[stem.length - HASH_LEN - 1] !== "-") {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
const hash = stem.slice(-HASH_LEN);
|
|
160
|
+
return /^[A-Za-z0-9_-]+$/.test(hash) && /[A-Z0-9]/.test(hash);
|
|
161
|
+
}
|
|
162
|
+
|
|
106
163
|
/**
|
|
107
164
|
* Rollup onwarn handler that suppresses known harmless warnings:
|
|
108
165
|
* - "use client" directives: handled by the RSC plugin, not relevant to Rollup
|
|
109
166
|
* - sourcemap errors: caused by "use client" directive at line 1:0 confusing sourcemap resolution
|
|
110
167
|
* - sourcemap incomplete: plugins that transform without generating sourcemaps (router + RSC plugin)
|
|
111
|
-
* - dynamic/static mixed imports: expected for router internals (e.g. request-context, cache-scope)
|
|
168
|
+
* - dynamic/static mixed imports: expected for router internals (e.g. request-context, cache-scope).
|
|
169
|
+
* Under Rolldown (Vite 8) this surfaces as the INEFFECTIVE_DYNAMIC_IMPORT code emitted directly
|
|
170
|
+
* by the bundler, rather than the vite:reporter message handled below (Rollup/Vite 7 shape).
|
|
112
171
|
* - empty bundle: @vitejs/plugin-rsc scan build (step 1/5) produces an empty "index" chunk
|
|
113
172
|
* because the RSC entry is fully externalized during client-reference analysis
|
|
173
|
+
* - file name conflicts on content-hashed assets: @vitejs/plugin-rsc copies the rsc
|
|
174
|
+
* environment's imported CSS/assets into the client bundle (its assets-manifest
|
|
175
|
+
* generateBundle re-emits each via emitFile with an explicit content-hashed
|
|
176
|
+
* fileName). When the client bundle already produced that identical asset,
|
|
177
|
+
* rollup raises FILE_NAME_CONFLICT even though the bytes are identical (a
|
|
178
|
+
* content hash collision IS a content match). Only these are suppressed; a
|
|
179
|
+
* collision on a stable name still surfaces. No upstream fix as of
|
|
180
|
+
* @vitejs/plugin-rsc@0.5.27; remove when it skips the redundant emit.
|
|
114
181
|
*/
|
|
115
182
|
export function onwarn(
|
|
116
183
|
warning: Vite.Rollup.RollupLog,
|
|
@@ -119,7 +186,14 @@ export function onwarn(
|
|
|
119
186
|
if (
|
|
120
187
|
warning.code === "MODULE_LEVEL_DIRECTIVE" ||
|
|
121
188
|
warning.code === "SOURCEMAP_ERROR" ||
|
|
122
|
-
warning.code === "EMPTY_BUNDLE"
|
|
189
|
+
warning.code === "EMPTY_BUNDLE" ||
|
|
190
|
+
warning.code === "INEFFECTIVE_DYNAMIC_IMPORT"
|
|
191
|
+
) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (
|
|
195
|
+
warning.code === "FILE_NAME_CONFLICT" &&
|
|
196
|
+
isContentHashedAssetConflict(warning.message)
|
|
123
197
|
) {
|
|
124
198
|
return;
|
|
125
199
|
}
|
|
@@ -157,12 +231,19 @@ export function getManualChunks(id: string): string | undefined {
|
|
|
157
231
|
return "react";
|
|
158
232
|
}
|
|
159
233
|
// Use dynamic package name from package.json
|
|
160
|
-
// Check both npm install path and workspace symlink resolved path
|
|
234
|
+
// Check both npm install path and workspace symlink resolved path.
|
|
235
|
+
//
|
|
236
|
+
// The workspace patterns are anchored to the package's own `src`/`dist` so
|
|
237
|
+
// they match the router runtime but NOT consumer apps that merely live under a
|
|
238
|
+
// `packages/rangojs-router/` ancestor (the in-repo e2e apps at
|
|
239
|
+
// `packages/rangojs-router/e2e/<app>/src/...`). Without the anchor those apps'
|
|
240
|
+
// own client components were force-merged into the shared "router" chunk,
|
|
241
|
+
// which both misrepresented real-consumer bundles and blocked `clientChunks`
|
|
242
|
+
// splitting from relocating them.
|
|
161
243
|
const packageName = getPublishedPackageName();
|
|
162
244
|
if (
|
|
163
245
|
normalized.includes(`node_modules/${packageName}/`) ||
|
|
164
|
-
|
|
165
|
-
normalized.includes("packages/rangojs-router/")
|
|
246
|
+
/\/packages\/(rsc-router|rangojs-router)\/(src|dist)\//.test(normalized)
|
|
166
247
|
) {
|
|
167
248
|
return "router";
|
|
168
249
|
}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Discriminated union of post-reconciliation action response scenarios.
|
|
3
|
-
*
|
|
4
|
-
* Error and full-update-unsupported are handled inline in the bridge
|
|
5
|
-
* before reconciliation. This classifier only runs for partial responses
|
|
6
|
-
* that have been successfully reconciled.
|
|
7
|
-
*/
|
|
8
|
-
export type ActionScenario =
|
|
9
|
-
| {
|
|
10
|
-
type: "navigated-away";
|
|
11
|
-
historyKeyChanged: boolean;
|
|
12
|
-
onInterceptRoute: boolean;
|
|
13
|
-
}
|
|
14
|
-
| { type: "hmr-missing" }
|
|
15
|
-
| { type: "consolidation-needed"; segmentIds: string[] }
|
|
16
|
-
| { type: "concurrent-skip"; otherFetchingCount: number }
|
|
17
|
-
| { type: "normal" };
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Pure data inputs for classifying a partial action response.
|
|
21
|
-
* All values come from the bridge but no browser APIs or side effects.
|
|
22
|
-
*/
|
|
23
|
-
export interface ClassifierInput {
|
|
24
|
-
/** window.location.pathname captured at action start */
|
|
25
|
-
actionStartPathname: string;
|
|
26
|
-
/** window.location.pathname at classification time */
|
|
27
|
-
currentPathname: string;
|
|
28
|
-
/** window.history.state?.key captured at action start */
|
|
29
|
-
actionStartLocationKey: string | undefined;
|
|
30
|
-
/** window.history.state?.key at classification time */
|
|
31
|
-
currentLocationKey: string | undefined;
|
|
32
|
-
/** Number of segments after reconciliation */
|
|
33
|
-
reconciledSegmentCount: number;
|
|
34
|
-
/** Number of matched segment IDs from server */
|
|
35
|
-
matchedCount: number;
|
|
36
|
-
/** Segment IDs needing consolidation (from concurrent action tracking) */
|
|
37
|
-
consolidationSegments: string[] | null;
|
|
38
|
-
/** Number of other actions still in "fetching" phase */
|
|
39
|
-
otherFetchingActionCount: number;
|
|
40
|
-
/** Current intercept source URL (null when not on intercept route) */
|
|
41
|
-
currentInterceptSource: string | null;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Classify a partial action response into one of 5 post-reconciliation
|
|
46
|
-
* scenarios.
|
|
47
|
-
*
|
|
48
|
-
* Called after error and full-update cases are handled inline by the bridge.
|
|
49
|
-
* The classification order matches the priority chain:
|
|
50
|
-
* 1. User navigated away during action
|
|
51
|
-
* 2. HMR missing segments (fewer reconciled than matched)
|
|
52
|
-
* 3. Consolidation needed (concurrent actions finished)
|
|
53
|
-
* 4. Concurrent skip (other actions still fetching)
|
|
54
|
-
* 5. Normal (single action, no issues)
|
|
55
|
-
*
|
|
56
|
-
* This is a pure function with no side effects - the bridge handles
|
|
57
|
-
* all UI updates, store mutations, and network requests based on the
|
|
58
|
-
* returned scenario.
|
|
59
|
-
*/
|
|
60
|
-
export function classifyActionResponse(input: ClassifierInput): ActionScenario {
|
|
61
|
-
// Check if user navigated away during the action
|
|
62
|
-
const userNavigatedAway =
|
|
63
|
-
input.currentPathname !== input.actionStartPathname ||
|
|
64
|
-
input.currentLocationKey !== input.actionStartLocationKey;
|
|
65
|
-
|
|
66
|
-
if (userNavigatedAway) {
|
|
67
|
-
const historyKeyChanged =
|
|
68
|
-
input.currentLocationKey !== input.actionStartLocationKey;
|
|
69
|
-
return {
|
|
70
|
-
type: "navigated-away",
|
|
71
|
-
historyKeyChanged,
|
|
72
|
-
onInterceptRoute: input.currentInterceptSource !== null,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// HMR resilience: segments missing after reconciliation
|
|
77
|
-
if (input.reconciledSegmentCount < input.matchedCount) {
|
|
78
|
-
return { type: "hmr-missing" };
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Consolidation needed for concurrent actions
|
|
82
|
-
if (input.consolidationSegments && input.consolidationSegments.length > 0) {
|
|
83
|
-
return {
|
|
84
|
-
type: "consolidation-needed",
|
|
85
|
-
segmentIds: input.consolidationSegments,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Other actions still fetching - skip UI update
|
|
90
|
-
if (input.otherFetchingActionCount > 0) {
|
|
91
|
-
return {
|
|
92
|
-
type: "concurrent-skip",
|
|
93
|
-
otherFetchingCount: input.otherFetchingActionCount,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Normal single-action completion
|
|
98
|
-
return { type: "normal" };
|
|
99
|
-
}
|