UNPKG

@agility/content-fetch

Version:
622 lines (603 loc) 23.8 kB
(() => { var __defProp = Object.defineProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; // src/utils.ts function logDebug({ config, message }) { if (config.logLevel !== "debug" && !config.debug) return; console.log("\x1B[33m%s\x1B[0m", message); } function logInfo({ config, message }) { if (config.logLevel !== "debug" && config.logLevel !== "info") return; console.log("\x1B[33m%s\x1B[0m", message); } function logError({ config, message }) { if (config.logLevel === "silent") return; console.error("\x1B[41m%s\x1B[0m", message); } function buildRequestUrlPath(config, locale) { let apiFetchOrPreview = ""; if (config.isPreview === true || config.isPreview === "true") { apiFetchOrPreview = "preview"; } else { apiFetchOrPreview = "fetch"; } let urlPath = `${config.baseUrl}/${apiFetchOrPreview}/${locale}`; return urlPath; } function buildPathUrl(contentType, referenceName, skip, take, sort, direction, filters, filtersLogicOperator, filterString, contentLinkDepth, expandAllContentLinks) { let url = `/${contentType}/${referenceName}?contentLinkDepth=${contentLinkDepth}&`; filtersLogicOperator = filtersLogicOperator ? ` ${filtersLogicOperator} ` : " AND "; if (sort) { url += `sort=${sort}&`; if (direction) { url += `direction=${direction}&`; } } if (skip) { url += `skip=${skip}&`; } if (take) { url += `take=${take}&`; } if (filters && filters.length > 0) { url += "filter="; for (let i = 0; i < filters.length; i++) { let filter = filters[i]; url += `${filter.property}[${filter.operator}]${filter.value}` + (i < filters.length - 1 ? filtersLogicOperator : ""); } url += "&"; } else if (filterString) { url += `filter=${encodeURIComponent(filterString)}&`; } if (expandAllContentLinks) { url += `expandAllContentLinks=${expandAllContentLinks}&`; } return url; } function buildAuthHeader(config) { let defaultAuthHeaders = { APIKey: config.apiKey, Guid: "" }; if (config.requiresGuidInHeaders) { defaultAuthHeaders.Guid = config.guid; } const headers = { ...defaultAuthHeaders, ...config.headers }; return headers; } function isHttps(url) { if (!url.toLowerCase().startsWith("https://")) { return false; } return true; } // src/types/errors/Errors.ts var TypeError2 = class extends Error { /** * @param {string} message The error message * @param {Function} [asserter] The assertion function that threw the error. Removes stack-trace noise if provided. */ constructor(message, asserter) { super(message); Error.captureStackTrace?.(this, asserter || this.constructor); } }; // src/methods/getSitemapFlat.ts function getSitemapFlat(requestParams) { validateRequestParams(requestParams); const req = { url: `/sitemap/flat/${requestParams.channelName}`, method: "get", baseURL: buildRequestUrlPath(this.config, requestParams.locale || requestParams.languageCode), headers: buildAuthHeader(this.config), params: {} }; return this.makeRequest(req); } function validateRequestParams(requestParams) { if (!requestParams.languageCode && !requestParams.locale) { throw new TypeError2("You must include a locale in your request params.", validateRequestParams); } else if (!requestParams.channelName) { throw new TypeError2("You must include a channelName in your request params.", validateRequestParams); } else { return; } } var getSitemapFlat_default = getSitemapFlat; // src/methods/getSitemapNested.ts function getSitemapNested(requestParams) { validateRequestParams2(requestParams); const req = { url: `/sitemap/nested/${requestParams.channelName}`, method: "get", baseURL: buildRequestUrlPath(this.config, requestParams.locale || requestParams.languageCode), headers: buildAuthHeader(this.config), params: {} }; return this.makeRequest(req); } function validateRequestParams2(requestParams) { if (!requestParams.languageCode && !requestParams.locale) { throw new TypeError2("You must include a locale in your request params.", validateRequestParams2); } else if (!requestParams.channelName) { throw new TypeError2("You must include a channelName in your request params.", validateRequestParams2); } } var getSitemapNested_default = getSitemapNested; // src/methods/getContentItem.ts var defaultParams = { contentLinkDepth: 1, expandAllContentLinks: false }; function getContentItem(requestParams) { validateRequestParams3(requestParams); requestParams = { ...defaultParams, ...requestParams }; const req = { url: `/item/${requestParams.contentID}?contentLinkDepth=${requestParams.contentLinkDepth}&expandAllContentLinks=${requestParams.expandAllContentLinks}`, method: "get", baseURL: buildRequestUrlPath(this.config, requestParams.locale ? requestParams.locale : requestParams.languageCode), headers: buildAuthHeader(this.config), params: {} }; return this.makeRequest(req); } function validateRequestParams3(requestParams) { if (!requestParams.languageCode && !requestParams.locale) { throw new TypeError2("You must include a locale in your request params.", validateRequestParams3); } else if (!requestParams.contentID) { throw new TypeError2("You must include a contentID number in your request params."); } else if (requestParams.contentLinkDepth && (isNaN(requestParams.contentLinkDepth) || requestParams.contentLinkDepth < 0)) { throw new TypeError2("When specifying contentLinkDepth, it must be a number greater than 0."); } else if (requestParams.expandAllContentLinks && typeof requestParams.expandAllContentLinks !== "boolean") { throw new TypeError2("ExpandAllContentLinks parameter must be a value of true or false"); } else { return; } } var getContentItem_default = getContentItem; // src/methods/getContentList.ts function getContentList(requestParams) { validateRequestParams4(requestParams); requestParams.referenceName = sanitizeReferenceName(requestParams.referenceName); requestParams = { ...defaultParams2, ...requestParams }; const req = { url: buildPathUrl("list", requestParams.referenceName, requestParams.skip, requestParams.take, requestParams.sort, requestParams.direction, requestParams.filters, requestParams.filtersLogicOperator, requestParams.filterString, requestParams.contentLinkDepth, requestParams.expandAllContentLinks), method: "get", baseURL: buildRequestUrlPath(this.config, requestParams.locale ? requestParams.locale : requestParams.languageCode), headers: buildAuthHeader(this.config), params: {} }; return this.makeRequest(req); } function sanitizeReferenceName(referenceName) { return referenceName.toLowerCase(); } function validateRequestParams4(requestParams) { if (!requestParams.languageCode && !requestParams.locale) { throw new TypeError2("You must include a locale in your request params.", validateRequestParams4); } else if (!requestParams.referenceName) { throw new TypeError2("You must include a content referenceName in your request params.", validateRequestParams4); } else if (requestParams.take && isNaN(requestParams.take)) { throw new TypeError2("Take parameter must be a number.", validateRequestParams4); } else if ((requestParams.take || requestParams.take == 0) && !isNaN(requestParams.take) && requestParams.take < 1) { throw new TypeError2("Take parameter must be greater than 0.", validateRequestParams4); } else if (requestParams.take && !isNaN(requestParams.take) && requestParams.take > 250) { throw new TypeError2("Take parameter must be 250 or less.", validateRequestParams4); } else if (requestParams.skip && isNaN(requestParams.skip)) { throw new TypeError2("Skip parameter must be a number.", validateRequestParams4); } else if (requestParams.skip && !isNaN(requestParams.skip) && requestParams.skip < 0) { throw new TypeError2("Skip parameter must be 0 or greater", validateRequestParams4); } else if (requestParams.direction && (requestParams.direction !== "desc" && requestParams.direction !== "asc")) { throw new TypeError2('Direction parameter must have a value of "asc" or "desc"', validateRequestParams4); } else if (requestParams.filters && requestParams.filters.length > 0) { for (let i = 0; i < requestParams.filters.length; i++) { let filter = requestParams.filters[i]; if (!filter.hasOwnProperty("property")) { throw new TypeError2(JSON.stringify(filter) + " does not contain 'property'.", validateRequestParams4); } else if (!filter.hasOwnProperty("operator")) { throw new TypeError2(JSON.stringify(filter) + " does not contain 'operator'.", validateRequestParams4); } else if (!filter.hasOwnProperty("value")) { throw new TypeError2(JSON.stringify(filter) + " does not contain 'value'.", validateRequestParams4); } if ([ "eq", "ne", "lt", "lte", "gt", "gte", "range", "like", "in", "contains" ].indexOf(filter.operator.toLowerCase()) < 0) { throw new TypeError2(JSON.stringify(filter) + "Operator must be one of ['eq','ne','lt','lte','gt','gte','range','like','in','contains'].", validateRequestParams4); } } } else if (requestParams.filtersLogicOperator && requestParams.filtersLogicOperator.toLowerCase() !== "and" && requestParams.filtersLogicOperator.toLowerCase() !== "or") { throw new TypeError2('FiltersLogicOperator parameter must have a value of "AND" or "OR"', validateRequestParams4); } else if (requestParams.expandAllContentLinks && typeof requestParams.expandAllContentLinks !== "boolean") { throw new TypeError2("ExpandAllContentLinks parameter must be a value of true or false", validateRequestParams4); } return true; } var defaultParams2 = { contentLinkDepth: 1, expandAllContentLinks: false }; var getContentList_default = getContentList; // src/methods/getPage.ts function getPage(requestParams) { validateRequestParams5(requestParams); requestParams = { ...defaultParams3, ...requestParams }; const req = { url: `/page/${requestParams.pageID}?contentLinkDepth=${requestParams.contentLinkDepth}&expandAllContentLinks=${requestParams.expandAllContentLinks}`, method: "get", baseURL: buildRequestUrlPath(this.config, requestParams.locale || requestParams.languageCode), headers: buildAuthHeader(this.config), params: {} }; return this.makeRequest(req); } function validateRequestParams5(requestParams) { if (!requestParams.languageCode && !requestParams.locale) { throw new TypeError2("You must include a locale in your request params.", validateRequestParams5); } else if (!requestParams.pageID) { throw new TypeError2("You must include a pageID in your request params.", validateRequestParams5); } else if (requestParams.expandAllContentLinks && typeof requestParams.expandAllContentLinks !== "boolean") { throw new TypeError2("ExpandAllContentLinks parameter must be a value of true or false", validateRequestParams5); } else { return; } } var defaultParams3 = { contentLinkDepth: 2, expandAllContentLinks: true }; var getPage_default = getPage; // src/methods/getPageByPath.ts function getPageByPath(requestParams) { validateRequestParams6(requestParams); const { channelName, pagePath } = requestParams; requestParams = { ...defaultParams4, ...requestParams }; const req = { url: `/page/${channelName}?path=${pagePath}&contentLinkDepth=${requestParams.contentLinkDepth}&expandAllContentLinks=${requestParams.expandAllContentLinks}`, method: "get", baseURL: buildRequestUrlPath( this.config, requestParams.locale || requestParams.languageCode ), headers: buildAuthHeader(this.config), params: {} }; return this.makeRequest(req); } function validateRequestParams6(requestParams) { if (!requestParams.languageCode && !requestParams.locale) { throw new TypeError2( "You must include a locale in your request params.", validateRequestParams6 ); } else if (!requestParams.pagePath) { throw new TypeError2( "You must include a page path in your request params.", validateRequestParams6 ); } else if (!requestParams.channelName) { throw new TypeError2( "You must include a channel name in your request params.", validateRequestParams6 ); } else if (requestParams.expandAllContentLinks && typeof requestParams.expandAllContentLinks !== "boolean") { throw new TypeError2( "ExpandAllContentLinks parameter must be a value of true or false", validateRequestParams6 ); } else { return; } } var defaultParams4 = { contentLinkDepth: 2, expandAllContentLinks: true }; var getPageByPath_default = getPageByPath; // src/methods/getGallery.ts function getGallery(requestParams) { validateRequestParams7(requestParams); requestParams = { ...defaultParams5, ...requestParams }; const req = { url: `/${requestParams.galleryID}`, method: "get", baseURL: buildRequestUrlPath(this.config, "gallery"), headers: buildAuthHeader(this.config), params: {} }; return this.makeRequest(req); } function validateRequestParams7(requestParams) { if (!requestParams.galleryID) { throw new TypeError2("You must include a galleryID number in your request params.", validateRequestParams7); } else { return; } } var defaultParams5 = { contentLinkDepth: 1 }; var getGallery_default = getGallery; // src/methods/getUrlRedirections.ts function getUrlRedirections(requestParams) { validateRequestParams8(requestParams); let url = ""; if (requestParams.lastAccessDate) { if (!requestParams.lastAccessDate.toISOString) { requestParams.lastAccessDate = new Date(requestParams.lastAccessDate); } url = `/?lastAccessDate=${requestParams.lastAccessDate.toISOString()}`; } const req = { url, method: "get", baseURL: buildRequestUrlPath(this.config, "urlredirection"), headers: buildAuthHeader(this.config), params: {} }; const self = this; let promise = new Promise(function(resolve, reject) { self.makeRequest(req).then((data) => { if (data == void 0 || !data) { reject(new Error("The URL redirections could not be retrieved.")); } else { resolve(data); } }).catch( (error) => { reject(error); } ); }); return promise; } function validateRequestParams8(requestParams) { if (requestParams.lastAccessDate) { if (!requestParams.lastAccessDate.toISOString) { let dt = new Date(requestParams.lastAccessDate); if (isNaN(dt.getTime())) { throw new TypeError2("You must include a valid Datetime for the lastAccessDate.", validateRequestParams8); } } } else { return; } } var getUrlRedirections_default = getUrlRedirections; // src/methods/getSyncContent.ts function getSyncContent(requestParams) { validateRequestParams9(requestParams); const req = { url: `/sync/items?pageSize=${requestParams.pageSize}&syncToken=${requestParams.syncToken}`, method: "get", baseURL: buildRequestUrlPath(this.config, requestParams.locale || requestParams.languageCode), headers: buildAuthHeader(this.config), params: {} }; return this.makeRequest(req); } function validateRequestParams9(requestParams) { if (!requestParams.languageCode && !requestParams.locale) { throw new TypeError2("You must include a locale in your request params.", validateRequestParams9); } else if (requestParams.syncToken == void 0 || requestParams.syncToken == null) { throw new TypeError2("You must include a syncToken value your request params. Use zero (0) to start a new sync.", validateRequestParams9); } else { return; } } var getSyncContent_default = getSyncContent; // src/methods/getSyncPages.ts function getSyncPages(requestParams) { validateRequestParams10(requestParams); const req = { url: `/sync/pages?pageSize=${requestParams.pageSize}&syncToken=${requestParams.syncToken}`, method: "get", baseURL: buildRequestUrlPath(this.config, requestParams.locale || requestParams.languageCode), headers: buildAuthHeader(this.config), params: {} }; return this.makeRequest(req); } function validateRequestParams10(requestParams) { if (!requestParams.languageCode && !requestParams.locale) { throw new TypeError("You must include a locale in your request params."); } else if (requestParams.syncToken == void 0 || requestParams.syncToken == null) { throw new TypeError("You must include a syncToken value your request params. Use zero (0) to start a new sync."); } else { return; } } var getSyncPages_default = getSyncPages; // src/types/index.ts var types_exports = {}; __export(types_exports, { FilterLogicOperators: () => FilterLogicOperators, FilterOperators: () => FilterOperator_default, SortDirections: () => SortDirections }); // src/types/FilterOperator.ts var FilterOperators = /* @__PURE__ */ ((FilterOperators2) => { FilterOperators2["EQUAL_TO"] = "eq"; FilterOperators2["NOT_EQUAL_TO"] = "ne"; FilterOperators2["LESS_THAN"] = "lt"; FilterOperators2["LESS_THAN_OR_EQUAL_TO"] = "lte"; FilterOperators2["GREATER_THAN"] = "gt"; FilterOperators2["GREATER_THAN_OR_EQUAL_TO"] = "gte"; FilterOperators2["RANGE"] = "range"; FilterOperators2["LIKE"] = "like"; FilterOperators2["IN"] = "in"; FilterOperators2["CONTAINS"] = "contains"; return FilterOperators2; })(FilterOperators || {}); var FilterOperator_default = FilterOperators; // src/types/FilterLogicOperator.ts var FilterLogicOperators = /* @__PURE__ */ ((FilterLogicOperators2) => { FilterLogicOperators2["AND"] = "AND"; FilterLogicOperators2["OR"] = "OR"; return FilterLogicOperators2; })(FilterLogicOperators || {}); // src/types/SortDirection.ts var SortDirections = /* @__PURE__ */ ((SortDirections2) => { SortDirections2["ASC"] = "asc"; SortDirections2["DESC"] = "desc"; return SortDirections2; })(SortDirections || {}); // src/api-client.ts var defaultConfig = { baseUrl: null, isPreview: false, guid: null, apiKey: null, locale: null, headers: {}, requiresGuidInHeaders: false, logLevel: "warn", debug: false, caching: { maxAge: 0 //caching disabled by default } }; function buildBaseUrl(guid) { const baseUrlSuffixes = { u: "", c: "-ca", e: "-eu", a: "-aus", d: "-dev", us2: "-usa2" }; const match = guid.match(/-(us2|[ucead])$/); if (match) { const env = match[1]; if (baseUrlSuffixes.hasOwnProperty(env)) { const url = `https://api${baseUrlSuffixes[env]}.aglty.io/${guid}`; return url; } } const legacyUrl = `https://${guid}-api.agilitycms.cloud`; return legacyUrl; } function validateConfigParams(configParams) { if (!configParams.guid || configParams.guid.length == 0) { throw new TypeError2("You must provide a guid."); } else if (!configParams.apiKey || configParams.apiKey.length == 0) { throw new TypeError2("You must provide an access token."); } else if (configParams.caching && isNaN(configParams.caching.maxAge)) { throw new TypeError2("When specifying a cache maxAge, you must set a number value in miliseconds, i.e. 180000 (3 mins)."); } else if (configParams.baseUrl && !isHttps(configParams.baseUrl)) { throw new TypeError2(`When specifying a baseUrl (${configParams.baseUrl}), it must be over HTTPs.`); } else { return; } } var ApiClient = class { constructor(userConfig) { this.types = types_exports; let config = { ...defaultConfig, ...userConfig }; if (!config.baseUrl) { config.baseUrl = buildBaseUrl(config?.guid || ""); } else { config.requiresGuidInHeaders = true; } this.config = config; } async getContentItem(params) { return getContentItem_default.call(this, params); } async getContentList(params) { return getContentList_default.call(this, params); } async getGallery(params) { return getGallery_default.call(this, params); } async getPage(params) { return getPage_default.call(this, params); } async getPageByPath(params) { return getPageByPath_default.call(this, params); } async getSitemapFlat(params) { return getSitemapFlat_default.call(this, params); } async getSitemapNested(params) { return getSitemapNested_default.call(this, params); } async getUrlRedirections(params) { return getUrlRedirections_default.call(this, params); } async getSyncContent(params) { return getSyncContent_default.call(this, params); } async getSyncPages(params) { return getSyncPages_default.call(this, params); } //the function that actually makes ALL our requests async makeRequest(reqConfig) { const isPreview = !!this.config.isPreview; logDebug({ config: this.config, message: `AgilityCMS Fetch API LOG: ${reqConfig.baseURL}${reqConfig.url}` }); try { const fullUrl = `${reqConfig.baseURL}${reqConfig.url}`; let init = { ...this.config.fetchConfig, method: "GET", headers: { ...reqConfig.headers, "Content-Type": "application/json", "Accept": "application/json" } }; if (isPreview) { init.cache = "no-store"; delete init.next; } const response = await fetch(fullUrl, init); if (!response.ok) { if (response.status === 404) { logInfo({ config: this.config, message: `AgilityCMS Fetch API: Request returned a ${response.status} response for ${reqConfig.baseURL}${reqConfig.url}. ${response.statusText}` }); return; } logError({ config: this.config, message: `AgilityCMS Fetch API ERROR: Request returned a ${response.status} response for ${reqConfig.baseURL}${reqConfig.url}. ${response.statusText}` }); return; } let data = await response.json(); if (this.config.debug) { data["agilityResponseHeaders"] = response.headers; } return data; } catch (error) { logError({ config: this.config, message: `AgilityCMS Fetch API ERROR: Request failed for ${reqConfig.baseURL}${reqConfig.url} ... ${error}` }); } } }; function getApi(config) { validateConfigParams(config); if (!config.fetchConfig) config.fetchConfig = {}; return new ApiClient(config); } // src/index.ts module.exports = { getApi }; })();