@inploi/sdk 1.13.2 → 1.13.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cdn/index.js +1 -1
- package/dist/index.d.mts +5 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/cdn/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// This is an inploi sdk script. Learn more at https://inploi.com
|
|
2
2
|
|
|
3
|
-
"use strict";(()=>{var N=Object.defineProperty,M=Object.defineProperties;var q=Object.getOwnPropertyDescriptors;var v=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,F=Object.prototype.propertyIsEnumerable;var x=(e,n,o)=>n in e?N(e,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[n]=o,
|
|
3
|
+
"use strict";(()=>{var N=Object.defineProperty,M=Object.defineProperties;var q=Object.getOwnPropertyDescriptors;var v=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,F=Object.prototype.propertyIsEnumerable;var x=(e,n,o)=>n in e?N(e,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[n]=o,u=(e,n)=>{for(var o in n||(n={}))j.call(n,o)&&x(e,o,n[o]);if(v)for(var o of v(n))F.call(n,o)&&x(e,o,n[o]);return e},S=(e,n)=>M(e,q(n));var d=(e,n,o)=>new Promise((t,s)=>{var p=r=>{try{i(o.next(r))}catch(a){s(a)}},c=r=>{try{i(o.throw(r))}catch(a){s(a)}},i=r=>r.done?t(r.value):Promise.resolve(r.value).then(p,c);i((o=o.apply(e,n)).next())});function w(e,n){if(!e)throw new Error(n)}var P="1.13.4";var E={sandbox:"https://api.staging.inploi.com",production:"https://api.inploi.com",_internal_local:"http://api.test"},b=P,k="/log",l="isdk_session";var I=e=>{let n=new Date;return n.setTime(n.getTime()+7*24*60*60*1e3),`${l}=${e};expires=${n.toUTCString()};path=/`},U=(e,n)=>{let o=e.get("session_id");if(n||o)return o;let t=sessionStorage.getItem(`${l}-session_id`);return typeof t=="string"?t:null},$=new RegExp(`${l}=([^;]+)`),L=e=>{let n=e?e.url:location.href,{searchParams:o}=new URL(n),t=o.get("anonymous_id"),s=U(o,typeof window=="undefined");if(t)return{anonymous_id:t,session_id:s};let p=e?e.headers.get("cookie"):document.cookie;if(p){let c=$.exec(p),i=c==null?void 0:c[1];return{anonymous_id:i!=null?i:null,session_id:s}}return{anonymous_id:t,session_id:s}},V=e=>typeof e!="object"||e===null?null:{anonymous_id:"anonymous_id"in e&&typeof e.anonymous_id=="string"?e.anonymous_id:null,session_id:"session_id"in e&&typeof e.session_id=="string"?e.session_id:null},A=({apiClient:e,logger:n})=>({log:t=>d(void 0,null,function*(){w(t.request||typeof window!="undefined","Cannot log on the server without a request. Please pass a request to `log`.");let s="request"in t&&t.request?{href:t.request.url,referrer:t.request.referrer,title:""}:{href:location.href,referrer:document.referrer,title:document.title};try{let p={library:{name:"inploi-sdk",version:b},page:s},c=L(t.request),i={anonymous_id:c.anonymous_id,session_id:c.session_id,event:t.event,sent_at:new Date().toISOString(),context:p,properties:t.properties,custom_properties:t.customProperties},r=yield e.fetch(k,{method:"POST",body:JSON.stringify(i)}),a=V(r);return a!=null&&a.anonymous_id&&(i.anonymous_id=a.anonymous_id),a!=null&&a.session_id&&(i.session_id=a.session_id),typeof window!="undefined"&&i.anonymous_id&&(i.session_id&&sessionStorage.setItem(`${l}-session_id`,i.session_id.toString()),document.cookie=I(i.anonymous_id)),{success:!0,data:i}}catch(p){return n.error("Failed to send log to API. Inspect error response of `log` for more information."),{success:!1,error:p}}}),getHeaders:t=>{let s=new Headers;return t.anonymous_id&&s.append("Set-Cookie",I(t.anonymous_id)),s},getSessionInfo:L});var Y="Unauthenticated",H="This action is unauthorized.",_=class extends Error{constructor(){super("Not found"),this.name="NotFoundError"}},g=class extends Error{constructor(n){super(n!=null?n:"You are not authorised to perform this action."),this.name="UnauthorisedError"}},f=class extends Error{constructor(o,t){super(`API error: \u201C${o}\u201D`);this.name="ApiError",this.errors=t}},h=class extends Error{constructor(o){super("Error parsing response into JSON.");this.textResponse=o;this.name="ParsingError"}},T=e=>{let n={Accept:"application/json","Content-Type":"application/json","x-publishable-key":e.publishableKey};return{fetch:(s,...p)=>d(void 0,[s,...p],function*(o,t={}){let c=S(u({},t),{headers:u(u({},t.headers),n)}),i=yield fetch(`${e.baseUrl}${o}`,c);if(i.status===404)throw new _;let r=yield i.json().catch(()=>d(void 0,null,function*(){throw new h(yield i.text())}));if(typeof r=="object"&&r!==null&&"message"in r&&typeof r.message=="string"){if(r.message===Y)throw new g("You are not authenticated.");if(r.message===H)throw new g;if("exception"in r)throw new f(r.message,[r.exception]);if("errors"in r)throw new f(r.message,Array.isArray(r.errors)?r.errors:[r.errors])}return r})}};var m="%c[inploi SDK]",y="color: #65BC67; font-weight: bold;",O={warn:(...e)=>console.warn(m,y,...e),error:(...e)=>console.error(m,y,...e),info:(...e)=>console.info(m,y,...e),log:(...e)=>console.log(m,y,...e)},C={info:()=>{},error:()=>{},log:()=>{},warn:()=>{}};function R({publishableKey:e,env:n,logger:o=O}){let t=T({baseUrl:E[n],publishableKey:e}),s=o===!1?C:o,p=A({apiClient:t,logger:s});return{register:i=>i({logger:s,apiClient:t,analytics:p}),analytics:p,apiClient:t}}typeof window.inploi!="object"&&(window.inploi={});window.process=window.process||{};window.process.env=window.process.env||{};window.process.env.NODE_ENV="production";window.inploi.initialiseSdk=R;})();
|
package/dist/index.d.mts
CHANGED
|
@@ -14,13 +14,15 @@ type AnalyticsLogParams = {
|
|
|
14
14
|
event: 'VIEW_JOB';
|
|
15
15
|
properties: {
|
|
16
16
|
job_id: string;
|
|
17
|
-
/** @default "
|
|
17
|
+
/** @default "external_id" */
|
|
18
18
|
key?: 'id' | 'external_id';
|
|
19
19
|
};
|
|
20
20
|
} | {
|
|
21
21
|
event: 'APPLY_REDIRECT';
|
|
22
22
|
properties: {
|
|
23
23
|
job_id: string;
|
|
24
|
+
/** @default "external_id" */
|
|
25
|
+
key?: 'id' | 'external_id';
|
|
24
26
|
};
|
|
25
27
|
} | {
|
|
26
28
|
event: 'FLOW_START' | 'FLOW_END';
|
|
@@ -100,7 +102,8 @@ declare class ApiError extends Error {
|
|
|
100
102
|
constructor(message: string, errors: unknown[]);
|
|
101
103
|
}
|
|
102
104
|
declare class ParsingError extends Error {
|
|
103
|
-
|
|
105
|
+
textResponse?: string | undefined;
|
|
106
|
+
constructor(textResponse?: string | undefined);
|
|
104
107
|
}
|
|
105
108
|
type ApiClient = {
|
|
106
109
|
fetch: (pathname: string, options?: RequestInit) => Promise<unknown>;
|
package/dist/index.d.ts
CHANGED
|
@@ -14,13 +14,15 @@ type AnalyticsLogParams = {
|
|
|
14
14
|
event: 'VIEW_JOB';
|
|
15
15
|
properties: {
|
|
16
16
|
job_id: string;
|
|
17
|
-
/** @default "
|
|
17
|
+
/** @default "external_id" */
|
|
18
18
|
key?: 'id' | 'external_id';
|
|
19
19
|
};
|
|
20
20
|
} | {
|
|
21
21
|
event: 'APPLY_REDIRECT';
|
|
22
22
|
properties: {
|
|
23
23
|
job_id: string;
|
|
24
|
+
/** @default "external_id" */
|
|
25
|
+
key?: 'id' | 'external_id';
|
|
24
26
|
};
|
|
25
27
|
} | {
|
|
26
28
|
event: 'FLOW_START' | 'FLOW_END';
|
|
@@ -100,7 +102,8 @@ declare class ApiError extends Error {
|
|
|
100
102
|
constructor(message: string, errors: unknown[]);
|
|
101
103
|
}
|
|
102
104
|
declare class ParsingError extends Error {
|
|
103
|
-
|
|
105
|
+
textResponse?: string | undefined;
|
|
106
|
+
constructor(textResponse?: string | undefined);
|
|
104
107
|
}
|
|
105
108
|
type ApiClient = {
|
|
106
109
|
fetch: (pathname: string, options?: RequestInit) => Promise<unknown>;
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var y=Object.defineProperty,F=Object.defineProperties,j=Object.getOwnPropertyDescriptor,D=Object.getOwnPropertyDescriptors,U=Object.getOwnPropertyNames,S=Object.getOwnPropertySymbols;var E=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable;var k=(e,n,t)=>n in e?y(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,_=(e,n)=>{for(var t in n||(n={}))E.call(n,t)&&k(e,t,n[t]);if(S)for(var t of S(n))$.call(n,t)&&k(e,t,n[t]);return e},A=(e,n)=>F(e,D(n));var Y=(e,n)=>{for(var t in n)y(e,t,{get:n[t],enumerable:!0})},B=(e,n,t,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of U(n))!E.call(e,s)&&s!==t&&y(e,s,{get:()=>n[s],enumerable:!(o=j(n,s))||o.enumerable});return e};var H=e=>B(y({},"__esModule",{value:!0}),e);var u=(e,n,t)=>new Promise((o,s)=>{var p=r=>{try{i(t.next(r))}catch(a){s(a)}},c=r=>{try{i(t.throw(r))}catch(a){s(a)}},i=r=>r.done?o(r.value):Promise.resolve(r.value).then(p,c);i((t=t.apply(e,n)).next())});var X={};Y(X,{ApiError:()=>d,NotFoundError:()=>g,ParsingError:()=>m,UnauthorisedError:()=>l,createPlugin:()=>I,initialiseSdk:()=>q,inploiBrandedLogger:()=>P,noLogging:()=>v});module.exports=H(X);var x="%c[inploi SDK]",h="color: #65BC67; font-weight: bold;",P={warn:(...e)=>console.warn(x,h,...e),error:(...e)=>console.error(x,h,...e),info:(...e)=>console.info(x,h,...e),log:(...e)=>console.log(x,h,...e)},v={info:()=>{},error:()=>{},log:()=>{},warn:()=>{}};var I=e=>e;var K="Unauthenticated",V="This action is unauthorized.",g=class extends Error{constructor(){super("Not found"),this.name="NotFoundError"}},l=class extends Error{constructor(n){super(n!=null?n:"You are not authorised to perform this action."),this.name="UnauthorisedError"}},d=class extends Error{constructor(t,o){super(`API error: \u201C${t}\u201D`);this.name="ApiError",this.errors=o}},m=class extends Error{constructor(t){super("Error parsing response into JSON.");this.textResponse=t;this.name="ParsingError"}},L=e=>{let n={Accept:"application/json","Content-Type":"application/json","x-publishable-key":e.publishableKey};return{fetch:(s,...p)=>u(void 0,[s,...p],function*(t,o={}){let c=A(_({},o),{headers:_(_({},o.headers),n)}),i=yield fetch(`${e.baseUrl}${t}`,c);if(i.status===404)throw new g;let r=yield i.json().catch(()=>u(void 0,null,function*(){throw new m(yield i.text())}));if(typeof r=="object"&&r!==null&&"message"in r&&typeof r.message=="string"){if(r.message===K)throw new l("You are not authenticated.");if(r.message===V)throw new l;if("exception"in r)throw new d(r.message,[r.exception]);if("errors"in r)throw new d(r.message,Array.isArray(r.errors)?r.errors:[r.errors])}return r})}};function w(e,n){if(!e)throw new Error(n)}var b="1.13.4";var T={sandbox:"https://api.staging.inploi.com",production:"https://api.inploi.com",_internal_local:"http://api.test"},O=b,C="/log",f="isdk_session";var R=e=>{let n=new Date;return n.setTime(n.getTime()+7*24*60*60*1e3),`${f}=${e};expires=${n.toUTCString()};path=/`},W=(e,n)=>{let t=e.get("session_id");if(n||t)return t;let o=sessionStorage.getItem(`${f}-session_id`);return typeof o=="string"?o:null},z=new RegExp(`${f}=([^;]+)`),N=e=>{let n=e?e.url:location.href,{searchParams:t}=new URL(n),o=t.get("anonymous_id"),s=W(t,typeof window=="undefined");if(o)return{anonymous_id:o,session_id:s};let p=e?e.headers.get("cookie"):document.cookie;if(p){let c=z.exec(p),i=c==null?void 0:c[1];return{anonymous_id:i!=null?i:null,session_id:s}}return{anonymous_id:o,session_id:s}},G=e=>typeof e!="object"||e===null?null:{anonymous_id:"anonymous_id"in e&&typeof e.anonymous_id=="string"?e.anonymous_id:null,session_id:"session_id"in e&&typeof e.session_id=="string"?e.session_id:null},M=({apiClient:e,logger:n})=>({log:o=>u(void 0,null,function*(){w(o.request||typeof window!="undefined","Cannot log on the server without a request. Please pass a request to `log`.");let s="request"in o&&o.request?{href:o.request.url,referrer:o.request.referrer,title:""}:{href:location.href,referrer:document.referrer,title:document.title};try{let p={library:{name:"inploi-sdk",version:O},page:s},c=N(o.request),i={anonymous_id:c.anonymous_id,session_id:c.session_id,event:o.event,sent_at:new Date().toISOString(),context:p,properties:o.properties,custom_properties:o.customProperties},r=yield e.fetch(C,{method:"POST",body:JSON.stringify(i)}),a=G(r);return a!=null&&a.anonymous_id&&(i.anonymous_id=a.anonymous_id),a!=null&&a.session_id&&(i.session_id=a.session_id),typeof window!="undefined"&&i.anonymous_id&&(i.session_id&&sessionStorage.setItem(`${f}-session_id`,i.session_id.toString()),document.cookie=R(i.anonymous_id)),{success:!0,data:i}}catch(p){return n.error("Failed to send log to API. Inspect error response of `log` for more information."),{success:!1,error:p}}}),getHeaders:o=>{let s=new Headers;return o.anonymous_id&&s.append("Set-Cookie",R(o.anonymous_id)),s},getSessionInfo:N});function q({publishableKey:e,env:n,logger:t=P}){let o=L({baseUrl:T[n],publishableKey:e}),s=t===!1?v:t,p=M({apiClient:o,logger:s});return{register:i=>i({logger:s,apiClient:o,analytics:p}),analytics:p,apiClient:o}}0&&(module.exports={ApiError,NotFoundError,ParsingError,UnauthorisedError,createPlugin,initialiseSdk,inploiBrandedLogger,noLogging});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/sdk.logger.ts","../src/sdk.plugins.ts","../src/sdk.api.ts","../../core/src/common/common.utils.ts","../package.json","../src/sdk.constants.ts","../src/sdk.analytics.ts","../src/sdk.ts"],"sourcesContent":["export { inploiBrandedLogger, noLogging } from './sdk.logger';\nexport type { Logger } from './sdk.logger';\n\nexport type { PluginParams, InploiSdkPlugin } from './sdk.plugins';\nexport { createPlugin } from './sdk.plugins';\n\nexport type { InploiSdkEnvironment } from './sdk.constants';\n\nexport type { ApiClient } from './sdk.api';\nexport { ApiError, NotFoundError, ParsingError, UnauthorisedError } from './sdk.api';\n\nexport { initialiseSdk } from './sdk';\nexport type { InitialiseInploiSdkParams, InploiSdk } from './sdk';\n\nexport type { AnalyticsService, AnalyticsLogEvent } from './sdk.analytics';\n","export const CONSOLE_PREFIX = '%c[inploi SDK]';\nexport const CONSOLE_STYLE = 'color: #65BC67; font-weight: bold;';\n\ntype LogMessage = (...data: any[]) => void;\nexport type Logger = {\n\twarn: LogMessage;\n\terror: LogMessage;\n\tinfo: LogMessage;\n\tlog: LogMessage;\n};\n\nexport const inploiBrandedLogger: Logger = {\n\twarn: (...args) => console.warn(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\terror: (...args) => console.error(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\tinfo: (...args) => console.info(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\tlog: (...args) => console.log(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n};\n\nexport const noLogging: Logger = { info: () => void 0, error: () => void 0, log: () => void 0, warn: () => void 0 };\n","import { AnalyticsService } from './sdk.analytics';\nimport { ApiClient } from './sdk.api';\nimport { Logger } from './sdk.logger';\n\nexport type PluginParams = {\n\tapiClient: ApiClient;\n\tlogger: Logger;\n};\n\nexport type Plugin<T extends string, P extends Record<string, unknown>> = {\n\tpluginName: T;\n\tpure_createActions: (params: PluginParams) => P;\n};\n\ntype PluginDependencies = {\n\tapiClient: ApiClient;\n\tlogger: Logger;\n\tanalytics: AnalyticsService;\n};\n\nexport type InploiSdkPlugin = (dependencies: PluginDependencies) => any;\n\nexport const createPlugin = <T extends InploiSdkPlugin>(pluginFn: T) => pluginFn;\n","export const unauthenticatedMessage = 'Unauthenticated';\nexport const unauthorisedMessage = 'This action is unauthorized.';\n\nexport class NotFoundError extends Error {\n\tconstructor() {\n\t\tsuper('Not found');\n\t\tthis.name = 'NotFoundError';\n\t}\n}\n\nexport class UnauthorisedError extends Error {\n\tconstructor(message?: string) {\n\t\tsuper(message ?? 'You are not authorised to perform this action.');\n\t\tthis.name = 'UnauthorisedError';\n\t}\n}\n\nexport class ApiError extends Error {\n\terrors: unknown[];\n\tconstructor(message: string, errors: unknown[]) {\n\t\tsuper(`API error: “${message}”`);\n\t\tthis.name = 'ApiError';\n\t\tthis.errors = errors;\n\t}\n}\n\nexport class ParsingError extends Error {\n\tconstructor() {\n\t\tsuper('Error parsing response into JSON.');\n\t\tthis.name = 'ParsingError';\n\t}\n}\n\nexport type ApiClient = {\n\tfetch: (pathname: string, options?: RequestInit) => Promise<unknown>;\n};\n\nexport const createApiClient = (params: { baseUrl: string; publishableKey: string }): ApiClient => {\n\tconst defaultHeaders: HeadersInit = {\n\t\tAccept: 'application/json',\n\t\t'Content-Type': 'application/json',\n\t\t'x-publishable-key': params.publishableKey,\n\t};\n\n\treturn {\n\t\t/** Fetches from a pathname with a pre-established base path.\n\t\t * Parses received output as JSON, and throw if one of the common error messages is received.\n\t\t */\n\t\tfetch: async (pathname, options = {}) => {\n\t\t\tconst init = { ...options, headers: { ...options.headers, ...defaultHeaders } };\n\t\t\tconst response = await fetch(`${params.baseUrl}${pathname}`, init);\n\t\t\tif (response.status === 404) throw new NotFoundError();\n\n\t\t\tconst json = await response.json().catch(() => new ParsingError());\n\n\t\t\tif (typeof json === 'object' && json !== null && 'message' in json && typeof json.message === 'string') {\n\t\t\t\tif (json.message === unauthenticatedMessage) {\n\t\t\t\t\tthrow new UnauthorisedError('You are not authenticated.');\n\t\t\t\t}\n\t\t\t\tif (json.message === unauthorisedMessage) {\n\t\t\t\t\tthrow new UnauthorisedError();\n\t\t\t\t}\n\t\t\t\tif ('exception' in json) {\n\t\t\t\t\tthrow new ApiError(json.message, [json.exception]);\n\t\t\t\t}\n\t\t\t\tif ('errors' in json) {\n\t\t\t\t\tthrow new ApiError(json.message, Array.isArray(json.errors) ? json.errors : [json.errors]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We’re assuming no other exceptions have happened.\n\t\t\treturn json;\n\t\t},\n\t};\n};\n","export const exhaustive = (value: never) => {\n\tthrow new Error(`Unhandled discriminated union member: ${JSON.stringify(value)}`);\n};\n\nexport function invariant(condition: any, message?: string): asserts condition {\n\tif (condition) {\n\t\treturn;\n\t}\n\n\tthrow new Error(message);\n}\n\nexport const uniqueOrThrow = <T>(array: T[]) => {\n\tconst uniqueValues = new Set(array);\n\n\tif (array.length !== uniqueValues.size) {\n\t\tthrow new Error('Duplicate values found');\n\t}\n\treturn true;\n};\n\nexport const uniqueByPropertyOrThrow =\n\t<T extends PropertyKey>(propertyKey: T) =>\n\t(array: { [K in T]: any }[]) => {\n\t\tconst values = array.map(item => item[propertyKey]);\n\t\tconst uniqueValues = new Set(values);\n\n\t\tif (values.length !== uniqueValues.size) {\n\t\t\tthrow new Error(`Duplicate values found for property: ${propertyKey.toString()}`);\n\t\t}\n\t\treturn true;\n\t};\n\n/**\n * A destructive way to ensure an object has a property.\n * This is useful when working with unknowns.\n */\nexport function hasProp<K extends PropertyKey>(data: object, prop: K): data is Record<K, unknown> {\n\treturn prop in data;\n}\n\n/**\n * A sort of type-safe way to check whether a key exists in an object.\n */\nexport function isKeyInObj<O extends Record<string, unknown>>(key: PropertyKey, obj: O): key is keyof O {\n\treturn key in obj;\n}\n","{\n\t\"name\": \"@inploi/sdk\",\n\t\"version\": \"1.13.2\",\n\t\"main\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"license\": \"MIT\",\n\t\"files\": [\n\t\t\"/dist\",\n\t\t\"/cdn\"\n\t],\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"require\": \"./dist/index.js\",\n\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\"types\": \"./dist/index.d.ts\"\n\t\t}\n\t},\n\t\"scripts\": {\n\t\t\"build:npm\": \"tsup --dts --dts-resolve\",\n\t\t\"build:cdn\": \"tsup --config tsup.cdn.config.ts\",\n\t\t\"build\": \"concurrently 'pnpm run build:npm' 'pnpm run build:cdn'\",\n\t\t\"dev\": \"tsup --watch --config tsup.cdn.config.ts\",\n\t\t\"check\": \"eslint src --fix --max-warnings 0 && tsc\",\n\t\t\"test\": \"bun test\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@happy-dom/global-registrator\": \"^13.6.2\",\n\t\t\"@inploi/core\": \"workspace:*\",\n\t\t\"@total-typescript/ts-reset\": \"^0.5.1\",\n\t\t\"@types/bun\": \"^1.0.8\",\n\t\t\"@types/react\": \"^18.2.33\",\n\t\t\"@types/react-dom\": \"^18.2.14\",\n\t\t\"autoprefixer\": \"^10.4.16\",\n\t\t\"eslint\": \"^7.32.0\",\n\t\t\"eslint-config-custom\": \"workspace:*\",\n\t\t\"happy-dom\": \"^12.6.0\",\n\t\t\"ts-toolbelt\": \"^9.6.0\",\n\t\t\"tsconfig\": \"workspace:*\",\n\t\t\"tsup\": \"^7.2.0\"\n\t}\n}\n","import { version } from '../package.json';\n\n/**\n * The environment the SDK should run in.\n * - `production`: data will be stored and displayed on dashboards\n * - `sandbox`: data will be stored temporarily and purged periodically\n */\nexport type InploiSdkEnvironment = 'production' | 'sandbox';\n\nexport const ENV_TO_API_URL: Record<InploiSdkEnvironment, string> = {\n\tsandbox: 'https://api.staging.inploi.com',\n\tproduction: 'https://api.inploi.com',\n\t// @ts-expect-error - local test environment\n\t_internal_local: 'http://api.test',\n};\n\nexport const ANALYTICS_VERSION = version;\n\nexport const LOG_PATHNAME = '/log';\n\nexport const ANALYTICS_COOKIE_NAME = 'isdk_session';\n","import type { ResponseObj } from '@inploi/core/common';\nimport { invariant } from '@inploi/core/common';\n\nimport { ApiClient, Logger } from '.';\nimport { ANALYTICS_COOKIE_NAME, ANALYTICS_VERSION, LOG_PATHNAME } from './sdk.constants';\n\nconst formatCookie = (value: string) => {\n\tconst now = new Date();\n\tnow.setTime(now.getTime() + 7 * 24 * 60 * 60 * 1000); // 7 days expiration\n\n\treturn `${ANALYTICS_COOKIE_NAME}=${value};expires=${now.toUTCString()};path=/`;\n};\n\ntype AnalyticsLogParams =\n\t| {\n\t\t\tevent: 'VIEW_JOB';\n\t\t\tproperties: {\n\t\t\t\tjob_id: string; // External job ID\n\t\t\t\t/** @default \"external\" */\n\t\t\t\tkey?: 'id' | 'external_id';\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'APPLY_REDIRECT';\n\t\t\tproperties: {\n\t\t\t\tjob_id: string; // External job ID\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'FLOW_START' | 'FLOW_END';\n\t\t\tproperties: {\n\t\t\t\tflow_id: string;\n\t\t\t\tflow_version: number;\n\t\t\t\tflow_session_id: string;\n\t\t\t\tflow_build: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'FLOW_NODE';\n\t\t\tproperties: {\n\t\t\t\t/** Increments by 1 per node interpreted */\n\t\t\t\tsequence: number;\n\t\t\t\tfrom_node_id: string;\n\t\t\t\tto_node_id: string;\n\t\t\t\tflow_id: string;\n\t\t\t\tflow_version: number;\n\t\t\t\tflow_session_id: string;\n\t\t\t\tflow_build: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'IDENTIFY' | 'SUBMIT_FORM' | 'VIEW_PAGE';\n\t\t\tproperties?: never;\n\t };\n\nexport type AnalyticsLogEvent = AnalyticsLogParams['event'];\n\ntype EventPropertyMap = {\n\t[Param in AnalyticsLogParams as Param['event']]: Omit<Param, 'event'>;\n};\n\ntype AnalyticsContext = {\n\tlibrary: {\n\t\tname: 'inploi-sdk';\n\t\tversion: string;\n\t};\n\tpage: {\n\t\thref: string;\n\t\treferrer: string;\n\t\ttitle: string;\n\t};\n};\n\ntype TrackPayload<P = EventPropertyMap[keyof EventPropertyMap]['properties']> = {\n\tanonymous_id: string | null;\n\tsession_id: string | null;\n\tevent: AnalyticsLogEvent;\n\tsent_at: string;\n\tcontext: AnalyticsContext;\n\tproperties: P;\n\tcustom_properties?: Record<string, unknown>;\n};\n\ntype LogFnParams<T extends keyof EventPropertyMap> = {\n\tevent: T;\n\tattributionKey?: string;\n\tcustomProperties?: Record<string, unknown>;\n\t/** Passing a request will make logging possible on a server environment. */\n\trequest?: Request;\n} & EventPropertyMap[T];\n\ntype LogFn = <TEvent extends keyof EventPropertyMap>(\n\tparams: LogFnParams<TEvent>,\n) => Promise<ResponseObj<TrackPayload<EventPropertyMap[TEvent]['properties']>>>;\n\nexport type AnalyticsService = {\n\tlog: LogFn;\n\t/** From a log payload data, generate headers to use in server environments to update the anonymous_id */\n\tgetHeaders: (payload: TrackPayload) => Headers;\n\tgetSessionInfo: typeof getSessionInfo;\n};\n\nconst getSessionId = (searchParams: URLSearchParams, isServer: boolean) => {\n\tconst fromSearchParams = searchParams.get('session_id');\n\tif (isServer) return fromSearchParams;\n\tif (fromSearchParams) return fromSearchParams;\n\tconst fromSessionStorage = sessionStorage.getItem(`${ANALYTICS_COOKIE_NAME}-session_id`);\n\tif (typeof fromSessionStorage === 'string') return fromSessionStorage;\n\treturn null;\n};\n\nconst cookieRegex = new RegExp(`${ANALYTICS_COOKIE_NAME}=([^;]+)`);\nconst getSessionInfo = (request?: Request) => {\n\tconst href = request ? request.url : location.href;\n\tconst { searchParams } = new URL(href);\n\tconst anonymous_id = searchParams.get('anonymous_id');\n\tconst session_id = getSessionId(searchParams, typeof window === 'undefined');\n\n\t// If there’s an anonymous_id in the search params, use it\n\tif (anonymous_id)\n\t\treturn {\n\t\t\tanonymous_id,\n\t\t\tsession_id,\n\t\t};\n\n\t// If there’s a cookie, use it\n\tconst cookie = request ? request.headers.get('cookie') : document.cookie;\n\tif (cookie) {\n\t\tconst match = cookieRegex.exec(cookie);\n\t\tconst anonymous_id = match?.[1];\n\t\treturn {\n\t\t\tanonymous_id: anonymous_id ?? null,\n\t\t\tsession_id,\n\t\t};\n\t}\n\n\t// Otherwise, return what we have\n\treturn {\n\t\tanonymous_id,\n\t\tsession_id,\n\t};\n};\n\nconst getSessionInfoFromResponse = (response: unknown) => {\n\tif (typeof response !== 'object' || response === null) return null;\n\treturn {\n\t\tanonymous_id:\n\t\t\t'anonymous_id' in response && typeof response.anonymous_id === 'string' ? response.anonymous_id : null,\n\t\tsession_id: 'session_id' in response && typeof response.session_id === 'string' ? response.session_id : null,\n\t};\n};\n\nexport const createAnalyticsService = ({\n\tapiClient,\n\tlogger,\n}: {\n\tlogger: Logger;\n\tapiClient: ApiClient;\n}): AnalyticsService => {\n\tconst logFn: LogFn = async params => {\n\t\tinvariant(\n\t\t\tparams.request || typeof window !== 'undefined',\n\t\t\t'Cannot log on the server without a request. Please pass a request to `log`.',\n\t\t);\n\n\t\t// if there’s a request, use it instead of browser APIs\n\t\tconst page =\n\t\t\t'request' in params && params.request ?\n\t\t\t\t{\n\t\t\t\t\thref: params.request.url,\n\t\t\t\t\treferrer: params.request.referrer,\n\t\t\t\t\ttitle: '',\n\t\t\t\t}\n\t\t\t:\t{\n\t\t\t\t\thref: location.href,\n\t\t\t\t\treferrer: document.referrer,\n\t\t\t\t\ttitle: document.title,\n\t\t\t\t};\n\n\t\ttry {\n\t\t\tconst context: AnalyticsContext = {\n\t\t\t\tlibrary: {\n\t\t\t\t\tname: 'inploi-sdk',\n\t\t\t\t\tversion: ANALYTICS_VERSION,\n\t\t\t\t},\n\t\t\t\tpage,\n\t\t\t};\n\n\t\t\tconst sessionInfo = getSessionInfo(params.request);\n\t\t\tconst payload: TrackPayload = {\n\t\t\t\tanonymous_id: sessionInfo.anonymous_id,\n\t\t\t\tsession_id: sessionInfo.session_id,\n\t\t\t\tevent: params.event,\n\t\t\t\tsent_at: new Date().toISOString(),\n\t\t\t\tcontext,\n\t\t\t\tproperties: params.properties,\n\t\t\t\tcustom_properties: params.customProperties,\n\t\t\t};\n\n\t\t\tconst responseJson = await apiClient.fetch(LOG_PATHNAME, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t});\n\n\t\t\tconst newSession = getSessionInfoFromResponse(responseJson);\n\t\t\tif (newSession?.anonymous_id) {\n\t\t\t\tpayload.anonymous_id = newSession.anonymous_id;\n\t\t\t}\n\t\t\tif (newSession?.session_id) {\n\t\t\t\tpayload.session_id = newSession.session_id;\n\t\t\t}\n\n\t\t\tif (typeof window !== 'undefined' && payload.anonymous_id) {\n\t\t\t\tif (payload.session_id) {\n\t\t\t\t\tsessionStorage.setItem(`${ANALYTICS_COOKIE_NAME}-session_id`, payload.session_id.toString());\n\t\t\t\t}\n\t\t\t\tdocument.cookie = formatCookie(payload.anonymous_id);\n\t\t\t}\n\n\t\t\treturn { success: true, data: payload };\n\t\t} catch (e) {\n\t\t\t/** We dont’t log any PII on the console */\n\t\t\tlogger.error('Failed to send log to API. Inspect error response of `log` for more information.');\n\t\t\treturn { success: false, error: e };\n\t\t}\n\t};\n\n\treturn {\n\t\tlog: logFn,\n\t\tgetHeaders: payload => {\n\t\t\tconst headers = new Headers();\n\t\t\tif (!payload.anonymous_id) return headers;\n\n\t\t\theaders.append('Set-Cookie', formatCookie(payload.anonymous_id));\n\t\t\treturn headers;\n\t\t},\n\t\tgetSessionInfo,\n\t};\n};\n","import { createAnalyticsService } from './sdk.analytics';\nimport { createApiClient } from './sdk.api';\nimport { ENV_TO_API_URL, InploiSdkEnvironment } from './sdk.constants';\nimport { Logger, inploiBrandedLogger, noLogging } from './sdk.logger';\nimport { InploiSdkPlugin } from './sdk.plugins';\n\nexport type InitialiseInploiSdkParams = {\n\t/** Your public API key for the inploi SDK. */\n\tpublishableKey: string;\n\t/** Which app environment to run. This ultimately affects which inploi endpoints to gather data are going to be used.\n\t * Anything other than `production` should be considered a development environment and the data periodicaly purged. */\n\tenv: InploiSdkEnvironment;\n\t/** Logger object that handles logging of different levels.\n\t * You can override this to use your own logger, or to disable logging altogether by passing`false`.\n\t * @default inploiBrandedLogger\n\t * */\n\tlogger?: Logger | false;\n};\n\nexport function initialiseSdk({ publishableKey, env, logger = inploiBrandedLogger }: InitialiseInploiSdkParams) {\n\tconst apiClient = createApiClient({ baseUrl: ENV_TO_API_URL[env], publishableKey });\n\tconst loggerService = logger === false ? noLogging : logger;\n\tconst analytics = createAnalyticsService({ apiClient, logger: loggerService });\n\n\tconst register = <P extends InploiSdkPlugin>(plugin: P): ReturnType<P> => {\n\t\treturn plugin({ logger: loggerService, apiClient, analytics });\n\t};\n\n\treturn { register, analytics, apiClient };\n}\n\nexport type InploiSdk = ReturnType<typeof initialiseSdk>;\n"],"mappings":"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","names":["src_exports","__export","ApiError","NotFoundError","ParsingError","UnauthorisedError","createPlugin","initialiseSdk","inploiBrandedLogger","noLogging","__toCommonJS","CONSOLE_PREFIX","CONSOLE_STYLE","inploiBrandedLogger","args","noLogging","createPlugin","pluginFn","unauthenticatedMessage","unauthorisedMessage","NotFoundError","UnauthorisedError","message","ApiError","errors","ParsingError","createApiClient","params","defaultHeaders","_0","_1","__async","pathname","options","init","__spreadProps","__spreadValues","response","json","invariant","condition","message","version","ENV_TO_API_URL","ANALYTICS_VERSION","version","LOG_PATHNAME","ANALYTICS_COOKIE_NAME","formatCookie","value","now","ANALYTICS_COOKIE_NAME","getSessionId","searchParams","isServer","fromSearchParams","fromSessionStorage","cookieRegex","getSessionInfo","request","href","anonymous_id","session_id","cookie","match","getSessionInfoFromResponse","response","createAnalyticsService","apiClient","logger","params","__async","invariant","page","context","ANALYTICS_VERSION","sessionInfo","payload","responseJson","LOG_PATHNAME","newSession","e","headers","initialiseSdk","publishableKey","env","logger","inploiBrandedLogger","apiClient","createApiClient","ENV_TO_API_URL","loggerService","noLogging","analytics","createAnalyticsService","plugin"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/sdk.logger.ts","../src/sdk.plugins.ts","../src/sdk.api.ts","../../core/src/common/common.utils.ts","../package.json","../src/sdk.constants.ts","../src/sdk.analytics.ts","../src/sdk.ts"],"sourcesContent":["export { inploiBrandedLogger, noLogging } from './sdk.logger';\nexport type { Logger } from './sdk.logger';\n\nexport type { PluginParams, InploiSdkPlugin } from './sdk.plugins';\nexport { createPlugin } from './sdk.plugins';\n\nexport type { InploiSdkEnvironment } from './sdk.constants';\n\nexport type { ApiClient } from './sdk.api';\nexport { ApiError, NotFoundError, ParsingError, UnauthorisedError } from './sdk.api';\n\nexport { initialiseSdk } from './sdk';\nexport type { InitialiseInploiSdkParams, InploiSdk } from './sdk';\n\nexport type { AnalyticsService, AnalyticsLogEvent } from './sdk.analytics';\n","export const CONSOLE_PREFIX = '%c[inploi SDK]';\nexport const CONSOLE_STYLE = 'color: #65BC67; font-weight: bold;';\n\ntype LogMessage = (...data: any[]) => void;\nexport type Logger = {\n\twarn: LogMessage;\n\terror: LogMessage;\n\tinfo: LogMessage;\n\tlog: LogMessage;\n};\n\nexport const inploiBrandedLogger: Logger = {\n\twarn: (...args) => console.warn(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\terror: (...args) => console.error(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\tinfo: (...args) => console.info(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\tlog: (...args) => console.log(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n};\n\nexport const noLogging: Logger = { info: () => void 0, error: () => void 0, log: () => void 0, warn: () => void 0 };\n","import { AnalyticsService } from './sdk.analytics';\nimport { ApiClient } from './sdk.api';\nimport { Logger } from './sdk.logger';\n\nexport type PluginParams = {\n\tapiClient: ApiClient;\n\tlogger: Logger;\n};\n\nexport type Plugin<T extends string, P extends Record<string, unknown>> = {\n\tpluginName: T;\n\tpure_createActions: (params: PluginParams) => P;\n};\n\ntype PluginDependencies = {\n\tapiClient: ApiClient;\n\tlogger: Logger;\n\tanalytics: AnalyticsService;\n};\n\nexport type InploiSdkPlugin = (dependencies: PluginDependencies) => any;\n\nexport const createPlugin = <T extends InploiSdkPlugin>(pluginFn: T) => pluginFn;\n","export const unauthenticatedMessage = 'Unauthenticated';\nexport const unauthorisedMessage = 'This action is unauthorized.';\n\nexport class NotFoundError extends Error {\n\tconstructor() {\n\t\tsuper('Not found');\n\t\tthis.name = 'NotFoundError';\n\t}\n}\n\nexport class UnauthorisedError extends Error {\n\tconstructor(message?: string) {\n\t\tsuper(message ?? 'You are not authorised to perform this action.');\n\t\tthis.name = 'UnauthorisedError';\n\t}\n}\n\nexport class ApiError extends Error {\n\terrors: unknown[];\n\tconstructor(message: string, errors: unknown[]) {\n\t\tsuper(`API error: “${message}”`);\n\t\tthis.name = 'ApiError';\n\t\tthis.errors = errors;\n\t}\n}\n\nexport class ParsingError extends Error {\n\tconstructor(public textResponse?: string) {\n\t\tsuper('Error parsing response into JSON.');\n\t\tthis.name = 'ParsingError';\n\t}\n}\n\nexport type ApiClient = {\n\tfetch: (pathname: string, options?: RequestInit) => Promise<unknown>;\n};\n\nexport const createApiClient = (params: { baseUrl: string; publishableKey: string }): ApiClient => {\n\tconst defaultHeaders: HeadersInit = {\n\t\tAccept: 'application/json',\n\t\t'Content-Type': 'application/json',\n\t\t'x-publishable-key': params.publishableKey,\n\t};\n\n\treturn {\n\t\t/** Fetches from a pathname with a pre-established base path.\n\t\t * Parses received output as JSON, and throw if one of the common error messages is received.\n\t\t */\n\t\tfetch: async (pathname, options = {}) => {\n\t\t\tconst init = { ...options, headers: { ...options.headers, ...defaultHeaders } };\n\t\t\tconst response = await fetch(`${params.baseUrl}${pathname}`, init);\n\t\t\tif (response.status === 404) throw new NotFoundError();\n\n\t\t\tconst json = await response.json().catch(async () => {\n\t\t\t\tthrow new ParsingError(await response.text());\n\t\t\t});\n\n\t\t\tif (typeof json === 'object' && json !== null && 'message' in json && typeof json.message === 'string') {\n\t\t\t\tif (json.message === unauthenticatedMessage) {\n\t\t\t\t\tthrow new UnauthorisedError('You are not authenticated.');\n\t\t\t\t}\n\t\t\t\tif (json.message === unauthorisedMessage) {\n\t\t\t\t\tthrow new UnauthorisedError();\n\t\t\t\t}\n\t\t\t\tif ('exception' in json) {\n\t\t\t\t\tthrow new ApiError(json.message, [json.exception]);\n\t\t\t\t}\n\t\t\t\tif ('errors' in json) {\n\t\t\t\t\tthrow new ApiError(json.message, Array.isArray(json.errors) ? json.errors : [json.errors]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We’re assuming no other exceptions have happened.\n\t\t\treturn json;\n\t\t},\n\t};\n};\n","export const exhaustive = (value: never) => {\n\tthrow new Error(`Unhandled discriminated union member: ${JSON.stringify(value)}`);\n};\n\nexport function invariant(condition: any, message?: string): asserts condition {\n\tif (condition) {\n\t\treturn;\n\t}\n\n\tthrow new Error(message);\n}\n\nexport const uniqueOrThrow = <T>(array: T[]) => {\n\tconst uniqueValues = new Set(array);\n\n\tif (array.length !== uniqueValues.size) {\n\t\tthrow new Error('Duplicate values found');\n\t}\n\treturn true;\n};\n\nexport const uniqueByPropertyOrThrow =\n\t<T extends PropertyKey>(propertyKey: T) =>\n\t(array: { [K in T]: any }[]) => {\n\t\tconst values = array.map(item => item[propertyKey]);\n\t\tconst uniqueValues = new Set(values);\n\n\t\tif (values.length !== uniqueValues.size) {\n\t\t\tthrow new Error(`Duplicate values found for property: ${propertyKey.toString()}`);\n\t\t}\n\t\treturn true;\n\t};\n\n/**\n * A destructive way to ensure an object has a property.\n * This is useful when working with unknowns.\n */\nexport function hasProp<K extends PropertyKey>(data: object, prop: K): data is Record<K, unknown> {\n\treturn prop in data;\n}\n\n/**\n * A sort of type-safe way to check whether a key exists in an object.\n */\nexport function isKeyInObj<O extends Record<string, unknown>>(key: PropertyKey, obj: O): key is keyof O {\n\treturn key in obj;\n}\n","{\n\t\"name\": \"@inploi/sdk\",\n\t\"version\": \"1.13.4\",\n\t\"main\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"license\": \"MIT\",\n\t\"files\": [\n\t\t\"/dist\",\n\t\t\"/cdn\"\n\t],\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"require\": \"./dist/index.js\",\n\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\"types\": \"./dist/index.d.ts\"\n\t\t}\n\t},\n\t\"scripts\": {\n\t\t\"build:npm\": \"tsup --dts --dts-resolve\",\n\t\t\"build:cdn\": \"tsup --config tsup.cdn.config.ts\",\n\t\t\"build\": \"concurrently 'pnpm run build:npm' 'pnpm run build:cdn'\",\n\t\t\"dev\": \"tsup --watch --config tsup.cdn.config.ts\",\n\t\t\"check\": \"eslint src --fix --max-warnings 0 && tsc\",\n\t\t\"test\": \"bun test\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@happy-dom/global-registrator\": \"^13.6.2\",\n\t\t\"@inploi/core\": \"workspace:*\",\n\t\t\"@total-typescript/ts-reset\": \"^0.5.1\",\n\t\t\"@types/bun\": \"^1.0.8\",\n\t\t\"@types/react\": \"^18.2.33\",\n\t\t\"@types/react-dom\": \"^18.2.14\",\n\t\t\"autoprefixer\": \"^10.4.16\",\n\t\t\"eslint\": \"^7.32.0\",\n\t\t\"eslint-config-custom\": \"workspace:*\",\n\t\t\"happy-dom\": \"^12.6.0\",\n\t\t\"ts-toolbelt\": \"^9.6.0\",\n\t\t\"tsconfig\": \"workspace:*\",\n\t\t\"tsup\": \"^7.2.0\"\n\t}\n}\n","import { version } from '../package.json';\n\n/**\n * The environment the SDK should run in.\n * - `production`: data will be stored and displayed on dashboards\n * - `sandbox`: data will be stored temporarily and purged periodically\n */\nexport type InploiSdkEnvironment = 'production' | 'sandbox';\n\nexport const ENV_TO_API_URL: Record<InploiSdkEnvironment, string> = {\n\tsandbox: 'https://api.staging.inploi.com',\n\tproduction: 'https://api.inploi.com',\n\t// @ts-expect-error - local test environment\n\t_internal_local: 'http://api.test',\n};\n\nexport const ANALYTICS_VERSION = version;\n\nexport const LOG_PATHNAME = '/log';\n\nexport const ANALYTICS_COOKIE_NAME = 'isdk_session';\n","import type { ResponseObj } from '@inploi/core/common';\nimport { invariant } from '@inploi/core/common';\n\nimport { ApiClient, Logger } from '.';\nimport { ANALYTICS_COOKIE_NAME, ANALYTICS_VERSION, LOG_PATHNAME } from './sdk.constants';\n\nconst formatCookie = (value: string) => {\n\tconst now = new Date();\n\tnow.setTime(now.getTime() + 7 * 24 * 60 * 60 * 1000); // 7 days expiration\n\n\treturn `${ANALYTICS_COOKIE_NAME}=${value};expires=${now.toUTCString()};path=/`;\n};\n\ntype AnalyticsLogParams =\n\t| {\n\t\t\tevent: 'VIEW_JOB';\n\t\t\tproperties: {\n\t\t\t\tjob_id: string;\n\t\t\t\t/** @default \"external_id\" */\n\t\t\t\tkey?: 'id' | 'external_id';\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'APPLY_REDIRECT';\n\t\t\tproperties: {\n\t\t\t\tjob_id: string;\n\t\t\t\t/** @default \"external_id\" */\n\t\t\t\tkey?: 'id' | 'external_id';\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'FLOW_START' | 'FLOW_END';\n\t\t\tproperties: {\n\t\t\t\tflow_id: string;\n\t\t\t\tflow_version: number;\n\t\t\t\tflow_session_id: string;\n\t\t\t\tflow_build: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'FLOW_NODE';\n\t\t\tproperties: {\n\t\t\t\t/** Increments by 1 per node interpreted */\n\t\t\t\tsequence: number;\n\t\t\t\tfrom_node_id: string;\n\t\t\t\tto_node_id: string;\n\t\t\t\tflow_id: string;\n\t\t\t\tflow_version: number;\n\t\t\t\tflow_session_id: string;\n\t\t\t\tflow_build: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'IDENTIFY' | 'SUBMIT_FORM' | 'VIEW_PAGE';\n\t\t\tproperties?: never;\n\t };\n\nexport type AnalyticsLogEvent = AnalyticsLogParams['event'];\n\ntype EventPropertyMap = {\n\t[Param in AnalyticsLogParams as Param['event']]: Omit<Param, 'event'>;\n};\n\ntype AnalyticsContext = {\n\tlibrary: {\n\t\tname: 'inploi-sdk';\n\t\tversion: string;\n\t};\n\tpage: {\n\t\thref: string;\n\t\treferrer: string;\n\t\ttitle: string;\n\t};\n};\n\ntype TrackPayload<P = EventPropertyMap[keyof EventPropertyMap]['properties']> = {\n\tanonymous_id: string | null;\n\tsession_id: string | null;\n\tevent: AnalyticsLogEvent;\n\tsent_at: string;\n\tcontext: AnalyticsContext;\n\tproperties: P;\n\tcustom_properties?: Record<string, unknown>;\n};\n\ntype LogFnParams<T extends keyof EventPropertyMap> = {\n\tevent: T;\n\tattributionKey?: string;\n\tcustomProperties?: Record<string, unknown>;\n\t/** Passing a request will make logging possible on a server environment. */\n\trequest?: Request;\n} & EventPropertyMap[T];\n\ntype LogFn = <TEvent extends keyof EventPropertyMap>(\n\tparams: LogFnParams<TEvent>,\n) => Promise<ResponseObj<TrackPayload<EventPropertyMap[TEvent]['properties']>>>;\n\nexport type AnalyticsService = {\n\tlog: LogFn;\n\t/** From a log payload data, generate headers to use in server environments to update the anonymous_id */\n\tgetHeaders: (payload: TrackPayload) => Headers;\n\tgetSessionInfo: typeof getSessionInfo;\n};\n\nconst getSessionId = (searchParams: URLSearchParams, isServer: boolean) => {\n\tconst fromSearchParams = searchParams.get('session_id');\n\tif (isServer) return fromSearchParams;\n\tif (fromSearchParams) return fromSearchParams;\n\tconst fromSessionStorage = sessionStorage.getItem(`${ANALYTICS_COOKIE_NAME}-session_id`);\n\tif (typeof fromSessionStorage === 'string') return fromSessionStorage;\n\treturn null;\n};\n\nconst cookieRegex = new RegExp(`${ANALYTICS_COOKIE_NAME}=([^;]+)`);\nconst getSessionInfo = (request?: Request) => {\n\tconst href = request ? request.url : location.href;\n\tconst { searchParams } = new URL(href);\n\tconst anonymous_id = searchParams.get('anonymous_id');\n\tconst session_id = getSessionId(searchParams, typeof window === 'undefined');\n\n\t// If there’s an anonymous_id in the search params, use it\n\tif (anonymous_id)\n\t\treturn {\n\t\t\tanonymous_id,\n\t\t\tsession_id,\n\t\t};\n\n\t// If there’s a cookie, use it\n\tconst cookie = request ? request.headers.get('cookie') : document.cookie;\n\tif (cookie) {\n\t\tconst match = cookieRegex.exec(cookie);\n\t\tconst anonymous_id = match?.[1];\n\t\treturn {\n\t\t\tanonymous_id: anonymous_id ?? null,\n\t\t\tsession_id,\n\t\t};\n\t}\n\n\t// Otherwise, return what we have\n\treturn {\n\t\tanonymous_id,\n\t\tsession_id,\n\t};\n};\n\nconst getSessionInfoFromResponse = (response: unknown) => {\n\tif (typeof response !== 'object' || response === null) return null;\n\treturn {\n\t\tanonymous_id:\n\t\t\t'anonymous_id' in response && typeof response.anonymous_id === 'string' ? response.anonymous_id : null,\n\t\tsession_id: 'session_id' in response && typeof response.session_id === 'string' ? response.session_id : null,\n\t};\n};\n\nexport const createAnalyticsService = ({\n\tapiClient,\n\tlogger,\n}: {\n\tlogger: Logger;\n\tapiClient: ApiClient;\n}): AnalyticsService => {\n\tconst logFn: LogFn = async params => {\n\t\tinvariant(\n\t\t\tparams.request || typeof window !== 'undefined',\n\t\t\t'Cannot log on the server without a request. Please pass a request to `log`.',\n\t\t);\n\n\t\t// if there’s a request, use it instead of browser APIs\n\t\tconst page =\n\t\t\t'request' in params && params.request ?\n\t\t\t\t{\n\t\t\t\t\thref: params.request.url,\n\t\t\t\t\treferrer: params.request.referrer,\n\t\t\t\t\ttitle: '',\n\t\t\t\t}\n\t\t\t:\t{\n\t\t\t\t\thref: location.href,\n\t\t\t\t\treferrer: document.referrer,\n\t\t\t\t\ttitle: document.title,\n\t\t\t\t};\n\n\t\ttry {\n\t\t\tconst context: AnalyticsContext = {\n\t\t\t\tlibrary: {\n\t\t\t\t\tname: 'inploi-sdk',\n\t\t\t\t\tversion: ANALYTICS_VERSION,\n\t\t\t\t},\n\t\t\t\tpage,\n\t\t\t};\n\n\t\t\tconst sessionInfo = getSessionInfo(params.request);\n\t\t\tconst payload: TrackPayload = {\n\t\t\t\tanonymous_id: sessionInfo.anonymous_id,\n\t\t\t\tsession_id: sessionInfo.session_id,\n\t\t\t\tevent: params.event,\n\t\t\t\tsent_at: new Date().toISOString(),\n\t\t\t\tcontext,\n\t\t\t\tproperties: params.properties,\n\t\t\t\tcustom_properties: params.customProperties,\n\t\t\t};\n\n\t\t\tconst responseJson = await apiClient.fetch(LOG_PATHNAME, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t});\n\n\t\t\tconst newSession = getSessionInfoFromResponse(responseJson);\n\t\t\tif (newSession?.anonymous_id) {\n\t\t\t\tpayload.anonymous_id = newSession.anonymous_id;\n\t\t\t}\n\t\t\tif (newSession?.session_id) {\n\t\t\t\tpayload.session_id = newSession.session_id;\n\t\t\t}\n\n\t\t\tif (typeof window !== 'undefined' && payload.anonymous_id) {\n\t\t\t\tif (payload.session_id) {\n\t\t\t\t\tsessionStorage.setItem(`${ANALYTICS_COOKIE_NAME}-session_id`, payload.session_id.toString());\n\t\t\t\t}\n\t\t\t\tdocument.cookie = formatCookie(payload.anonymous_id);\n\t\t\t}\n\n\t\t\treturn { success: true, data: payload };\n\t\t} catch (e) {\n\t\t\t/** We dont’t log any PII on the console */\n\t\t\tlogger.error('Failed to send log to API. Inspect error response of `log` for more information.');\n\t\t\treturn { success: false, error: e };\n\t\t}\n\t};\n\n\treturn {\n\t\tlog: logFn,\n\t\tgetHeaders: payload => {\n\t\t\tconst headers = new Headers();\n\t\t\tif (!payload.anonymous_id) return headers;\n\n\t\t\theaders.append('Set-Cookie', formatCookie(payload.anonymous_id));\n\t\t\treturn headers;\n\t\t},\n\t\tgetSessionInfo,\n\t};\n};\n","import { createAnalyticsService } from './sdk.analytics';\nimport { createApiClient } from './sdk.api';\nimport { ENV_TO_API_URL, InploiSdkEnvironment } from './sdk.constants';\nimport { Logger, inploiBrandedLogger, noLogging } from './sdk.logger';\nimport { InploiSdkPlugin } from './sdk.plugins';\n\nexport type InitialiseInploiSdkParams = {\n\t/** Your public API key for the inploi SDK. */\n\tpublishableKey: string;\n\t/** Which app environment to run. This ultimately affects which inploi endpoints to gather data are going to be used.\n\t * Anything other than `production` should be considered a development environment and the data periodicaly purged. */\n\tenv: InploiSdkEnvironment;\n\t/** Logger object that handles logging of different levels.\n\t * You can override this to use your own logger, or to disable logging altogether by passing`false`.\n\t * @default inploiBrandedLogger\n\t * */\n\tlogger?: Logger | false;\n};\n\nexport function initialiseSdk({ publishableKey, env, logger = inploiBrandedLogger }: InitialiseInploiSdkParams) {\n\tconst apiClient = createApiClient({ baseUrl: ENV_TO_API_URL[env], publishableKey });\n\tconst loggerService = logger === false ? noLogging : logger;\n\tconst analytics = createAnalyticsService({ apiClient, logger: loggerService });\n\n\tconst register = <P extends InploiSdkPlugin>(plugin: P): ReturnType<P> => {\n\t\treturn plugin({ logger: loggerService, apiClient, analytics });\n\t};\n\n\treturn { register, analytics, apiClient };\n}\n\nexport type InploiSdk = ReturnType<typeof initialiseSdk>;\n"],"mappings":"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","names":["src_exports","__export","ApiError","NotFoundError","ParsingError","UnauthorisedError","createPlugin","initialiseSdk","inploiBrandedLogger","noLogging","__toCommonJS","CONSOLE_PREFIX","CONSOLE_STYLE","inploiBrandedLogger","args","noLogging","createPlugin","pluginFn","unauthenticatedMessage","unauthorisedMessage","NotFoundError","UnauthorisedError","message","ApiError","errors","ParsingError","textResponse","createApiClient","params","defaultHeaders","_0","_1","__async","pathname","options","init","__spreadProps","__spreadValues","response","json","invariant","condition","message","version","ENV_TO_API_URL","ANALYTICS_VERSION","version","LOG_PATHNAME","ANALYTICS_COOKIE_NAME","formatCookie","value","now","ANALYTICS_COOKIE_NAME","getSessionId","searchParams","isServer","fromSearchParams","fromSessionStorage","cookieRegex","getSessionInfo","request","href","anonymous_id","session_id","cookie","match","getSessionInfoFromResponse","response","createAnalyticsService","apiClient","logger","params","__async","invariant","page","context","ANALYTICS_VERSION","sessionInfo","payload","responseJson","LOG_PATHNAME","newSession","e","headers","initialiseSdk","publishableKey","env","logger","inploiBrandedLogger","apiClient","createApiClient","ENV_TO_API_URL","loggerService","noLogging","analytics","createAnalyticsService","plugin"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var R=Object.defineProperty,N=Object.defineProperties;var M=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,F=Object.prototype.propertyIsEnumerable;var S=(e,n,
|
|
1
|
+
var R=Object.defineProperty,N=Object.defineProperties;var M=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var q=Object.prototype.hasOwnProperty,F=Object.prototype.propertyIsEnumerable;var S=(e,n,t)=>n in e?R(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,m=(e,n)=>{for(var t in n||(n={}))q.call(n,t)&&S(e,t,n[t]);if(w)for(var t of w(n))F.call(n,t)&&S(e,t,n[t]);return e},k=(e,n)=>N(e,M(n));var l=(e,n,t)=>new Promise((o,s)=>{var p=r=>{try{i(t.next(r))}catch(a){s(a)}},c=r=>{try{i(t.throw(r))}catch(a){s(a)}},i=r=>r.done?o(r.value):Promise.resolve(r.value).then(p,c);i((t=t.apply(e,n)).next())});var f="%c[inploi SDK]",y="color: #65BC67; font-weight: bold;",h={warn:(...e)=>console.warn(f,y,...e),error:(...e)=>console.error(f,y,...e),info:(...e)=>console.info(f,y,...e),log:(...e)=>console.log(f,y,...e)},P={info:()=>{},error:()=>{},log:()=>{},warn:()=>{}};var j=e=>e;var D="Unauthenticated",U="This action is unauthorized.",_=class extends Error{constructor(){super("Not found"),this.name="NotFoundError"}},d=class extends Error{constructor(n){super(n!=null?n:"You are not authorised to perform this action."),this.name="UnauthorisedError"}},u=class extends Error{constructor(t,o){super(`API error: \u201C${t}\u201D`);this.name="ApiError",this.errors=o}},x=class extends Error{constructor(t){super("Error parsing response into JSON.");this.textResponse=t;this.name="ParsingError"}},E=e=>{let n={Accept:"application/json","Content-Type":"application/json","x-publishable-key":e.publishableKey};return{fetch:(s,...p)=>l(void 0,[s,...p],function*(t,o={}){let c=k(m({},o),{headers:m(m({},o.headers),n)}),i=yield fetch(`${e.baseUrl}${t}`,c);if(i.status===404)throw new _;let r=yield i.json().catch(()=>l(void 0,null,function*(){throw new x(yield i.text())}));if(typeof r=="object"&&r!==null&&"message"in r&&typeof r.message=="string"){if(r.message===D)throw new d("You are not authenticated.");if(r.message===U)throw new d;if("exception"in r)throw new u(r.message,[r.exception]);if("errors"in r)throw new u(r.message,Array.isArray(r.errors)?r.errors:[r.errors])}return r})}};function v(e,n){if(!e)throw new Error(n)}var A="1.13.4";var I={sandbox:"https://api.staging.inploi.com",production:"https://api.inploi.com",_internal_local:"http://api.test"},L=A,b="/log",g="isdk_session";var T=e=>{let n=new Date;return n.setTime(n.getTime()+7*24*60*60*1e3),`${g}=${e};expires=${n.toUTCString()};path=/`},Y=(e,n)=>{let t=e.get("session_id");if(n||t)return t;let o=sessionStorage.getItem(`${g}-session_id`);return typeof o=="string"?o:null},B=new RegExp(`${g}=([^;]+)`),O=e=>{let n=e?e.url:location.href,{searchParams:t}=new URL(n),o=t.get("anonymous_id"),s=Y(t,typeof window=="undefined");if(o)return{anonymous_id:o,session_id:s};let p=e?e.headers.get("cookie"):document.cookie;if(p){let c=B.exec(p),i=c==null?void 0:c[1];return{anonymous_id:i!=null?i:null,session_id:s}}return{anonymous_id:o,session_id:s}},H=e=>typeof e!="object"||e===null?null:{anonymous_id:"anonymous_id"in e&&typeof e.anonymous_id=="string"?e.anonymous_id:null,session_id:"session_id"in e&&typeof e.session_id=="string"?e.session_id:null},C=({apiClient:e,logger:n})=>({log:o=>l(void 0,null,function*(){v(o.request||typeof window!="undefined","Cannot log on the server without a request. Please pass a request to `log`.");let s="request"in o&&o.request?{href:o.request.url,referrer:o.request.referrer,title:""}:{href:location.href,referrer:document.referrer,title:document.title};try{let p={library:{name:"inploi-sdk",version:L},page:s},c=O(o.request),i={anonymous_id:c.anonymous_id,session_id:c.session_id,event:o.event,sent_at:new Date().toISOString(),context:p,properties:o.properties,custom_properties:o.customProperties},r=yield e.fetch(b,{method:"POST",body:JSON.stringify(i)}),a=H(r);return a!=null&&a.anonymous_id&&(i.anonymous_id=a.anonymous_id),a!=null&&a.session_id&&(i.session_id=a.session_id),typeof window!="undefined"&&i.anonymous_id&&(i.session_id&&sessionStorage.setItem(`${g}-session_id`,i.session_id.toString()),document.cookie=T(i.anonymous_id)),{success:!0,data:i}}catch(p){return n.error("Failed to send log to API. Inspect error response of `log` for more information."),{success:!1,error:p}}}),getHeaders:o=>{let s=new Headers;return o.anonymous_id&&s.append("Set-Cookie",T(o.anonymous_id)),s},getSessionInfo:O});function K({publishableKey:e,env:n,logger:t=h}){let o=E({baseUrl:I[n],publishableKey:e}),s=t===!1?P:t,p=C({apiClient:o,logger:s});return{register:i=>i({logger:s,apiClient:o,analytics:p}),analytics:p,apiClient:o}}export{u as ApiError,_ as NotFoundError,x as ParsingError,d as UnauthorisedError,j as createPlugin,K as initialiseSdk,h as inploiBrandedLogger,P as noLogging};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sdk.logger.ts","../src/sdk.plugins.ts","../src/sdk.api.ts","../../core/src/common/common.utils.ts","../package.json","../src/sdk.constants.ts","../src/sdk.analytics.ts","../src/sdk.ts"],"sourcesContent":["export const CONSOLE_PREFIX = '%c[inploi SDK]';\nexport const CONSOLE_STYLE = 'color: #65BC67; font-weight: bold;';\n\ntype LogMessage = (...data: any[]) => void;\nexport type Logger = {\n\twarn: LogMessage;\n\terror: LogMessage;\n\tinfo: LogMessage;\n\tlog: LogMessage;\n};\n\nexport const inploiBrandedLogger: Logger = {\n\twarn: (...args) => console.warn(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\terror: (...args) => console.error(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\tinfo: (...args) => console.info(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\tlog: (...args) => console.log(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n};\n\nexport const noLogging: Logger = { info: () => void 0, error: () => void 0, log: () => void 0, warn: () => void 0 };\n","import { AnalyticsService } from './sdk.analytics';\nimport { ApiClient } from './sdk.api';\nimport { Logger } from './sdk.logger';\n\nexport type PluginParams = {\n\tapiClient: ApiClient;\n\tlogger: Logger;\n};\n\nexport type Plugin<T extends string, P extends Record<string, unknown>> = {\n\tpluginName: T;\n\tpure_createActions: (params: PluginParams) => P;\n};\n\ntype PluginDependencies = {\n\tapiClient: ApiClient;\n\tlogger: Logger;\n\tanalytics: AnalyticsService;\n};\n\nexport type InploiSdkPlugin = (dependencies: PluginDependencies) => any;\n\nexport const createPlugin = <T extends InploiSdkPlugin>(pluginFn: T) => pluginFn;\n","export const unauthenticatedMessage = 'Unauthenticated';\nexport const unauthorisedMessage = 'This action is unauthorized.';\n\nexport class NotFoundError extends Error {\n\tconstructor() {\n\t\tsuper('Not found');\n\t\tthis.name = 'NotFoundError';\n\t}\n}\n\nexport class UnauthorisedError extends Error {\n\tconstructor(message?: string) {\n\t\tsuper(message ?? 'You are not authorised to perform this action.');\n\t\tthis.name = 'UnauthorisedError';\n\t}\n}\n\nexport class ApiError extends Error {\n\terrors: unknown[];\n\tconstructor(message: string, errors: unknown[]) {\n\t\tsuper(`API error: “${message}”`);\n\t\tthis.name = 'ApiError';\n\t\tthis.errors = errors;\n\t}\n}\n\nexport class ParsingError extends Error {\n\tconstructor() {\n\t\tsuper('Error parsing response into JSON.');\n\t\tthis.name = 'ParsingError';\n\t}\n}\n\nexport type ApiClient = {\n\tfetch: (pathname: string, options?: RequestInit) => Promise<unknown>;\n};\n\nexport const createApiClient = (params: { baseUrl: string; publishableKey: string }): ApiClient => {\n\tconst defaultHeaders: HeadersInit = {\n\t\tAccept: 'application/json',\n\t\t'Content-Type': 'application/json',\n\t\t'x-publishable-key': params.publishableKey,\n\t};\n\n\treturn {\n\t\t/** Fetches from a pathname with a pre-established base path.\n\t\t * Parses received output as JSON, and throw if one of the common error messages is received.\n\t\t */\n\t\tfetch: async (pathname, options = {}) => {\n\t\t\tconst init = { ...options, headers: { ...options.headers, ...defaultHeaders } };\n\t\t\tconst response = await fetch(`${params.baseUrl}${pathname}`, init);\n\t\t\tif (response.status === 404) throw new NotFoundError();\n\n\t\t\tconst json = await response.json().catch(() => new ParsingError());\n\n\t\t\tif (typeof json === 'object' && json !== null && 'message' in json && typeof json.message === 'string') {\n\t\t\t\tif (json.message === unauthenticatedMessage) {\n\t\t\t\t\tthrow new UnauthorisedError('You are not authenticated.');\n\t\t\t\t}\n\t\t\t\tif (json.message === unauthorisedMessage) {\n\t\t\t\t\tthrow new UnauthorisedError();\n\t\t\t\t}\n\t\t\t\tif ('exception' in json) {\n\t\t\t\t\tthrow new ApiError(json.message, [json.exception]);\n\t\t\t\t}\n\t\t\t\tif ('errors' in json) {\n\t\t\t\t\tthrow new ApiError(json.message, Array.isArray(json.errors) ? json.errors : [json.errors]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We’re assuming no other exceptions have happened.\n\t\t\treturn json;\n\t\t},\n\t};\n};\n","export const exhaustive = (value: never) => {\n\tthrow new Error(`Unhandled discriminated union member: ${JSON.stringify(value)}`);\n};\n\nexport function invariant(condition: any, message?: string): asserts condition {\n\tif (condition) {\n\t\treturn;\n\t}\n\n\tthrow new Error(message);\n}\n\nexport const uniqueOrThrow = <T>(array: T[]) => {\n\tconst uniqueValues = new Set(array);\n\n\tif (array.length !== uniqueValues.size) {\n\t\tthrow new Error('Duplicate values found');\n\t}\n\treturn true;\n};\n\nexport const uniqueByPropertyOrThrow =\n\t<T extends PropertyKey>(propertyKey: T) =>\n\t(array: { [K in T]: any }[]) => {\n\t\tconst values = array.map(item => item[propertyKey]);\n\t\tconst uniqueValues = new Set(values);\n\n\t\tif (values.length !== uniqueValues.size) {\n\t\t\tthrow new Error(`Duplicate values found for property: ${propertyKey.toString()}`);\n\t\t}\n\t\treturn true;\n\t};\n\n/**\n * A destructive way to ensure an object has a property.\n * This is useful when working with unknowns.\n */\nexport function hasProp<K extends PropertyKey>(data: object, prop: K): data is Record<K, unknown> {\n\treturn prop in data;\n}\n\n/**\n * A sort of type-safe way to check whether a key exists in an object.\n */\nexport function isKeyInObj<O extends Record<string, unknown>>(key: PropertyKey, obj: O): key is keyof O {\n\treturn key in obj;\n}\n","{\n\t\"name\": \"@inploi/sdk\",\n\t\"version\": \"1.13.2\",\n\t\"main\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"license\": \"MIT\",\n\t\"files\": [\n\t\t\"/dist\",\n\t\t\"/cdn\"\n\t],\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"require\": \"./dist/index.js\",\n\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\"types\": \"./dist/index.d.ts\"\n\t\t}\n\t},\n\t\"scripts\": {\n\t\t\"build:npm\": \"tsup --dts --dts-resolve\",\n\t\t\"build:cdn\": \"tsup --config tsup.cdn.config.ts\",\n\t\t\"build\": \"concurrently 'pnpm run build:npm' 'pnpm run build:cdn'\",\n\t\t\"dev\": \"tsup --watch --config tsup.cdn.config.ts\",\n\t\t\"check\": \"eslint src --fix --max-warnings 0 && tsc\",\n\t\t\"test\": \"bun test\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@happy-dom/global-registrator\": \"^13.6.2\",\n\t\t\"@inploi/core\": \"workspace:*\",\n\t\t\"@total-typescript/ts-reset\": \"^0.5.1\",\n\t\t\"@types/bun\": \"^1.0.8\",\n\t\t\"@types/react\": \"^18.2.33\",\n\t\t\"@types/react-dom\": \"^18.2.14\",\n\t\t\"autoprefixer\": \"^10.4.16\",\n\t\t\"eslint\": \"^7.32.0\",\n\t\t\"eslint-config-custom\": \"workspace:*\",\n\t\t\"happy-dom\": \"^12.6.0\",\n\t\t\"ts-toolbelt\": \"^9.6.0\",\n\t\t\"tsconfig\": \"workspace:*\",\n\t\t\"tsup\": \"^7.2.0\"\n\t}\n}\n","import { version } from '../package.json';\n\n/**\n * The environment the SDK should run in.\n * - `production`: data will be stored and displayed on dashboards\n * - `sandbox`: data will be stored temporarily and purged periodically\n */\nexport type InploiSdkEnvironment = 'production' | 'sandbox';\n\nexport const ENV_TO_API_URL: Record<InploiSdkEnvironment, string> = {\n\tsandbox: 'https://api.staging.inploi.com',\n\tproduction: 'https://api.inploi.com',\n\t// @ts-expect-error - local test environment\n\t_internal_local: 'http://api.test',\n};\n\nexport const ANALYTICS_VERSION = version;\n\nexport const LOG_PATHNAME = '/log';\n\nexport const ANALYTICS_COOKIE_NAME = 'isdk_session';\n","import type { ResponseObj } from '@inploi/core/common';\nimport { invariant } from '@inploi/core/common';\n\nimport { ApiClient, Logger } from '.';\nimport { ANALYTICS_COOKIE_NAME, ANALYTICS_VERSION, LOG_PATHNAME } from './sdk.constants';\n\nconst formatCookie = (value: string) => {\n\tconst now = new Date();\n\tnow.setTime(now.getTime() + 7 * 24 * 60 * 60 * 1000); // 7 days expiration\n\n\treturn `${ANALYTICS_COOKIE_NAME}=${value};expires=${now.toUTCString()};path=/`;\n};\n\ntype AnalyticsLogParams =\n\t| {\n\t\t\tevent: 'VIEW_JOB';\n\t\t\tproperties: {\n\t\t\t\tjob_id: string; // External job ID\n\t\t\t\t/** @default \"external\" */\n\t\t\t\tkey?: 'id' | 'external_id';\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'APPLY_REDIRECT';\n\t\t\tproperties: {\n\t\t\t\tjob_id: string; // External job ID\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'FLOW_START' | 'FLOW_END';\n\t\t\tproperties: {\n\t\t\t\tflow_id: string;\n\t\t\t\tflow_version: number;\n\t\t\t\tflow_session_id: string;\n\t\t\t\tflow_build: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'FLOW_NODE';\n\t\t\tproperties: {\n\t\t\t\t/** Increments by 1 per node interpreted */\n\t\t\t\tsequence: number;\n\t\t\t\tfrom_node_id: string;\n\t\t\t\tto_node_id: string;\n\t\t\t\tflow_id: string;\n\t\t\t\tflow_version: number;\n\t\t\t\tflow_session_id: string;\n\t\t\t\tflow_build: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'IDENTIFY' | 'SUBMIT_FORM' | 'VIEW_PAGE';\n\t\t\tproperties?: never;\n\t };\n\nexport type AnalyticsLogEvent = AnalyticsLogParams['event'];\n\ntype EventPropertyMap = {\n\t[Param in AnalyticsLogParams as Param['event']]: Omit<Param, 'event'>;\n};\n\ntype AnalyticsContext = {\n\tlibrary: {\n\t\tname: 'inploi-sdk';\n\t\tversion: string;\n\t};\n\tpage: {\n\t\thref: string;\n\t\treferrer: string;\n\t\ttitle: string;\n\t};\n};\n\ntype TrackPayload<P = EventPropertyMap[keyof EventPropertyMap]['properties']> = {\n\tanonymous_id: string | null;\n\tsession_id: string | null;\n\tevent: AnalyticsLogEvent;\n\tsent_at: string;\n\tcontext: AnalyticsContext;\n\tproperties: P;\n\tcustom_properties?: Record<string, unknown>;\n};\n\ntype LogFnParams<T extends keyof EventPropertyMap> = {\n\tevent: T;\n\tattributionKey?: string;\n\tcustomProperties?: Record<string, unknown>;\n\t/** Passing a request will make logging possible on a server environment. */\n\trequest?: Request;\n} & EventPropertyMap[T];\n\ntype LogFn = <TEvent extends keyof EventPropertyMap>(\n\tparams: LogFnParams<TEvent>,\n) => Promise<ResponseObj<TrackPayload<EventPropertyMap[TEvent]['properties']>>>;\n\nexport type AnalyticsService = {\n\tlog: LogFn;\n\t/** From a log payload data, generate headers to use in server environments to update the anonymous_id */\n\tgetHeaders: (payload: TrackPayload) => Headers;\n\tgetSessionInfo: typeof getSessionInfo;\n};\n\nconst getSessionId = (searchParams: URLSearchParams, isServer: boolean) => {\n\tconst fromSearchParams = searchParams.get('session_id');\n\tif (isServer) return fromSearchParams;\n\tif (fromSearchParams) return fromSearchParams;\n\tconst fromSessionStorage = sessionStorage.getItem(`${ANALYTICS_COOKIE_NAME}-session_id`);\n\tif (typeof fromSessionStorage === 'string') return fromSessionStorage;\n\treturn null;\n};\n\nconst cookieRegex = new RegExp(`${ANALYTICS_COOKIE_NAME}=([^;]+)`);\nconst getSessionInfo = (request?: Request) => {\n\tconst href = request ? request.url : location.href;\n\tconst { searchParams } = new URL(href);\n\tconst anonymous_id = searchParams.get('anonymous_id');\n\tconst session_id = getSessionId(searchParams, typeof window === 'undefined');\n\n\t// If there’s an anonymous_id in the search params, use it\n\tif (anonymous_id)\n\t\treturn {\n\t\t\tanonymous_id,\n\t\t\tsession_id,\n\t\t};\n\n\t// If there’s a cookie, use it\n\tconst cookie = request ? request.headers.get('cookie') : document.cookie;\n\tif (cookie) {\n\t\tconst match = cookieRegex.exec(cookie);\n\t\tconst anonymous_id = match?.[1];\n\t\treturn {\n\t\t\tanonymous_id: anonymous_id ?? null,\n\t\t\tsession_id,\n\t\t};\n\t}\n\n\t// Otherwise, return what we have\n\treturn {\n\t\tanonymous_id,\n\t\tsession_id,\n\t};\n};\n\nconst getSessionInfoFromResponse = (response: unknown) => {\n\tif (typeof response !== 'object' || response === null) return null;\n\treturn {\n\t\tanonymous_id:\n\t\t\t'anonymous_id' in response && typeof response.anonymous_id === 'string' ? response.anonymous_id : null,\n\t\tsession_id: 'session_id' in response && typeof response.session_id === 'string' ? response.session_id : null,\n\t};\n};\n\nexport const createAnalyticsService = ({\n\tapiClient,\n\tlogger,\n}: {\n\tlogger: Logger;\n\tapiClient: ApiClient;\n}): AnalyticsService => {\n\tconst logFn: LogFn = async params => {\n\t\tinvariant(\n\t\t\tparams.request || typeof window !== 'undefined',\n\t\t\t'Cannot log on the server without a request. Please pass a request to `log`.',\n\t\t);\n\n\t\t// if there’s a request, use it instead of browser APIs\n\t\tconst page =\n\t\t\t'request' in params && params.request ?\n\t\t\t\t{\n\t\t\t\t\thref: params.request.url,\n\t\t\t\t\treferrer: params.request.referrer,\n\t\t\t\t\ttitle: '',\n\t\t\t\t}\n\t\t\t:\t{\n\t\t\t\t\thref: location.href,\n\t\t\t\t\treferrer: document.referrer,\n\t\t\t\t\ttitle: document.title,\n\t\t\t\t};\n\n\t\ttry {\n\t\t\tconst context: AnalyticsContext = {\n\t\t\t\tlibrary: {\n\t\t\t\t\tname: 'inploi-sdk',\n\t\t\t\t\tversion: ANALYTICS_VERSION,\n\t\t\t\t},\n\t\t\t\tpage,\n\t\t\t};\n\n\t\t\tconst sessionInfo = getSessionInfo(params.request);\n\t\t\tconst payload: TrackPayload = {\n\t\t\t\tanonymous_id: sessionInfo.anonymous_id,\n\t\t\t\tsession_id: sessionInfo.session_id,\n\t\t\t\tevent: params.event,\n\t\t\t\tsent_at: new Date().toISOString(),\n\t\t\t\tcontext,\n\t\t\t\tproperties: params.properties,\n\t\t\t\tcustom_properties: params.customProperties,\n\t\t\t};\n\n\t\t\tconst responseJson = await apiClient.fetch(LOG_PATHNAME, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t});\n\n\t\t\tconst newSession = getSessionInfoFromResponse(responseJson);\n\t\t\tif (newSession?.anonymous_id) {\n\t\t\t\tpayload.anonymous_id = newSession.anonymous_id;\n\t\t\t}\n\t\t\tif (newSession?.session_id) {\n\t\t\t\tpayload.session_id = newSession.session_id;\n\t\t\t}\n\n\t\t\tif (typeof window !== 'undefined' && payload.anonymous_id) {\n\t\t\t\tif (payload.session_id) {\n\t\t\t\t\tsessionStorage.setItem(`${ANALYTICS_COOKIE_NAME}-session_id`, payload.session_id.toString());\n\t\t\t\t}\n\t\t\t\tdocument.cookie = formatCookie(payload.anonymous_id);\n\t\t\t}\n\n\t\t\treturn { success: true, data: payload };\n\t\t} catch (e) {\n\t\t\t/** We dont’t log any PII on the console */\n\t\t\tlogger.error('Failed to send log to API. Inspect error response of `log` for more information.');\n\t\t\treturn { success: false, error: e };\n\t\t}\n\t};\n\n\treturn {\n\t\tlog: logFn,\n\t\tgetHeaders: payload => {\n\t\t\tconst headers = new Headers();\n\t\t\tif (!payload.anonymous_id) return headers;\n\n\t\t\theaders.append('Set-Cookie', formatCookie(payload.anonymous_id));\n\t\t\treturn headers;\n\t\t},\n\t\tgetSessionInfo,\n\t};\n};\n","import { createAnalyticsService } from './sdk.analytics';\nimport { createApiClient } from './sdk.api';\nimport { ENV_TO_API_URL, InploiSdkEnvironment } from './sdk.constants';\nimport { Logger, inploiBrandedLogger, noLogging } from './sdk.logger';\nimport { InploiSdkPlugin } from './sdk.plugins';\n\nexport type InitialiseInploiSdkParams = {\n\t/** Your public API key for the inploi SDK. */\n\tpublishableKey: string;\n\t/** Which app environment to run. This ultimately affects which inploi endpoints to gather data are going to be used.\n\t * Anything other than `production` should be considered a development environment and the data periodicaly purged. */\n\tenv: InploiSdkEnvironment;\n\t/** Logger object that handles logging of different levels.\n\t * You can override this to use your own logger, or to disable logging altogether by passing`false`.\n\t * @default inploiBrandedLogger\n\t * */\n\tlogger?: Logger | false;\n};\n\nexport function initialiseSdk({ publishableKey, env, logger = inploiBrandedLogger }: InitialiseInploiSdkParams) {\n\tconst apiClient = createApiClient({ baseUrl: ENV_TO_API_URL[env], publishableKey });\n\tconst loggerService = logger === false ? noLogging : logger;\n\tconst analytics = createAnalyticsService({ apiClient, logger: loggerService });\n\n\tconst register = <P extends InploiSdkPlugin>(plugin: P): ReturnType<P> => {\n\t\treturn plugin({ logger: loggerService, apiClient, analytics });\n\t};\n\n\treturn { register, analytics, apiClient };\n}\n\nexport type InploiSdk = ReturnType<typeof initialiseSdk>;\n"],"mappings":"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","names":["CONSOLE_PREFIX","CONSOLE_STYLE","inploiBrandedLogger","args","noLogging","createPlugin","pluginFn","unauthenticatedMessage","unauthorisedMessage","NotFoundError","UnauthorisedError","message","ApiError","errors","ParsingError","createApiClient","params","defaultHeaders","_0","_1","__async","pathname","options","init","__spreadProps","__spreadValues","response","json","invariant","condition","message","version","ENV_TO_API_URL","ANALYTICS_VERSION","version","LOG_PATHNAME","ANALYTICS_COOKIE_NAME","formatCookie","value","now","ANALYTICS_COOKIE_NAME","getSessionId","searchParams","isServer","fromSearchParams","fromSessionStorage","cookieRegex","getSessionInfo","request","href","anonymous_id","session_id","cookie","match","getSessionInfoFromResponse","response","createAnalyticsService","apiClient","logger","params","__async","invariant","page","context","ANALYTICS_VERSION","sessionInfo","payload","responseJson","LOG_PATHNAME","newSession","e","headers","initialiseSdk","publishableKey","env","logger","inploiBrandedLogger","apiClient","createApiClient","ENV_TO_API_URL","loggerService","noLogging","analytics","createAnalyticsService","plugin"]}
|
|
1
|
+
{"version":3,"sources":["../src/sdk.logger.ts","../src/sdk.plugins.ts","../src/sdk.api.ts","../../core/src/common/common.utils.ts","../package.json","../src/sdk.constants.ts","../src/sdk.analytics.ts","../src/sdk.ts"],"sourcesContent":["export const CONSOLE_PREFIX = '%c[inploi SDK]';\nexport const CONSOLE_STYLE = 'color: #65BC67; font-weight: bold;';\n\ntype LogMessage = (...data: any[]) => void;\nexport type Logger = {\n\twarn: LogMessage;\n\terror: LogMessage;\n\tinfo: LogMessage;\n\tlog: LogMessage;\n};\n\nexport const inploiBrandedLogger: Logger = {\n\twarn: (...args) => console.warn(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\terror: (...args) => console.error(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\tinfo: (...args) => console.info(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n\tlog: (...args) => console.log(CONSOLE_PREFIX, CONSOLE_STYLE, ...args),\n};\n\nexport const noLogging: Logger = { info: () => void 0, error: () => void 0, log: () => void 0, warn: () => void 0 };\n","import { AnalyticsService } from './sdk.analytics';\nimport { ApiClient } from './sdk.api';\nimport { Logger } from './sdk.logger';\n\nexport type PluginParams = {\n\tapiClient: ApiClient;\n\tlogger: Logger;\n};\n\nexport type Plugin<T extends string, P extends Record<string, unknown>> = {\n\tpluginName: T;\n\tpure_createActions: (params: PluginParams) => P;\n};\n\ntype PluginDependencies = {\n\tapiClient: ApiClient;\n\tlogger: Logger;\n\tanalytics: AnalyticsService;\n};\n\nexport type InploiSdkPlugin = (dependencies: PluginDependencies) => any;\n\nexport const createPlugin = <T extends InploiSdkPlugin>(pluginFn: T) => pluginFn;\n","export const unauthenticatedMessage = 'Unauthenticated';\nexport const unauthorisedMessage = 'This action is unauthorized.';\n\nexport class NotFoundError extends Error {\n\tconstructor() {\n\t\tsuper('Not found');\n\t\tthis.name = 'NotFoundError';\n\t}\n}\n\nexport class UnauthorisedError extends Error {\n\tconstructor(message?: string) {\n\t\tsuper(message ?? 'You are not authorised to perform this action.');\n\t\tthis.name = 'UnauthorisedError';\n\t}\n}\n\nexport class ApiError extends Error {\n\terrors: unknown[];\n\tconstructor(message: string, errors: unknown[]) {\n\t\tsuper(`API error: “${message}”`);\n\t\tthis.name = 'ApiError';\n\t\tthis.errors = errors;\n\t}\n}\n\nexport class ParsingError extends Error {\n\tconstructor(public textResponse?: string) {\n\t\tsuper('Error parsing response into JSON.');\n\t\tthis.name = 'ParsingError';\n\t}\n}\n\nexport type ApiClient = {\n\tfetch: (pathname: string, options?: RequestInit) => Promise<unknown>;\n};\n\nexport const createApiClient = (params: { baseUrl: string; publishableKey: string }): ApiClient => {\n\tconst defaultHeaders: HeadersInit = {\n\t\tAccept: 'application/json',\n\t\t'Content-Type': 'application/json',\n\t\t'x-publishable-key': params.publishableKey,\n\t};\n\n\treturn {\n\t\t/** Fetches from a pathname with a pre-established base path.\n\t\t * Parses received output as JSON, and throw if one of the common error messages is received.\n\t\t */\n\t\tfetch: async (pathname, options = {}) => {\n\t\t\tconst init = { ...options, headers: { ...options.headers, ...defaultHeaders } };\n\t\t\tconst response = await fetch(`${params.baseUrl}${pathname}`, init);\n\t\t\tif (response.status === 404) throw new NotFoundError();\n\n\t\t\tconst json = await response.json().catch(async () => {\n\t\t\t\tthrow new ParsingError(await response.text());\n\t\t\t});\n\n\t\t\tif (typeof json === 'object' && json !== null && 'message' in json && typeof json.message === 'string') {\n\t\t\t\tif (json.message === unauthenticatedMessage) {\n\t\t\t\t\tthrow new UnauthorisedError('You are not authenticated.');\n\t\t\t\t}\n\t\t\t\tif (json.message === unauthorisedMessage) {\n\t\t\t\t\tthrow new UnauthorisedError();\n\t\t\t\t}\n\t\t\t\tif ('exception' in json) {\n\t\t\t\t\tthrow new ApiError(json.message, [json.exception]);\n\t\t\t\t}\n\t\t\t\tif ('errors' in json) {\n\t\t\t\t\tthrow new ApiError(json.message, Array.isArray(json.errors) ? json.errors : [json.errors]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// We’re assuming no other exceptions have happened.\n\t\t\treturn json;\n\t\t},\n\t};\n};\n","export const exhaustive = (value: never) => {\n\tthrow new Error(`Unhandled discriminated union member: ${JSON.stringify(value)}`);\n};\n\nexport function invariant(condition: any, message?: string): asserts condition {\n\tif (condition) {\n\t\treturn;\n\t}\n\n\tthrow new Error(message);\n}\n\nexport const uniqueOrThrow = <T>(array: T[]) => {\n\tconst uniqueValues = new Set(array);\n\n\tif (array.length !== uniqueValues.size) {\n\t\tthrow new Error('Duplicate values found');\n\t}\n\treturn true;\n};\n\nexport const uniqueByPropertyOrThrow =\n\t<T extends PropertyKey>(propertyKey: T) =>\n\t(array: { [K in T]: any }[]) => {\n\t\tconst values = array.map(item => item[propertyKey]);\n\t\tconst uniqueValues = new Set(values);\n\n\t\tif (values.length !== uniqueValues.size) {\n\t\t\tthrow new Error(`Duplicate values found for property: ${propertyKey.toString()}`);\n\t\t}\n\t\treturn true;\n\t};\n\n/**\n * A destructive way to ensure an object has a property.\n * This is useful when working with unknowns.\n */\nexport function hasProp<K extends PropertyKey>(data: object, prop: K): data is Record<K, unknown> {\n\treturn prop in data;\n}\n\n/**\n * A sort of type-safe way to check whether a key exists in an object.\n */\nexport function isKeyInObj<O extends Record<string, unknown>>(key: PropertyKey, obj: O): key is keyof O {\n\treturn key in obj;\n}\n","{\n\t\"name\": \"@inploi/sdk\",\n\t\"version\": \"1.13.4\",\n\t\"main\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"license\": \"MIT\",\n\t\"files\": [\n\t\t\"/dist\",\n\t\t\"/cdn\"\n\t],\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"require\": \"./dist/index.js\",\n\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\"types\": \"./dist/index.d.ts\"\n\t\t}\n\t},\n\t\"scripts\": {\n\t\t\"build:npm\": \"tsup --dts --dts-resolve\",\n\t\t\"build:cdn\": \"tsup --config tsup.cdn.config.ts\",\n\t\t\"build\": \"concurrently 'pnpm run build:npm' 'pnpm run build:cdn'\",\n\t\t\"dev\": \"tsup --watch --config tsup.cdn.config.ts\",\n\t\t\"check\": \"eslint src --fix --max-warnings 0 && tsc\",\n\t\t\"test\": \"bun test\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@happy-dom/global-registrator\": \"^13.6.2\",\n\t\t\"@inploi/core\": \"workspace:*\",\n\t\t\"@total-typescript/ts-reset\": \"^0.5.1\",\n\t\t\"@types/bun\": \"^1.0.8\",\n\t\t\"@types/react\": \"^18.2.33\",\n\t\t\"@types/react-dom\": \"^18.2.14\",\n\t\t\"autoprefixer\": \"^10.4.16\",\n\t\t\"eslint\": \"^7.32.0\",\n\t\t\"eslint-config-custom\": \"workspace:*\",\n\t\t\"happy-dom\": \"^12.6.0\",\n\t\t\"ts-toolbelt\": \"^9.6.0\",\n\t\t\"tsconfig\": \"workspace:*\",\n\t\t\"tsup\": \"^7.2.0\"\n\t}\n}\n","import { version } from '../package.json';\n\n/**\n * The environment the SDK should run in.\n * - `production`: data will be stored and displayed on dashboards\n * - `sandbox`: data will be stored temporarily and purged periodically\n */\nexport type InploiSdkEnvironment = 'production' | 'sandbox';\n\nexport const ENV_TO_API_URL: Record<InploiSdkEnvironment, string> = {\n\tsandbox: 'https://api.staging.inploi.com',\n\tproduction: 'https://api.inploi.com',\n\t// @ts-expect-error - local test environment\n\t_internal_local: 'http://api.test',\n};\n\nexport const ANALYTICS_VERSION = version;\n\nexport const LOG_PATHNAME = '/log';\n\nexport const ANALYTICS_COOKIE_NAME = 'isdk_session';\n","import type { ResponseObj } from '@inploi/core/common';\nimport { invariant } from '@inploi/core/common';\n\nimport { ApiClient, Logger } from '.';\nimport { ANALYTICS_COOKIE_NAME, ANALYTICS_VERSION, LOG_PATHNAME } from './sdk.constants';\n\nconst formatCookie = (value: string) => {\n\tconst now = new Date();\n\tnow.setTime(now.getTime() + 7 * 24 * 60 * 60 * 1000); // 7 days expiration\n\n\treturn `${ANALYTICS_COOKIE_NAME}=${value};expires=${now.toUTCString()};path=/`;\n};\n\ntype AnalyticsLogParams =\n\t| {\n\t\t\tevent: 'VIEW_JOB';\n\t\t\tproperties: {\n\t\t\t\tjob_id: string;\n\t\t\t\t/** @default \"external_id\" */\n\t\t\t\tkey?: 'id' | 'external_id';\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'APPLY_REDIRECT';\n\t\t\tproperties: {\n\t\t\t\tjob_id: string;\n\t\t\t\t/** @default \"external_id\" */\n\t\t\t\tkey?: 'id' | 'external_id';\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'FLOW_START' | 'FLOW_END';\n\t\t\tproperties: {\n\t\t\t\tflow_id: string;\n\t\t\t\tflow_version: number;\n\t\t\t\tflow_session_id: string;\n\t\t\t\tflow_build: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'FLOW_NODE';\n\t\t\tproperties: {\n\t\t\t\t/** Increments by 1 per node interpreted */\n\t\t\t\tsequence: number;\n\t\t\t\tfrom_node_id: string;\n\t\t\t\tto_node_id: string;\n\t\t\t\tflow_id: string;\n\t\t\t\tflow_version: number;\n\t\t\t\tflow_session_id: string;\n\t\t\t\tflow_build: number;\n\t\t\t};\n\t }\n\t| {\n\t\t\tevent: 'IDENTIFY' | 'SUBMIT_FORM' | 'VIEW_PAGE';\n\t\t\tproperties?: never;\n\t };\n\nexport type AnalyticsLogEvent = AnalyticsLogParams['event'];\n\ntype EventPropertyMap = {\n\t[Param in AnalyticsLogParams as Param['event']]: Omit<Param, 'event'>;\n};\n\ntype AnalyticsContext = {\n\tlibrary: {\n\t\tname: 'inploi-sdk';\n\t\tversion: string;\n\t};\n\tpage: {\n\t\thref: string;\n\t\treferrer: string;\n\t\ttitle: string;\n\t};\n};\n\ntype TrackPayload<P = EventPropertyMap[keyof EventPropertyMap]['properties']> = {\n\tanonymous_id: string | null;\n\tsession_id: string | null;\n\tevent: AnalyticsLogEvent;\n\tsent_at: string;\n\tcontext: AnalyticsContext;\n\tproperties: P;\n\tcustom_properties?: Record<string, unknown>;\n};\n\ntype LogFnParams<T extends keyof EventPropertyMap> = {\n\tevent: T;\n\tattributionKey?: string;\n\tcustomProperties?: Record<string, unknown>;\n\t/** Passing a request will make logging possible on a server environment. */\n\trequest?: Request;\n} & EventPropertyMap[T];\n\ntype LogFn = <TEvent extends keyof EventPropertyMap>(\n\tparams: LogFnParams<TEvent>,\n) => Promise<ResponseObj<TrackPayload<EventPropertyMap[TEvent]['properties']>>>;\n\nexport type AnalyticsService = {\n\tlog: LogFn;\n\t/** From a log payload data, generate headers to use in server environments to update the anonymous_id */\n\tgetHeaders: (payload: TrackPayload) => Headers;\n\tgetSessionInfo: typeof getSessionInfo;\n};\n\nconst getSessionId = (searchParams: URLSearchParams, isServer: boolean) => {\n\tconst fromSearchParams = searchParams.get('session_id');\n\tif (isServer) return fromSearchParams;\n\tif (fromSearchParams) return fromSearchParams;\n\tconst fromSessionStorage = sessionStorage.getItem(`${ANALYTICS_COOKIE_NAME}-session_id`);\n\tif (typeof fromSessionStorage === 'string') return fromSessionStorage;\n\treturn null;\n};\n\nconst cookieRegex = new RegExp(`${ANALYTICS_COOKIE_NAME}=([^;]+)`);\nconst getSessionInfo = (request?: Request) => {\n\tconst href = request ? request.url : location.href;\n\tconst { searchParams } = new URL(href);\n\tconst anonymous_id = searchParams.get('anonymous_id');\n\tconst session_id = getSessionId(searchParams, typeof window === 'undefined');\n\n\t// If there’s an anonymous_id in the search params, use it\n\tif (anonymous_id)\n\t\treturn {\n\t\t\tanonymous_id,\n\t\t\tsession_id,\n\t\t};\n\n\t// If there’s a cookie, use it\n\tconst cookie = request ? request.headers.get('cookie') : document.cookie;\n\tif (cookie) {\n\t\tconst match = cookieRegex.exec(cookie);\n\t\tconst anonymous_id = match?.[1];\n\t\treturn {\n\t\t\tanonymous_id: anonymous_id ?? null,\n\t\t\tsession_id,\n\t\t};\n\t}\n\n\t// Otherwise, return what we have\n\treturn {\n\t\tanonymous_id,\n\t\tsession_id,\n\t};\n};\n\nconst getSessionInfoFromResponse = (response: unknown) => {\n\tif (typeof response !== 'object' || response === null) return null;\n\treturn {\n\t\tanonymous_id:\n\t\t\t'anonymous_id' in response && typeof response.anonymous_id === 'string' ? response.anonymous_id : null,\n\t\tsession_id: 'session_id' in response && typeof response.session_id === 'string' ? response.session_id : null,\n\t};\n};\n\nexport const createAnalyticsService = ({\n\tapiClient,\n\tlogger,\n}: {\n\tlogger: Logger;\n\tapiClient: ApiClient;\n}): AnalyticsService => {\n\tconst logFn: LogFn = async params => {\n\t\tinvariant(\n\t\t\tparams.request || typeof window !== 'undefined',\n\t\t\t'Cannot log on the server without a request. Please pass a request to `log`.',\n\t\t);\n\n\t\t// if there’s a request, use it instead of browser APIs\n\t\tconst page =\n\t\t\t'request' in params && params.request ?\n\t\t\t\t{\n\t\t\t\t\thref: params.request.url,\n\t\t\t\t\treferrer: params.request.referrer,\n\t\t\t\t\ttitle: '',\n\t\t\t\t}\n\t\t\t:\t{\n\t\t\t\t\thref: location.href,\n\t\t\t\t\treferrer: document.referrer,\n\t\t\t\t\ttitle: document.title,\n\t\t\t\t};\n\n\t\ttry {\n\t\t\tconst context: AnalyticsContext = {\n\t\t\t\tlibrary: {\n\t\t\t\t\tname: 'inploi-sdk',\n\t\t\t\t\tversion: ANALYTICS_VERSION,\n\t\t\t\t},\n\t\t\t\tpage,\n\t\t\t};\n\n\t\t\tconst sessionInfo = getSessionInfo(params.request);\n\t\t\tconst payload: TrackPayload = {\n\t\t\t\tanonymous_id: sessionInfo.anonymous_id,\n\t\t\t\tsession_id: sessionInfo.session_id,\n\t\t\t\tevent: params.event,\n\t\t\t\tsent_at: new Date().toISOString(),\n\t\t\t\tcontext,\n\t\t\t\tproperties: params.properties,\n\t\t\t\tcustom_properties: params.customProperties,\n\t\t\t};\n\n\t\t\tconst responseJson = await apiClient.fetch(LOG_PATHNAME, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t});\n\n\t\t\tconst newSession = getSessionInfoFromResponse(responseJson);\n\t\t\tif (newSession?.anonymous_id) {\n\t\t\t\tpayload.anonymous_id = newSession.anonymous_id;\n\t\t\t}\n\t\t\tif (newSession?.session_id) {\n\t\t\t\tpayload.session_id = newSession.session_id;\n\t\t\t}\n\n\t\t\tif (typeof window !== 'undefined' && payload.anonymous_id) {\n\t\t\t\tif (payload.session_id) {\n\t\t\t\t\tsessionStorage.setItem(`${ANALYTICS_COOKIE_NAME}-session_id`, payload.session_id.toString());\n\t\t\t\t}\n\t\t\t\tdocument.cookie = formatCookie(payload.anonymous_id);\n\t\t\t}\n\n\t\t\treturn { success: true, data: payload };\n\t\t} catch (e) {\n\t\t\t/** We dont’t log any PII on the console */\n\t\t\tlogger.error('Failed to send log to API. Inspect error response of `log` for more information.');\n\t\t\treturn { success: false, error: e };\n\t\t}\n\t};\n\n\treturn {\n\t\tlog: logFn,\n\t\tgetHeaders: payload => {\n\t\t\tconst headers = new Headers();\n\t\t\tif (!payload.anonymous_id) return headers;\n\n\t\t\theaders.append('Set-Cookie', formatCookie(payload.anonymous_id));\n\t\t\treturn headers;\n\t\t},\n\t\tgetSessionInfo,\n\t};\n};\n","import { createAnalyticsService } from './sdk.analytics';\nimport { createApiClient } from './sdk.api';\nimport { ENV_TO_API_URL, InploiSdkEnvironment } from './sdk.constants';\nimport { Logger, inploiBrandedLogger, noLogging } from './sdk.logger';\nimport { InploiSdkPlugin } from './sdk.plugins';\n\nexport type InitialiseInploiSdkParams = {\n\t/** Your public API key for the inploi SDK. */\n\tpublishableKey: string;\n\t/** Which app environment to run. This ultimately affects which inploi endpoints to gather data are going to be used.\n\t * Anything other than `production` should be considered a development environment and the data periodicaly purged. */\n\tenv: InploiSdkEnvironment;\n\t/** Logger object that handles logging of different levels.\n\t * You can override this to use your own logger, or to disable logging altogether by passing`false`.\n\t * @default inploiBrandedLogger\n\t * */\n\tlogger?: Logger | false;\n};\n\nexport function initialiseSdk({ publishableKey, env, logger = inploiBrandedLogger }: InitialiseInploiSdkParams) {\n\tconst apiClient = createApiClient({ baseUrl: ENV_TO_API_URL[env], publishableKey });\n\tconst loggerService = logger === false ? noLogging : logger;\n\tconst analytics = createAnalyticsService({ apiClient, logger: loggerService });\n\n\tconst register = <P extends InploiSdkPlugin>(plugin: P): ReturnType<P> => {\n\t\treturn plugin({ logger: loggerService, apiClient, analytics });\n\t};\n\n\treturn { register, analytics, apiClient };\n}\n\nexport type InploiSdk = ReturnType<typeof initialiseSdk>;\n"],"mappings":"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","names":["CONSOLE_PREFIX","CONSOLE_STYLE","inploiBrandedLogger","args","noLogging","createPlugin","pluginFn","unauthenticatedMessage","unauthorisedMessage","NotFoundError","UnauthorisedError","message","ApiError","errors","ParsingError","textResponse","createApiClient","params","defaultHeaders","_0","_1","__async","pathname","options","init","__spreadProps","__spreadValues","response","json","invariant","condition","message","version","ENV_TO_API_URL","ANALYTICS_VERSION","version","LOG_PATHNAME","ANALYTICS_COOKIE_NAME","formatCookie","value","now","ANALYTICS_COOKIE_NAME","getSessionId","searchParams","isServer","fromSearchParams","fromSessionStorage","cookieRegex","getSessionInfo","request","href","anonymous_id","session_id","cookie","match","getSessionInfoFromResponse","response","createAnalyticsService","apiClient","logger","params","__async","invariant","page","context","ANALYTICS_VERSION","sessionInfo","payload","responseJson","LOG_PATHNAME","newSession","e","headers","initialiseSdk","publishableKey","env","logger","inploiBrandedLogger","apiClient","createApiClient","ENV_TO_API_URL","loggerService","noLogging","analytics","createAnalyticsService","plugin"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inploi/sdk",
|
|
3
|
-
"version": "1.13.
|
|
3
|
+
"version": "1.13.4",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"license": "MIT",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"happy-dom": "^12.6.0",
|
|
27
27
|
"ts-toolbelt": "^9.6.0",
|
|
28
28
|
"tsup": "^7.2.0",
|
|
29
|
-
"@inploi/core": "1.14.
|
|
29
|
+
"@inploi/core": "1.14.1",
|
|
30
30
|
"eslint-config-custom": "0.1.0",
|
|
31
31
|
"tsconfig": "0.1.0"
|
|
32
32
|
},
|