diff --git a/package-lock.json b/package-lock.json index d5db93f..1c4c4e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,9 +17,11 @@ }, "devDependencies": { "@oclif/plugin-help": "^3.2.0", + "@types/async": "^3.2.18", "@types/jest": "^26.0.14", "@types/lodash": "^4.14.162", "@types/node": "^10.17.28", + "async": "^3.2.4", "eslint": "^5.16.0", "eslint-config-oclif": "^3.1.0", "eslint-config-oclif-typescript": "^0.1.0", @@ -2169,6 +2171,12 @@ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" }, + "node_modules/@types/async": { + "version": "3.2.18", + "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.18.tgz", + "integrity": "sha512-/IsuXp3B9R//uRLi40VlIYoMp7OzhkunPe2fDu7jGfQXI9y3CDCx6FC4juRLSqrpmLst3vgsiK536AAGJFl4Ww==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", diff --git a/package.json b/package.json index df0a8c6..9d27b84 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,11 @@ }, "devDependencies": { "@oclif/plugin-help": "^3.2.0", + "@types/async": "^3.2.18", "@types/jest": "^26.0.14", "@types/lodash": "^4.14.162", "@types/node": "^10.17.28", + "async": "^3.2.4", "eslint": "^5.16.0", "eslint-config-oclif": "^3.1.0", "eslint-config-oclif-typescript": "^0.1.0", diff --git a/src/lib/stack/client.ts b/src/lib/stack/client.ts index b04f545..3e78447 100644 --- a/src/lib/stack/client.ts +++ b/src/lib/stack/client.ts @@ -1,4 +1,6 @@ import * as http from 'https' +import * as async from 'async' +import {ContentTypeCollection} from 'contentstack' type RegionUrlMap = { [prop: string]: string; @@ -18,6 +20,13 @@ export type StackConnectionConfig = { environment: string; } +const limit = 100 + +const queryParams = { + limit, + include_global_field_schema: true, +} + export async function stackConnect(client: any, config: StackConnectionConfig) { try { // eslint-disable-next-line new-cap @@ -28,9 +37,34 @@ export async function stackConnect(client: any, config: StackConnectionConfig) { config.region ) - const results = await stack.getContentTypes({ - include_global_field_schema: true, - }) + const results = (await stack.getContentTypes({ + ...queryParams, + include_count: true, + })) as Omit & { count: number } + + if (results.count > limit) { + const additionalQueries = Array.from( + {length: Math.ceil(results.count / limit) - 1}, + (_, i) => { + return async.reflect(async () => { + return stack.getContentTypes({ + ...queryParams, + skip: (i + 1) * limit, + }) + }) + } + ) + const additionalResults = (await async.parallel(additionalQueries)) as { + value: ContentTypeCollection; + }[] + + for (const r of additionalResults) { + results.content_types = [ + ...results.content_types, + ...r.value.content_types, + ] + } + } const types = results.content_types