@@ -10,53 +10,73 @@ const asyncMiddleware = fn =>
1010 }
1111
1212module . exports = function ( app ) {
13+ // *** Development tools ***
14+ app . use ( require ( 'morgan' ) ( 'dev' , { skip : ( req , res ) => ! isDevelopment } ) )
15+ if ( isDevelopment ) app . use ( require ( './webpack' ) )
16+
17+ // *** Early exits ***
1318 // Don't use the proxy's IP, use the requester's for rate limiting
1419 // See https://expressjs.com/en/guide/behind-proxies.html
1520 app . set ( 'trust proxy' , 1 )
16- app . use ( require ( 'morgan' ) ( 'dev' , { skip : ( req , res ) => ! isDevelopment } ) )
1721 app . use ( require ( './rate-limit' ) )
18- if ( isDevelopment ) app . use ( require ( './webpack' ) )
19- app . use ( require ( './cookie-parser' ) )
20- app . use ( require ( './req-utils' ) )
21- app . use ( require ( './record-redirect' ) )
22- app . use ( require ( './redirects/external' ) )
23- app . use ( require ( './redirects/help-to-docs' ) )
24- app . use ( require ( './set-fastly-cache-headers' ) )
2522 app . use ( require ( './handle-invalid-paths' ) )
26- app . use ( require ( './loaderio-verification' ) )
23+
24+ // *** Security ***
2725 app . use ( require ( './cors' ) )
28- app . use ( require ( './csp' ) )
26+ app . use ( require ( './csp' ) ) // Must come before helmet
2927 app . use ( require ( 'helmet' ) ( ) )
30- app . use ( require ( './robots ' ) )
31- app . use ( express . json ( ) ) // Must come before ./ csrf
28+ app . use ( require ( './cookie-parser ' ) ) // Must come before csrf
29+ app . use ( express . json ( ) ) // Must come before csrf
3230 app . use ( require ( './csrf' ) )
33- app . use ( require ( './handle-csrf-errors' ) )
31+ app . use ( require ( './handle-csrf-errors' ) ) // Must come before regular handle-errors
32+
33+ // *** Headers ***
3434 app . use ( require ( 'compression' ) ( ) )
35+ app . use ( require ( './set-fastly-cache-headers' ) )
36+ app . use ( require ( './disable-caching-on-safari' ) )
37+
38+ // *** Config and context for redirects ***
39+ app . use ( require ( './req-utils' ) ) // Must come before record-redirect and events
40+ app . use ( require ( './record-redirect' ) )
41+ app . use ( require ( './detect-language' ) ) // Must come before context, breadcrumbs, find-page, handle-errors, homepages
42+ app . use ( asyncMiddleware ( require ( './context' ) ) ) // Must come before early-access-*, handle-redirects
43+
44+ // *** Redirects, 3xx responses ***
45+ // I ordered these by use frequency
3546 app . use ( require ( 'connect-slashes' ) ( false ) )
47+ app . use ( require ( './redirects/external' ) )
48+ app . use ( require ( './redirects/help-to-docs' ) )
49+ app . use ( require ( './redirects/language-code-redirects' ) ) // Must come before contextualizers
50+ app . use ( require ( './redirects/handle-redirects' ) ) // Must come before contextualizers
51+
52+ // *** Config and context for rendering ***
53+ app . use ( require ( './find-page' ) ) // Must come before archived-enterprise-versions, breadcrumbs, featured-links, products, render-page
54+
55+ // *** Rendering, 2xx responses ***
56+ // I largely ordered these by use frequency
57+ app . use ( require ( './archived-enterprise-versions-assets' ) ) // Must come before static/assets
3658 app . use ( '/dist' , express . static ( 'dist' ) )
59+ app . use ( '/assets' , express . static ( 'assets' ) )
60+ app . use ( '/public' , express . static ( 'data/graphql' ) )
3761 app . use ( '/events' , require ( './events' ) )
38- app . use ( require ( './categories-for-support-team' ) )
39- app . use ( require ( './detect-language' ) )
40- app . use ( asyncMiddleware ( require ( './context' ) ) )
4162 app . use ( '/csrf' , require ( './csrf-route' ) )
63+ app . use ( require ( './archived-enterprise-versions' ) )
64+ app . use ( require ( './robots' ) )
4265 app . use ( require ( './early-access-paths' ) )
4366 app . use ( require ( './early-access-proxy' ) )
44- app . use ( require ( './find-page' ) )
45- app . use ( require ( './archived-enterprise-versions' ) )
46- app . use ( require ( './archived-enterprise-versions-assets' ) )
47- app . use ( '/assets' , express . static ( 'assets' ) )
48- app . use ( '/public' , express . static ( 'data/graphql' ) )
49- app . use ( require ( './redirects/language-code-redirects' ) )
50- // redirects need to be handled before the contextualizers
51- app . use ( require ( './redirects/handle-redirects' ) )
67+ app . use ( require ( './categories-for-support-team' ) )
68+ app . use ( require ( './loaderio-verification' ) )
69+ app . get ( '/_500' , asyncMiddleware ( require ( './trigger-error' ) ) )
70+
71+ // *** Preparation for render-page ***
5272 app . use ( require ( './contextualizers/graphql' ) )
5373 app . use ( require ( './contextualizers/rest' ) )
5474 app . use ( require ( './contextualizers/webhooks' ) )
55- app . use ( require ( './disable-caching-on-safari' ) )
56- app . get ( '/_500' , asyncMiddleware ( require ( './trigger-error' ) ) )
5775 app . use ( require ( './breadcrumbs' ) )
5876 app . use ( require ( './dev-toc' ) )
5977 app . use ( require ( './featured-links' ) )
78+
79+ // *** Rendering, must go last ***
6080 app . get ( '/*' , asyncMiddleware ( require ( './render-page' ) ) )
6181 app . use ( require ( './handle-errors' ) )
6282}
0 commit comments