@reckona/mreact-router 0.0.51 → 0.0.53
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 +5 -5
- package/dist/actions.d.ts +1 -6
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +6 -98
- package/dist/actions.js.map +1 -1
- package/dist/adapters/cloudflare.d.ts +11 -2
- package/dist/adapters/cloudflare.d.ts.map +1 -1
- package/dist/adapters/cloudflare.js +205 -6
- package/dist/adapters/cloudflare.js.map +1 -1
- package/dist/build.d.ts +2 -0
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +79 -14
- package/dist/build.js.map +1 -1
- package/dist/bundle-pipeline.d.ts +2 -0
- package/dist/bundle-pipeline.d.ts.map +1 -1
- package/dist/bundle-pipeline.js +1 -0
- package/dist/bundle-pipeline.js.map +1 -1
- package/dist/cli.js +6 -5
- package/dist/cli.js.map +1 -1
- package/dist/csrf.d.ts +7 -0
- package/dist/csrf.d.ts.map +1 -0
- package/dist/csrf.js +104 -0
- package/dist/csrf.js.map +1 -0
- package/dist/file-conventions.d.ts.map +1 -1
- package/dist/file-conventions.js +16 -0
- package/dist/file-conventions.js.map +1 -1
- package/dist/import-policy.d.ts.map +1 -1
- package/dist/import-policy.js +2 -0
- package/dist/import-policy.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/module-runner.d.ts +2 -0
- package/dist/module-runner.d.ts.map +1 -1
- package/dist/module-runner.js +1 -0
- package/dist/module-runner.js.map +1 -1
- package/dist/multipart.d.ts +19 -0
- package/dist/multipart.d.ts.map +1 -0
- package/dist/multipart.js +362 -0
- package/dist/multipart.js.map +1 -0
- package/dist/native-route-matcher.d.ts.map +1 -1
- package/dist/native-route-matcher.js +14 -1
- package/dist/native-route-matcher.js.map +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +79 -8
- package/dist/render.js.map +1 -1
- package/dist/routes.d.ts +1 -1
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +58 -5
- package/dist/routes.js.map +1 -1
- package/dist/types.d.ts +10 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -11
|
@@ -30,11 +30,24 @@ export function createNativeRouteMatcher(sortedRoutes) {
|
|
|
30
30
|
? undefined
|
|
31
31
|
: {
|
|
32
32
|
route,
|
|
33
|
-
params: output.params,
|
|
33
|
+
params: normalizeNativeParams(route, output.params),
|
|
34
34
|
};
|
|
35
35
|
},
|
|
36
36
|
};
|
|
37
37
|
}
|
|
38
|
+
function normalizeNativeParams(route, params) {
|
|
39
|
+
const normalized = { ...params };
|
|
40
|
+
for (const segment of route.segments) {
|
|
41
|
+
if (segment.kind !== "catch-all") {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const value = normalized[segment.name];
|
|
45
|
+
if (typeof value === "string") {
|
|
46
|
+
normalized[segment.name] = value.split("/").filter((part) => part !== "");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return normalized;
|
|
50
|
+
}
|
|
38
51
|
export function shouldUseNativeRouteMatcher(routeCount, mode) {
|
|
39
52
|
if (mode === "1" || mode === "true") {
|
|
40
53
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-route-matcher.js","sourceRoot":"","sources":["../src/native-route-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAoBzC,IAAI,kBAAgE,CAAC;AACrE,MAAM,+BAA+B,GAAG,GAAG,CAAC;AAE5C,MAAM,UAAU,wBAAwB,CACtC,YAAiC;IAEjC,IACE,CAAC,2BAA2B,CAC1B,YAAY,CAAC,MAAM,EACnB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CACnD,EACD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,4BAA4B,EAAE,CAAC;IACpD,MAAM,kBAAkB,GAAG,YAAY,KAAK,KAAK;QAC/C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,YAAY,CAAC,kBAAkB,CAAC;IAEpC,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACvD,KAAK;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;IAErE,OAAO;QACL,KAAK,CAAC,QAAQ;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAE5C,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzC,OAAO,KAAK,KAAK,SAAS;gBACxB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC;oBACE,KAAK;oBACL,MAAM,EAAE,MAAM,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"native-route-matcher.js","sourceRoot":"","sources":["../src/native-route-matcher.ts"],"names":[],"mappings":"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"}
|
package/dist/render.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAWA,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAyB/B,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EACL,KAAK,4BAA4B,
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
|
package/dist/render.js
CHANGED
|
@@ -10,7 +10,8 @@ import { assetPath } from "./assets.js";
|
|
|
10
10
|
import { escapeHtmlAttribute, escapeHtmlText as escapeHtml, } from "@reckona/mreact-shared/html-escape";
|
|
11
11
|
import { matchRoute, scanAppRoutes } from "./routes.js";
|
|
12
12
|
import { appFileConventionContentType } from "./file-conventions.js";
|
|
13
|
-
import { dispatchServerActionRequest, prepareRouteServerActions,
|
|
13
|
+
import { dispatchServerActionRequest, prepareRouteServerActions, } from "./actions.js";
|
|
14
|
+
import { serverActionCookie } from "./csrf.js";
|
|
14
15
|
import { beginRouteCacheContext, cachedRouteResponse, cacheRouteResponse, routeCacheKey, routeCachePolicyFromSource, } from "./cache.js";
|
|
15
16
|
import { resolveRouterCacheLimit } from "./cache-config.js";
|
|
16
17
|
import { importAppRouterBuiltFileModule, importAppRouterFileModule, importAppRouterSourceModule, fileImportMetaUrlPlugin, } from "./module-runner.js";
|
|
@@ -1227,9 +1228,13 @@ async function dispatchMetadataRoute(options) {
|
|
|
1227
1228
|
const context = {
|
|
1228
1229
|
baseUrl: url.origin,
|
|
1229
1230
|
host: url.host,
|
|
1231
|
+
params: options.params,
|
|
1230
1232
|
request: options.request,
|
|
1231
1233
|
};
|
|
1232
1234
|
const value = await handler(context);
|
|
1235
|
+
if (value instanceof Response) {
|
|
1236
|
+
return value;
|
|
1237
|
+
}
|
|
1233
1238
|
if (options.route.convention === "robots") {
|
|
1234
1239
|
return textConventionResponse(serializeRobots(value));
|
|
1235
1240
|
}
|
|
@@ -1239,6 +1244,19 @@ async function dispatchMetadataRoute(options) {
|
|
|
1239
1244
|
if (options.route.convention === "manifest") {
|
|
1240
1245
|
return jsonConventionResponse(value);
|
|
1241
1246
|
}
|
|
1247
|
+
if (options.route.convention === "opengraph-image") {
|
|
1248
|
+
const body = value instanceof Uint8Array
|
|
1249
|
+
? value
|
|
1250
|
+
: new TextEncoder().encode(typeof value === "string" ? value : String(value));
|
|
1251
|
+
return bytesResponse(body, {
|
|
1252
|
+
headers: {
|
|
1253
|
+
"cache-control": "public, max-age=3600",
|
|
1254
|
+
"content-type": typeof value === "string" && value.trimStart().startsWith("<svg")
|
|
1255
|
+
? "image/svg+xml"
|
|
1256
|
+
: "application/octet-stream",
|
|
1257
|
+
},
|
|
1258
|
+
});
|
|
1259
|
+
}
|
|
1242
1260
|
return new Response("Invalid metadata route convention", { status: 500 });
|
|
1243
1261
|
}
|
|
1244
1262
|
async function loadServerRouteModule(options) {
|
|
@@ -2701,7 +2719,7 @@ async function loadComposedRouteMetadataUncached(options) {
|
|
|
2701
2719
|
}
|
|
2702
2720
|
return {
|
|
2703
2721
|
dynamic,
|
|
2704
|
-
metadata: applyFileConventionMetadata(mergeRouteMetadata(metadata), options.routes),
|
|
2722
|
+
metadata: applyFileConventionMetadata(mergeRouteMetadata(metadata), options.routes, options.filename, options.context.params),
|
|
2705
2723
|
};
|
|
2706
2724
|
}
|
|
2707
2725
|
function mergeRouteMetadata(metadata) {
|
|
@@ -2733,24 +2751,68 @@ function mergeRouteMetadata(metadata) {
|
|
|
2733
2751
|
return mergedMetadata;
|
|
2734
2752
|
}, {});
|
|
2735
2753
|
}
|
|
2736
|
-
function applyFileConventionMetadata(metadata, routes) {
|
|
2754
|
+
function applyFileConventionMetadata(metadata, routes, filename, params) {
|
|
2737
2755
|
const next = metadata === undefined ? {} : { ...metadata };
|
|
2738
2756
|
const iconRoute = routes.find((route) => route.kind === "asset" && route.convention === "icon");
|
|
2739
2757
|
const appleIconRoute = routes.find((route) => route.kind === "asset" && route.convention === "apple-icon");
|
|
2740
|
-
const
|
|
2758
|
+
const openGraphImagePath = fileConventionMetadataRoutePath(routes, filename, params, "opengraph-image");
|
|
2741
2759
|
if (iconRoute !== undefined && next.icons?.icon === undefined) {
|
|
2742
2760
|
next.icons = { ...next.icons, icon: iconRoute.path };
|
|
2743
2761
|
}
|
|
2744
2762
|
if (appleIconRoute !== undefined && next.icons?.apple === undefined) {
|
|
2745
2763
|
next.icons = { ...next.icons, apple: appleIconRoute.path };
|
|
2746
2764
|
}
|
|
2747
|
-
if (
|
|
2765
|
+
if (openGraphImagePath !== undefined &&
|
|
2748
2766
|
next.openGraph?.image === undefined &&
|
|
2749
2767
|
(next.openGraph?.images === undefined || next.openGraph.images.length === 0)) {
|
|
2750
|
-
next.openGraph = { ...next.openGraph, image:
|
|
2768
|
+
next.openGraph = { ...next.openGraph, image: openGraphImagePath };
|
|
2751
2769
|
}
|
|
2752
2770
|
return Object.keys(next).length === 0 ? undefined : next;
|
|
2753
2771
|
}
|
|
2772
|
+
function fileConventionMetadataRoutePath(routes, filename, params, convention) {
|
|
2773
|
+
const pageRoute = routes.find((route) => route.kind === "page" && route.file === filename);
|
|
2774
|
+
const candidateRoutes = routes.filter((route) => (route.kind === "asset" || route.kind === "metadata") &&
|
|
2775
|
+
route.convention === convention);
|
|
2776
|
+
if (pageRoute !== undefined) {
|
|
2777
|
+
const expectedPath = pageRoute.path === "/" ? `/${convention}` : `${pageRoute.path}/${convention}`;
|
|
2778
|
+
const routeLocal = candidateRoutes.find((route) => route.path === expectedPath);
|
|
2779
|
+
const routeLocalPath = routeLocal === undefined ? undefined : concreteRoutePath(routeLocal.path, params);
|
|
2780
|
+
if (routeLocalPath !== undefined) {
|
|
2781
|
+
return routeLocalPath;
|
|
2782
|
+
}
|
|
2783
|
+
}
|
|
2784
|
+
return candidateRoutes.find((route) => route.path === `/${convention}`)?.path;
|
|
2785
|
+
}
|
|
2786
|
+
function concreteRoutePath(path, params) {
|
|
2787
|
+
const segments = path === "/" ? [] : path.slice(1).split("/");
|
|
2788
|
+
const concrete = [];
|
|
2789
|
+
for (const segment of segments) {
|
|
2790
|
+
if (segment.startsWith(":...")) {
|
|
2791
|
+
const value = params[segment.slice(4)];
|
|
2792
|
+
const values = Array.isArray(value)
|
|
2793
|
+
? value
|
|
2794
|
+
: typeof value === "string"
|
|
2795
|
+
? value.split("/").filter((part) => part !== "")
|
|
2796
|
+
: undefined;
|
|
2797
|
+
if (values === undefined) {
|
|
2798
|
+
return undefined;
|
|
2799
|
+
}
|
|
2800
|
+
concrete.push(...values.map((part) => encodeURIComponent(part)));
|
|
2801
|
+
continue;
|
|
2802
|
+
}
|
|
2803
|
+
if (segment.startsWith(":")) {
|
|
2804
|
+
const value = params[segment.slice(1)];
|
|
2805
|
+
const stringValue = Array.isArray(value) ? value[0] : value;
|
|
2806
|
+
if (typeof stringValue !== "string") {
|
|
2807
|
+
return undefined;
|
|
2808
|
+
}
|
|
2809
|
+
concrete.push(encodeURIComponent(stringValue));
|
|
2810
|
+
continue;
|
|
2811
|
+
}
|
|
2812
|
+
concrete.push(segment);
|
|
2813
|
+
}
|
|
2814
|
+
return `/${concrete.join("/")}`;
|
|
2815
|
+
}
|
|
2754
2816
|
function mergeObject(left, right) {
|
|
2755
2817
|
if (left === undefined) {
|
|
2756
2818
|
return right;
|
|
@@ -3125,9 +3187,18 @@ function isMetadataScalar(value) {
|
|
|
3125
3187
|
}
|
|
3126
3188
|
function openGraphImages(openGraph) {
|
|
3127
3189
|
if (openGraph?.images !== undefined) {
|
|
3128
|
-
return openGraph.images.map((image, index) =>
|
|
3190
|
+
return openGraph.images.map((image, index) => metadataImageUrl(image, `openGraph.images.${index}`));
|
|
3191
|
+
}
|
|
3192
|
+
return openGraph?.image === undefined ? [] : [metadataImageUrl(openGraph.image, "openGraph.image")];
|
|
3193
|
+
}
|
|
3194
|
+
function metadataImageUrl(value, path) {
|
|
3195
|
+
if (isMetadataScalar(value)) {
|
|
3196
|
+
return metadataString(value, path);
|
|
3197
|
+
}
|
|
3198
|
+
if (typeof value === "object" && value !== null && "url" in value) {
|
|
3199
|
+
return metadataString(value.url, `${path}.url`);
|
|
3129
3200
|
}
|
|
3130
|
-
|
|
3201
|
+
throw new Error(`Invalid metadata field ${path}: expected string, number, boolean, or object with url.`);
|
|
3131
3202
|
}
|
|
3132
3203
|
function robotsContent(robots) {
|
|
3133
3204
|
if (typeof robots === "string") {
|