Skip to content

Commit 0445779

Browse files
committed
refactor: replace promises with async/await
BREAKING CHANGE: Some functions that used to throw synchronously for things like bad parameters now reject the promise. In many cases users may not have to do anything assuming the calls already happened within a promise chain, but in rare cases this may need some refactoring of error handling cases.
1 parent d70de1f commit 0445779

9 files changed

+633
-671
lines changed

lib/create-contentful-api.js

+85-58
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,17 @@ export default function createContentfulApi ({ http, getGlobalOptions }) {
105105
* accessToken: '<content_delivery_api_key>'
106106
* })
107107
* // returns the space object with the above <space-id>
108-
* client.getSpace()
109-
* .then((space) => console.log(space))
110-
* .catch(console.error)
108+
* const space = await client.getSpace()
109+
* console.log(space)
111110
*/
112-
function getSpace () {
111+
async function getSpace () {
113112
switchToSpace(http)
114-
return http.get('')
115-
.then((response) => wrapSpace(response.data), errorHandler)
113+
try {
114+
const response = await http.get('')
115+
return wrapSpace(response.data)
116+
} catch (error) {
117+
errorHandler(error)
118+
}
116119
}
117120

118121
/**
@@ -128,14 +131,18 @@ export default function createContentfulApi ({ http, getGlobalOptions }) {
128131
* accessToken: '<content_delivery_api_key>'
129132
* })
130133
*
131-
* client.getContentType('<content_type_id>')
132-
* .then((contentType) => console.log(contentType))
133-
* .catch(console.error)
134+
* const contentType = await client.getContentType('<content_type_id>')
135+
* console.log(contentType)
134136
*/
135-
function getContentType (id) {
137+
async function getContentType (id) {
136138
switchToEnvironment(http)
137-
return http.get('content_types/' + id)
138-
.then((response) => wrapContentType(response.data), errorHandler)
139+
140+
try {
141+
const response = await http.get(`content_types/${id}`)
142+
return wrapContentType(response.data)
143+
} catch (error) {
144+
errorHandler(error)
145+
}
139146
}
140147

141148
/**
@@ -151,14 +158,17 @@ export default function createContentfulApi ({ http, getGlobalOptions }) {
151158
* accessToken: '<content_delivery_api_key>'
152159
* })
153160
*
154-
* client.getContentTypes()
155-
* .then((response) => console.log(response.items))
156-
* .catch(console.error)
161+
* const response = await client.getContentTypes()
162+
* console.log(response.items)
157163
*/
158-
function getContentTypes (query = {}) {
164+
async function getContentTypes (query = {}) {
159165
switchToEnvironment(http)
160-
return http.get('content_types', createRequestConfig({ query: query }))
161-
.then((response) => wrapContentTypeCollection(response.data), errorHandler)
166+
try {
167+
const response = await http.get('content_types', createRequestConfig({ query: query }))
168+
return wrapContentTypeCollection(response.data)
169+
} catch (error) {
170+
errorHandler(error)
171+
}
162172
}
163173

164174
/**
@@ -175,22 +185,24 @@ export default function createContentfulApi ({ http, getGlobalOptions }) {
175185
* accessToken: '<content_delivery_api_key>'
176186
* })
177187
*
178-
* client.getEntry('<entry_id>')
179-
* .then((entry) => console.log(entry))
180-
* .catch(console.error)
188+
* const entry = await client.getEntry('<entry_id>')
189+
* console.log(entry)
181190
*/
182-
function getEntry (id, query = {}) {
191+
async function getEntry (id, query = {}) {
183192
if (!id) {
184-
return Promise.reject(notFoundError(id))
193+
throw notFoundError(id)
185194
}
186195

187-
return this.getEntries({ 'sys.id': id, ...query })
188-
.then((response) => {
189-
if (response.items.length > 0) {
190-
return wrapEntry(response.items[0])
191-
}
196+
try {
197+
const response = await this.getEntries({ 'sys.id': id, ...query })
198+
if (response.items.length > 0) {
199+
return wrapEntry(response.items[0])
200+
} else {
192201
throw notFoundError(id)
193-
}, errorHandler)
202+
}
203+
} catch (error) {
204+
errorHandler(error)
205+
}
194206
}
195207

196208
/**
@@ -206,16 +218,20 @@ export default function createContentfulApi ({ http, getGlobalOptions }) {
206218
* accessToken: '<content_delivery_api_key>'
207219
* })
208220
*
209-
* client.getEntries()
210-
* .then((response) => console.log(response.items))
211-
* .catch(console.error)
221+
* const response = await client.getEntries()
222+
* .console.log(response.items)
212223
*/
213-
function getEntries (query = {}) {
224+
async function getEntries (query = {}) {
214225
switchToEnvironment(http)
215226
const { resolveLinks, removeUnresolved } = getGlobalOptions(query)
216227
normalizeSelect(query)
217-
return http.get('entries', createRequestConfig({ query: query }))
218-
.then((response) => wrapEntryCollection(response.data, { resolveLinks, removeUnresolved }), errorHandler)
228+
229+
try {
230+
const response = await http.get('entries', createRequestConfig({ query: query }))
231+
return wrapEntryCollection(response.data, { resolveLinks, removeUnresolved })
232+
} catch (error) {
233+
errorHandler(error)
234+
}
219235
}
220236
/**
221237
* Gets an Asset
@@ -231,15 +247,19 @@ export default function createContentfulApi ({ http, getGlobalOptions }) {
231247
* accessToken: '<content_delivery_api_key>'
232248
* })
233249
*
234-
* client.getAsset('<asset_id>')
235-
* .then((asset) => console.log(asset))
236-
* .catch(console.error)
250+
* const asset = await client.getAsset('<asset_id>')
251+
* console.log(asset)
237252
*/
238-
function getAsset (id, query = {}) {
253+
async function getAsset (id, query = {}) {
239254
switchToEnvironment(http)
240255
normalizeSelect(query)
241-
return http.get('assets/' + id, createRequestConfig({ query: query }))
242-
.then((response) => wrapAsset(response.data), errorHandler)
256+
257+
try {
258+
const response = await http.get(`assets/${id}`, createRequestConfig({ query: query }))
259+
return wrapAsset(response.data)
260+
} catch (error) {
261+
errorHandler(error)
262+
}
243263
}
244264

245265
/**
@@ -255,15 +275,19 @@ export default function createContentfulApi ({ http, getGlobalOptions }) {
255275
* accessToken: '<content_delivery_api_key>'
256276
* })
257277
*
258-
* client.getAssets()
259-
* .then((response) => console.log(response.items))
260-
* .catch(console.error)
278+
* const response = await client.getAssets()
279+
* console.log(response.items)
261280
*/
262-
function getAssets (query = {}) {
281+
async function getAssets (query = {}) {
263282
switchToEnvironment(http)
264283
normalizeSelect(query)
265-
return http.get('assets', createRequestConfig({ query: query }))
266-
.then((response) => wrapAssetCollection(response.data), errorHandler)
284+
285+
try {
286+
const response = await http.get('assets', createRequestConfig({ query: query }))
287+
return wrapAssetCollection(response.data)
288+
} catch (error) {
289+
errorHandler(error)
290+
}
267291
}
268292

269293
/**
@@ -279,14 +303,18 @@ export default function createContentfulApi ({ http, getGlobalOptions }) {
279303
* accessToken: '<content_delivery_api_key>'
280304
* })
281305
*
282-
* client.getLocales()
283-
* .then((response) => console.log(response.items))
284-
* .catch(console.error)
306+
* const response = await client.getLocales()
307+
* console.log(response.items)
285308
*/
286-
function getLocales (query = {}) {
309+
async function getLocales (query = {}) {
287310
switchToEnvironment(http)
288-
return http.get('locales', createRequestConfig({ query: query }))
289-
.then((response) => wrapLocaleCollection(response.data), errorHandler)
311+
312+
try {
313+
const response = await http.get('locales', createRequestConfig({ query: query }))
314+
return wrapLocaleCollection(response.data)
315+
} catch (error) {
316+
errorHandler(error)
317+
}
290318
}
291319

292320
/**
@@ -313,17 +341,16 @@ export default function createContentfulApi ({ http, getGlobalOptions }) {
313341
* accessToken: '<content_delivery_api_key>'
314342
* })
315343
*
316-
* client.sync({
344+
* const response = await client.sync({
317345
* initial: true
318346
* })
319-
* .then((response) => console.log({
347+
* console.log({
320348
* entries: response.entries,
321349
* assets: response.assets,
322350
* nextSyncToken: response.nextSyncToken
323-
* }))
324-
* .catch(console.error)
351+
* })
325352
*/
326-
function sync (query = {}, options = { paginate: true }) {
353+
async function sync (query = {}, options = { paginate: true }) {
327354
const { resolveLinks, removeUnresolved } = getGlobalOptions(query)
328355
switchToEnvironment(http)
329356
return pagedSync(http, query, { resolveLinks, removeUnresolved, ...options })

lib/paged-sync.js

+37-43
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import mixinStringifySafe from './mixins/stringify-safe'
4343
* @param {boolean} [options.paginate = true] - If further sync pages should automatically be crawled
4444
* @return {Promise<SyncCollection>}
4545
*/
46-
export default function pagedSync (http, query, options = {}) {
46+
export default async function pagedSync (http, query, options = {}) {
4747
if (!query || (!query.initial && !query.nextSyncToken && !query.nextPageToken)) {
4848
throw new Error('Please provide one of `initial`, `nextSyncToken` or `nextPageToken` parameters for syncing')
4949
}
@@ -64,27 +64,23 @@ export default function pagedSync (http, query, options = {}) {
6464
paginate
6565
}
6666

67-
return getSyncPage(http, [], query, syncOptions)
68-
.then((response) => {
69-
// clones response.items used in includes because we don't want these to be mutated
70-
if (resolveLinks) {
71-
response.items = resolveResponse(response, { removeUnresolved, itemEntryPoints: ['fields'] })
72-
}
73-
// maps response items again after getters are attached
74-
const mappedResponseItems = mapResponseItems(response.items)
67+
const response = await getSyncPage(http, [], query, syncOptions)
68+
// clones response.items used in includes because we don't want these to be mutated
69+
if (resolveLinks) {
70+
response.items = resolveResponse(response, { removeUnresolved, itemEntryPoints: ['fields'] })
71+
}
72+
// maps response items again after getters are attached
73+
const mappedResponseItems = mapResponseItems(response.items)
7574

76-
if (response.nextSyncToken) {
77-
mappedResponseItems.nextSyncToken = response.nextSyncToken
78-
}
75+
if (response.nextSyncToken) {
76+
mappedResponseItems.nextSyncToken = response.nextSyncToken
77+
}
7978

80-
if (response.nextPageToken) {
81-
mappedResponseItems.nextPageToken = response.nextPageToken
82-
}
79+
if (response.nextPageToken) {
80+
mappedResponseItems.nextPageToken = response.nextPageToken
81+
}
8382

84-
return freezeSys(mixinStringifySafe(toPlainObject(mappedResponseItems)))
85-
}, (error) => {
86-
throw error
87-
})
83+
return freezeSys(mixinStringifySafe(toPlainObject(mappedResponseItems)))
8884
}
8985

9086
/**
@@ -125,7 +121,7 @@ function mapResponseItems (items) {
125121
* @param {boolean} [options.paginate = true] - If further sync pages should automatically be crawled
126122
* @return {Promise<{items: Array, nextSyncToken: string}>}
127123
*/
128-
function getSyncPage (http, items, query, { paginate }) {
124+
async function getSyncPage (http, items, query, { paginate }) {
129125
if (query.nextSyncToken) {
130126
query.sync_token = query.nextSyncToken
131127
delete query.nextSyncToken
@@ -143,29 +139,27 @@ function getSyncPage (http, items, query, { paginate }) {
143139
delete query.limit
144140
}
145141

146-
return http.get('sync', createRequestConfig({ query: query }))
147-
.then((response) => {
148-
const data = response.data || {}
149-
items = items.concat(data.items || [])
150-
if (data.nextPageUrl) {
151-
if (paginate) {
152-
delete query.initial
153-
query.sync_token = getToken(data.nextPageUrl)
154-
return getSyncPage(http, items, query, { paginate })
155-
}
156-
return {
157-
items: items,
158-
nextPageToken: getToken(data.nextPageUrl)
159-
}
160-
} else if (data.nextSyncUrl) {
161-
return {
162-
items: items,
163-
nextSyncToken: getToken(data.nextSyncUrl)
164-
}
165-
} else {
166-
return { items: [] }
167-
}
168-
})
142+
const response = await http.get('sync', createRequestConfig({ query: query }))
143+
const data = response.data || {}
144+
items = items.concat(data.items || [])
145+
if (data.nextPageUrl) {
146+
if (paginate) {
147+
delete query.initial
148+
query.sync_token = getToken(data.nextPageUrl)
149+
return getSyncPage(http, items, query, { paginate })
150+
}
151+
return {
152+
items: items,
153+
nextPageToken: getToken(data.nextPageUrl)
154+
}
155+
} else if (data.nextSyncUrl) {
156+
return {
157+
items: items,
158+
nextSyncToken: getToken(data.nextSyncUrl)
159+
}
160+
} else {
161+
return { items: [] }
162+
}
169163
}
170164

171165
/**

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
"karma-webpack": "^4.0.2",
109109
"mkdirp": "^1.0.3",
110110
"nodemon": "^2.0.2",
111+
"regenerator-runtime": "^0.13.7",
111112
"require-all": "^3.0.0",
112113
"rimraf": "^3.0.0",
113114
"selenium-webdriver": "^4.0.0-alpha.5",

test/e2e/index.js

+3-5
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,12 @@ const driver = new Builder()
2424
.usingServer(`http://${process.env.SAUCE_USERNAME}:${process.env.SAUCE_ACCESS_KEY}@ondemand.saucelabs.com/wd/hub`)
2525
.build()
2626

27-
initServer((server) => {
27+
initServer(async (server) => {
2828
driver.get('http://localhost:3000')
2929

3030
const h1 = driver.findElement(By.tagName('h1'))
3131

3232
driver.wait(until.elementTextIs(h1, 'Success'), 30000)
33-
driver.quit()
34-
.then(() => {
35-
server.close()
36-
})
33+
await driver.quit()
34+
server.close()
3735
})

0 commit comments

Comments
 (0)