This repository has been archived by the owner on Feb 8, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathroutes.js
executable file
·88 lines (69 loc) · 3.36 KB
/
routes.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
const fs = require('fs')
// read now.json file
const nowConfig = JSON.parse(fs.readFileSync('now.json', 'utf8'))
/*
|--------------------------------------------------------------------------
| Build routes object based on now.json routes
|--------------------------------------------------------------------------
| we only look at routes that have "headers": { "permalink": "true" } set
| neither Now nor Next does not require "permalink" in headers but its "our" way
| for destinguishing Now routes that corespond to WordPress routes.
| We convert each now route to { path: '/', page: '/', query: req => ({}) } object
| languages and post types are paresed based on definitions below
*/
// language definitions (without default language)
const languages = ['pl']
// post type definitions & their translations
const types = [
{ slug: 'news', type: 'post', trans: { pl: 'posty' }},
{ slug: 'employees', type: 'employee', trans: { pl: 'pracownicy' }}
]
// create routes on=bject
const routes = nowConfig.routes
.filter( ({ headers }) => headers && headers.permalink)
.map( ({ src, dest, headers, status, methods }) => {
// route rules based on now.json route "src" value
const rules = src.replace(/\^\//g, '^FS') // replace ^/ with ^FS (so we can corectly explode by / )
.split('/') // split by /
.filter(part => part) // skip empty values
.map(part => part.replace(/\^FS/g, '^/')) // replace ^FS back to ^/
// build request path that will be used by server
const path = rules.reduce((path, rule) => {
const queryVar = rule.match(/[a-z]+(?=>)/)
return path += queryVar ? ('/:' + queryVar) : ('/' + rule)
}, '')
// set page that will be used by Next to handle the request
const page = dest.split('?')[0]
// check what language we are dealing with
const lang = ~languages.indexOf(rules[0]) ? languages[languages.indexOf(rules[0])] : ''
// build query object
const queryObject = rules.reduce((q, rule, i) => {
const queryVar = rule.match(/[a-z]+(?=>)/)
// query param for preview
if(i === 0 && rule === '_preview') q.preview = true
//query param for language
if(!q.lang && lang) q.lang = lang
// query param for post type
if(!lang && i === 0) {
const matchedTypeObj = types.filter(obj => obj.slug === rule)[0]
if(matchedTypeObj) q.type = matchedTypeObj.type
}
if(lang && i === 1) {
const matchedTypeObj = types.filter(obj => obj.trans[lang] && obj.trans[lang] === rule)[0]
if(i === 1 && matchedTypeObj) q.type = matchedTypeObj.type
}
// query param for query var
if(queryVar) q[queryVar] = queryVar[0]
return q
}, {})//query: req => ({ lang: 'pl', slug: req.params.slug, parent: req.params.parent })
// query function
const query = req => {
return Object.keys(queryObject).reduce((params, key) => {
params[key] = req.params[queryObject[key]] || queryObject[key]
return params
}, {})
}
return { src, path, page, queryObject, query }
})
//console.log(routes)
module.exports = routes