@agility/content-fetch
Version:
JS/TS library for the Agility Fetch API
622 lines (603 loc) • 23.8 kB
JavaScript
(() => {
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
};
})();