Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove flags #11384

Merged
merged 2 commits into from
Mar 29, 2024
Merged
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
5 changes: 5 additions & 0 deletions .changeset/funny-tips-beg.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@remix-run/router": patch
---

[REMOVE] Remove staticHandler.query flags that we can implement in dataStrategy
1 change: 0 additions & 1 deletion .changeset/slow-flies-help.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,3 @@
---

- Move `unstable_dataStrategy` from `createStaticHandler` to `staticHandler.query` so it can be request-specific for use with the `ResponseStub` approach in Remix. It's not really applicable to `queryRoute` for now since that's a singular handler call anyway so any pre-processing/post/processing could be done there manually.
- Added a new `skipLoaders` flag to `staticHandler.query` for calling only the action in Remix Single Fetch
5 changes: 1 addition & 4 deletions .changeset/static-query-flags.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,4 @@
"@remix-run/router": minor
---

Added 2 new options to the `staticHandler.query` method for use in Remix's Single Fetch implementation:

- `loadRouteIds`: An optional array of route IDs to load if you wish to load a subset of the matched routes (useful for fine-grained revalidation)
- `skipLoaderErrorBubbling`: Disable error bubbling on loader executions for single-fetch scenarios where the client-side router will handle the bubbling
Added a `skipLoaderErrorBubbling` flag to `staticHandler.query` to disable error bubbling on loader executions for single-fetch scenarios where the client-side router will handle the bubbling
5 changes: 1 addition & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,10 +202,7 @@ With this flag enabled, `action`'s that return/throw a `4xx`/`5xx` response stat

