@reckona/mreact-router 0.0.81 → 0.0.82
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 +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +64 -5
- package/dist/client.js.map +1 -1
- package/dist/server-action-inference.d.ts.map +1 -1
- package/dist/server-action-inference.js +37 -1
- package/dist/server-action-inference.js.map +1 -1
- package/package.json +11 -11
- package/src/client.ts +92 -4
- package/src/server-action-inference.ts +49 -0
package/README.md
CHANGED
|
@@ -109,6 +109,8 @@ client-only code. Navigation observers are available from
|
|
|
109
109
|
|
|
110
110
|
Route-owned client data loading is inferred when the page render path reaches `cell()` state or a same-module browser-only helper, even if the initial server HTML has no event handler. Use route-level `"use client";` as an escape hatch when the client work is hidden behind dynamic dispatch, a registry, or another pattern the static analyzer cannot follow; otherwise a page that only renders passive SSR output may remain server-only and no `/_mreact/client/routes/...` script is emitted.
|
|
111
111
|
|
|
112
|
+
Client boundary inference follows rendered app-local imports through direct JSX, JSX member roots, simple aliases, and barrel re-exports, including renamed specifiers such as `export { Counter as Widget } from "./Counter"`.
|
|
113
|
+
|
|
112
114
|
Inferred form actions are bound to the rendered form with a hidden token derived from the CSRF token and form nonce. Single-process deployments use an automatically generated process secret; multi-instance deployments should set the same `MREACT_SERVER_ACTION_SECRET` value on every instance so forms rendered by one instance can be submitted to another.
|
|
113
115
|
|
|
114
116
|
Plain `multipart/form-data` route handlers do not automatically run the server-action CSRF guard. For cookie-authenticated upload forms that post directly to `route.ts`, render a hidden field named `formCsrfFieldName`, set `formCsrfCookie(token)` for the same token, and either call `validateFormCsrf(request, formData)` for small buffered forms or read the CSRF field with `parseMultipartStream()` before consuming a large file part. `request.formData()` buffers multipart file parts in memory; `parseMultipartStream(request, { fields })` keeps file parts as `ReadableStream<Uint8Array>` values with per-part and total byte limits. Workers APIs such as R2 require known-length streams, so `part.fixedLengthStream(length).readable` is only valid when the multipart part carries a `Content-Length` header or the handler can pass the exact byte length; otherwise use a bounded `arrayBuffer()` fallback for R2. Put the CSRF field before the file field when you want early rejection without reading the file body.
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,EAML,KAAK,yBAAyB,EAE9B,KAAK,uBAAuB,EAG7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAKL,KAAK,qBAAqB,EAC3B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAIL,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,OAAO,KAAK,EAAU,YAAY,EAAE,MAAM,MAAM,CAAC;AAIjD,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACtD,sBAAsB,CAAC,EAAE,SAAS,qBAAqB,EAAE,GAAG,SAAS,CAAC;IACtE,uBAAuB,CAAC,EAAE,SAAS,uBAAuB,EAAE,GAAG,SAAS,CAAC;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;IAClD,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,uBAAuB,EAAE,GAAG,SAAS,CAAC;IAC/C,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAC;IAC3C,MAAM,EAAE,SAAS,gCAAgC,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,gCAAgC;IAC/C,KAAK,EAAE,uBAAuB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACtE,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACjE,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC5D,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;CACxE;AAED,UAAU,uBAAuB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAOD,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,8BAA8B,EAAE,CAAC;CAC/C;AAaD,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,0BAA2B,SAAQ,0BAA0B;IAC5E,sBAAsB,EAAE,qBAAqB,EAAE,CAAC;IAChD,uBAAuB,EAAE,uBAAuB,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EACA,OAAO,8CAA8C,GACrD,OAAO,+CAA+C,CAAC;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,QAAA,MAAM,8CAA8C,uDACE,CAAC;AACvD,QAAA,MAAM,+CAA+C,uDACC,CAAC;AAEvD,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,wBAAwB,CAAC,CAqBnC;AAED,wBAAgB,+BAA+B,IAAI,yBAAyB,CAQ3E;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;CACnD,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnB;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;CACnD,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAwDtC;AAgED,wBAAsB,4BAA4B,CAAC,OAAO,EAAE;IAC1D,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;CACnD,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAsKtC;AAuDD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMzD;AA0TD,wBAAsB,8BAA8B,CAAC,OAAO,EAAE;IAC5D,KAAK,EAAE,yBAAyB,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgBjC;AA2KD,wBAAgB,oCAAoC,CAClD,UAAU,EAAE,8BAA8B,GACzC,MAAM,CAER;AAmRD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUnD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,uBAAuB,CAAC,EAAE,SAAS,uBAAuB,EAAE,GAAG,SAAS,CAAC;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,GAAG,MAAM,CAUT;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAIrF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,uBAAuB,CAAC,EAAE,SAAS,uBAAuB,EAAE,GAAG,SAAS,CAAC;IACzE,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAwBrC;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACtD,sBAAsB,CAAC,EAAE,SAAS,qBAAqB,EAAE,GAAG,SAAS,CAAC;IACtE,uBAAuB,CAAC,EAAE,SAAS,uBAAuB,EAAE,GAAG,SAAS,CAAC;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;CACnD,GAAG,OAAO,CAAC,MAAM,CAAC,CAElB;AAED,wBAAsB,4BAA4B,CAChD,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CASzC;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBzC;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,MAAM,EAAE,SAAS,6BAA6B,EAAE,CAAC;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,SAAS,YAAY,EAAE,GAAG,SAAS,CAAC;CACnD,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAoDvC;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAmjD3B;AAgLD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAKlE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAKnE"}
|
package/dist/client.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { readFile, stat } from "node:fs/promises";
|
|
3
3
|
import { builtinModules } from "node:module";
|
|
4
4
|
import { dirname, extname, join, relative, sep } from "node:path";
|
|
5
|
-
import { collectClientRouteModuleAnalysis, formatDiagnostic, } from "@reckona/mreact-compiler";
|
|
5
|
+
import { analyzeBoundaryGraph, collectClientRouteModuleAnalysis, formatDiagnostic, } from "@reckona/mreact-compiler";
|
|
6
6
|
import { collectClientRouteModuleAnalysisFromContext, createCompilerModuleContext, stripTypeScriptWithOxc, transformCompilerModuleContext, } from "@reckona/mreact-compiler/internal";
|
|
7
7
|
import { assetPath } from "./assets.js";
|
|
8
8
|
import { bundleRouterModule, bundleRouterModules, } from "./bundle-pipeline.js";
|
|
@@ -65,8 +65,16 @@ export async function inferClientRouteModule(options) {
|
|
|
65
65
|
seen: new Set(),
|
|
66
66
|
sourceTransform,
|
|
67
67
|
});
|
|
68
|
+
const mergedRouteInference = routeInference.boundaryGraphFallbackRequired
|
|
69
|
+
? mergeClientRouteInference(routeInference, await inferClientRouteModuleBoundaryGraph({
|
|
70
|
+
cache,
|
|
71
|
+
code,
|
|
72
|
+
filename: options.filename,
|
|
73
|
+
sourceTransform,
|
|
74
|
+
}))
|
|
75
|
+
: routeInference;
|
|
68
76
|
if (options.appDir === undefined) {
|
|
69
|
-
return
|
|
77
|
+
return mergedRouteInference;
|
|
70
78
|
}
|
|
71
79
|
const shellInferences = await inferClientRouteShellModules({
|
|
72
80
|
appDir: options.appDir,
|
|
@@ -75,10 +83,10 @@ export async function inferClientRouteModule(options) {
|
|
|
75
83
|
sourceTransform,
|
|
76
84
|
});
|
|
77
85
|
return {
|
|
78
|
-
client:
|
|
79
|
-
clientBoundaryImports:
|
|
86
|
+
client: mergedRouteInference.client || shellInferences.some((inference) => inference.client),
|
|
87
|
+
clientBoundaryImports: mergedRouteInference.clientBoundaryImports,
|
|
80
88
|
diagnostics: [
|
|
81
|
-
...
|
|
89
|
+
...mergedRouteInference.diagnostics,
|
|
82
90
|
...shellInferences.flatMap((inference) => inference.diagnostics),
|
|
83
91
|
],
|
|
84
92
|
};
|
|
@@ -87,6 +95,46 @@ export async function inferClientRouteModule(options) {
|
|
|
87
95
|
throw new Error(`Failed to infer client route for ${options.routePath ?? "<unknown>"} (${options.filename}).\n${errorMessage(error)}`, { cause: error });
|
|
88
96
|
}
|
|
89
97
|
}
|
|
98
|
+
async function inferClientRouteModuleBoundaryGraph(options) {
|
|
99
|
+
const graph = await analyzeBoundaryGraph({
|
|
100
|
+
entries: [{ file: options.filename, kind: "route-page" }],
|
|
101
|
+
readModule: async (file) => {
|
|
102
|
+
if (file === options.filename) {
|
|
103
|
+
return options.code;
|
|
104
|
+
}
|
|
105
|
+
return await readClientRouteSource({
|
|
106
|
+
cache: options.cache,
|
|
107
|
+
filename: file,
|
|
108
|
+
sourceTransform: options.sourceTransform,
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
resolveModule: async ({ importer, source }) => await resolveAppLocalModule({
|
|
112
|
+
allowExplicitNonSource: options.sourceTransform !== undefined,
|
|
113
|
+
cache: options.cache,
|
|
114
|
+
importer,
|
|
115
|
+
specifier: source,
|
|
116
|
+
}),
|
|
117
|
+
});
|
|
118
|
+
return clientRouteInferenceFromBoundaryGraph(graph, options.filename);
|
|
119
|
+
}
|
|
120
|
+
function clientRouteInferenceFromBoundaryGraph(graph, filename) {
|
|
121
|
+
const clientBoundaryImports = graph.clientBoundaries
|
|
122
|
+
.filter((boundary) => boundary.importerFile === filename)
|
|
123
|
+
.map((boundary) => boundary.source);
|
|
124
|
+
const clientRoute = graph.modules.some((module) => module.file === filename && module.classification === "client-route");
|
|
125
|
+
return {
|
|
126
|
+
client: clientRoute || clientBoundaryImports.length > 0,
|
|
127
|
+
clientBoundaryImports,
|
|
128
|
+
diagnostics: [],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function mergeClientRouteInference(left, right) {
|
|
132
|
+
return {
|
|
133
|
+
client: left.client || right.client,
|
|
134
|
+
clientBoundaryImports: Array.from(new Set([...left.clientBoundaryImports, ...right.clientBoundaryImports])),
|
|
135
|
+
diagnostics: [...left.diagnostics, ...right.diagnostics],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
90
138
|
export async function collectClientRouteReferences(options) {
|
|
91
139
|
const cache = options.cache ?? createClientRouteInferenceCache();
|
|
92
140
|
const sourceTransform = clientRouteSourceTransformForVitePlugins(options.vitePlugins);
|
|
@@ -300,6 +348,7 @@ async function inferClientRouteModuleSource(options) {
|
|
|
300
348
|
const nestedClientExportNames = new Set();
|
|
301
349
|
const clientReferenceSourceFiles = [];
|
|
302
350
|
const diagnostics = [];
|
|
351
|
+
let boundaryGraphFallbackRequired = false;
|
|
303
352
|
let clientProxy = false;
|
|
304
353
|
let nestedClient = false;
|
|
305
354
|
const exportInfo = analysis.topLevelExportRenderInfo;
|
|
@@ -361,6 +410,9 @@ async function inferClientRouteModuleSource(options) {
|
|
|
361
410
|
});
|
|
362
411
|
diagnostics.push(...imported.diagnostics);
|
|
363
412
|
if (!imported.client) {
|
|
413
|
+
if (rendered && imported.boundaryGraphFallbackCandidate) {
|
|
414
|
+
boundaryGraphFallbackRequired = true;
|
|
415
|
+
}
|
|
364
416
|
if (imported.serverOnlyClientRuntime && rendered) {
|
|
365
417
|
diagnostics.push(serverOnlyClientImportReferenceDiagnostic({
|
|
366
418
|
filename: options.filename,
|
|
@@ -447,9 +499,14 @@ async function inferClientRouteModuleSource(options) {
|
|
|
447
499
|
nestedClient = true;
|
|
448
500
|
clientReferenceSourceFiles.push(resolved);
|
|
449
501
|
}
|
|
502
|
+
else if (exported.boundaryGraphFallbackCandidate) {
|
|
503
|
+
boundaryGraphFallbackRequired = true;
|
|
504
|
+
}
|
|
450
505
|
}
|
|
451
506
|
}
|
|
452
507
|
return {
|
|
508
|
+
boundaryGraphFallbackCandidate: analysis.staticExports.length > 0 || boundaryGraphFallbackRequired,
|
|
509
|
+
boundaryGraphFallbackRequired,
|
|
453
510
|
client: clientBoundaryImports.length > 0 ||
|
|
454
511
|
clientBoundaryExportNames.size > 0 ||
|
|
455
512
|
implicitModuleClient ||
|
|
@@ -471,6 +528,8 @@ async function inferClientRouteModuleSource(options) {
|
|
|
471
528
|
}
|
|
472
529
|
function emptyClientRouteModuleInferenceResult(overrides = {}) {
|
|
473
530
|
return {
|
|
531
|
+
boundaryGraphFallbackCandidate: false,
|
|
532
|
+
boundaryGraphFallbackRequired: false,
|
|
474
533
|
client: false,
|
|
475
534
|
clientBoundaryImports: [],
|
|
476
535
|
clientBoundaryExportNames: [],
|