@nativerent/js-utils 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/README.md +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.js +270 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +236 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +22 -0
- package/rollup.config.mjs +39 -0
- package/src/index.ts +362 -0
- package/src/types.d.ts +1 -0
- package/tsconfig.json +13 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# js-utils
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
type Primitive = string | boolean | number;
|
|
2
|
+
|
|
3
|
+
declare function debounce(fn: Function, delay: number): () => void;
|
|
4
|
+
declare function throttle(fn: Function, delay: number): (...args: any[]) => void;
|
|
5
|
+
declare function isObject(obj: any): obj is object;
|
|
6
|
+
declare function isFn(fn: any): fn is Function;
|
|
7
|
+
declare function isStr(str: any): boolean;
|
|
8
|
+
declare function isString(str: any): str is string;
|
|
9
|
+
declare function isHTMLElement(el: any): el is HTMLElement;
|
|
10
|
+
declare function isNum(num: any): num is number;
|
|
11
|
+
declare function isBool(bool: any): boolean;
|
|
12
|
+
declare function isUndef(val: any): val is undefined;
|
|
13
|
+
declare function isNullOrUndef(value: unknown): value is null | undefined;
|
|
14
|
+
declare function isDefined(val: any): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Returns an array containing all the elements of array1 that are not in array2 and vice-versa
|
|
17
|
+
*/
|
|
18
|
+
declare function arrayDiff(array1: Array<Primitive | null | undefined>, array2: Array<Primitive | null | undefined>): Array<Primitive | null | undefined>;
|
|
19
|
+
/**
|
|
20
|
+
* Returns an array of elements present in array1 and array2
|
|
21
|
+
*/
|
|
22
|
+
declare function arrayIntersect(array1: Array<Primitive | null | undefined>, array2: Array<Primitive | null | undefined>): (Primitive | null | undefined)[];
|
|
23
|
+
declare function deepCloneObject<Type>(object: Type): Type;
|
|
24
|
+
declare function getNumericStyleProp(prop: string, el: Element): number;
|
|
25
|
+
declare function objectHasProp(obj: any, prop: string | number | symbol): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Custom version of Object.keys()
|
|
28
|
+
*/
|
|
29
|
+
declare function getObjectKeys(object: object): string[];
|
|
30
|
+
/**
|
|
31
|
+
* Works with primitive objects, see JSDoc @param
|
|
32
|
+
*
|
|
33
|
+
* @param object {[key: string]: SimpleObject | { [key: string]: SimpleObject }}
|
|
34
|
+
*/
|
|
35
|
+
declare function objectToQueryString(object: object): string;
|
|
36
|
+
declare function decodeSafeURL(url: string): string;
|
|
37
|
+
declare function getSafeURL(url: string): string;
|
|
38
|
+
declare function parseURL(url: string): URL;
|
|
39
|
+
declare function encodeQueryString(url: string): string;
|
|
40
|
+
declare function injectScript(filename: string): void;
|
|
41
|
+
declare function injectStyleLink(filename: string): void;
|
|
42
|
+
declare function toBinaryStr(str: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Convert an HTML string into a list of nodes
|
|
45
|
+
*/
|
|
46
|
+
declare function stringToHtmlElements(html: string): NodeListOf<ChildNode>;
|
|
47
|
+
/**
|
|
48
|
+
* Creates an HTML element and sets attributes
|
|
49
|
+
*/
|
|
50
|
+
declare function createHtmlElement(type: string, attributes?: {
|
|
51
|
+
[key: string]: string;
|
|
52
|
+
}): HTMLElement;
|
|
53
|
+
/**
|
|
54
|
+
* Insert HTML elements into DOM
|
|
55
|
+
*/
|
|
56
|
+
declare function insertHtmlElements(nodes: NodeListOf<Node>, appendTo?: Element | null): void;
|
|
57
|
+
/**
|
|
58
|
+
* Make a simple object which contains only attribute name and value
|
|
59
|
+
*/
|
|
60
|
+
declare function flatHtmlAttributes(attributes?: NamedNodeMap): {
|
|
61
|
+
[key: string]: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Create a <script> element
|
|
65
|
+
*/
|
|
66
|
+
declare function createScriptElement(js: string, inline?: boolean, attributes?: {
|
|
67
|
+
[key: string]: string;
|
|
68
|
+
}): HTMLScriptElement;
|
|
69
|
+
/**
|
|
70
|
+
* Create a <style> element
|
|
71
|
+
*/
|
|
72
|
+
declare function createStyleElement(css: string | null): HTMLElement;
|
|
73
|
+
/**
|
|
74
|
+
* Create svg elements
|
|
75
|
+
*/
|
|
76
|
+
declare function createSvgElement(content: string, attributes: {
|
|
77
|
+
[key: string]: string;
|
|
78
|
+
}): SVGSVGElement;
|
|
79
|
+
|
|
80
|
+
export { arrayDiff, arrayIntersect, createHtmlElement, createScriptElement, createStyleElement, createSvgElement, debounce, decodeSafeURL, deepCloneObject, encodeQueryString, flatHtmlAttributes, getNumericStyleProp, getObjectKeys, getSafeURL, injectScript, injectStyleLink, insertHtmlElements, isBool, isDefined, isFn, isHTMLElement, isNullOrUndef, isNum, isObject, isStr, isString, isUndef, objectHasProp, objectToQueryString, parseURL, stringToHtmlElements, throttle, toBinaryStr };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function debounce(fn, delay) {
|
|
4
|
+
let timeout;
|
|
5
|
+
return function(...args) {
|
|
6
|
+
clearTimeout(timeout);
|
|
7
|
+
timeout = setTimeout(() => fn.apply(this, args), delay);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function throttle(fn, delay) {
|
|
11
|
+
let lastCall = 0;
|
|
12
|
+
return function(...args) {
|
|
13
|
+
const now = (/* @__PURE__ */ new Date()).getTime();
|
|
14
|
+
if (now - lastCall < delay) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
lastCall = now;
|
|
18
|
+
fn(...args);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function isObject(obj) {
|
|
22
|
+
return !!obj && typeof obj === "object" && !Array.isArray(obj);
|
|
23
|
+
}
|
|
24
|
+
function isFn(fn) {
|
|
25
|
+
return typeof fn === "function";
|
|
26
|
+
}
|
|
27
|
+
function isStr(str) {
|
|
28
|
+
return typeof str === "string";
|
|
29
|
+
}
|
|
30
|
+
function isString(str) {
|
|
31
|
+
return typeof str === "string";
|
|
32
|
+
}
|
|
33
|
+
function isHTMLElement(el) {
|
|
34
|
+
return el instanceof HTMLElement || el instanceof SVGElement;
|
|
35
|
+
}
|
|
36
|
+
function isNum(num) {
|
|
37
|
+
return typeof num === "number";
|
|
38
|
+
}
|
|
39
|
+
function isBool(bool) {
|
|
40
|
+
return typeof bool === "boolean";
|
|
41
|
+
}
|
|
42
|
+
function isUndef(val) {
|
|
43
|
+
return typeof val === "undefined";
|
|
44
|
+
}
|
|
45
|
+
function isNullOrUndef(value) {
|
|
46
|
+
return value === null || typeof value === "undefined";
|
|
47
|
+
}
|
|
48
|
+
function isDefined(val) {
|
|
49
|
+
return !isUndef(val);
|
|
50
|
+
}
|
|
51
|
+
function arrayDiff(array1, array2) {
|
|
52
|
+
return array1.filter((value) => !array2.includes(value)).concat(array2.filter((value) => !array1.includes(value)));
|
|
53
|
+
}
|
|
54
|
+
function arrayIntersect(array1, array2) {
|
|
55
|
+
return array1.filter((value) => array2.includes(value));
|
|
56
|
+
}
|
|
57
|
+
function deepCloneObject(object) {
|
|
58
|
+
return JSON.parse(JSON.stringify(object));
|
|
59
|
+
}
|
|
60
|
+
function getNumericStyleProp(prop, el) {
|
|
61
|
+
const styles = window.getComputedStyle(el);
|
|
62
|
+
return !isNullOrUndef(styles[prop]) ? parseInt(styles[prop].slice(0, -2)) : 0;
|
|
63
|
+
}
|
|
64
|
+
function objectHasProp(obj, prop) {
|
|
65
|
+
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
66
|
+
}
|
|
67
|
+
function getObjectKeys(object) {
|
|
68
|
+
let key;
|
|
69
|
+
let keys = [];
|
|
70
|
+
for (key in object) {
|
|
71
|
+
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
72
|
+
keys.push(key);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return keys;
|
|
76
|
+
}
|
|
77
|
+
function objectToQueryString(object) {
|
|
78
|
+
return Object.entries(object).map(([k, v]) => {
|
|
79
|
+
if (Array.isArray(v)) {
|
|
80
|
+
return v.map((item) => `${k}[]=${encodeURIComponent(item)}`).join("&");
|
|
81
|
+
} else if (isObject(v)) {
|
|
82
|
+
v = JSON.stringify(v);
|
|
83
|
+
}
|
|
84
|
+
return `${k}=${encodeURIComponent(v || "")}`;
|
|
85
|
+
}).join("&");
|
|
86
|
+
}
|
|
87
|
+
function decodeSafeURL(url) {
|
|
88
|
+
try {
|
|
89
|
+
return decodeURI(url);
|
|
90
|
+
} catch (e) {
|
|
91
|
+
return url;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function getSafeURL(url) {
|
|
95
|
+
return encodeURI(decodeSafeURL(url));
|
|
96
|
+
}
|
|
97
|
+
function parseURL(url) {
|
|
98
|
+
return new URL(url);
|
|
99
|
+
}
|
|
100
|
+
function encodeQueryString(url) {
|
|
101
|
+
if (url.length > 0) {
|
|
102
|
+
const index = url.indexOf("?");
|
|
103
|
+
if (index >= 0) {
|
|
104
|
+
return url.substr(0, index) + parseURL(url).search;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return url;
|
|
108
|
+
}
|
|
109
|
+
function injectScript(filename) {
|
|
110
|
+
const script = document.createElement("script");
|
|
111
|
+
script.src = filename;
|
|
112
|
+
script.async = true;
|
|
113
|
+
document.head.appendChild(script);
|
|
114
|
+
}
|
|
115
|
+
function injectStyleLink(filename) {
|
|
116
|
+
const link = document.createElement("link");
|
|
117
|
+
link.rel = "stylesheet";
|
|
118
|
+
link.href = filename;
|
|
119
|
+
document.head.appendChild(link);
|
|
120
|
+
}
|
|
121
|
+
function toBinaryStr(str) {
|
|
122
|
+
const encoder = new TextEncoder();
|
|
123
|
+
const charCodes = encoder.encode(str);
|
|
124
|
+
return String.fromCharCode(...charCodes);
|
|
125
|
+
}
|
|
126
|
+
function stringToHtmlElements(html) {
|
|
127
|
+
const template = createHtmlElement("div");
|
|
128
|
+
template.innerHTML = html.replace(/[\r\n]/gm, "").trim();
|
|
129
|
+
return template.childNodes;
|
|
130
|
+
}
|
|
131
|
+
function createHtmlElement(type, attributes = {}) {
|
|
132
|
+
const attrs = getObjectKeys(attributes);
|
|
133
|
+
const element = document.createElement(type);
|
|
134
|
+
if (attrs.length) {
|
|
135
|
+
attrs.forEach((name) => {
|
|
136
|
+
element.setAttribute(name, attributes[name]);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return element;
|
|
140
|
+
}
|
|
141
|
+
function insertHtmlElements(nodes, appendTo = null) {
|
|
142
|
+
appendTo = appendTo || document.body;
|
|
143
|
+
const fragment = new DocumentFragment();
|
|
144
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
145
|
+
if (!isHTMLElement(nodes[i]) && nodes[i].nodeType !== 3) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const node = nodes[i];
|
|
149
|
+
let newNode;
|
|
150
|
+
switch (node.nodeName.toLowerCase()) {
|
|
151
|
+
case "script":
|
|
152
|
+
const src = node.getAttribute("src");
|
|
153
|
+
if (!isNullOrUndef(src) && src.length > 0) {
|
|
154
|
+
newNode = createScriptElement(
|
|
155
|
+
src,
|
|
156
|
+
false,
|
|
157
|
+
flatHtmlAttributes(node.attributes)
|
|
158
|
+
);
|
|
159
|
+
} else {
|
|
160
|
+
newNode = createScriptElement(node.innerHTML, true);
|
|
161
|
+
}
|
|
162
|
+
break;
|
|
163
|
+
case "style":
|
|
164
|
+
newNode = createStyleElement(node.textContent);
|
|
165
|
+
break;
|
|
166
|
+
case "svg":
|
|
167
|
+
newNode = createSvgElement(
|
|
168
|
+
node.innerHTML,
|
|
169
|
+
flatHtmlAttributes(node.attributes)
|
|
170
|
+
);
|
|
171
|
+
break;
|
|
172
|
+
case "#text":
|
|
173
|
+
newNode = document.createTextNode(node.textContent ?? "");
|
|
174
|
+
break;
|
|
175
|
+
default:
|
|
176
|
+
newNode = createHtmlElement(
|
|
177
|
+
node.tagName,
|
|
178
|
+
flatHtmlAttributes(node.attributes)
|
|
179
|
+
);
|
|
180
|
+
if (node.childNodes.length) {
|
|
181
|
+
insertHtmlElements(node.childNodes, newNode);
|
|
182
|
+
} else {
|
|
183
|
+
newNode.innerHTML = node.innerHTML;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
fragment.appendChild(newNode);
|
|
187
|
+
}
|
|
188
|
+
appendTo.appendChild(fragment);
|
|
189
|
+
}
|
|
190
|
+
function flatHtmlAttributes(attributes) {
|
|
191
|
+
let flatAttributes = {};
|
|
192
|
+
if (!isNullOrUndef(attributes)) {
|
|
193
|
+
for (let i = 0; i < attributes.length; i++) {
|
|
194
|
+
let attr = attributes[i];
|
|
195
|
+
if (!isUndef(attr)) {
|
|
196
|
+
flatAttributes[attr.name] = attr.value;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return flatAttributes;
|
|
201
|
+
}
|
|
202
|
+
function createScriptElement(js, inline = false, attributes = {}) {
|
|
203
|
+
const attrs = isObject(attributes) ? getObjectKeys(attributes) : [];
|
|
204
|
+
const element = createHtmlElement("script");
|
|
205
|
+
if (attrs.length) {
|
|
206
|
+
attrs.forEach((name) => {
|
|
207
|
+
element.setAttribute(name, attributes[name]);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
if (inline) {
|
|
211
|
+
element.appendChild(document.createTextNode(js));
|
|
212
|
+
} else {
|
|
213
|
+
element.async = true;
|
|
214
|
+
element.src = js;
|
|
215
|
+
}
|
|
216
|
+
return element;
|
|
217
|
+
}
|
|
218
|
+
function createStyleElement(css) {
|
|
219
|
+
const element = createHtmlElement("style");
|
|
220
|
+
if (css) {
|
|
221
|
+
element.appendChild(document.createTextNode(css));
|
|
222
|
+
}
|
|
223
|
+
return element;
|
|
224
|
+
}
|
|
225
|
+
function createSvgElement(content, attributes) {
|
|
226
|
+
const attrs = getObjectKeys(attributes);
|
|
227
|
+
const element = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
228
|
+
if (attrs.length) {
|
|
229
|
+
attrs.forEach((name) => {
|
|
230
|
+
element.setAttribute(name, attributes[name]);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
element.innerHTML = content;
|
|
234
|
+
return element;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
exports.arrayDiff = arrayDiff;
|
|
238
|
+
exports.arrayIntersect = arrayIntersect;
|
|
239
|
+
exports.createHtmlElement = createHtmlElement;
|
|
240
|
+
exports.createScriptElement = createScriptElement;
|
|
241
|
+
exports.createStyleElement = createStyleElement;
|
|
242
|
+
exports.createSvgElement = createSvgElement;
|
|
243
|
+
exports.debounce = debounce;
|
|
244
|
+
exports.decodeSafeURL = decodeSafeURL;
|
|
245
|
+
exports.deepCloneObject = deepCloneObject;
|
|
246
|
+
exports.encodeQueryString = encodeQueryString;
|
|
247
|
+
exports.flatHtmlAttributes = flatHtmlAttributes;
|
|
248
|
+
exports.getNumericStyleProp = getNumericStyleProp;
|
|
249
|
+
exports.getObjectKeys = getObjectKeys;
|
|
250
|
+
exports.getSafeURL = getSafeURL;
|
|
251
|
+
exports.injectScript = injectScript;
|
|
252
|
+
exports.injectStyleLink = injectStyleLink;
|
|
253
|
+
exports.insertHtmlElements = insertHtmlElements;
|
|
254
|
+
exports.isBool = isBool;
|
|
255
|
+
exports.isDefined = isDefined;
|
|
256
|
+
exports.isFn = isFn;
|
|
257
|
+
exports.isHTMLElement = isHTMLElement;
|
|
258
|
+
exports.isNullOrUndef = isNullOrUndef;
|
|
259
|
+
exports.isNum = isNum;
|
|
260
|
+
exports.isObject = isObject;
|
|
261
|
+
exports.isStr = isStr;
|
|
262
|
+
exports.isString = isString;
|
|
263
|
+
exports.isUndef = isUndef;
|
|
264
|
+
exports.objectHasProp = objectHasProp;
|
|
265
|
+
exports.objectToQueryString = objectToQueryString;
|
|
266
|
+
exports.parseURL = parseURL;
|
|
267
|
+
exports.stringToHtmlElements = stringToHtmlElements;
|
|
268
|
+
exports.throttle = throttle;
|
|
269
|
+
exports.toBinaryStr = toBinaryStr;
|
|
270
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { Primitive } from \"./types\";\n\nexport function debounce(fn: Function, delay: number): () => void {\n let timeout: ReturnType<typeof setTimeout>;\n\n return function (this: any, ...args: any[]) {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn.apply(this, args), delay);\n };\n}\n\nexport function throttle(fn: Function, delay: number) {\n let lastCall = 0;\n\n return function (...args: any[]) {\n const now = new Date().getTime();\n if (now - lastCall < delay) {\n return;\n }\n lastCall = now;\n fn(...args);\n };\n}\n\nexport function isObject(obj: any): obj is object {\n return !!obj && typeof obj === \"object\" && !Array.isArray(obj);\n}\n\nexport function isFn(fn: any): fn is Function {\n return typeof fn === \"function\";\n}\n\nexport function isStr(str: any): boolean {\n return typeof str === \"string\";\n}\n\nexport function isString(str: any): str is string {\n return typeof str === \"string\";\n}\n\nexport function isHTMLElement(el: any): el is HTMLElement {\n return el instanceof HTMLElement || el instanceof SVGElement;\n}\n\nexport function isNum(num: any): num is number {\n return typeof num === \"number\";\n}\n\nexport function isBool(bool: any): boolean {\n return typeof bool === \"boolean\";\n}\n\nexport function isUndef(val: any): val is undefined {\n return typeof val === \"undefined\";\n}\n\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || typeof value === \"undefined\";\n}\n\nexport function isDefined(val: any): boolean {\n return !isUndef(val);\n}\n\n/**\n * Returns an array containing all the elements of array1 that are not in array2 and vice-versa\n */\nexport function arrayDiff(\n array1: Array<Primitive | null | undefined>,\n array2: Array<Primitive | null | undefined>,\n): Array<Primitive | null | undefined> {\n return array1\n .filter((value) => !array2.includes(value))\n .concat(array2.filter((value: any) => !array1.includes(value)));\n}\n\n/**\n * Returns an array of elements present in array1 and array2\n */\nexport function arrayIntersect(\n array1: Array<Primitive | null | undefined>,\n array2: Array<Primitive | null | undefined>,\n) {\n return array1.filter((value) => array2.includes(value));\n}\n\nexport function deepCloneObject<Type>(object: Type): Type {\n return JSON.parse(JSON.stringify(object));\n}\n\nexport function getNumericStyleProp(prop: string, el: Element) {\n const styles: { [key: string]: any } = window.getComputedStyle(el);\n return !isNullOrUndef(styles[prop]) ? parseInt(styles[prop].slice(0, -2)) : 0;\n}\n\nexport function objectHasProp(\n obj: any,\n prop: string | number | symbol,\n): boolean {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n/**\n * Custom version of Object.keys()\n */\nexport function getObjectKeys(object: object): string[] {\n let key;\n let keys = [];\n\n for (key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n\n return keys;\n}\n\n/**\n * Works with primitive objects, see JSDoc @param\n *\n * @param object {[key: string]: SimpleObject | { [key: string]: SimpleObject }}\n */\nexport function objectToQueryString(object: object): string {\n return Object.entries(object)\n .map(([k, v]) => {\n if (Array.isArray(v)) {\n return v.map((item) => `${k}[]=${encodeURIComponent(item)}`).join(\"&\");\n } else if (isObject(v)) {\n v = JSON.stringify(v);\n }\n return `${k}=${encodeURIComponent(v || \"\")}`;\n })\n .join(\"&\");\n}\n\nexport function decodeSafeURL(url: string): string {\n try {\n return decodeURI(url);\n } catch (e) {\n return url;\n }\n}\n\nexport function getSafeURL(url: string): string {\n return encodeURI(decodeSafeURL(url));\n}\n\nexport function parseURL(url: string): URL {\n return new URL(url);\n}\n\nexport function encodeQueryString(url: string): string {\n if (url.length > 0) {\n const index = url.indexOf(\"?\");\n if (index >= 0) {\n return url.substr(0, index) + parseURL(url).search;\n }\n }\n\n return url;\n}\n\nexport function injectScript(filename: string): void {\n const script = document.createElement(\"script\");\n script.src = filename;\n script.async = true;\n document.head.appendChild(script);\n}\n\nexport function injectStyleLink(filename: string): void {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = filename;\n document.head.appendChild(link);\n}\n\nexport function toBinaryStr(str: string) {\n const encoder = new TextEncoder();\n // 1: split the UTF-16 string into an array of bytes\n const charCodes = encoder.encode(str);\n // 2: concatenate byte data to create a binary string\n return String.fromCharCode(...charCodes);\n}\n\n/**\n * Convert an HTML string into a list of nodes\n */\nexport function stringToHtmlElements(html: string): NodeListOf<ChildNode> {\n const template = createHtmlElement(\"div\");\n template.innerHTML = html.replace(/[\\r\\n]/gm, \"\").trim();\n return template.childNodes;\n}\n\n/**\n * Creates an HTML element and sets attributes\n */\nexport function createHtmlElement(\n type: string,\n attributes: { [key: string]: string } = {},\n): HTMLElement {\n const attrs = getObjectKeys(attributes);\n const element = document.createElement(type);\n\n if (attrs.length) {\n attrs.forEach((name) => {\n element.setAttribute(name, attributes[name]);\n });\n }\n\n return element;\n}\n\n/**\n * Insert HTML elements into DOM\n */\nexport function insertHtmlElements(\n nodes: NodeListOf<Node>,\n appendTo: Element | null = null,\n) {\n appendTo = appendTo || document.body;\n\n const fragment = new DocumentFragment();\n\n for (let i = 0; i < nodes.length; i++) {\n // skip non tags and non text, 3 for text nodes\n if (!isHTMLElement(nodes[i]) && nodes[i].nodeType !== 3) {\n continue;\n }\n\n const node = nodes[i] as HTMLElement;\n let newNode;\n\n switch (node.nodeName.toLowerCase()) {\n case \"script\":\n const src = node.getAttribute(\"src\");\n\n if (!isNullOrUndef(src) && src.length > 0) {\n newNode = createScriptElement(\n src,\n false,\n flatHtmlAttributes(node.attributes),\n );\n } else {\n newNode = createScriptElement(node.innerHTML, true);\n }\n break;\n\n case \"style\":\n newNode = createStyleElement(node.textContent);\n break;\n\n case \"svg\":\n newNode = createSvgElement(\n node.innerHTML,\n flatHtmlAttributes(node.attributes),\n );\n break;\n\n case \"#text\":\n newNode = document.createTextNode(node.textContent ?? \"\");\n break;\n\n default:\n newNode = createHtmlElement(\n node.tagName,\n flatHtmlAttributes(node.attributes),\n );\n\n // recursive\n if (node.childNodes.length) {\n insertHtmlElements(node.childNodes, newNode);\n } else {\n newNode.innerHTML = node.innerHTML;\n }\n }\n\n fragment.appendChild(newNode);\n }\n\n appendTo.appendChild(fragment);\n}\n\n/**\n * Make a simple object which contains only attribute name and value\n */\nexport function flatHtmlAttributes(attributes?: NamedNodeMap) {\n let flatAttributes: { [key: string]: string } = {};\n\n if (!isNullOrUndef(attributes)) {\n for (let i = 0; i < attributes.length; i++) {\n let attr = attributes[i];\n\n if (!isUndef(attr)) {\n flatAttributes[attr.name] = attr.value;\n }\n }\n }\n\n return flatAttributes;\n}\n\n/**\n * Create a <script> element\n */\nexport function createScriptElement(\n js: string,\n inline: boolean = false,\n attributes: { [key: string]: string } = {},\n) {\n const attrs = isObject(attributes) ? getObjectKeys(attributes) : [];\n const element = createHtmlElement(\"script\") as HTMLScriptElement;\n\n if (attrs.length) {\n attrs.forEach((name) => {\n element.setAttribute(name, attributes[name]);\n });\n }\n\n if (inline) {\n element.appendChild(document.createTextNode(js));\n } else {\n element.async = true;\n element.src = js;\n }\n\n return element;\n}\n\n/**\n * Create a <style> element\n */\nexport function createStyleElement(css: string | null) {\n const element = createHtmlElement(\"style\");\n\n if (css) {\n element.appendChild(document.createTextNode(css));\n }\n\n return element;\n}\n\n/**\n * Create svg elements\n */\nexport function createSvgElement(\n content: string,\n attributes: { [key: string]: string },\n) {\n const attrs = getObjectKeys(attributes);\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\n if (attrs.length) {\n attrs.forEach((name) => {\n element.setAttribute(name, attributes[name]);\n });\n }\n\n element.innerHTML = content;\n\n return element;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
function debounce(fn, delay) {
|
|
2
|
+
let timeout;
|
|
3
|
+
return function(...args) {
|
|
4
|
+
clearTimeout(timeout);
|
|
5
|
+
timeout = setTimeout(() => fn.apply(this, args), delay);
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
function throttle(fn, delay) {
|
|
9
|
+
let lastCall = 0;
|
|
10
|
+
return function(...args) {
|
|
11
|
+
const now = (/* @__PURE__ */ new Date()).getTime();
|
|
12
|
+
if (now - lastCall < delay) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
lastCall = now;
|
|
16
|
+
fn(...args);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function isObject(obj) {
|
|
20
|
+
return !!obj && typeof obj === "object" && !Array.isArray(obj);
|
|
21
|
+
}
|
|
22
|
+
function isFn(fn) {
|
|
23
|
+
return typeof fn === "function";
|
|
24
|
+
}
|
|
25
|
+
function isStr(str) {
|
|
26
|
+
return typeof str === "string";
|
|
27
|
+
}
|
|
28
|
+
function isString(str) {
|
|
29
|
+
return typeof str === "string";
|
|
30
|
+
}
|
|
31
|
+
function isHTMLElement(el) {
|
|
32
|
+
return el instanceof HTMLElement || el instanceof SVGElement;
|
|
33
|
+
}
|
|
34
|
+
function isNum(num) {
|
|
35
|
+
return typeof num === "number";
|
|
36
|
+
}
|
|
37
|
+
function isBool(bool) {
|
|
38
|
+
return typeof bool === "boolean";
|
|
39
|
+
}
|
|
40
|
+
function isUndef(val) {
|
|
41
|
+
return typeof val === "undefined";
|
|
42
|
+
}
|
|
43
|
+
function isNullOrUndef(value) {
|
|
44
|
+
return value === null || typeof value === "undefined";
|
|
45
|
+
}
|
|
46
|
+
function isDefined(val) {
|
|
47
|
+
return !isUndef(val);
|
|
48
|
+
}
|
|
49
|
+
function arrayDiff(array1, array2) {
|
|
50
|
+
return array1.filter((value) => !array2.includes(value)).concat(array2.filter((value) => !array1.includes(value)));
|
|
51
|
+
}
|
|
52
|
+
function arrayIntersect(array1, array2) {
|
|
53
|
+
return array1.filter((value) => array2.includes(value));
|
|
54
|
+
}
|
|
55
|
+
function deepCloneObject(object) {
|
|
56
|
+
return JSON.parse(JSON.stringify(object));
|
|
57
|
+
}
|
|
58
|
+
function getNumericStyleProp(prop, el) {
|
|
59
|
+
const styles = window.getComputedStyle(el);
|
|
60
|
+
return !isNullOrUndef(styles[prop]) ? parseInt(styles[prop].slice(0, -2)) : 0;
|
|
61
|
+
}
|
|
62
|
+
function objectHasProp(obj, prop) {
|
|
63
|
+
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
64
|
+
}
|
|
65
|
+
function getObjectKeys(object) {
|
|
66
|
+
let key;
|
|
67
|
+
let keys = [];
|
|
68
|
+
for (key in object) {
|
|
69
|
+
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
70
|
+
keys.push(key);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return keys;
|
|
74
|
+
}
|
|
75
|
+
function objectToQueryString(object) {
|
|
76
|
+
return Object.entries(object).map(([k, v]) => {
|
|
77
|
+
if (Array.isArray(v)) {
|
|
78
|
+
return v.map((item) => `${k}[]=${encodeURIComponent(item)}`).join("&");
|
|
79
|
+
} else if (isObject(v)) {
|
|
80
|
+
v = JSON.stringify(v);
|
|
81
|
+
}
|
|
82
|
+
return `${k}=${encodeURIComponent(v || "")}`;
|
|
83
|
+
}).join("&");
|
|
84
|
+
}
|
|
85
|
+
function decodeSafeURL(url) {
|
|
86
|
+
try {
|
|
87
|
+
return decodeURI(url);
|
|
88
|
+
} catch (e) {
|
|
89
|
+
return url;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function getSafeURL(url) {
|
|
93
|
+
return encodeURI(decodeSafeURL(url));
|
|
94
|
+
}
|
|
95
|
+
function parseURL(url) {
|
|
96
|
+
return new URL(url);
|
|
97
|
+
}
|
|
98
|
+
function encodeQueryString(url) {
|
|
99
|
+
if (url.length > 0) {
|
|
100
|
+
const index = url.indexOf("?");
|
|
101
|
+
if (index >= 0) {
|
|
102
|
+
return url.substr(0, index) + parseURL(url).search;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return url;
|
|
106
|
+
}
|
|
107
|
+
function injectScript(filename) {
|
|
108
|
+
const script = document.createElement("script");
|
|
109
|
+
script.src = filename;
|
|
110
|
+
script.async = true;
|
|
111
|
+
document.head.appendChild(script);
|
|
112
|
+
}
|
|
113
|
+
function injectStyleLink(filename) {
|
|
114
|
+
const link = document.createElement("link");
|
|
115
|
+
link.rel = "stylesheet";
|
|
116
|
+
link.href = filename;
|
|
117
|
+
document.head.appendChild(link);
|
|
118
|
+
}
|
|
119
|
+
function toBinaryStr(str) {
|
|
120
|
+
const encoder = new TextEncoder();
|
|
121
|
+
const charCodes = encoder.encode(str);
|
|
122
|
+
return String.fromCharCode(...charCodes);
|
|
123
|
+
}
|
|
124
|
+
function stringToHtmlElements(html) {
|
|
125
|
+
const template = createHtmlElement("div");
|
|
126
|
+
template.innerHTML = html.replace(/[\r\n]/gm, "").trim();
|
|
127
|
+
return template.childNodes;
|
|
128
|
+
}
|
|
129
|
+
function createHtmlElement(type, attributes = {}) {
|
|
130
|
+
const attrs = getObjectKeys(attributes);
|
|
131
|
+
const element = document.createElement(type);
|
|
132
|
+
if (attrs.length) {
|
|
133
|
+
attrs.forEach((name) => {
|
|
134
|
+
element.setAttribute(name, attributes[name]);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return element;
|
|
138
|
+
}
|
|
139
|
+
function insertHtmlElements(nodes, appendTo = null) {
|
|
140
|
+
appendTo = appendTo || document.body;
|
|
141
|
+
const fragment = new DocumentFragment();
|
|
142
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
143
|
+
if (!isHTMLElement(nodes[i]) && nodes[i].nodeType !== 3) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const node = nodes[i];
|
|
147
|
+
let newNode;
|
|
148
|
+
switch (node.nodeName.toLowerCase()) {
|
|
149
|
+
case "script":
|
|
150
|
+
const src = node.getAttribute("src");
|
|
151
|
+
if (!isNullOrUndef(src) && src.length > 0) {
|
|
152
|
+
newNode = createScriptElement(
|
|
153
|
+
src,
|
|
154
|
+
false,
|
|
155
|
+
flatHtmlAttributes(node.attributes)
|
|
156
|
+
);
|
|
157
|
+
} else {
|
|
158
|
+
newNode = createScriptElement(node.innerHTML, true);
|
|
159
|
+
}
|
|
160
|
+
break;
|
|
161
|
+
case "style":
|
|
162
|
+
newNode = createStyleElement(node.textContent);
|
|
163
|
+
break;
|
|
164
|
+
case "svg":
|
|
165
|
+
newNode = createSvgElement(
|
|
166
|
+
node.innerHTML,
|
|
167
|
+
flatHtmlAttributes(node.attributes)
|
|
168
|
+
);
|
|
169
|
+
break;
|
|
170
|
+
case "#text":
|
|
171
|
+
newNode = document.createTextNode(node.textContent ?? "");
|
|
172
|
+
break;
|
|
173
|
+
default:
|
|
174
|
+
newNode = createHtmlElement(
|
|
175
|
+
node.tagName,
|
|
176
|
+
flatHtmlAttributes(node.attributes)
|
|
177
|
+
);
|
|
178
|
+
if (node.childNodes.length) {
|
|
179
|
+
insertHtmlElements(node.childNodes, newNode);
|
|
180
|
+
} else {
|
|
181
|
+
newNode.innerHTML = node.innerHTML;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
fragment.appendChild(newNode);
|
|
185
|
+
}
|
|
186
|
+
appendTo.appendChild(fragment);
|
|
187
|
+
}
|
|
188
|
+
function flatHtmlAttributes(attributes) {
|
|
189
|
+
let flatAttributes = {};
|
|
190
|
+
if (!isNullOrUndef(attributes)) {
|
|
191
|
+
for (let i = 0; i < attributes.length; i++) {
|
|
192
|
+
let attr = attributes[i];
|
|
193
|
+
if (!isUndef(attr)) {
|
|
194
|
+
flatAttributes[attr.name] = attr.value;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return flatAttributes;
|
|
199
|
+
}
|
|
200
|
+
function createScriptElement(js, inline = false, attributes = {}) {
|
|
201
|
+
const attrs = isObject(attributes) ? getObjectKeys(attributes) : [];
|
|
202
|
+
const element = createHtmlElement("script");
|
|
203
|
+
if (attrs.length) {
|
|
204
|
+
attrs.forEach((name) => {
|
|
205
|
+
element.setAttribute(name, attributes[name]);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
if (inline) {
|
|
209
|
+
element.appendChild(document.createTextNode(js));
|
|
210
|
+
} else {
|
|
211
|
+
element.async = true;
|
|
212
|
+
element.src = js;
|
|
213
|
+
}
|
|
214
|
+
return element;
|
|
215
|
+
}
|
|
216
|
+
function createStyleElement(css) {
|
|
217
|
+
const element = createHtmlElement("style");
|
|
218
|
+
if (css) {
|
|
219
|
+
element.appendChild(document.createTextNode(css));
|
|
220
|
+
}
|
|
221
|
+
return element;
|
|
222
|
+
}
|
|
223
|
+
function createSvgElement(content, attributes) {
|
|
224
|
+
const attrs = getObjectKeys(attributes);
|
|
225
|
+
const element = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
226
|
+
if (attrs.length) {
|
|
227
|
+
attrs.forEach((name) => {
|
|
228
|
+
element.setAttribute(name, attributes[name]);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
element.innerHTML = content;
|
|
232
|
+
return element;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export { arrayDiff, arrayIntersect, createHtmlElement, createScriptElement, createStyleElement, createSvgElement, debounce, decodeSafeURL, deepCloneObject, encodeQueryString, flatHtmlAttributes, getNumericStyleProp, getObjectKeys, getSafeURL, injectScript, injectStyleLink, insertHtmlElements, isBool, isDefined, isFn, isHTMLElement, isNullOrUndef, isNum, isObject, isStr, isString, isUndef, objectHasProp, objectToQueryString, parseURL, stringToHtmlElements, throttle, toBinaryStr };
|
|
236
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { Primitive } from \"./types\";\n\nexport function debounce(fn: Function, delay: number): () => void {\n let timeout: ReturnType<typeof setTimeout>;\n\n return function (this: any, ...args: any[]) {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn.apply(this, args), delay);\n };\n}\n\nexport function throttle(fn: Function, delay: number) {\n let lastCall = 0;\n\n return function (...args: any[]) {\n const now = new Date().getTime();\n if (now - lastCall < delay) {\n return;\n }\n lastCall = now;\n fn(...args);\n };\n}\n\nexport function isObject(obj: any): obj is object {\n return !!obj && typeof obj === \"object\" && !Array.isArray(obj);\n}\n\nexport function isFn(fn: any): fn is Function {\n return typeof fn === \"function\";\n}\n\nexport function isStr(str: any): boolean {\n return typeof str === \"string\";\n}\n\nexport function isString(str: any): str is string {\n return typeof str === \"string\";\n}\n\nexport function isHTMLElement(el: any): el is HTMLElement {\n return el instanceof HTMLElement || el instanceof SVGElement;\n}\n\nexport function isNum(num: any): num is number {\n return typeof num === \"number\";\n}\n\nexport function isBool(bool: any): boolean {\n return typeof bool === \"boolean\";\n}\n\nexport function isUndef(val: any): val is undefined {\n return typeof val === \"undefined\";\n}\n\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || typeof value === \"undefined\";\n}\n\nexport function isDefined(val: any): boolean {\n return !isUndef(val);\n}\n\n/**\n * Returns an array containing all the elements of array1 that are not in array2 and vice-versa\n */\nexport function arrayDiff(\n array1: Array<Primitive | null | undefined>,\n array2: Array<Primitive | null | undefined>,\n): Array<Primitive | null | undefined> {\n return array1\n .filter((value) => !array2.includes(value))\n .concat(array2.filter((value: any) => !array1.includes(value)));\n}\n\n/**\n * Returns an array of elements present in array1 and array2\n */\nexport function arrayIntersect(\n array1: Array<Primitive | null | undefined>,\n array2: Array<Primitive | null | undefined>,\n) {\n return array1.filter((value) => array2.includes(value));\n}\n\nexport function deepCloneObject<Type>(object: Type): Type {\n return JSON.parse(JSON.stringify(object));\n}\n\nexport function getNumericStyleProp(prop: string, el: Element) {\n const styles: { [key: string]: any } = window.getComputedStyle(el);\n return !isNullOrUndef(styles[prop]) ? parseInt(styles[prop].slice(0, -2)) : 0;\n}\n\nexport function objectHasProp(\n obj: any,\n prop: string | number | symbol,\n): boolean {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n/**\n * Custom version of Object.keys()\n */\nexport function getObjectKeys(object: object): string[] {\n let key;\n let keys = [];\n\n for (key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n\n return keys;\n}\n\n/**\n * Works with primitive objects, see JSDoc @param\n *\n * @param object {[key: string]: SimpleObject | { [key: string]: SimpleObject }}\n */\nexport function objectToQueryString(object: object): string {\n return Object.entries(object)\n .map(([k, v]) => {\n if (Array.isArray(v)) {\n return v.map((item) => `${k}[]=${encodeURIComponent(item)}`).join(\"&\");\n } else if (isObject(v)) {\n v = JSON.stringify(v);\n }\n return `${k}=${encodeURIComponent(v || \"\")}`;\n })\n .join(\"&\");\n}\n\nexport function decodeSafeURL(url: string): string {\n try {\n return decodeURI(url);\n } catch (e) {\n return url;\n }\n}\n\nexport function getSafeURL(url: string): string {\n return encodeURI(decodeSafeURL(url));\n}\n\nexport function parseURL(url: string): URL {\n return new URL(url);\n}\n\nexport function encodeQueryString(url: string): string {\n if (url.length > 0) {\n const index = url.indexOf(\"?\");\n if (index >= 0) {\n return url.substr(0, index) + parseURL(url).search;\n }\n }\n\n return url;\n}\n\nexport function injectScript(filename: string): void {\n const script = document.createElement(\"script\");\n script.src = filename;\n script.async = true;\n document.head.appendChild(script);\n}\n\nexport function injectStyleLink(filename: string): void {\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = filename;\n document.head.appendChild(link);\n}\n\nexport function toBinaryStr(str: string) {\n const encoder = new TextEncoder();\n // 1: split the UTF-16 string into an array of bytes\n const charCodes = encoder.encode(str);\n // 2: concatenate byte data to create a binary string\n return String.fromCharCode(...charCodes);\n}\n\n/**\n * Convert an HTML string into a list of nodes\n */\nexport function stringToHtmlElements(html: string): NodeListOf<ChildNode> {\n const template = createHtmlElement(\"div\");\n template.innerHTML = html.replace(/[\\r\\n]/gm, \"\").trim();\n return template.childNodes;\n}\n\n/**\n * Creates an HTML element and sets attributes\n */\nexport function createHtmlElement(\n type: string,\n attributes: { [key: string]: string } = {},\n): HTMLElement {\n const attrs = getObjectKeys(attributes);\n const element = document.createElement(type);\n\n if (attrs.length) {\n attrs.forEach((name) => {\n element.setAttribute(name, attributes[name]);\n });\n }\n\n return element;\n}\n\n/**\n * Insert HTML elements into DOM\n */\nexport function insertHtmlElements(\n nodes: NodeListOf<Node>,\n appendTo: Element | null = null,\n) {\n appendTo = appendTo || document.body;\n\n const fragment = new DocumentFragment();\n\n for (let i = 0; i < nodes.length; i++) {\n // skip non tags and non text, 3 for text nodes\n if (!isHTMLElement(nodes[i]) && nodes[i].nodeType !== 3) {\n continue;\n }\n\n const node = nodes[i] as HTMLElement;\n let newNode;\n\n switch (node.nodeName.toLowerCase()) {\n case \"script\":\n const src = node.getAttribute(\"src\");\n\n if (!isNullOrUndef(src) && src.length > 0) {\n newNode = createScriptElement(\n src,\n false,\n flatHtmlAttributes(node.attributes),\n );\n } else {\n newNode = createScriptElement(node.innerHTML, true);\n }\n break;\n\n case \"style\":\n newNode = createStyleElement(node.textContent);\n break;\n\n case \"svg\":\n newNode = createSvgElement(\n node.innerHTML,\n flatHtmlAttributes(node.attributes),\n );\n break;\n\n case \"#text\":\n newNode = document.createTextNode(node.textContent ?? \"\");\n break;\n\n default:\n newNode = createHtmlElement(\n node.tagName,\n flatHtmlAttributes(node.attributes),\n );\n\n // recursive\n if (node.childNodes.length) {\n insertHtmlElements(node.childNodes, newNode);\n } else {\n newNode.innerHTML = node.innerHTML;\n }\n }\n\n fragment.appendChild(newNode);\n }\n\n appendTo.appendChild(fragment);\n}\n\n/**\n * Make a simple object which contains only attribute name and value\n */\nexport function flatHtmlAttributes(attributes?: NamedNodeMap) {\n let flatAttributes: { [key: string]: string } = {};\n\n if (!isNullOrUndef(attributes)) {\n for (let i = 0; i < attributes.length; i++) {\n let attr = attributes[i];\n\n if (!isUndef(attr)) {\n flatAttributes[attr.name] = attr.value;\n }\n }\n }\n\n return flatAttributes;\n}\n\n/**\n * Create a <script> element\n */\nexport function createScriptElement(\n js: string,\n inline: boolean = false,\n attributes: { [key: string]: string } = {},\n) {\n const attrs = isObject(attributes) ? getObjectKeys(attributes) : [];\n const element = createHtmlElement(\"script\") as HTMLScriptElement;\n\n if (attrs.length) {\n attrs.forEach((name) => {\n element.setAttribute(name, attributes[name]);\n });\n }\n\n if (inline) {\n element.appendChild(document.createTextNode(js));\n } else {\n element.async = true;\n element.src = js;\n }\n\n return element;\n}\n\n/**\n * Create a <style> element\n */\nexport function createStyleElement(css: string | null) {\n const element = createHtmlElement(\"style\");\n\n if (css) {\n element.appendChild(document.createTextNode(css));\n }\n\n return element;\n}\n\n/**\n * Create svg elements\n */\nexport function createSvgElement(\n content: string,\n attributes: { [key: string]: string },\n) {\n const attrs = getObjectKeys(attributes);\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\n if (attrs.length) {\n attrs.forEach((name) => {\n element.setAttribute(name, attributes[name]);\n });\n }\n\n element.innerHTML = content;\n\n return element;\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nativerent/js-utils",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"typings": "dist/index.d.ts",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "rollup -c",
|
|
10
|
+
"watch": "rollup -c -w"
|
|
11
|
+
},
|
|
12
|
+
"author": "NativeRent",
|
|
13
|
+
"license": "GPL-3.0-or-later",
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"eslint": "^8.56.0",
|
|
16
|
+
"prettier": "^3.1.1",
|
|
17
|
+
"rollup": "^4.9.4",
|
|
18
|
+
"rollup-plugin-dts": "^6.1.0",
|
|
19
|
+
"rollup-plugin-esbuild": "^6.1.0",
|
|
20
|
+
"typescript": "^5.3.3"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import dts from "rollup-plugin-dts";
|
|
2
|
+
import esbuild from "rollup-plugin-esbuild";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @param {import('rollup').RollupOptions} config
|
|
6
|
+
* @returns {import('rollup').RollupOptions}
|
|
7
|
+
*/
|
|
8
|
+
const bundle = (config) => ({
|
|
9
|
+
...config,
|
|
10
|
+
input: "src/index.ts",
|
|
11
|
+
external: (id) => !/^[./]/.test(id),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const outputDir = "dist";
|
|
15
|
+
|
|
16
|
+
export default [
|
|
17
|
+
bundle({
|
|
18
|
+
plugins: [esbuild()],
|
|
19
|
+
output: [
|
|
20
|
+
{
|
|
21
|
+
file: `${outputDir}/index.js`,
|
|
22
|
+
format: "cjs",
|
|
23
|
+
sourcemap: true,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
file: `${outputDir}/index.mjs`,
|
|
27
|
+
format: "es",
|
|
28
|
+
sourcemap: true,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
}),
|
|
32
|
+
bundle({
|
|
33
|
+
plugins: [dts()],
|
|
34
|
+
output: {
|
|
35
|
+
file: `${outputDir}/index.d.ts`,
|
|
36
|
+
format: "es",
|
|
37
|
+
},
|
|
38
|
+
}),
|
|
39
|
+
];
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { Primitive } from "./types";
|
|
2
|
+
|
|
3
|
+
export function debounce(fn: Function, delay: number): () => void {
|
|
4
|
+
let timeout: ReturnType<typeof setTimeout>;
|
|
5
|
+
|
|
6
|
+
return function (this: any, ...args: any[]) {
|
|
7
|
+
clearTimeout(timeout);
|
|
8
|
+
timeout = setTimeout(() => fn.apply(this, args), delay);
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function throttle(fn: Function, delay: number) {
|
|
13
|
+
let lastCall = 0;
|
|
14
|
+
|
|
15
|
+
return function (...args: any[]) {
|
|
16
|
+
const now = new Date().getTime();
|
|
17
|
+
if (now - lastCall < delay) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
lastCall = now;
|
|
21
|
+
fn(...args);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function isObject(obj: any): obj is object {
|
|
26
|
+
return !!obj && typeof obj === "object" && !Array.isArray(obj);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function isFn(fn: any): fn is Function {
|
|
30
|
+
return typeof fn === "function";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function isStr(str: any): boolean {
|
|
34
|
+
return typeof str === "string";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function isString(str: any): str is string {
|
|
38
|
+
return typeof str === "string";
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function isHTMLElement(el: any): el is HTMLElement {
|
|
42
|
+
return el instanceof HTMLElement || el instanceof SVGElement;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function isNum(num: any): num is number {
|
|
46
|
+
return typeof num === "number";
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function isBool(bool: any): boolean {
|
|
50
|
+
return typeof bool === "boolean";
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function isUndef(val: any): val is undefined {
|
|
54
|
+
return typeof val === "undefined";
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function isNullOrUndef(value: unknown): value is null | undefined {
|
|
58
|
+
return value === null || typeof value === "undefined";
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function isDefined(val: any): boolean {
|
|
62
|
+
return !isUndef(val);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Returns an array containing all the elements of array1 that are not in array2 and vice-versa
|
|
67
|
+
*/
|
|
68
|
+
export function arrayDiff(
|
|
69
|
+
array1: Array<Primitive | null | undefined>,
|
|
70
|
+
array2: Array<Primitive | null | undefined>,
|
|
71
|
+
): Array<Primitive | null | undefined> {
|
|
72
|
+
return array1
|
|
73
|
+
.filter((value) => !array2.includes(value))
|
|
74
|
+
.concat(array2.filter((value: any) => !array1.includes(value)));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Returns an array of elements present in array1 and array2
|
|
79
|
+
*/
|
|
80
|
+
export function arrayIntersect(
|
|
81
|
+
array1: Array<Primitive | null | undefined>,
|
|
82
|
+
array2: Array<Primitive | null | undefined>,
|
|
83
|
+
) {
|
|
84
|
+
return array1.filter((value) => array2.includes(value));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function deepCloneObject<Type>(object: Type): Type {
|
|
88
|
+
return JSON.parse(JSON.stringify(object));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function getNumericStyleProp(prop: string, el: Element) {
|
|
92
|
+
const styles: { [key: string]: any } = window.getComputedStyle(el);
|
|
93
|
+
return !isNullOrUndef(styles[prop]) ? parseInt(styles[prop].slice(0, -2)) : 0;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function objectHasProp(
|
|
97
|
+
obj: any,
|
|
98
|
+
prop: string | number | symbol,
|
|
99
|
+
): boolean {
|
|
100
|
+
return Object.prototype.hasOwnProperty.call(obj, prop);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Custom version of Object.keys()
|
|
105
|
+
*/
|
|
106
|
+
export function getObjectKeys(object: object): string[] {
|
|
107
|
+
let key;
|
|
108
|
+
let keys = [];
|
|
109
|
+
|
|
110
|
+
for (key in object) {
|
|
111
|
+
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
112
|
+
keys.push(key);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return keys;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Works with primitive objects, see JSDoc @param
|
|
121
|
+
*
|
|
122
|
+
* @param object {[key: string]: SimpleObject | { [key: string]: SimpleObject }}
|
|
123
|
+
*/
|
|
124
|
+
export function objectToQueryString(object: object): string {
|
|
125
|
+
return Object.entries(object)
|
|
126
|
+
.map(([k, v]) => {
|
|
127
|
+
if (Array.isArray(v)) {
|
|
128
|
+
return v.map((item) => `${k}[]=${encodeURIComponent(item)}`).join("&");
|
|
129
|
+
} else if (isObject(v)) {
|
|
130
|
+
v = JSON.stringify(v);
|
|
131
|
+
}
|
|
132
|
+
return `${k}=${encodeURIComponent(v || "")}`;
|
|
133
|
+
})
|
|
134
|
+
.join("&");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export function decodeSafeURL(url: string): string {
|
|
138
|
+
try {
|
|
139
|
+
return decodeURI(url);
|
|
140
|
+
} catch (e) {
|
|
141
|
+
return url;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function getSafeURL(url: string): string {
|
|
146
|
+
return encodeURI(decodeSafeURL(url));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function parseURL(url: string): URL {
|
|
150
|
+
return new URL(url);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function encodeQueryString(url: string): string {
|
|
154
|
+
if (url.length > 0) {
|
|
155
|
+
const index = url.indexOf("?");
|
|
156
|
+
if (index >= 0) {
|
|
157
|
+
return url.substr(0, index) + parseURL(url).search;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return url;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function injectScript(filename: string): void {
|
|
165
|
+
const script = document.createElement("script");
|
|
166
|
+
script.src = filename;
|
|
167
|
+
script.async = true;
|
|
168
|
+
document.head.appendChild(script);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function injectStyleLink(filename: string): void {
|
|
172
|
+
const link = document.createElement("link");
|
|
173
|
+
link.rel = "stylesheet";
|
|
174
|
+
link.href = filename;
|
|
175
|
+
document.head.appendChild(link);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function toBinaryStr(str: string) {
|
|
179
|
+
const encoder = new TextEncoder();
|
|
180
|
+
// 1: split the UTF-16 string into an array of bytes
|
|
181
|
+
const charCodes = encoder.encode(str);
|
|
182
|
+
// 2: concatenate byte data to create a binary string
|
|
183
|
+
return String.fromCharCode(...charCodes);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Convert an HTML string into a list of nodes
|
|
188
|
+
*/
|
|
189
|
+
export function stringToHtmlElements(html: string): NodeListOf<ChildNode> {
|
|
190
|
+
const template = createHtmlElement("div");
|
|
191
|
+
template.innerHTML = html.replace(/[\r\n]/gm, "").trim();
|
|
192
|
+
return template.childNodes;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Creates an HTML element and sets attributes
|
|
197
|
+
*/
|
|
198
|
+
export function createHtmlElement(
|
|
199
|
+
type: string,
|
|
200
|
+
attributes: { [key: string]: string } = {},
|
|
201
|
+
): HTMLElement {
|
|
202
|
+
const attrs = getObjectKeys(attributes);
|
|
203
|
+
const element = document.createElement(type);
|
|
204
|
+
|
|
205
|
+
if (attrs.length) {
|
|
206
|
+
attrs.forEach((name) => {
|
|
207
|
+
element.setAttribute(name, attributes[name]);
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return element;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Insert HTML elements into DOM
|
|
216
|
+
*/
|
|
217
|
+
export function insertHtmlElements(
|
|
218
|
+
nodes: NodeListOf<Node>,
|
|
219
|
+
appendTo: Element | null = null,
|
|
220
|
+
) {
|
|
221
|
+
appendTo = appendTo || document.body;
|
|
222
|
+
|
|
223
|
+
const fragment = new DocumentFragment();
|
|
224
|
+
|
|
225
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
226
|
+
// skip non tags and non text, 3 for text nodes
|
|
227
|
+
if (!isHTMLElement(nodes[i]) && nodes[i].nodeType !== 3) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const node = nodes[i] as HTMLElement;
|
|
232
|
+
let newNode;
|
|
233
|
+
|
|
234
|
+
switch (node.nodeName.toLowerCase()) {
|
|
235
|
+
case "script":
|
|
236
|
+
const src = node.getAttribute("src");
|
|
237
|
+
|
|
238
|
+
if (!isNullOrUndef(src) && src.length > 0) {
|
|
239
|
+
newNode = createScriptElement(
|
|
240
|
+
src,
|
|
241
|
+
false,
|
|
242
|
+
flatHtmlAttributes(node.attributes),
|
|
243
|
+
);
|
|
244
|
+
} else {
|
|
245
|
+
newNode = createScriptElement(node.innerHTML, true);
|
|
246
|
+
}
|
|
247
|
+
break;
|
|
248
|
+
|
|
249
|
+
case "style":
|
|
250
|
+
newNode = createStyleElement(node.textContent);
|
|
251
|
+
break;
|
|
252
|
+
|
|
253
|
+
case "svg":
|
|
254
|
+
newNode = createSvgElement(
|
|
255
|
+
node.innerHTML,
|
|
256
|
+
flatHtmlAttributes(node.attributes),
|
|
257
|
+
);
|
|
258
|
+
break;
|
|
259
|
+
|
|
260
|
+
case "#text":
|
|
261
|
+
newNode = document.createTextNode(node.textContent ?? "");
|
|
262
|
+
break;
|
|
263
|
+
|
|
264
|
+
default:
|
|
265
|
+
newNode = createHtmlElement(
|
|
266
|
+
node.tagName,
|
|
267
|
+
flatHtmlAttributes(node.attributes),
|
|
268
|
+
);
|
|
269
|
+
|
|
270
|
+
// recursive
|
|
271
|
+
if (node.childNodes.length) {
|
|
272
|
+
insertHtmlElements(node.childNodes, newNode);
|
|
273
|
+
} else {
|
|
274
|
+
newNode.innerHTML = node.innerHTML;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
fragment.appendChild(newNode);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
appendTo.appendChild(fragment);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Make a simple object which contains only attribute name and value
|
|
286
|
+
*/
|
|
287
|
+
export function flatHtmlAttributes(attributes?: NamedNodeMap) {
|
|
288
|
+
let flatAttributes: { [key: string]: string } = {};
|
|
289
|
+
|
|
290
|
+
if (!isNullOrUndef(attributes)) {
|
|
291
|
+
for (let i = 0; i < attributes.length; i++) {
|
|
292
|
+
let attr = attributes[i];
|
|
293
|
+
|
|
294
|
+
if (!isUndef(attr)) {
|
|
295
|
+
flatAttributes[attr.name] = attr.value;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return flatAttributes;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Create a <script> element
|
|
305
|
+
*/
|
|
306
|
+
export function createScriptElement(
|
|
307
|
+
js: string,
|
|
308
|
+
inline: boolean = false,
|
|
309
|
+
attributes: { [key: string]: string } = {},
|
|
310
|
+
) {
|
|
311
|
+
const attrs = isObject(attributes) ? getObjectKeys(attributes) : [];
|
|
312
|
+
const element = createHtmlElement("script") as HTMLScriptElement;
|
|
313
|
+
|
|
314
|
+
if (attrs.length) {
|
|
315
|
+
attrs.forEach((name) => {
|
|
316
|
+
element.setAttribute(name, attributes[name]);
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (inline) {
|
|
321
|
+
element.appendChild(document.createTextNode(js));
|
|
322
|
+
} else {
|
|
323
|
+
element.async = true;
|
|
324
|
+
element.src = js;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return element;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Create a <style> element
|
|
332
|
+
*/
|
|
333
|
+
export function createStyleElement(css: string | null) {
|
|
334
|
+
const element = createHtmlElement("style");
|
|
335
|
+
|
|
336
|
+
if (css) {
|
|
337
|
+
element.appendChild(document.createTextNode(css));
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return element;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Create svg elements
|
|
345
|
+
*/
|
|
346
|
+
export function createSvgElement(
|
|
347
|
+
content: string,
|
|
348
|
+
attributes: { [key: string]: string },
|
|
349
|
+
) {
|
|
350
|
+
const attrs = getObjectKeys(attributes);
|
|
351
|
+
const element = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
352
|
+
|
|
353
|
+
if (attrs.length) {
|
|
354
|
+
attrs.forEach((name) => {
|
|
355
|
+
element.setAttribute(name, attributes[name]);
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
element.innerHTML = content;
|
|
360
|
+
|
|
361
|
+
return element;
|
|
362
|
+
}
|
package/src/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Primitive = string | boolean | number;
|
package/tsconfig.json
ADDED