@buddy-technology/offer-component 0.3.2 → 1.0.0
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/CHANGELOG.md +27 -2
- package/README.md +77 -16
- package/dist/index.js +304 -130
- package/dist/index.js.map +1 -0
- package/dist/index.modern.mjs +273 -0
- package/dist/index.modern.mjs.map +1 -0
- package/lib/components/BuddyOfferElement.d.ts +5 -0
- package/lib/components/BuddyOfferElement.d.ts.map +1 -0
- package/lib/components/index.d.ts +2 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/hooks/index.d.ts +3 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/useConfig.d.ts +7 -0
- package/lib/hooks/useConfig.d.ts.map +1 -0
- package/lib/hooks/useUpdateEffect.d.ts +4 -0
- package/lib/hooks/useUpdateEffect.d.ts.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/interface/index.d.ts +70 -0
- package/lib/interface/index.d.ts.map +1 -0
- package/lib/util/dictionary.d.ts +21 -0
- package/lib/util/dictionary.d.ts.map +1 -0
- package/lib/util/index.d.ts +9 -0
- package/lib/util/index.d.ts.map +1 -0
- package/package.json +23 -29
- package/release.config.js +22 -0
- package/setupTests.ts +8 -0
- package/tsconfig.eslint.json +12 -0
- package/API.md +0 -174
- package/dist/util.js +0 -252
- package/lib/types.d.ts +0 -144
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/util/dictionary.ts","../src/util/index.ts","../src/hooks/useConfig.tsx","../src/hooks/useUpdateEffect.tsx","../src/components/BuddyOfferElement.tsx"],"sourcesContent":["const EXISTING_SCRIPT_MESSAGE = 'Buddy Offer Script is already loaded.';\n\nconst SCRIPTS = {\n\tLOCAL: {\n\t\tURL: 'http://localhost:8008/index.js',\n\t},\n\t// TODO: Delete this in favor of \"testing\", once we're sure nothing is using it.\n\tDEVELOPMENT: {\n\t\tURL: 'https://js.buddy.insure/v2/dev/index.js',\n\t},\n\tTESTING: {\n\t\tURL: 'https://js.buddy.insure/v2/testing/index.js',\n\t},\n\tSTAGING: {\n\t\tURL: 'https://js.buddy.insure/v2/staging/index.js',\n\t},\n\tPRODUCTION: {\n\t\tURL: 'https://js.buddy.insure/v2/index.js',\n\t},\n} as const;\n\nconst STAGES = Object.keys(SCRIPTS);\n\nexport {\n\tEXISTING_SCRIPT_MESSAGE,\n\tSCRIPTS,\n\tSTAGES,\n};\n","import { EXISTING_SCRIPT_MESSAGE, SCRIPTS, STAGES } from './dictionary';\nimport type { BuddyObject, IWindow } from '../interface';\n\ntype IStages = keyof typeof SCRIPTS;\n\nconst defaultOptions = {\n\tstage: 'STAGING',\n} as const;\n\nconst isEmptyOrNil = (value: any) => {\n\tconst isNil = (val: any) => [undefined, null].includes(val);\n\tconst isEmptyStr = (str: any) => typeof str === 'string' && str.trim().length === 0;\n\tconst isEmptyObjOrArr = (obj: any) => (typeof obj === 'object' && obj.length === undefined &&\n\t\tObject.keys(obj).length === 0) || (Array.isArray(obj) && obj.length === 0);\n\treturn (isNil(value) || isEmptyStr(value) || isEmptyObjOrArr(value));\n};\n\nconst validatePropertiesOfObject = (propsToCheck: string[], obj: Record<string, any>) => {\n\tconst emptyProps = propsToCheck.filter((prop) => isEmptyOrNil(obj[prop]));\n\tif (emptyProps.length) {\n\t\tconst displayMissingProps = emptyProps.reduce((prev, current, i) => {\n\t\t\tconst isLastEl = i === emptyProps.length - 1;\n\t\t\treturn isLastEl ? `${prev}${current}.` : `${prev}${current}, `;\n\t\t}, '');\n\t\treturn `The following props are required: ${displayMissingProps}`;\n\t}\n\treturn null;\n};\n\nexport const findScript = (url: string) => {\n\tconst scripts = Array.from(document.querySelectorAll('script'));\n\treturn scripts.find(({ src }) => src.startsWith(url));\n};\n\nexport const findOfferScript = (stage: IStages = defaultOptions.stage) => {\n\tconst { URL } = SCRIPTS[stage];\n\tconst matchedScript = findScript(URL);\n\treturn matchedScript;\n};\n\nexport const updateOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.updateOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst createOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.createOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst injectScript = (options: Record<string, any>) => {\n\tconst finalOptions = { ...defaultOptions, ...options };\n\tconst script = document.createElement('script');\n\tscript.src = `${SCRIPTS[finalOptions.stage].URL}`;\n\tscript.onload = () => createOffer(finalOptions);\n\tdocument.body.appendChild(script);\n\treturn script;\n};\n\nlet scriptPromise: Promise<BuddyObject | null> | null = null;\n\nexport const loadScript = (options: Record<string, any>) => {\n\t// Ensure that we only attempt to script once\n\tif (scriptPromise !== null) {\n\t\treturn scriptPromise;\n\t}\n\n\tscriptPromise = new Promise((resolve, reject) => {\n\t\tif (typeof window === 'undefined') {\n\t\t\t// Resolve to null when imported server side. This makes the module\n\t\t\t// safe to import in an isomorphic code base.\n\t\t\tresolve(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst requiredProps = ['ion', 'partnerID'];\n\t\t\tconst missingRequiredProps = validatePropertiesOfObject(requiredProps, options);\n\n\t\t\tif (missingRequiredProps) {\n\t\t\t\treject(new Error(missingRequiredProps));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!options?.stage) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);\n\t\t\t}\n\n\t\t\t// If stage is passed, ensure it is one of the prescribed options.\n\t\t\tif (options?.stage && !STAGES.includes(options.stage)) {\n\t\t\t\tconst msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received \"${options.stage}.\"`;\n\t\t\t\treject(new Error(msg));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet script = findOfferScript(options?.stage);\n\n\t\t\tif (script) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error('Buddy Offer Element not available'));\n\t\t\t\t}\n\t\t\t} else if (!script) {\n\t\t\t\tscript = injectScript(options);\n\t\t\t}\n\n\t\t\tscript.addEventListener('load', () => {\n\t\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error('Buddy Offer Element not available'));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscript.addEventListener('error', () => {\n\t\t\t\treject(new Error('Failed to load Buddy Offer Element'));\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t});\n\n\treturn scriptPromise;\n};\n","import { useEffect, useState } from 'react';\nimport { findScript } from '../util';\nimport type { IWindow, ConfigObject } from '../interface';\n\nfunction useConfig(src: string) {\n\tconst [config, setConfig] = useState<ConfigObject | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\n\tconst hasConfig = typeof window !== 'undefined';\n\n\tuseEffect(() => {\n\t\tlet script = findScript(src);\n\n\t\tif (!script) {\n\t\t\tscript = document.createElement('script');\n\t\t\tscript.src = src;\n\n\t\t\tscript.onload = () => {\n\t\t\t\t// Assuming the script sets a global variable named 'config'\n\t\t\t\tif (hasConfig) {\n\t\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.body.appendChild(script);\n\t\t} else {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn('Config script is already loaded.');\n\t\t\tif (hasConfig) {\n\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (script) {\n\t\t\t\tdocument.body.removeChild(script);\n\t\t\t}\n\t\t};\n\t}, [src]);\n\n\treturn { config, isLoading };\n}\n\nexport default useConfig;\n","import { useEffect, useRef } from 'react';\n\nconst useUpdateEffect: typeof useEffect = (effect, deps) => {\n\tconst isFirstMount = useRef<boolean>(true);\n\t// need to return only in the else condition in case a cleanup func is passed in effect.\n\t// eslint-disable-next-line consistent-return\n\tuseEffect(() => {\n\t\tif (isFirstMount) {\n\t\t\tisFirstMount.current = false;\n\t\t} else {\n\t\t\treturn effect();\n\t\t}\n\t}, deps);\n};\n\nexport default useUpdateEffect;\n","import React from 'react';\nimport { useUpdateEffect } from '../hooks';\nimport { loadScript, updateOffer } from '../util';\nimport type { BuddyOfferElementProps } from '../interface';\n\nfunction BuddyOfferElement(options: BuddyOfferElementProps) {\n\tconst getScript = async () => {\n\t\ttry {\n\t\t\tawait loadScript(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t};\n\tgetScript();\n\n\tuseUpdateEffect(() => {\n\t\tupdateOffer(options);\n\t}, [options]);\n\n\treturn (\n\t\t<div id=\"buddy_offer\" />\n\t);\n}\n\nexport default BuddyOfferElement;\n"],"names":["EXISTING_SCRIPT_MESSAGE","SCRIPTS","LOCAL","URL","DEVELOPMENT","TESTING","STAGING","PRODUCTION","STAGES","Object","keys","defaultOptions","stage","isEmptyOrNil","value","isNil","val","undefined","includes","isEmptyStr","str","trim","length","isEmptyObjOrArr","obj","Array","isArray","validatePropertiesOfObject","propsToCheck","emptyProps","filter","prop","displayMissingProps","reduce","prev","current","i","isLastEl","findScript","url","scripts","from","document","querySelectorAll","find","src","startsWith","findOfferScript","matchedScript","updateOffer","options","window","Buddy","error","console","createOffer","injectScript","finalOptions","script","createElement","onload","body","appendChild","scriptPromise","loadScript","Promise","resolve","reject","warn","requiredProps","missingRequiredProps","Error","msg","join","addEventListener","useConfig","useState","config","setConfig","isLoading","setIsLoading","hasConfig","useEffect","removeChild","useUpdateEffect","effect","deps","isFirstMount","useRef","BuddyOfferElement","getScript","React","id"],"mappings":"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"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import React, { useState, useEffect, useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
function _extends() {
|
|
4
|
+
_extends = Object.assign || function (target) {
|
|
5
|
+
for (var i = 1; i < arguments.length; i++) {
|
|
6
|
+
var source = arguments[i];
|
|
7
|
+
|
|
8
|
+
for (var key in source) {
|
|
9
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
10
|
+
target[key] = source[key];
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return target;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
return _extends.apply(this, arguments);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const EXISTING_SCRIPT_MESSAGE = 'Buddy Offer Script is already loaded.';
|
|
22
|
+
const SCRIPTS = {
|
|
23
|
+
LOCAL: {
|
|
24
|
+
URL: 'http://localhost:8008/index.js'
|
|
25
|
+
},
|
|
26
|
+
// TODO: Delete this in favor of "testing", once we're sure nothing is using it.
|
|
27
|
+
DEVELOPMENT: {
|
|
28
|
+
URL: 'https://js.buddy.insure/v2/dev/index.js'
|
|
29
|
+
},
|
|
30
|
+
TESTING: {
|
|
31
|
+
URL: 'https://js.buddy.insure/v2/testing/index.js'
|
|
32
|
+
},
|
|
33
|
+
STAGING: {
|
|
34
|
+
URL: 'https://js.buddy.insure/v2/staging/index.js'
|
|
35
|
+
},
|
|
36
|
+
PRODUCTION: {
|
|
37
|
+
URL: 'https://js.buddy.insure/v2/index.js'
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const STAGES = Object.keys(SCRIPTS);
|
|
41
|
+
|
|
42
|
+
const defaultOptions = {
|
|
43
|
+
stage: 'STAGING'
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const isEmptyOrNil = value => {
|
|
47
|
+
const isNil = val => [undefined, null].includes(val);
|
|
48
|
+
|
|
49
|
+
const isEmptyStr = str => typeof str === 'string' && str.trim().length === 0;
|
|
50
|
+
|
|
51
|
+
const isEmptyObjOrArr = obj => typeof obj === 'object' && obj.length === undefined && Object.keys(obj).length === 0 || Array.isArray(obj) && obj.length === 0;
|
|
52
|
+
|
|
53
|
+
return isNil(value) || isEmptyStr(value) || isEmptyObjOrArr(value);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const validatePropertiesOfObject = (propsToCheck, obj) => {
|
|
57
|
+
const emptyProps = propsToCheck.filter(prop => isEmptyOrNil(obj[prop]));
|
|
58
|
+
|
|
59
|
+
if (emptyProps.length) {
|
|
60
|
+
const displayMissingProps = emptyProps.reduce((prev, current, i) => {
|
|
61
|
+
const isLastEl = i === emptyProps.length - 1;
|
|
62
|
+
return isLastEl ? `${prev}${current}.` : `${prev}${current}, `;
|
|
63
|
+
}, '');
|
|
64
|
+
return `The following props are required: ${displayMissingProps}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return null;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const findScript = url => {
|
|
71
|
+
const scripts = Array.from(document.querySelectorAll('script'));
|
|
72
|
+
return scripts.find(({
|
|
73
|
+
src
|
|
74
|
+
}) => src.startsWith(url));
|
|
75
|
+
};
|
|
76
|
+
const findOfferScript = (stage = defaultOptions.stage) => {
|
|
77
|
+
const {
|
|
78
|
+
URL
|
|
79
|
+
} = SCRIPTS[stage];
|
|
80
|
+
const matchedScript = findScript(URL);
|
|
81
|
+
return matchedScript;
|
|
82
|
+
};
|
|
83
|
+
const updateOffer = options => {
|
|
84
|
+
if (window.Buddy) {
|
|
85
|
+
try {
|
|
86
|
+
window.Buddy.updateOffer(options);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
// eslint-disable-next-line no-console
|
|
89
|
+
console.error(error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const createOffer = options => {
|
|
95
|
+
if (window.Buddy) {
|
|
96
|
+
try {
|
|
97
|
+
window.Buddy.createOffer(options);
|
|
98
|
+
} catch (error) {
|
|
99
|
+
// eslint-disable-next-line no-console
|
|
100
|
+
console.error(error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const injectScript = options => {
|
|
106
|
+
const finalOptions = _extends({}, defaultOptions, options);
|
|
107
|
+
|
|
108
|
+
const script = document.createElement('script');
|
|
109
|
+
script.src = `${SCRIPTS[finalOptions.stage].URL}`;
|
|
110
|
+
|
|
111
|
+
script.onload = () => createOffer(finalOptions);
|
|
112
|
+
|
|
113
|
+
document.body.appendChild(script);
|
|
114
|
+
return script;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
let scriptPromise = null;
|
|
118
|
+
const loadScript = options => {
|
|
119
|
+
// Ensure that we only attempt to script once
|
|
120
|
+
if (scriptPromise !== null) {
|
|
121
|
+
return scriptPromise;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
scriptPromise = new Promise((resolve, reject) => {
|
|
125
|
+
var _window$Buddy;
|
|
126
|
+
|
|
127
|
+
if (typeof window === 'undefined') {
|
|
128
|
+
// Resolve to null when imported server side. This makes the module
|
|
129
|
+
// safe to import in an isomorphic code base.
|
|
130
|
+
resolve(null);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if ((_window$Buddy = window.Buddy) != null && _window$Buddy.createOffer) {
|
|
135
|
+
// eslint-disable-next-line no-console
|
|
136
|
+
console.warn(EXISTING_SCRIPT_MESSAGE);
|
|
137
|
+
resolve(window.Buddy);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
const requiredProps = ['ion', 'partnerID'];
|
|
143
|
+
const missingRequiredProps = validatePropertiesOfObject(requiredProps, options);
|
|
144
|
+
|
|
145
|
+
if (missingRequiredProps) {
|
|
146
|
+
reject(new Error(missingRequiredProps));
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!(options != null && options.stage)) {
|
|
151
|
+
// eslint-disable-next-line no-console
|
|
152
|
+
console.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);
|
|
153
|
+
} // If stage is passed, ensure it is one of the prescribed options.
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
if (options != null && options.stage && !STAGES.includes(options.stage)) {
|
|
157
|
+
const msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received "${options.stage}."`;
|
|
158
|
+
reject(new Error(msg));
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
let script = findOfferScript(options == null ? void 0 : options.stage);
|
|
163
|
+
|
|
164
|
+
if (script) {
|
|
165
|
+
var _window$Buddy2;
|
|
166
|
+
|
|
167
|
+
// eslint-disable-next-line no-console
|
|
168
|
+
console.warn(EXISTING_SCRIPT_MESSAGE);
|
|
169
|
+
|
|
170
|
+
if ((_window$Buddy2 = window.Buddy) != null && _window$Buddy2.createOffer) {
|
|
171
|
+
resolve(window.Buddy);
|
|
172
|
+
} else {
|
|
173
|
+
reject(new Error('Buddy Offer Element not available'));
|
|
174
|
+
}
|
|
175
|
+
} else if (!script) {
|
|
176
|
+
script = injectScript(options);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
script.addEventListener('load', () => {
|
|
180
|
+
var _window$Buddy3;
|
|
181
|
+
|
|
182
|
+
if ((_window$Buddy3 = window.Buddy) != null && _window$Buddy3.createOffer) {
|
|
183
|
+
resolve(window.Buddy);
|
|
184
|
+
} else {
|
|
185
|
+
reject(new Error('Buddy Offer Element not available'));
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
script.addEventListener('error', () => {
|
|
189
|
+
reject(new Error('Failed to load Buddy Offer Element'));
|
|
190
|
+
});
|
|
191
|
+
} catch (error) {
|
|
192
|
+
reject(error);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
return scriptPromise;
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
function useConfig(src) {
|
|
199
|
+
const [config, setConfig] = useState(null);
|
|
200
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
201
|
+
const hasConfig = typeof window !== 'undefined';
|
|
202
|
+
useEffect(() => {
|
|
203
|
+
let script = findScript(src);
|
|
204
|
+
|
|
205
|
+
if (!script) {
|
|
206
|
+
script = document.createElement('script');
|
|
207
|
+
script.src = src;
|
|
208
|
+
|
|
209
|
+
script.onload = () => {
|
|
210
|
+
// Assuming the script sets a global variable named 'config'
|
|
211
|
+
if (hasConfig) {
|
|
212
|
+
setConfig(window.Buddy.config);
|
|
213
|
+
setIsLoading(false);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
document.body.appendChild(script);
|
|
218
|
+
} else {
|
|
219
|
+
// eslint-disable-next-line no-console
|
|
220
|
+
console.warn('Config script is already loaded.');
|
|
221
|
+
|
|
222
|
+
if (hasConfig) {
|
|
223
|
+
setConfig(window.Buddy.config);
|
|
224
|
+
setIsLoading(false);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return () => {
|
|
229
|
+
if (script) {
|
|
230
|
+
document.body.removeChild(script);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
}, [src]);
|
|
234
|
+
return {
|
|
235
|
+
config,
|
|
236
|
+
isLoading
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const useUpdateEffect = (effect, deps) => {
|
|
241
|
+
const isFirstMount = useRef(true); // need to return only in the else condition in case a cleanup func is passed in effect.
|
|
242
|
+
// eslint-disable-next-line consistent-return
|
|
243
|
+
|
|
244
|
+
useEffect(() => {
|
|
245
|
+
if (isFirstMount) {
|
|
246
|
+
isFirstMount.current = false;
|
|
247
|
+
} else {
|
|
248
|
+
return effect();
|
|
249
|
+
}
|
|
250
|
+
}, deps);
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
function BuddyOfferElement(options) {
|
|
254
|
+
const getScript = async () => {
|
|
255
|
+
try {
|
|
256
|
+
await loadScript(options);
|
|
257
|
+
} catch (error) {
|
|
258
|
+
// eslint-disable-next-line no-console
|
|
259
|
+
console.error(error);
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
getScript();
|
|
264
|
+
useUpdateEffect(() => {
|
|
265
|
+
updateOffer(options);
|
|
266
|
+
}, [options]);
|
|
267
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
268
|
+
id: "buddy_offer"
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export { BuddyOfferElement as default, useConfig };
|
|
273
|
+
//# sourceMappingURL=index.modern.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.modern.mjs","sources":["../src/util/dictionary.ts","../src/util/index.ts","../src/hooks/useConfig.tsx","../src/hooks/useUpdateEffect.tsx","../src/components/BuddyOfferElement.tsx"],"sourcesContent":["const EXISTING_SCRIPT_MESSAGE = 'Buddy Offer Script is already loaded.';\n\nconst SCRIPTS = {\n\tLOCAL: {\n\t\tURL: 'http://localhost:8008/index.js',\n\t},\n\t// TODO: Delete this in favor of \"testing\", once we're sure nothing is using it.\n\tDEVELOPMENT: {\n\t\tURL: 'https://js.buddy.insure/v2/dev/index.js',\n\t},\n\tTESTING: {\n\t\tURL: 'https://js.buddy.insure/v2/testing/index.js',\n\t},\n\tSTAGING: {\n\t\tURL: 'https://js.buddy.insure/v2/staging/index.js',\n\t},\n\tPRODUCTION: {\n\t\tURL: 'https://js.buddy.insure/v2/index.js',\n\t},\n} as const;\n\nconst STAGES = Object.keys(SCRIPTS);\n\nexport {\n\tEXISTING_SCRIPT_MESSAGE,\n\tSCRIPTS,\n\tSTAGES,\n};\n","import { EXISTING_SCRIPT_MESSAGE, SCRIPTS, STAGES } from './dictionary';\nimport type { BuddyObject, IWindow } from '../interface';\n\ntype IStages = keyof typeof SCRIPTS;\n\nconst defaultOptions = {\n\tstage: 'STAGING',\n} as const;\n\nconst isEmptyOrNil = (value: any) => {\n\tconst isNil = (val: any) => [undefined, null].includes(val);\n\tconst isEmptyStr = (str: any) => typeof str === 'string' && str.trim().length === 0;\n\tconst isEmptyObjOrArr = (obj: any) => (typeof obj === 'object' && obj.length === undefined &&\n\t\tObject.keys(obj).length === 0) || (Array.isArray(obj) && obj.length === 0);\n\treturn (isNil(value) || isEmptyStr(value) || isEmptyObjOrArr(value));\n};\n\nconst validatePropertiesOfObject = (propsToCheck: string[], obj: Record<string, any>) => {\n\tconst emptyProps = propsToCheck.filter((prop) => isEmptyOrNil(obj[prop]));\n\tif (emptyProps.length) {\n\t\tconst displayMissingProps = emptyProps.reduce((prev, current, i) => {\n\t\t\tconst isLastEl = i === emptyProps.length - 1;\n\t\t\treturn isLastEl ? `${prev}${current}.` : `${prev}${current}, `;\n\t\t}, '');\n\t\treturn `The following props are required: ${displayMissingProps}`;\n\t}\n\treturn null;\n};\n\nexport const findScript = (url: string) => {\n\tconst scripts = Array.from(document.querySelectorAll('script'));\n\treturn scripts.find(({ src }) => src.startsWith(url));\n};\n\nexport const findOfferScript = (stage: IStages = defaultOptions.stage) => {\n\tconst { URL } = SCRIPTS[stage];\n\tconst matchedScript = findScript(URL);\n\treturn matchedScript;\n};\n\nexport const updateOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.updateOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst createOffer = (options: Record<string, any>) => {\n\tif ((window as IWindow).Buddy) {\n\t\ttry {\n\t\t\t(window as IWindow).Buddy!.createOffer(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t}\n};\n\nconst injectScript = (options: Record<string, any>) => {\n\tconst finalOptions = { ...defaultOptions, ...options };\n\tconst script = document.createElement('script');\n\tscript.src = `${SCRIPTS[finalOptions.stage].URL}`;\n\tscript.onload = () => createOffer(finalOptions);\n\tdocument.body.appendChild(script);\n\treturn script;\n};\n\nlet scriptPromise: Promise<BuddyObject | null> | null = null;\n\nexport const loadScript = (options: Record<string, any>) => {\n\t// Ensure that we only attempt to script once\n\tif (scriptPromise !== null) {\n\t\treturn scriptPromise;\n\t}\n\n\tscriptPromise = new Promise((resolve, reject) => {\n\t\tif (typeof window === 'undefined') {\n\t\t\t// Resolve to null when imported server side. This makes the module\n\t\t\t// safe to import in an isomorphic code base.\n\t\t\tresolve(null);\n\t\t\treturn;\n\t\t}\n\n\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst requiredProps = ['ion', 'partnerID'];\n\t\t\tconst missingRequiredProps = validatePropertiesOfObject(requiredProps, options);\n\n\t\t\tif (missingRequiredProps) {\n\t\t\t\treject(new Error(missingRequiredProps));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!options?.stage) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(`No stage passed to BuddyOfferElement. Using default stage: ${defaultOptions.stage}`);\n\t\t\t}\n\n\t\t\t// If stage is passed, ensure it is one of the prescribed options.\n\t\t\tif (options?.stage && !STAGES.includes(options.stage)) {\n\t\t\t\tconst msg = `The stage prop must be one of: [${STAGES.join(' , ')}], but received \"${options.stage}.\"`;\n\t\t\t\treject(new Error(msg));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet script = findOfferScript(options?.stage);\n\n\t\t\tif (script) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn(EXISTING_SCRIPT_MESSAGE);\n\t\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error('Buddy Offer Element not available'));\n\t\t\t\t}\n\t\t\t} else if (!script) {\n\t\t\t\tscript = injectScript(options);\n\t\t\t}\n\n\t\t\tscript.addEventListener('load', () => {\n\t\t\t\tif ((window as IWindow).Buddy?.createOffer) {\n\t\t\t\t\tresolve((window as IWindow).Buddy!);\n\t\t\t\t} else {\n\t\t\t\t\treject(new Error('Buddy Offer Element not available'));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tscript.addEventListener('error', () => {\n\t\t\t\treject(new Error('Failed to load Buddy Offer Element'));\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treject(error);\n\t\t}\n\t});\n\n\treturn scriptPromise;\n};\n","import { useEffect, useState } from 'react';\nimport { findScript } from '../util';\nimport type { IWindow, ConfigObject } from '../interface';\n\nfunction useConfig(src: string) {\n\tconst [config, setConfig] = useState<ConfigObject | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\n\tconst hasConfig = typeof window !== 'undefined';\n\n\tuseEffect(() => {\n\t\tlet script = findScript(src);\n\n\t\tif (!script) {\n\t\t\tscript = document.createElement('script');\n\t\t\tscript.src = src;\n\n\t\t\tscript.onload = () => {\n\t\t\t\t// Assuming the script sets a global variable named 'config'\n\t\t\t\tif (hasConfig) {\n\t\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\t\tsetIsLoading(false);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tdocument.body.appendChild(script);\n\t\t} else {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn('Config script is already loaded.');\n\t\t\tif (hasConfig) {\n\t\t\t\tsetConfig((window as IWindow).Buddy!.config!);\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (script) {\n\t\t\t\tdocument.body.removeChild(script);\n\t\t\t}\n\t\t};\n\t}, [src]);\n\n\treturn { config, isLoading };\n}\n\nexport default useConfig;\n","import { useEffect, useRef } from 'react';\n\nconst useUpdateEffect: typeof useEffect = (effect, deps) => {\n\tconst isFirstMount = useRef<boolean>(true);\n\t// need to return only in the else condition in case a cleanup func is passed in effect.\n\t// eslint-disable-next-line consistent-return\n\tuseEffect(() => {\n\t\tif (isFirstMount) {\n\t\t\tisFirstMount.current = false;\n\t\t} else {\n\t\t\treturn effect();\n\t\t}\n\t}, deps);\n};\n\nexport default useUpdateEffect;\n","import React from 'react';\nimport { useUpdateEffect } from '../hooks';\nimport { loadScript, updateOffer } from '../util';\nimport type { BuddyOfferElementProps } from '../interface';\n\nfunction BuddyOfferElement(options: BuddyOfferElementProps) {\n\tconst getScript = async () => {\n\t\ttry {\n\t\t\tawait loadScript(options);\n\t\t} catch (error) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(error);\n\t\t}\n\t};\n\tgetScript();\n\n\tuseUpdateEffect(() => {\n\t\tupdateOffer(options);\n\t}, [options]);\n\n\treturn (\n\t\t<div id=\"buddy_offer\" />\n\t);\n}\n\nexport default BuddyOfferElement;\n"],"names":["EXISTING_SCRIPT_MESSAGE","SCRIPTS","LOCAL","URL","DEVELOPMENT","TESTING","STAGING","PRODUCTION","STAGES","Object","keys","defaultOptions","stage","isEmptyOrNil","value","isNil","val","undefined","includes","isEmptyStr","str","trim","length","isEmptyObjOrArr","obj","Array","isArray","validatePropertiesOfObject","propsToCheck","emptyProps","filter","prop","displayMissingProps","reduce","prev","current","i","isLastEl","findScript","url","scripts","from","document","querySelectorAll","find","src","startsWith","findOfferScript","matchedScript","updateOffer","options","window","Buddy","error","console","createOffer","injectScript","finalOptions","script","createElement","onload","body","appendChild","scriptPromise","loadScript","Promise","resolve","reject","warn","requiredProps","missingRequiredProps","Error","msg","join","addEventListener","useConfig","config","setConfig","useState","isLoading","setIsLoading","hasConfig","useEffect","removeChild","useUpdateEffect","effect","deps","isFirstMount","useRef","BuddyOfferElement","getScript","React","id"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BuddyOfferElement.d.ts","sourceRoot":"","sources":["../../src/components/BuddyOfferElement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE3D,iBAAS,iBAAiB,CAAC,OAAO,EAAE,sBAAsB,qBAkBzD;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConfig.d.ts","sourceRoot":"","sources":["../../src/hooks/useConfig.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,iBAAS,SAAS,CAAC,GAAG,EAAE,MAAM;;;EAuC7B;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpdateEffect.d.ts","sourceRoot":"","sources":["../../src/hooks/useUpdateEffect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,OAAO,CAAC;AAE1C,QAAA,MAAM,eAAe,EAAE,OAAO,SAW7B,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
type ConfigObject = Record<string, any>;
|
|
2
|
+
interface BuddyObject {
|
|
3
|
+
createOffer: (options: any) => void;
|
|
4
|
+
updateOffer: (options: any) => void;
|
|
5
|
+
config?: ConfigObject;
|
|
6
|
+
}
|
|
7
|
+
interface IWindow extends Window {
|
|
8
|
+
Buddy?: BuddyObject;
|
|
9
|
+
}
|
|
10
|
+
type Stages = 'DEVELOPMENT' | 'TESTING' | 'STAGING' | 'PRODUCTION';
|
|
11
|
+
type ViewTypes = 'paginated' | 'single-form' | 'offer-only';
|
|
12
|
+
interface DataObject {
|
|
13
|
+
customer?: Record<string, any>;
|
|
14
|
+
policy?: Record<string, any>;
|
|
15
|
+
session?: Record<string, any>;
|
|
16
|
+
}
|
|
17
|
+
interface ColorSchema {
|
|
18
|
+
primary?: string;
|
|
19
|
+
secondary?: string;
|
|
20
|
+
tertiary?: string;
|
|
21
|
+
negative?: string;
|
|
22
|
+
positive?: string;
|
|
23
|
+
textPrimary?: string;
|
|
24
|
+
textSecondary?: string;
|
|
25
|
+
backgroundPrimary?: string;
|
|
26
|
+
backgroundSecondary?: string;
|
|
27
|
+
}
|
|
28
|
+
interface ThemeOverrides {
|
|
29
|
+
colors?: ColorSchema;
|
|
30
|
+
styles?: Record<string, any>;
|
|
31
|
+
webFonts?: string[];
|
|
32
|
+
}
|
|
33
|
+
interface ThemeObject {
|
|
34
|
+
baseTheme?: string;
|
|
35
|
+
palette?: string;
|
|
36
|
+
overrides?: ThemeOverrides;
|
|
37
|
+
}
|
|
38
|
+
interface LogoOverride {
|
|
39
|
+
src: string;
|
|
40
|
+
alt?: string;
|
|
41
|
+
url?: string;
|
|
42
|
+
}
|
|
43
|
+
interface EventData {
|
|
44
|
+
[x: string]: unknown;
|
|
45
|
+
timestamp: number;
|
|
46
|
+
}
|
|
47
|
+
interface EventObject {
|
|
48
|
+
eventType: string;
|
|
49
|
+
data: EventData;
|
|
50
|
+
}
|
|
51
|
+
type OnAddToCart = (data: DataObject) => void;
|
|
52
|
+
type OnRemoveFromCart = (data: DataObject) => void;
|
|
53
|
+
type ScrollToTopOverride = () => void;
|
|
54
|
+
type OnUserEvent = (event: EventObject) => void;
|
|
55
|
+
interface BuddyOfferElementProps {
|
|
56
|
+
ion: string;
|
|
57
|
+
partnerID: string;
|
|
58
|
+
data?: DataObject;
|
|
59
|
+
includeCheckout?: boolean;
|
|
60
|
+
logoOverride?: LogoOverride;
|
|
61
|
+
stage?: Stages;
|
|
62
|
+
theme?: ThemeObject;
|
|
63
|
+
viewType?: ViewTypes;
|
|
64
|
+
onAddToCart?: OnAddToCart;
|
|
65
|
+
onRemoveFromCart?: OnRemoveFromCart;
|
|
66
|
+
onUserEvent?: OnUserEvent;
|
|
67
|
+
overrideScrollToTop?: ScrollToTopOverride;
|
|
68
|
+
}
|
|
69
|
+
export type { BuddyObject, BuddyOfferElementProps, ConfigObject, IWindow, };
|
|
70
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interface/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
declare const EXISTING_SCRIPT_MESSAGE = "Buddy Offer Script is already loaded.";
|
|
2
|
+
declare const SCRIPTS: {
|
|
3
|
+
readonly LOCAL: {
|
|
4
|
+
readonly URL: "http://localhost:8008/index.js";
|
|
5
|
+
};
|
|
6
|
+
readonly DEVELOPMENT: {
|
|
7
|
+
readonly URL: "https://js.buddy.insure/v2/dev/index.js";
|
|
8
|
+
};
|
|
9
|
+
readonly TESTING: {
|
|
10
|
+
readonly URL: "https://js.buddy.insure/v2/testing/index.js";
|
|
11
|
+
};
|
|
12
|
+
readonly STAGING: {
|
|
13
|
+
readonly URL: "https://js.buddy.insure/v2/staging/index.js";
|
|
14
|
+
};
|
|
15
|
+
readonly PRODUCTION: {
|
|
16
|
+
readonly URL: "https://js.buddy.insure/v2/index.js";
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
declare const STAGES: string[];
|
|
20
|
+
export { EXISTING_SCRIPT_MESSAGE, SCRIPTS, STAGES, };
|
|
21
|
+
//# sourceMappingURL=dictionary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dictionary.d.ts","sourceRoot":"","sources":["../../src/util/dictionary.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,uBAAuB,0CAA0C,CAAC;AAExE,QAAA,MAAM,OAAO;;;;;;;;;;;;;;;;CAiBH,CAAC;AAEX,QAAA,MAAM,MAAM,UAAuB,CAAC;AAEpC,OAAO,EACN,uBAAuB,EACvB,OAAO,EACP,MAAM,GACN,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SCRIPTS } from './dictionary';
|
|
2
|
+
import type { BuddyObject } from '../interface';
|
|
3
|
+
type IStages = keyof typeof SCRIPTS;
|
|
4
|
+
export declare const findScript: (url: string) => HTMLScriptElement | undefined;
|
|
5
|
+
export declare const findOfferScript: (stage?: IStages) => HTMLScriptElement | undefined;
|
|
6
|
+
export declare const updateOffer: (options: Record<string, any>) => void;
|
|
7
|
+
export declare const loadScript: (options: Record<string, any>) => Promise<BuddyObject | null>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,OAAO,EAAU,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,cAAc,CAAC;AAEzD,KAAK,OAAO,GAAG,MAAM,OAAO,OAAO,CAAC;AA0BpC,eAAO,MAAM,UAAU,QAAS,MAAM,kCAGrC,CAAC;AAEF,eAAO,MAAM,eAAe,WAAW,OAAO,kCAI7C,CAAC;AAEF,eAAO,MAAM,WAAW,YAAa,OAAO,MAAM,EAAE,GAAG,CAAC,SASvD,CAAC;AAwBF,eAAO,MAAM,UAAU,YAAa,OAAO,MAAM,EAAE,GAAG,CAAC,gCAyEtD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,29 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@buddy-technology/offer-component",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"author": "Buddy Technology",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
|
-
"
|
|
6
|
+
"module": "dist/index.modern.mjs",
|
|
7
|
+
"types": "./lib/index.d.ts",
|
|
7
8
|
"license": "UNLICENSED",
|
|
8
9
|
"private": false,
|
|
9
10
|
"repository": {
|
|
10
11
|
"type": "git",
|
|
11
|
-
"url": "git://github.com/Buddy-Technology/
|
|
12
|
+
"url": "git://github.com/Buddy-Technology/ion-to-react.git",
|
|
13
|
+
"directory": "packages/offer-component"
|
|
12
14
|
},
|
|
13
15
|
"bugs": {
|
|
14
|
-
"url": "https://github.com/Buddy-Technology/
|
|
16
|
+
"url": "https://github.com/Buddy-Technology/ion-to-react/issues"
|
|
15
17
|
},
|
|
16
|
-
"homepage": "https://github.com/Buddy-Technology/
|
|
18
|
+
"homepage": "https://github.com/Buddy-Technology/ion-to-react#readme",
|
|
17
19
|
"scripts": {
|
|
18
|
-
"build": "
|
|
19
|
-
"dev": "
|
|
20
|
+
"build": "NODE_ENV=production microbundle --jsx React.createElement --jsxImportSource react --no-compress --format modern,cjs",
|
|
21
|
+
"dev": "microbundle watch --jsx React.createElement --jsxImportSource react --no-compress --format modern,cjs",
|
|
20
22
|
"deploy": "yarn version",
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"watch:src": "rm -rf dist && NODE_ENV=development babel src --out-dir dist --watch",
|
|
24
|
-
"start": "ESLINT_NO_DEV_ERRORS=true react-scripts start",
|
|
25
|
-
"test": "react-scripts test",
|
|
26
|
-
"eject": "react-scripts eject"
|
|
23
|
+
"release": "npx --no-install semantic-release",
|
|
24
|
+
"test": "jest"
|
|
27
25
|
},
|
|
28
26
|
"eslintConfig": {
|
|
29
27
|
"extends": [
|
|
@@ -44,25 +42,21 @@
|
|
|
44
42
|
]
|
|
45
43
|
},
|
|
46
44
|
"devDependencies": {
|
|
47
|
-
"@
|
|
48
|
-
"@
|
|
49
|
-
"@
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"eslint-config-
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"jsdoc": "^3.6.10",
|
|
57
|
-
"jsdoc-to-markdown": "^7.1.1",
|
|
58
|
-
"jsdoc-tsimport-plugin": "^1.0.5",
|
|
59
|
-
"react": "^18.1.0",
|
|
60
|
-
"react-scripts": "5.0.1",
|
|
61
|
-
"regenerator-runtime": "^0.13.9",
|
|
62
|
-
"tsd-jsdoc": "^2.5.0"
|
|
45
|
+
"@testing-library/dom": "^9.3.3",
|
|
46
|
+
"@testing-library/jest-dom": "^6.1.4",
|
|
47
|
+
"@testing-library/react": "^14.1.2",
|
|
48
|
+
"@testing-library/user-event": "^14.5.1",
|
|
49
|
+
"@types/jest": "^29.5.10",
|
|
50
|
+
"eslint-config-custom": "*",
|
|
51
|
+
"microbundle": "^0.15.1",
|
|
52
|
+
"ts-jest": "^29.1.1",
|
|
53
|
+
"typescript": "^5.3.2"
|
|
63
54
|
},
|
|
64
55
|
"peerDependencies": {
|
|
65
56
|
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
|
66
57
|
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
|
58
|
+
},
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"access": "public"
|
|
67
61
|
}
|
|
68
62
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
extends: 'semantic-release-monorepo',
|
|
3
|
+
branches: ['main'],
|
|
4
|
+
plugins: [
|
|
5
|
+
'@semantic-release/commit-analyzer',
|
|
6
|
+
'@semantic-release/release-notes-generator',
|
|
7
|
+
'@semantic-release/changelog',
|
|
8
|
+
'@semantic-release/npm',
|
|
9
|
+
[
|
|
10
|
+
'@semantic-release/git',
|
|
11
|
+
{
|
|
12
|
+
assets: [
|
|
13
|
+
'CHANGELOG.md',
|
|
14
|
+
'package.json',
|
|
15
|
+
],
|
|
16
|
+
// eslint-disable-next-line no-template-curly-in-string
|
|
17
|
+
message: 'chore(release): set `package.json` to ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}',
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
'@semantic-release/github',
|
|
21
|
+
],
|
|
22
|
+
};
|