@searchspring/snap-toolbox 0.20.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/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/cjs/DomTargeter/DomTargeter.d.ts +25 -0
- package/dist/cjs/DomTargeter/DomTargeter.d.ts.map +1 -0
- package/dist/cjs/DomTargeter/DomTargeter.js +144 -0
- package/dist/cjs/cookies/cookies.d.ts +8 -0
- package/dist/cjs/cookies/cookies.d.ts.map +1 -0
- package/dist/cjs/cookies/cookies.js +35 -0
- package/dist/cjs/featureFlags/featureFlags.d.ts +13 -0
- package/dist/cjs/featureFlags/featureFlags.d.ts.map +1 -0
- package/dist/cjs/featureFlags/featureFlags.js +43 -0
- package/dist/cjs/filters/currency.d.ts +3 -0
- package/dist/cjs/filters/currency.d.ts.map +1 -0
- package/dist/cjs/filters/currency.js +20 -0
- package/dist/cjs/filters/filters.d.ts +6 -0
- package/dist/cjs/filters/filters.d.ts.map +1 -0
- package/dist/cjs/filters/filters.js +13 -0
- package/dist/cjs/filters/formatNumber.d.ts +10 -0
- package/dist/cjs/filters/formatNumber.d.ts.map +1 -0
- package/dist/cjs/filters/formatNumber.js +42 -0
- package/dist/cjs/filters/handleize.d.ts +2 -0
- package/dist/cjs/filters/handleize.d.ts.map +1 -0
- package/dist/cjs/filters/handleize.js +13 -0
- package/dist/cjs/filters/stripHTML.d.ts +2 -0
- package/dist/cjs/filters/stripHTML.d.ts.map +1 -0
- package/dist/cjs/filters/stripHTML.js +13 -0
- package/dist/cjs/filters/truncate.d.ts +2 -0
- package/dist/cjs/filters/truncate.d.ts.map +1 -0
- package/dist/cjs/filters/truncate.js +12 -0
- package/dist/cjs/getContext/getContext.d.ts +6 -0
- package/dist/cjs/getContext/getContext.d.ts.map +1 -0
- package/dist/cjs/getContext/getContext.js +46 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +32 -0
- package/dist/cjs/types.d.ts +1 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +0 -0
- package/dist/cjs/url/url.d.ts +12 -0
- package/dist/cjs/url/url.d.ts.map +1 -0
- package/dist/cjs/url/url.js +30 -0
- package/dist/cjs/version/version.d.ts +2 -0
- package/dist/cjs/version/version.d.ts.map +1 -0
- package/dist/cjs/version/version.js +8 -0
- package/dist/esm/DomTargeter/DomTargeter.d.ts +25 -0
- package/dist/esm/DomTargeter/DomTargeter.d.ts.map +1 -0
- package/dist/esm/DomTargeter/DomTargeter.js +134 -0
- package/dist/esm/cookies/cookies.d.ts +8 -0
- package/dist/esm/cookies/cookies.d.ts.map +1 -0
- package/dist/esm/cookies/cookies.js +32 -0
- package/dist/esm/featureFlags/featureFlags.d.ts +13 -0
- package/dist/esm/featureFlags/featureFlags.d.ts.map +1 -0
- package/dist/esm/featureFlags/featureFlags.js +38 -0
- package/dist/esm/filters/currency.d.ts +3 -0
- package/dist/esm/filters/currency.d.ts.map +1 -0
- package/dist/esm/filters/currency.js +10 -0
- package/dist/esm/filters/filters.d.ts +6 -0
- package/dist/esm/filters/filters.d.ts.map +1 -0
- package/dist/esm/filters/filters.js +5 -0
- package/dist/esm/filters/formatNumber.d.ts +10 -0
- package/dist/esm/filters/formatNumber.d.ts.map +1 -0
- package/dist/esm/filters/formatNumber.js +35 -0
- package/dist/esm/filters/handleize.d.ts +2 -0
- package/dist/esm/filters/handleize.d.ts.map +1 -0
- package/dist/esm/filters/handleize.js +9 -0
- package/dist/esm/filters/stripHTML.d.ts +2 -0
- package/dist/esm/filters/stripHTML.d.ts.map +1 -0
- package/dist/esm/filters/stripHTML.js +9 -0
- package/dist/esm/filters/truncate.d.ts +2 -0
- package/dist/esm/filters/truncate.d.ts.map +1 -0
- package/dist/esm/filters/truncate.js +8 -0
- package/dist/esm/getContext/getContext.d.ts +6 -0
- package/dist/esm/getContext/getContext.d.ts.map +1 -0
- package/dist/esm/getContext/getContext.js +45 -0
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/types.d.ts +1 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +0 -0
- package/dist/esm/url/url.d.ts +12 -0
- package/dist/esm/url/url.d.ts.map +1 -0
- package/dist/esm/url/url.js +26 -0
- package/dist/esm/version/version.d.ts +2 -0
- package/dist/esm/version/version.d.ts.map +1 -0
- package/dist/esm/version/version.js +2 -0
- package/package.json +27 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/url/url.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,GAAG,SAAU,MAAM,KAAG,iBA2BlC,CAAC;AAEF,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACP,KAAK,EAAE;YACN,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;SACtB,CAAC;QACF,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;IACF,GAAG,EAAE,MAAM,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.url = void 0;
|
|
4
|
+
var url = function (href) {
|
|
5
|
+
if (!href) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
var _a = href.split('#'), urlWithoutHash = _a[0], hash = _a[1];
|
|
9
|
+
var _b = urlWithoutHash.split('?'), base = _b[0], queryParams = _b[1];
|
|
10
|
+
var params = {
|
|
11
|
+
query: {},
|
|
12
|
+
hash: hash,
|
|
13
|
+
};
|
|
14
|
+
queryParams === null || queryParams === void 0 ? void 0 : queryParams.split('&').forEach(function (entry) {
|
|
15
|
+
var _a = entry.split('='), key = _a[0], value = _a[1];
|
|
16
|
+
params.query[key] = value;
|
|
17
|
+
});
|
|
18
|
+
var urlfunction = function () {
|
|
19
|
+
var queryString = Object.keys(params.query)
|
|
20
|
+
.map(function (key) { return "".concat(key, "=").concat(params.query[key]); })
|
|
21
|
+
.join('&');
|
|
22
|
+
return "".concat(base).concat(queryString ? '?' + queryString : '').concat(params.hash ? '#' + params.hash : '');
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
base: base,
|
|
26
|
+
params: params,
|
|
27
|
+
url: urlfunction,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
exports.url = url;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAQ,OAAO,QAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.version = void 0;
|
|
7
|
+
var package_json_1 = __importDefault(require("@searchspring/snap-toolbox/package.json"));
|
|
8
|
+
exports.version = package_json_1.default.version;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare type Target = {
|
|
2
|
+
selector: string;
|
|
3
|
+
inject?: {
|
|
4
|
+
action: 'before' | 'after' | 'append' | 'prepend' | 'replace';
|
|
5
|
+
element: Element | ((target: Target, element: Element) => Element);
|
|
6
|
+
};
|
|
7
|
+
emptyTarget?: boolean;
|
|
8
|
+
hideTarget?: boolean;
|
|
9
|
+
[any: string]: unknown;
|
|
10
|
+
};
|
|
11
|
+
export declare type OnTarget = (target: Target, elem: Element, originalElem?: Element) => void;
|
|
12
|
+
export declare class DomTargeter {
|
|
13
|
+
private targets;
|
|
14
|
+
private onTarget;
|
|
15
|
+
private document;
|
|
16
|
+
private styleBlockRefs;
|
|
17
|
+
constructor(targets: Array<Target>, onTarget: OnTarget, document?: Document);
|
|
18
|
+
getTargets(): Array<Target>;
|
|
19
|
+
retarget(): void;
|
|
20
|
+
unhideTarget: (selector: string) => void;
|
|
21
|
+
hideTarget: (selector: string) => void;
|
|
22
|
+
private domQuery;
|
|
23
|
+
private inject;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=DomTargeter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DomTargeter.d.ts","sourceRoot":"","sources":["../../../src/DomTargeter/DomTargeter.ts"],"names":[],"mappings":"AAAA,oBAAY,MAAM,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACR,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;QAC9D,OAAO,EAAE,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC;KACnE,CAAC;IACF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,oBAAY,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAGvF,qBAAa,WAAW;IACvB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,cAAc,CAA4B;gBAEtC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ;IAsB3E,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;IAI3B,QAAQ,IAAI,IAAI;IAgDhB,YAAY,aAAc,MAAM,KAAG,IAAI,CASrC;IAEF,UAAU,aAAc,MAAM,KAAG,IAAI,CASnC;IAEF,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,MAAM;CA2Cd"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
let targetedElems = [];
|
|
2
|
+
export class DomTargeter {
|
|
3
|
+
constructor(targets, onTarget, document) {
|
|
4
|
+
this.targets = [];
|
|
5
|
+
this.styleBlockRefs = {};
|
|
6
|
+
this.unhideTarget = (selector) => {
|
|
7
|
+
if (this.styleBlockRefs[selector]) {
|
|
8
|
+
try {
|
|
9
|
+
this.document.head.removeChild(this.styleBlockRefs[selector]);
|
|
10
|
+
delete this.styleBlockRefs[selector];
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
// do nothing
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
this.hideTarget = (selector) => {
|
|
18
|
+
if (this.styleBlockRefs[selector])
|
|
19
|
+
return;
|
|
20
|
+
const styles = `${selector} { visibility: hidden !important }`;
|
|
21
|
+
const styleBlock = this.document.createElement('style');
|
|
22
|
+
styleBlock.setAttribute('type', 'text/css');
|
|
23
|
+
styleBlock.appendChild(this.document.createTextNode(styles));
|
|
24
|
+
this.document.head.appendChild(styleBlock);
|
|
25
|
+
this.styleBlockRefs[selector] = styleBlock;
|
|
26
|
+
};
|
|
27
|
+
this.document = document || window.document;
|
|
28
|
+
this.targets = targets;
|
|
29
|
+
this.onTarget = onTarget;
|
|
30
|
+
this.retarget();
|
|
31
|
+
if (/complete|loaded/.test(this.document.readyState)) {
|
|
32
|
+
// DOMContent has loaded - unhide targets
|
|
33
|
+
this.targets.forEach((target) => target.hideTarget && this.unhideTarget(target.selector));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// attempt retarget on DOMContentLoaded
|
|
37
|
+
this.document.addEventListener('DOMContentLoaded', () => {
|
|
38
|
+
this.retarget();
|
|
39
|
+
// unhide targets after re-target attempt in DOMContentLoaded
|
|
40
|
+
this.targets.forEach((target) => target.hideTarget && this.unhideTarget(target.selector));
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
getTargets() {
|
|
45
|
+
return this.targets;
|
|
46
|
+
}
|
|
47
|
+
retarget() {
|
|
48
|
+
const targetElemPairs = this.targets.flatMap((target) => {
|
|
49
|
+
// hide targets before found
|
|
50
|
+
if (target.hideTarget) {
|
|
51
|
+
this.hideTarget(target.selector);
|
|
52
|
+
}
|
|
53
|
+
const elems = this.domQuery(target.selector).filter((elem) => {
|
|
54
|
+
if (!targetedElems.find((e) => e == elem)) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// unhide retarget attempts
|
|
59
|
+
this.unhideTarget(target.selector);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
targetedElems = targetedElems.concat(elems);
|
|
63
|
+
return elems.map((elem) => ({ target, elem }));
|
|
64
|
+
});
|
|
65
|
+
const errors = [];
|
|
66
|
+
targetElemPairs.forEach(({ target, elem }) => {
|
|
67
|
+
if (target.inject) {
|
|
68
|
+
try {
|
|
69
|
+
const injectedElem = this.inject(elem, target);
|
|
70
|
+
this.onTarget(target, injectedElem, elem);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
errors.push(String(e));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// empty target selector by default
|
|
78
|
+
target.emptyTarget = target.emptyTarget ?? true;
|
|
79
|
+
if (target.emptyTarget)
|
|
80
|
+
while (elem.firstChild && elem.removeChild(elem.firstChild))
|
|
81
|
+
;
|
|
82
|
+
this.onTarget(target, elem);
|
|
83
|
+
}
|
|
84
|
+
// unhide target
|
|
85
|
+
this.unhideTarget(target.selector);
|
|
86
|
+
});
|
|
87
|
+
if (errors.length) {
|
|
88
|
+
throw new Error(errors.reduce((acc, err) => (acc += err + '\n'), '\n'));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
domQuery(selector) {
|
|
92
|
+
return Array.from(this.document.querySelectorAll(selector));
|
|
93
|
+
}
|
|
94
|
+
inject(elem, target) {
|
|
95
|
+
if (!target || !target.inject) {
|
|
96
|
+
throw new Error('DomTargeter::inject: Injected element unspecified');
|
|
97
|
+
}
|
|
98
|
+
const injectedElem = target.inject.element instanceof Function ? target.inject.element(target, elem) : target.inject.element;
|
|
99
|
+
if (!injectedElem) {
|
|
100
|
+
throw new Error('DomTargeter::inject: Injected element unspecified');
|
|
101
|
+
}
|
|
102
|
+
if (!elem.parentNode) {
|
|
103
|
+
throw new Error('DomTargeter::inject: Provided element has no parent element');
|
|
104
|
+
}
|
|
105
|
+
switch (target?.inject?.action) {
|
|
106
|
+
case 'before':
|
|
107
|
+
elem.parentNode.insertBefore(injectedElem, elem);
|
|
108
|
+
break;
|
|
109
|
+
case 'after':
|
|
110
|
+
if (elem.nextSibling) {
|
|
111
|
+
elem.parentNode.insertBefore(injectedElem, elem.nextSibling);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
elem.parentNode.appendChild(injectedElem);
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
case 'append':
|
|
118
|
+
elem.appendChild(injectedElem);
|
|
119
|
+
break;
|
|
120
|
+
case 'prepend':
|
|
121
|
+
if (elem.firstChild) {
|
|
122
|
+
elem.insertBefore(injectedElem, elem.firstChild);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
elem.appendChild(injectedElem);
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
case 'replace':
|
|
129
|
+
elem.parentNode.replaceChild(injectedElem, elem);
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
return injectedElem;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../../src/cookies/cookies.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,EAAE,OAuCrB,CAAC;AAEF,UAAU,OAAO;IAChB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5E,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const cookies = {
|
|
2
|
+
set: (name, val, sameSite, expires) => {
|
|
3
|
+
sameSite = sameSite || 'Lax';
|
|
4
|
+
let cookie = name + '=' + encodeURIComponent(val) + ';' + 'SameSite=' + sameSite + ';path=/;';
|
|
5
|
+
if (window.location.protocol == 'https:') {
|
|
6
|
+
cookie += 'Secure;';
|
|
7
|
+
}
|
|
8
|
+
if (expires) {
|
|
9
|
+
const d = new Date();
|
|
10
|
+
d.setTime(d.getTime() + expires);
|
|
11
|
+
cookie += 'expires=' + d['toUTCString']() + ';';
|
|
12
|
+
}
|
|
13
|
+
window.document.cookie = cookie;
|
|
14
|
+
},
|
|
15
|
+
get: (name) => {
|
|
16
|
+
name = name + '=';
|
|
17
|
+
const ca = window.document.cookie.split(';');
|
|
18
|
+
for (let i = 0; i < ca.length; i++) {
|
|
19
|
+
let c = ca[i];
|
|
20
|
+
while (c.charAt(0) == ' ') {
|
|
21
|
+
c = c.substring(1);
|
|
22
|
+
}
|
|
23
|
+
if (c.indexOf(name) == 0) {
|
|
24
|
+
return decodeURIComponent(c.substring(name.length, c.length));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return '';
|
|
28
|
+
},
|
|
29
|
+
unset: (name) => {
|
|
30
|
+
window.document.cookie = name + '=; path=/; Max-Age=-99999999;';
|
|
31
|
+
},
|
|
32
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function getFlags(userAgent?: string): FeatureFlags;
|
|
2
|
+
interface FeatureFlags {
|
|
3
|
+
cors: () => boolean;
|
|
4
|
+
cookies: () => boolean;
|
|
5
|
+
storage: () => boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const featureFlags: {
|
|
8
|
+
cors: boolean;
|
|
9
|
+
cookies: boolean;
|
|
10
|
+
storage: boolean;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=featureFlags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"featureFlags.d.ts","sourceRoot":"","sources":["../../../src/featureFlags/featureFlags.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,SAAS,SAAK,GAAG,YAAY,CAqCrD;AAED,UAAU,YAAY;IACrB,IAAI,EAAE,MAAM,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,OAAO,CAAC;CACvB;AAGD,eAAO,MAAM,YAAY;;;;CAIxB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function getFlags(userAgent = '') {
|
|
2
|
+
userAgent = (userAgent || (window.navigator || {}).userAgent || '').toLowerCase();
|
|
3
|
+
const isIE = (function () {
|
|
4
|
+
let ieVersion;
|
|
5
|
+
return function isIE() {
|
|
6
|
+
if (ieVersion === undefined) {
|
|
7
|
+
const version = (userAgent.match(/(msie|trident\/7.0; rv:) ?([0-9]{1,2})\./) || [])[2];
|
|
8
|
+
ieVersion = version ? Number(version) : false;
|
|
9
|
+
}
|
|
10
|
+
return ieVersion;
|
|
11
|
+
};
|
|
12
|
+
})();
|
|
13
|
+
return {
|
|
14
|
+
cors: function () {
|
|
15
|
+
return !isIE() || isIE() >= 10;
|
|
16
|
+
},
|
|
17
|
+
cookies: function () {
|
|
18
|
+
return window.navigator && window.navigator.cookieEnabled && !window.navigator.doNotTrack;
|
|
19
|
+
},
|
|
20
|
+
storage: function () {
|
|
21
|
+
const test = 'ss-test';
|
|
22
|
+
try {
|
|
23
|
+
window.localStorage.setItem(test, test);
|
|
24
|
+
window.localStorage.removeItem(test);
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const flags = getFlags();
|
|
34
|
+
export const featureFlags = {
|
|
35
|
+
cors: flags.cors(),
|
|
36
|
+
cookies: flags.cookies(),
|
|
37
|
+
storage: flags.storage(),
|
|
38
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"currency.d.ts","sourceRoot":"","sources":["../../../src/filters/currency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAEnE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAStF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/filters/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare type formatNumberOptions = {
|
|
2
|
+
symbol?: string;
|
|
3
|
+
decimalPlaces?: number;
|
|
4
|
+
padDecimalPlaces?: boolean;
|
|
5
|
+
thousandsSeparator?: string;
|
|
6
|
+
decimalSeparator?: string;
|
|
7
|
+
symbolAfter?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function formatNumber(input: number, opts?: formatNumberOptions): string | undefined;
|
|
10
|
+
//# sourceMappingURL=formatNumber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatNumber.d.ts","sourceRoot":"","sources":["../../../src/filters/formatNumber.ts"],"names":[],"mappings":"AAAA,oBAAY,mBAAmB,GAAG;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAgC1F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export function formatNumber(input, opts) {
|
|
2
|
+
const options = {
|
|
3
|
+
symbol: '',
|
|
4
|
+
decimalPlaces: 3,
|
|
5
|
+
padDecimalPlaces: true,
|
|
6
|
+
thousandsSeparator: '',
|
|
7
|
+
decimalSeparator: '.',
|
|
8
|
+
symbolAfter: false,
|
|
9
|
+
...opts,
|
|
10
|
+
};
|
|
11
|
+
if (typeof input != 'number' || Number.isNaN(input)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// format based on options
|
|
15
|
+
const split = truncateDecimals(input, options.decimalPlaces).split('.');
|
|
16
|
+
split[0] = split[0].replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + options.thousandsSeparator);
|
|
17
|
+
if (options.decimalPlaces > 0 && options.padDecimalPlaces) {
|
|
18
|
+
split[1] = (split[1] || '').padEnd(options.decimalPlaces, '0');
|
|
19
|
+
}
|
|
20
|
+
let output = split.join(options.decimalSeparator);
|
|
21
|
+
// if symbol should go after
|
|
22
|
+
if (options.symbolAfter) {
|
|
23
|
+
output = output + options.symbol;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
output = options.symbol + output;
|
|
27
|
+
}
|
|
28
|
+
return output;
|
|
29
|
+
}
|
|
30
|
+
function truncateDecimals(input, digits) {
|
|
31
|
+
const numString = input.toString();
|
|
32
|
+
const decimalPosition = numString.indexOf('.');
|
|
33
|
+
const substrLength = decimalPosition == -1 ? numString.length : 1 + decimalPosition + (digits || -1);
|
|
34
|
+
return numString.substr(0, substrLength);
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handleize.d.ts","sourceRoot":"","sources":["../../../src/filters/handleize.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripHTML.d.ts","sourceRoot":"","sources":["../../../src/filters/stripHTML.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncate.d.ts","sourceRoot":"","sources":["../../../src/filters/truncate.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAS9E"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function truncate(input, limit, append) {
|
|
2
|
+
if (typeof input != 'string' || input.length <= limit) {
|
|
3
|
+
return input;
|
|
4
|
+
}
|
|
5
|
+
const lastSpace = input.lastIndexOf(' ', limit);
|
|
6
|
+
const trimIndex = lastSpace != -1 ? lastSpace : limit - 1;
|
|
7
|
+
return input.substr(0, trimIndex) + (append ? append : '');
|
|
8
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getContext.d.ts","sourceRoot":"","sources":["../../../src/getContext/getContext.ts"],"names":[],"mappings":"AAAA,aAAK,gBAAgB,GAAG;IACvB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;CACxB,CAAC;AAEF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,gBAAgB,CAuDpG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export function getContext(evaluate, script) {
|
|
2
|
+
if (!script || typeof script === 'string') {
|
|
3
|
+
const scripts = Array.from(document.querySelectorAll(script || 'script[id^=searchspring], script[src*="snapui.searchspring.io"]'));
|
|
4
|
+
script = scripts
|
|
5
|
+
.sort((a, b) => {
|
|
6
|
+
// order them by innerHTML (so that popped script has innerHTML)
|
|
7
|
+
return a.innerHTML.length - b.innerHTML.length;
|
|
8
|
+
})
|
|
9
|
+
.pop();
|
|
10
|
+
}
|
|
11
|
+
if (!script || typeof script !== 'object' || script.tagName !== 'SCRIPT') {
|
|
12
|
+
throw new Error('getContext: did not find a script tag');
|
|
13
|
+
}
|
|
14
|
+
const scriptElem = script;
|
|
15
|
+
// check script type
|
|
16
|
+
if (!scriptElem.getAttribute('type')?.match(/^searchspring/i) &&
|
|
17
|
+
!scriptElem.id?.match(/^searchspring/i) &&
|
|
18
|
+
!scriptElem.src?.match(/\/\/snapui.searchspring.io/i)) {
|
|
19
|
+
throw new Error('getContext: did not find a script from Snap CDN or with attribute (type, id) starting with "searchspring"');
|
|
20
|
+
}
|
|
21
|
+
if ((evaluate && !Array.isArray(evaluate)) || (evaluate && !evaluate.reduce((accu, name) => accu && typeof name === 'string', true))) {
|
|
22
|
+
throw new Error('getContext: first parameter must be an array of strings');
|
|
23
|
+
}
|
|
24
|
+
const variables = {};
|
|
25
|
+
// grab all element attributes and put into variables
|
|
26
|
+
Object.values(scriptElem.attributes).map((attr) => {
|
|
27
|
+
variables[attr.nodeName] = scriptElem.getAttribute(attr.nodeName);
|
|
28
|
+
});
|
|
29
|
+
try {
|
|
30
|
+
// evaluate text and put into variables
|
|
31
|
+
evaluate?.forEach((name) => {
|
|
32
|
+
const fn = new Function(`
|
|
33
|
+
var ${evaluate.join(', ')};
|
|
34
|
+
${scriptElem.innerHTML}
|
|
35
|
+
return ${name};
|
|
36
|
+
`);
|
|
37
|
+
variables[name] = fn();
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
console.error('getContext: failed to parse variables - error in context');
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
return variables;
|
|
45
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * as filters from './filters/filters';
|
|
2
|
+
export * from './DomTargeter/DomTargeter';
|
|
3
|
+
export * from './featureFlags/featureFlags';
|
|
4
|
+
export * from './cookies/cookies';
|
|
5
|
+
export * from './getContext/getContext';
|
|
6
|
+
export * from './url/url';
|
|
7
|
+
export * from './version/version';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * as filters from './filters/filters';
|
|
2
|
+
export * from './DomTargeter/DomTargeter';
|
|
3
|
+
export * from './featureFlags/featureFlags';
|
|
4
|
+
export * from './cookies/cookies';
|
|
5
|
+
export * from './getContext/getContext';
|
|
6
|
+
export * from './url/url';
|
|
7
|
+
export * from './version/version';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/url/url.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,GAAG,SAAU,MAAM,KAAG,iBA2BlC,CAAC;AAEF,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACP,KAAK,EAAE;YACN,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;SACtB,CAAC;QACF,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;IACF,GAAG,EAAE,MAAM,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const url = (href) => {
|
|
2
|
+
if (!href) {
|
|
3
|
+
return;
|
|
4
|
+
}
|
|
5
|
+
const [urlWithoutHash, hash] = href.split('#');
|
|
6
|
+
const [base, queryParams] = urlWithoutHash.split('?');
|
|
7
|
+
const params = {
|
|
8
|
+
query: {},
|
|
9
|
+
hash,
|
|
10
|
+
};
|
|
11
|
+
queryParams?.split('&').forEach((entry) => {
|
|
12
|
+
const [key, value] = entry.split('=');
|
|
13
|
+
params.query[key] = value;
|
|
14
|
+
});
|
|
15
|
+
const urlfunction = () => {
|
|
16
|
+
const queryString = Object.keys(params.query)
|
|
17
|
+
.map((key) => `${key}=${params.query[key]}`)
|
|
18
|
+
.join('&');
|
|
19
|
+
return `${base}${queryString ? '?' + queryString : ''}${params.hash ? '#' + params.hash : ''}`;
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
base,
|
|
23
|
+
params,
|
|
24
|
+
url: urlfunction,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/version/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAQ,OAAO,QAAgB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@searchspring/snap-toolbox",
|
|
3
|
+
"version": "0.20.0",
|
|
4
|
+
"description": "Snap Toolbox",
|
|
5
|
+
"main": "dist/cjs/index.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
7
|
+
"author": "Searchspring",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"repository": "https://github.com/searchspring/snap",
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "rm -rf ./dist && tsc && tsc -p tsconfig.cjs.json",
|
|
15
|
+
"build:docs": "typedoc --out docs src/index.ts",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"format": "prettier --write 'src/**/*.{js,jsx,ts,tsx}'",
|
|
18
|
+
"lint": "eslint 'src/**/*.{js,jsx,ts,tsx}'",
|
|
19
|
+
"test": "jest",
|
|
20
|
+
"test:watch": "jest --watch"
|
|
21
|
+
},
|
|
22
|
+
"sideEffects": false,
|
|
23
|
+
"files": [
|
|
24
|
+
"dist/**/*"
|
|
25
|
+
],
|
|
26
|
+
"gitHead": "122405b27b497c7bb6a189c30535fdc197bc3ef0"
|
|
27
|
+
}
|