- Add a new `unstable_dataStrategy` configuration option ([#11098](https://github.com/remix-run/react-router/pull/11098), ([#11377](https://github.com/remix-run/react-router/pull/11377)))
- `@remix-run/router` - Add a new `future.unstable_skipActionRevalidation` future flag ([#11098](https://github.com/remix-run/react-router/pull/11098))
- `@remix-run/router` - SSR: Added 3 new options to the `staticHandler.query` method for use in Remix's Single Fetch implementation: ([#11098](https://github.com/remix-run/react-router/pull/11098), ([#11377](https://github.com/remix-run/react-router/pull/11377)))
- `loadRouteIds`: Optional array of route IDs to load a subset of the matched routes
- `skipLoaderErrorBubbling`: Disable error bubbling by the static handler
- `skipLoaders`: Only call the action on POST requests, don't call all of the loaders afterwards
- `@remix-run/router` - SSR: Added a new `skipLoaderErrorBubbling` options to the `staticHandler.query` method to disable error bubbling by the static handler for use in Remix's Single Fetch implementation ([#11098](https://github.com/remix-run/react-router/pull/11098), ([#11377](https://github.com/remix-run/react-router/pull/11377)))

**Full Changelog**: [`v6.22.3...v6.23.0`](https://github.com/remix-run/react-router/compare/[email protected]@6.23.0)

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@
"none": "14.8 kB"
},
"packages/react-router/dist/umd/react-router.production.min.js": {
"none": "17.2 kB"
"none": "17.21 kB"
},
"packages/react-router-dom/dist/react-router-dom.production.min.js": {
"none": "17.1 kB"
Expand Down
50 changes: 0 additions & 50 deletions packages/router/__tests__/ssr-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1090,56 +1090,6 @@ describe("ssr", () => {
expect(arg(childStub).context.sessionId).toBe("12345");
});

it("should support a loadRouteIds parameter for granular loads", async () => {
let rootStub = jest.fn(() => "ROOT");
let childStub = jest.fn(() => "CHILD");
let actionStub = jest.fn(() => "CHILD ACTION");
let { query } = createStaticHandler([
{
id: "root",
path: "/",
loader: rootStub,
children: [
{
id: "child",
path: "child",
action: actionStub,
loader: childStub,
},
],
},
]);

let ctx = await query(createRequest("/child"), {
loadRouteIds: ["child"],
});
expect(rootStub).not.toHaveBeenCalled();
expect(childStub).toHaveBeenCalled();
expect(ctx).toMatchObject({
loaderData: {
child: "CHILD",
},
});

actionStub.mockClear();
rootStub.mockClear();
childStub.mockClear();

ctx = await query(createSubmitRequest("/child"), {
loadRouteIds: ["child"],
});
expect(rootStub).not.toHaveBeenCalled();
expect(childStub).toHaveBeenCalled();
expect(ctx).toMatchObject({
actionData: {
child: "CHILD ACTION",
},
loaderData: {
child: "CHILD",
},
});
});

describe("deferred", () => {
let { query } = createStaticHandler(SSR_ROUTES);

Expand Down
81 changes: 8 additions & 73 deletions packages/router/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -405,9 +405,7 @@ export interface StaticHandler {
query(
request: Request,
opts?: {
loadRouteIds?: string[];
requestContext?: unknown;
skipLoaders?: boolean;
skipLoaderErrorBubbling?: boolean;
unstable_dataStrategy?: DataStrategyFunction;
}
Expand Down Expand Up @@ -2988,30 +2986,22 @@ export function createStaticHandler(
* propagate that out and return the raw Response so the HTTP server can
* return it directly.
*
* - `opts.loadRouteIds` is an optional array of routeIds to run only a subset of
* loaders during a query() call
* - `opts.requestContext` is an optional server context that will be passed
* to actions/loaders in the `context` parameter
* - `opts.skipLoaderErrorBubbling` is an optional parameter that will prevent
* the bubbling of errors which allows single-fetch-type implementations
* where the client will handle the bubbling and we may need to return data
* for the handling route
* - `opts.skipLoaders` is an optional parameter that will prevent loaders
* from running after an action
*/
async function query(
request: Request,
{
loadRouteIds,
requestContext,
skipLoaderErrorBubbling,
skipLoaders,
unstable_dataStrategy,
}: {
loadRouteIds?: string[];
requestContext?: unknown;
skipLoaderErrorBubbling?: boolean;
skipLoaders?: boolean;
unstable_dataStrategy?: DataStrategyFunction;
} = {}
): Promise<StaticHandlerContext | Response> {
Expand Down Expand Up @@ -3065,9 +3055,7 @@ export function createStaticHandler(
matches,
requestContext,
unstable_dataStrategy || null,
loadRouteIds || null,
skipLoaderErrorBubbling === true,
skipLoaders === true,
null
);
if (isResponse(result)) {
Expand Down Expand Up @@ -3145,11 +3133,10 @@ export function createStaticHandler(
matches,
requestContext,
null,
null,
false,
false,
match
);

if (isResponse(result)) {
return result;
}
Expand Down Expand Up @@ -3185,9 +3172,7 @@ export function createStaticHandler(
matches: AgnosticDataRouteMatch[],
requestContext: unknown,
unstable_dataStrategy: DataStrategyFunction | null,
loadRouteIds: string[] | null,
skipLoaderErrorBubbling: boolean,
skipLoaders: boolean,
routeMatch: AgnosticDataRouteMatch | null
): Promise<Omit<StaticHandlerContext, "location" | "basename"> | Response> {
invariant(
Expand All @@ -3203,9 +3188,7 @@ export function createStaticHandler(
routeMatch || getTargetMatch(matches, location),
requestContext,
unstable_dataStrategy,
loadRouteIds,
skipLoaderErrorBubbling,
skipLoaders,
routeMatch != null
);
return result;
Expand All @@ -3216,7 +3199,6 @@ export function createStaticHandler(
matches,
requestContext,
unstable_dataStrategy,
loadRouteIds,
skipLoaderErrorBubbling,
routeMatch
);
Expand Down Expand Up @@ -3252,9 +3234,7 @@ export function createStaticHandler(
actionMatch: AgnosticDataRouteMatch,
requestContext: unknown,
unstable_dataStrategy: DataStrategyFunction | null,
loadRouteIds: string[] | null,
skipLoaderErrorBubbling: boolean,
skipLoaders: boolean,
isRouteRequest: boolean
): Promise<Omit<StaticHandlerContext, "location" | "basename"> | Response> {
let result: DataResult;
Expand Down Expand Up @@ -3347,36 +3327,12 @@ export function createStaticHandler(
let boundaryMatch = skipLoaderErrorBubbling
? actionMatch
: findNearestBoundary(matches, actionMatch.route.id);
let statusCode = isRouteErrorResponse(result.error)
? result.error.status
: result.statusCode != null
? result.statusCode
: 500;
let actionHeaders = {
...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),
};

if (skipLoaders) {
return {
matches,
loaderData: {},
actionData: {},
errors: {
[boundaryMatch.route.id]: result.error,
},
statusCode,
loaderHeaders: {},
actionHeaders,
activeDeferreds: null,
};
}

let context = await loadRouteData(
loaderRequest,
matches,
requestContext,
unstable_dataStrategy,
loadRouteIds,
skipLoaderErrorBubbling,
null,
[boundaryMatch.route.id, result]
Expand All @@ -3385,28 +3341,15 @@ export function createStaticHandler(
// action status codes take precedence over loader status codes
return {
...context,
statusCode,
statusCode: isRouteErrorResponse(result.error)
? result.error.status
: result.statusCode != null
? result.statusCode
: 500,
actionData: null,
actionHeaders,
};
}

let actionHeaders = result.headers
? { [actionMatch.route.id]: result.headers }
: {};

if (skipLoaders) {
return {
matches,
loaderData: {},
actionData: {
[actionMatch.route.id]: result.data,
actionHeaders: {
...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),
},
errors: null,
statusCode: result.statusCode || 200,
loaderHeaders: {},
actionHeaders,
activeDeferreds: null,
};
}

Expand All @@ -3415,7 +3358,6 @@ export function createStaticHandler(
matches,
requestContext,
unstable_dataStrategy,
loadRouteIds,
skipLoaderErrorBubbling,
null
);
Expand All @@ -3438,7 +3380,6 @@ export function createStaticHandler(
matches: AgnosticDataRouteMatch[],
requestContext: unknown,
unstable_dataStrategy: DataStrategyFunction | null,
loadRouteIds: string[] | null,
skipLoaderErrorBubbling: boolean,
routeMatch: AgnosticDataRouteMatch | null,
pendingActionResult?: PendingActionResult
Expand Down Expand Up @@ -3473,12 +3414,6 @@ export function createStaticHandler(
(m) => m.route.loader || m.route.lazy
);

if (loadRouteIds) {
matchesToLoad = matchesToLoad.filter((m) =>
loadRouteIds.includes(m.route.id)
);
}

// Short circuit if we have no loaders to run (query())
if (matchesToLoad.length === 0) {
return {
Expand Down