UNPKG

prismic.io

Version:

JavaScript development kit for prismic.io

111 lines (92 loc) 2.41 kB
var Kind = { Dynamic: 'dynamic', Static: 'static' }; var Condition = { ID: 'withId', UID: 'withUid', Singleton: 'singleton' }; function toUrl(route, doc) { if(!route.fragments || route.fragments.length == 0) { return '/'; } else { return route.fragments.reduce(function (acc, f) { switch(f.kind) { case Kind.Dynamic: if (doc) return acc + '/' + getFragmentValue(f, doc); else return acc + '/:' + toKey(f.key); case Kind.Static: return acc + '/' + f.value; default: return acc; } }, ''); } } function getFragmentValue(fragment, doc) { var steps = fragment.key.split('.'); if (steps[0] == doc.type) { switch(steps[1]) { case 'uid': return doc.uid; case 'id': return doc.id; default: throw Error("Unsupported dynamic fragment: " + fragment); } } else { throw Error("Wrong doc type error: got " + doc.type + ", expected " + steps[0]); } } function toKey(dotty) { return dotty.split('.').join('_'); } function fetchData(req, res, fetchers) { return new Promise(function(resolve, reject) { var pData = fetchers.map(function(f) { return fetcherAction(f, req) .then(function(doc) { return { name: f.name, doc: doc }; }) .catch(function(err) { reject(err); }); }); Promise.all(pData).then(function(results) { var data = {}; results.forEach(function(result) { data[result.name] = result.doc; }); resolve(data); }); }); } function fetcherAction(f, req) { switch(f.condition.kind) { case Condition.ID: return req.prismic.api.getByID(f.mask, req.params[toKey(f.condition.key)]); case Condition.UID: return req.prismic.api.getByUID(f.mask, req.params[toKey(f.condition.key)]); case Condition.Singleton: return req.prismic.api.getSingle(f.mask); default: return Promise.reject(new Error("Unknown fetcher condition: " + f.condition.kind)); } } function makeLinkResolver(dynRoutes, linkResolver) { return function(doc) { var docRoute = dynRoutes.find(function(dr) { return dr.forMask === doc.type; }); if(docRoute) return toUrl(docRoute, doc); else return linkResolver(doc); }; } module.exports = { toUrl: toUrl, makeLinkResolver: makeLinkResolver, fetchData: fetchData };