@sls-next/core
Version:
Handles Next.js routing independent of provider
68 lines (63 loc) • 1.57 kB
text/typescript
import { normalise } from "./basepath";
import { dropLocaleFromPath } from "./locale";
import { matchDynamic } from "../match";
import { getRewritePath, isExternalRewrite } from "./rewrite";
import {
ApiManifest,
ApiRoute,
ExternalRoute,
RoutesManifest,
Request
} from "../types";
export const handleApiReq = (
req: Request,
uri: string,
manifest: ApiManifest,
routesManifest: RoutesManifest,
isRewrite?: boolean
): ExternalRoute | ApiRoute | undefined => {
const { apis } = manifest;
const { normalisedUri, missingExpectedBasePath } = normalise(
uri,
routesManifest
);
if (!missingExpectedBasePath) {
const nonDynamic = apis.nonDynamic[normalisedUri];
if (nonDynamic) {
return {
isApi: true,
page: nonDynamic
};
}
}
const rewrite = !isRewrite && getRewritePath(req, uri, routesManifest);
if (rewrite) {
// Rewrites include locales even for api routes
const apiRewrite = dropLocaleFromPath(rewrite, routesManifest);
const [path, querystring] = apiRewrite.split("?");
if (isExternalRewrite(path)) {
return {
isExternal: true,
path,
querystring
};
}
const route = handleApiReq(req, path, manifest, routesManifest, true);
if (route) {
return {
...route,
querystring
};
}
return route;
}
if (!missingExpectedBasePath) {
const dynamic = matchDynamic(normalisedUri, apis.dynamic);
if (dynamic) {
return {
isApi: true,
page: dynamic
};
}
}
};