Skip to content
This repository has been archived by the owner on Feb 2, 2021. It is now read-only.

Commit

Permalink
added query and findOnly to static build CLOSES #38
Browse files Browse the repository at this point in the history
  • Loading branch information
alidcast committed Aug 4, 2017
1 parent 3b13240 commit e206106
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 42 deletions.
14 changes: 7 additions & 7 deletions lib/content/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export default function createRouter (options) {
if (!options.content['/']) {
router.use("/", new Router().get('/', (req, res) => {
response(res).json({
'content-endpoints': Object.keys(options.content)
'content-endpoints': Object.keys(options.content)
})
}))
}
Expand All @@ -36,17 +36,17 @@ function curryResponseHandler (endpoint, options) {
return function sendContent (req, res) {
const send = response(res)
const permalink = req.params['0']
const [_, query] = req.url.match(/\?(.*)/) || []
const { only, between, ...params } = parse(query)
const [_, queryStr] = req.url.match(/\?(.*)/) || []
const { only, between, ...query } = parse(queryStr)

logRequest(permalink, api.serverPrefix, api.baseURL)

if (permalink === '/') { // request multiple pages from directory
if (between) send.json(db.findBetween(between, params))
else if (only) send.json(db.findOnly(only, params))
else send.json(db.findAll(params))
if (between) send.json(db.findBetween(between, query))
else if (only) send.json(db.findOnly(only, query))
else send.json(db.findAll(query))
} else { // request single page
if (db.exists(permalink)) send.json(db.find(permalink, params))
if (db.exists(permalink)) send.json(db.find(permalink, query))
else send.notFound()
}
}
Expand Down
58 changes: 38 additions & 20 deletions lib/content/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,42 +28,60 @@ const asset = (object) => { // webpack asset
export default function buildContent ({ nuxt, options }) {
const { sitePath, srcDir, content } = options

let routeData = []
let dynamicRoutePaths = new Map()
let assetMap = new Map()
let routePages = [] // dynamic pages to create
let routePaths = new Map() // paths to reconfigure
let assetMap = new Map() // browser assets to generate

Object.keys(content).forEach(dirName => {
const dirOpts = content[dirName]
const { page, generate, permalink } = content[dirName]
const contentPath = join(sitePath, srcDir)

if (!dirOpts.routes) return
const { findAll, query } = createDatabase(contentPath, dirName, options)
if (!generate) return

dirOpts.routes.forEach(route => {
if (!route.path || !route.method) throw new Error('Routes must have a path and a method')
const name = routeName(route.path)
switch (route.method) {
const db = createDatabase(contentPath, dirName, options)

generate.forEach(reqType => {
const req = {}
if (typeof reqType === 'string') {
req['method'] = reqType
} else if (Array.isArray(reqType)) {
const [reqMethod, reqOptions] = reqType
req['method'] = reqMethod
req['query'] = reqOptions.query ? reqOptions.query : {}
req['args'] = reqOptions.args ? reqOptions.args : []
}

switch (req['method']) {
case 'get':
if (!page) throw new Error('You must specify a page path')
const name = routeName(page)
const pathPrefix = getPrefix(name)
dynamicRoutePaths.set(name, dirOpts.permalink.replace(/^\//, ''))
findAll().forEach((page) => {
routeData.push({ route: join(pathPrefix, page.permalink)/* , payload: page */ })
routePaths.set(name, permalink.replace(/^\//, ''))
db.findAll(req['query']).forEach((page) => {
routePages.push(join(pathPrefix, page.permalink))
assetMap.set(buildPath(page.permalink, dirName, options), page)
})
break
case 'getAll':
// routeData.push({ route: name, payload: findAll() })
assetMap.set(buildPath('_all', dirName, options), findAll())
assetMap.set(
buildPath('_all', dirName, options),
db.findAll(req['query'])
)
break
case 'getOnly':
assetMap.set(
buildPath('_only', dirName, options),
db.findOnly(req['args'], req['query'])
)
break
// case 'query':
// break
default:
throw new Error(`Generate route method "${route.method}" does not exist.`)
throw new Error(`The ${req['method']} is not supported for static builds.`)
}
})
})
interceptRoutes(nuxt, dynamicRoutePaths)
addRoutes(nuxt.options, routeData)

interceptRoutes(nuxt, routePaths)
addRoutes(nuxt.options, routePages)
addAssets(nuxt.options, assetMap)
}

Expand Down
22 changes: 11 additions & 11 deletions lib/content/database.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ export default function createDatabase (contentPath, dirName, options) {
return pagesMap.has(permalink)
},

find (permalink, params) {
return pagesMap.get(permalink).create(params)
find (permalink, query) {
return pagesMap.get(permalink).create(query)
},

findOnly(onlyArg, params) {
findOnly(onlyArg, query) {
if (typeof onlyArg === 'string') onlyArg = onlyArg.split(',')

const [startIndex, endIndex] = onlyArg
Expand All @@ -41,16 +41,16 @@ export default function createDatabase (contentPath, dirName, options) {
currIndex++
}

return pages.map(page => page.create(params))
return pages.map(page => page.create(query))
},

findBetween(betweenStr, params) {
findBetween(betweenStr, query) {
const { findOnly } = this
const [currPermalink, numStr1, numStr2] = betweenStr.split(',')

if (!pagesMap.has(currPermalink)) return []

const currPage = pagesMap.get(currPermalink).create(params)
const currPage = pagesMap.get(currPermalink).create(query)
const { index } = currPage.meta
const total = pagesArr.length -1

Expand All @@ -67,14 +67,14 @@ export default function createDatabase (contentPath, dirName, options) {
if (num2 === 0 || (!num2 && num1 === 0)) afterRange = []
else afterRange = [min(index + 1, total), min(index + (num2 || num1), total)]

const beforePages = findOnly(beforeRange, params)
const afterPages = findOnly(afterRange, params)
const beforePages = findOnly(beforeRange, query)
const afterPages = findOnly(afterRange, query)

return [...beforePages, currPage, ...afterPages]
},

findAll (params) {
return pagesArr.map(page => page.create(params))
findAll (query) {
return pagesArr.map(page => page.create(query))
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions lib/module.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ export default function ContentModule(moduleOpts) {
buildDir: `/content`,

content: contentOptions(userOptions.content, {
page: null,
permalink: ':slug',
anchorsLevel: 1,
isPost: true,
data: {},
routes: null
generate: []
}),

parsers: {
Expand Down
4 changes: 2 additions & 2 deletions lib/plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,13 @@ export default ({ app, isClient, isServer }) => {
return await fetchContent(contentDir, permalink, '?' + query)
},
async getBetween (permalink, num1or2, num2 = '') {
const endpoint = isAPI ? '/' : '_between' // TODO
const endpoint = isAPI ? '/' : '_between'
const betweenQuery = 'between=' + [permalink, num1or2, num2].join(',')
const fullQuery = '?' + betweenQuery + '&' + query
return await fetchContent(contentDir, endpoint, fullQuery)
},
async getOnly (startIndex, endIndex) {
const endpoint = isAPI ? '/' : '_only' // TODO
const endpoint = isAPI ? '/' : '_only'
const onlyQuery = 'only=' + [startIndex, endIndex].join(',')
const fullQuery = '?' + onlyQuery + '&' + query
return await fetchContent(contentDir, endpoint, fullQuery)
Expand Down

0 comments on commit e206106

Please sign in to comment.