Skip to content

Commit 0902435

Browse files
committed
Add in allRequests boolean on server
1 parent c3c4cfd commit 0902435

File tree

7 files changed

+81
-15
lines changed

7 files changed

+81
-15
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@elderjs/elderjs",
3-
"version": "1.7.1",
3+
"version": "1.7.2",
44
"main": "./build/index.js",
55
"types": "./build/index.d.ts",
66
"engineStrict": true,

src/routes/prepareRouter.ts

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import routeSort from 'route-sort';
33
import get from 'lodash.get';
44
import Page from '../utils/Page';
5-
import { RequestOptions } from '../utils/types';
5+
import { RequestOptions, ServerOptions } from '../utils/types';
66
import { RouteOptions } from './types';
77

88
export function extractDynamicRouteParams({ path, $$meta }) {
@@ -36,30 +36,48 @@ type Req = {
3636
search?: string;
3737
};
3838

39-
interface IFindPrebuildRequest {
39+
interface IGetSpecialRequest {
4040
req: Req;
4141
serverLookupObject: any;
42-
dataRoutes: boolean | string;
42+
server: ServerOptions;
4343
}
4444

45-
export const getDataRequest = ({ req, server, serverLookupObject }) => {
45+
export const getSpecialRequest = ({ req, server, serverLookupObject }: IGetSpecialRequest) => {
4646
// check data routes
4747
let request;
48+
let type;
4849
if (server.dataRoutes) {
4950
const dataSuffix = typeof server.dataRoutes === 'string' ? server.dataRoutes : 'data.json';
5051
if (req.path.endsWith(dataSuffix)) {
5152
const lookup = req.path.replace(dataSuffix, '');
5253
request = serverLookupObject[lookup];
54+
type = 'data';
55+
}
56+
}
57+
58+
if (server.allRequestsRoute) {
59+
const dataSuffix = typeof server.allRequestsRoute === 'string' ? server.allRequestsRoute : '/allRequests.json';
60+
if (req.path === dataSuffix) {
61+
// just needs any request.
62+
const k1 = Object.keys(serverLookupObject)[0];
63+
request = serverLookupObject[k1];
64+
type = 'allRequests';
5365
}
5466
}
5567

5668
if (request) {
69+
request = JSON.parse(JSON.stringify(request));
5770
request.req = req;
5871
}
5972

60-
return request;
73+
return { request, type };
6174
};
6275

76+
interface IFindPrebuildRequest {
77+
req: Req;
78+
serverLookupObject: any;
79+
}
80+
6381
export const findPrebuiltRequest = ({ req, serverLookupObject }: IFindPrebuildRequest): RequestOptions | false => {
6482
// see if we have a request object with the path as is. (could include / or not.)
6583
let request = serverLookupObject[req.path] ? serverLookupObject[req.path] : false;
@@ -72,6 +90,7 @@ export const findPrebuiltRequest = ({ req, serverLookupObject }: IFindPrebuildRe
7290
}
7391

7492
if (request) {
93+
request = JSON.parse(JSON.stringify(request));
7594
request.req = req;
7695
}
7796

@@ -148,18 +167,24 @@ function prepareRouter(Elder) {
148167
shortcodes: elder.shortcodes,
149168
};
150169

151-
async function handleRequest({ res, next, request, dynamic = false, dataRequest = false }) {
170+
async function handleRequest({ res, next, request, dynamic = false, type = '' }) {
152171
if (!request.route || typeof request.route !== 'string') return next();
153172
if (!routes[request.route]) return next();
154173
const page = new Page({ ...forPage, request, next: dynamic ? next : undefined, route: routes[request.route] });
155-
const { htmlString: html, data } = await page.build();
174+
const { htmlString: html, data, allRequests } = await page.build();
156175

157-
if (dataRequest && data) {
176+
if (type === 'data' && data) {
158177
res.setHeader('Content-Type', 'application/json');
159178
res.end(JSON.stringify(data));
160179
return undefined;
161180
}
162181

182+
if (type === 'allRequests' && allRequests) {
183+
res.setHeader('Content-Type', 'application/json');
184+
res.end(JSON.stringify(allRequests));
185+
return undefined;
186+
}
187+
163188
if (html && !res.headerSent && !res.headersSent) {
164189
// note: html will be undefined if a dynamic route calls skip() as it aborts page building.
165190
res.setHeader('Content-Type', 'text/html');
@@ -178,14 +203,17 @@ function prepareRouter(Elder) {
178203
// initial request may be well formed if it is modified via a hook BEFORE the router runs.
179204
if (initialRequestIsWellFormed(initialRequest)) return handleRequest({ res, next, request: initialRequest });
180205
if (!needsElderRequest({ req, prefix })) return next();
181-
const dataRequest = getDataRequest({ req, server: settings.server, serverLookupObject });
182-
if (dataRequest) {
183-
return handleRequest({ res, next, request: { ...dataRequest, ...initialRequest }, dataRequest: true });
206+
const { request: specialRequest, type } = getSpecialRequest({
207+
req,
208+
server: settings.server,
209+
serverLookupObject,
210+
});
211+
if (specialRequest) {
212+
return handleRequest({ res, next, request: { ...specialRequest, ...initialRequest }, type });
184213
}
185214
const request = findPrebuiltRequest({
186215
req,
187216
serverLookupObject,
188-
dataRoutes: settings && settings.server && settings.server.dataRoutes,
189217
});
190218
if (request) return handleRequest({ res, next, request: { ...request, ...initialRequest } });
191219
const dynamicRequest = requestFromDynamicRoute({ req, dynamicRoutes, requestCache });

src/utils/__tests__/__snapshots__/validations.spec.ts.snap

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,7 @@ Object {
789789
"_exclusive": Object {},
790790
"_mutate": undefined,
791791
"_nodes": Array [
792+
"allRequestsRoute",
792793
"dataRoutes",
793794
"cacheRequests",
794795
"prefix",
@@ -804,6 +805,33 @@ Object {
804805
"refs": Map {},
805806
},
806807
"fields": Object {
808+
"allRequestsRoute": Object {
809+
"_blacklist": Object {
810+
"list": Set {},
811+
"refs": Map {},
812+
},
813+
"_conditions": Array [],
814+
"_default": false,
815+
"_deps": Array [],
816+
"_exclusive": Object {},
817+
"_label": "Experimental: Allows for getting a json response of the all requests object by hitting a url. Defaults to /allRequests.json if \\"true\\" but can be overridden with any string.",
818+
"_mutate": undefined,
819+
"_options": Object {
820+
"abortEarly": true,
821+
"recursive": true,
822+
},
823+
"_type": "boolean",
824+
"_typeError": [Function],
825+
"_whitelist": Object {
826+
"list": Set {},
827+
"refs": Map {},
828+
},
829+
"tests": Array [],
830+
"transforms": Array [
831+
[Function],
832+
],
833+
"type": "boolean",
834+
},
807835
"cacheRequests": Object {
808836
"_blacklist": Object {
809837
"list": Set {},

src/utils/__tests__/validations.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ describe('#validations', () => {
5656
prefix: '',
5757
cacheRequests: true,
5858
dataRoutes: false,
59+
allRequestsRoute: false,
5960
},
6061
shortcodes: {
6162
closePattern: '}}',

src/utils/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ import type { HookOptions } from '../hooks/types';
33
import type { ShortcodeDefs } from '../shortcodes/types';
44
import Page from './Page';
55

6-
type ServerOptions = {
6+
export type ServerOptions = {
77
prefix: string;
88
cacheRequests?: boolean;
9+
dataRoutes?: boolean | string;
10+
allRequestsRoute?: boolean | string;
911
};
1012

1113
type BuildOptions = {

src/utils/validations.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ const configSchema = yup.object({
112112
.label(
113113
'Experimental: Allows for getting a json response of the data object of a url. Defaults to [path]/data.json but can be any suffix/filename after the route.',
114114
),
115+
allRequestsRoute: yup
116+
.boolean()
117+
.notRequired()
118+
.default(false)
119+
.label(
120+
'Experimental: Allows for getting a json response of the all requests object by hitting a url. Defaults to /allRequests.json if "true" but can be overridden with any string.',
121+
),
115122
}),
116123
prefix: yup
117124
.string()

0 commit comments

Comments
 (0)