@xman.io/xman-js-sdk
Version:
Javascript/typescript SDK to access the data published using XMan.io
297 lines (282 loc) • 9.95 kB
TypeScript
interface XmanItem<T> {
id: string;
data: T;
createTime: string;
updateTime: string;
version: number;
}
interface XmanItemsList<T> {
items: XmanItem<T>[];
/**
* Use in the next `list<T>()` call to get the next set of results.
* No more pages left if `nextPageToken` is not present.
*/
nextPageToken?: string;
}
/**
* Options for reading a list
*/
interface ListParams {
/** in page size. Default 12. Max 24. */
pageSize?: number;
/** `nextPageToken` returned by the previous `list()` call. */
nextPage?: string;
/** property path to order by, followed by direction. E.g. `name asc` */
orderBy?: string;
}
type XMValidValues = number | string | Date | number[] | string[] | boolean
type XmanProperties = Record<string, XMValidValues | XmanProperties>
interface DecisionInputs {
anonymousId?: string
userId?: string
properties?: XmanProperties
}
interface MockContext {
profile?: XmanProperties
events?: {
eventName: string
at: number
payload?: XmanProperties
}[]
requestContext?: XmanProperties
serverContext?: XmanProperties
}
declare namespace XmanFieldValue {
interface Reference {
collection: string;
id: string;
/** Label is cached at the time reference is created. Not updated with the item changes. */
label?: string;
altText?: string;
thumbId?: string;
}
interface File {
contentType: string,
name: string,
storageName: string,
md5Hash: string,
size: number,
publicUrl: string
}
interface Place {
rawAddress?: string,
streetAddress?: string,
unit?: string,
city?: string,
state?: string,
postal_code?: string,
country?: string,
neighborhood?: string,
latitude: number,
longitude: number,
geohashes?: string[],
geohash?: {
p_1: string,
p_2: string,
p_3: string,
p_4: string,
p_5: string,
p_6: string,
p_7: string,
p_8: string,
p_9: string,
p_10: string,
p_11: string,
p_12: string,
},
google_place?: {
neighborhood: string,
administrative_area_level_1: string,
route: string,
postal_code: string,
locality: string,
country: string,
street_number: string,
subpremise: string,
latitude: number,
longitude: number
},
}
}
interface ImageSettings {
/**
* Key to identify the variation of the image.
* `getImage(s)` will return variations in a map keyed by this key
* */
key: string;
/** Image width. If larger than actual image width, actual width is used */
width?: number;
/** Image height. If larger than actual image height, actual height is used */
height?: number;
fit?: 'cover' | 'fill' | 'contain';
}
interface HTMLImageData {
alt: string;
variations: {
[key: string]: {
src: string;
width?: number;
height?: number;
};
};
}
interface MoadeDecisionResult {
promo: {
payload: {
id: string
title?: string
cta?: string
targetUrl?: string
name?: string
coverImage?: XmanFieldValue.Reference[]
}
goalEventName?: string
}
}
interface EventPayload {
event?: string
userId?: string
anonymousId?: string
properties?: XmanProperties
}
interface AnalyticsInstance {
getState: () => {
context?: {
campaign?: XmanProperties
}
}
}
type TrackerFunction = ({ payload, instance }: { payload: EventPayload, instance: AnalyticsInstance }) => void
type ProxyResult<T> = {
success: true;
data: T;
} | {
success: false;
response: Response;
};
interface AnalyticsPlugin {
name: string;
initialize?: TrackerFunction;
track?: TrackerFunction;
page?: TrackerFunction;
identify?: TrackerFunction;
}
interface WorkspaceWrapper {
/**
* Reads a specific item. *Returns `null` if item is not found*
* @param {string} collection collection ID (e.g. xman-articles)
* @param {string} itemId 20 character Item ID (e.g. dXEFNfms7zlMI8AdbFND)
* @returns {Promise<XmanItem<T> | null>} an item or `null`
*/
read<T>(collection: string, itemId: string): Promise<XmanItem<T> | null>;
/**
* Loads and returns the first referenced item in the reference list. If the list is empty, returns null
*
* @param referenceFieldValue {XmanFieldValue.Reference[]} field value of a reference field. Use directly from the response of previous calls
* @returns {Promise<XmanItem<T> | null>} First referenced item or `null` if no items referenced
*/
readReferencedItem<T>(referenceFieldValue?: XmanFieldValue.Reference[]): Promise<XmanItem<T> | null>;
/**
* Loads and returns all the referenced items in the reference list. If the list is empty, returns [].
* This method ignores all items that fail to load. E.g. The API Client you created may not have access to some collections
* If you want the call to fail when such errors happen, pass `failOnPartialFailure = true`
*
* @param referenceFieldValue {XmanFieldValue.Reference[]} field value of a reference field. Use directly from the response of previous calls
* @param failOnPartialFailure {boolean} if `true` throws an error if any item reference throws an error
* @returns {[Promise<XmanItem<T>]} First referenced item or `null` if no items referenced
* @throws Error when `failOnPartialFailure = true` and one or more items fail to load
*/
readReferencedItems<T>(referenceFieldValue?: XmanFieldValue.Reference[], failOnPartialFailure?: boolean): Promise<XmanItem<T>[]>;
/**
* Read a list of items. Simple paging and sorting is supported.
*
* Use `query()` for more sophisticated queries
*
* @param {string} collection
* @param {ListParams?} listParams Parameters for the list
*/
list<T>(collection: string, listParams?: ListParams): Promise<XmanItemsList<T>>;
/**
* Call the MOADE.ai to get a decision.
*
* Make sure you retrieve the userId and anonymousId from your Analytics implementation
* and pass it in decisionInputs
*
* @param {string} decisionFlowId Flat Decision Flow Id. Get from the MOADE test harness
* @param {DecisionInputs} decisionInputs Parameters for making the decision
* @param {MockContext?} mockContext optional mock context. Use only for testing
*
*/
decide(decisionFlowId: string, decisionInputs: DecisionInputs, mockContext?: MockContext): Promise<ProxyResult<MoadeDecisionResult>>;
/**
* Returns a plugin to be used with the analytics.js library or Segment
*
*/
getMoadeAnalyticsPlugin(): AnalyticsPlugin;
/**
* Generates alt text and image URLs for a set of image references.
*
* @param {XmanFieldValue.Reference[]} imgRefs pointers to image items. You can use the reference field values directly
* @param {ImageSettings?} imageSettings image settings
* @returns Promise<HTMLImageData[]> list of image details
*/
getImages(imgRefs: XmanFieldValue.Reference[], imageSettings?: ImageSettings[]): Promise<HTMLImageData[]>;
/**
* Generates alt text and image URLs for one image reference
*
* @param {XmanFieldValue.Reference} imgRef pointers to an image item. You can use the reference field value directly
* @param {ImageSettings?} imageSettings image settings
* @returns Promise<HTMLImageData> image details
*/
getImage(imgRef: XmanFieldValue.Reference, imageSettings?: ImageSettings[]): Promise<HTMLImageData>;
/**
* Generates image URLs for one image reference.
* Use with references in Live Collections where the Alt in the is always up-to-date.
* *NOTE* that this is a synchronous function. Don't await.
*
* @param {XmanFieldValue.Reference} imgRef pointers to an image item. You can use the reference field value directly
* @param {ImageSettings?} imageSettings image settings
* @returns HTMLImageData['variations'] image details
*/
generateImageVariations(imgRef: XmanFieldValue.Reference, imageSettings?: ImageSettings[]): HTMLImageData['variations'];
/**
* Change the stage to pull data from. Default is 'live'
* @param {String} stageName
*/
stage(stageName: string): WorkspaceWrapper;
/**
* Point to a separate delivery CDN.
* Only applicable to "Environment" plans.
*
* @param {String} cdnServer CDN Server URL
*/
cdn(cdnServer: string): WorkspaceWrapper;
/**
* Point to a separate MOADE.ai decision server.
* Only applicable to "Environment" plans.
*
* @param {String} moadeServer MOADE.ai Server URL
*/
moade(moadeServer: string): WorkspaceWrapper;
/**
* Provide the secret part of the key for server side access without `Origin` check
* *DO NOT USE IN A CLIENT SIDE WEB APP*
* Please use in server only settings for SSR apps such as NuxtJS, NextJS, Gatsby, etc.
*
* @param {String} secret for server side access.
*/
secret(secret: string): WorkspaceWrapper;
}
/**
*
* @param clientId API client ID from XMan I/O
* @param workspaceId Workspace ID. You can see this in the URL on XMan I/O
* @param stageName 'live' by default
* @param cdnServer Ignore. Unless Liquiron support has asked you to set this
* @param moadeServer Ignore. Unless Liquiron support has asked you to set this
* @param secret Secret for server side access. DO NOT USE IN THE BROWSER
* @returns Workspace object
*/
declare const getWorkspace: (clientId: string, workspaceId: string, stageName?: string, cdnServer?: string, moadeServer?: string, secret?: string) => WorkspaceWrapper;
export { XmanFieldValue, getWorkspace };
export type { AnalyticsPlugin, DecisionInputs, HTMLImageData, ImageSettings, ListParams, MoadeDecisionResult, MockContext, WorkspaceWrapper, XMValidValues, XmanItem, XmanItemsList, XmanProperties };