@catbee/utils 0.0.1 → 0.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.
- package/README.md +303 -107
- package/build/esm/config.d.ts +12 -0
- package/build/esm/config.js +12 -0
- package/build/esm/config.js.map +1 -1
- package/build/esm/index.d.ts +1 -0
- package/build/esm/index.js +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/types/api-response.d.ts +82 -0
- package/build/esm/types/api-response.js.map +1 -1
- package/build/esm/utils/array.utils.d.ts +64 -1
- package/build/esm/utils/array.utils.js +139 -2
- package/build/esm/utils/array.utils.js.map +1 -1
- package/build/esm/utils/async.utils.d.ts +60 -1
- package/build/esm/utils/async.utils.js +160 -2
- package/build/esm/utils/async.utils.js.map +1 -1
- package/build/esm/utils/cache.utils.d.ts +67 -4
- package/build/esm/utils/cache.utils.js +210 -28
- package/build/esm/utils/cache.utils.js.map +1 -1
- package/build/esm/utils/context-store.utils.d.ts +101 -0
- package/build/esm/utils/context-store.utils.js +182 -0
- package/build/esm/utils/context-store.utils.js.map +1 -1
- package/build/esm/utils/crypto.utils.d.ts +110 -8
- package/build/esm/utils/crypto.utils.js +298 -15
- package/build/esm/utils/crypto.utils.js.map +1 -1
- package/build/esm/utils/decorators.utils.d.ts +40 -0
- package/build/esm/utils/decorators.utils.js +312 -0
- package/build/esm/utils/decorators.utils.js.map +1 -0
- package/build/esm/utils/dir.utils.d.ts +121 -0
- package/build/esm/utils/dir.utils.js +577 -0
- package/build/esm/utils/dir.utils.js.map +1 -1
- package/build/esm/utils/env.utils.d.ts +83 -0
- package/build/esm/utils/env.utils.js +233 -0
- package/build/esm/utils/env.utils.js.map +1 -1
- package/build/esm/utils/exception.utils.d.ts +116 -0
- package/build/esm/utils/exception.utils.js +322 -0
- package/build/esm/utils/exception.utils.js.map +1 -1
- package/build/esm/utils/fs.utils.d.ts +132 -0
- package/build/esm/utils/fs.utils.js +421 -0
- package/build/esm/utils/fs.utils.js.map +1 -1
- package/build/esm/utils/http-status-codes.d.ts +87 -178
- package/build/esm/utils/http-status-codes.js +92 -178
- package/build/esm/utils/http-status-codes.js.map +1 -1
- package/build/esm/utils/id.utils.d.ts +11 -10
- package/build/esm/utils/id.utils.js +29 -20
- package/build/esm/utils/id.utils.js.map +1 -1
- package/build/esm/utils/logger.utils.d.ts +24 -0
- package/build/esm/utils/logger.utils.js +54 -0
- package/build/esm/utils/logger.utils.js.map +1 -1
- package/build/esm/utils/middleware.utils.d.ts +72 -0
- package/build/esm/utils/middleware.utils.js +158 -0
- package/build/esm/utils/middleware.utils.js.map +1 -0
- package/build/esm/utils/obj.utils.d.ts +65 -3
- package/build/esm/utils/obj.utils.js +205 -6
- package/build/esm/utils/obj.utils.js.map +1 -1
- package/build/esm/utils/response.utils.d.ts +101 -0
- package/build/esm/utils/response.utils.js +153 -0
- package/build/esm/utils/response.utils.js.map +1 -1
- package/build/esm/utils/string.utils.d.ts +61 -5
- package/build/esm/utils/string.utils.js +101 -11
- package/build/esm/utils/string.utils.js.map +1 -1
- package/build/esm/utils/url.utils.d.ts +117 -0
- package/build/esm/utils/url.utils.js +287 -0
- package/build/esm/utils/url.utils.js.map +1 -1
- package/build/esm/utils/validate.utils.d.ts +110 -0
- package/build/esm/utils/validate.utils.js +186 -0
- package/build/esm/utils/validate.utils.js.map +1 -1
- package/build/esnext/config.d.ts +12 -0
- package/build/esnext/config.js +12 -0
- package/build/esnext/config.js.map +1 -1
- package/build/esnext/index.d.ts +1 -0
- package/build/esnext/index.js +1 -0
- package/build/esnext/index.js.map +1 -1
- package/build/esnext/types/api-response.d.ts +82 -0
- package/build/esnext/types/api-response.js.map +1 -1
- package/build/esnext/utils/array.utils.d.ts +64 -1
- package/build/esnext/utils/array.utils.js +129 -2
- package/build/esnext/utils/array.utils.js.map +1 -1
- package/build/esnext/utils/async.utils.d.ts +60 -1
- package/build/esnext/utils/async.utils.js +117 -1
- package/build/esnext/utils/async.utils.js.map +1 -1
- package/build/esnext/utils/cache.utils.d.ts +67 -4
- package/build/esnext/utils/cache.utils.js +137 -9
- package/build/esnext/utils/cache.utils.js.map +1 -1
- package/build/esnext/utils/context-store.utils.d.ts +101 -0
- package/build/esnext/utils/context-store.utils.js +168 -0
- package/build/esnext/utils/context-store.utils.js.map +1 -1
- package/build/esnext/utils/crypto.utils.d.ts +110 -8
- package/build/esnext/utils/crypto.utils.js +205 -15
- package/build/esnext/utils/crypto.utils.js.map +1 -1
- package/build/esnext/utils/decorators.utils.d.ts +40 -0
- package/build/esnext/utils/decorators.utils.js +155 -0
- package/build/esnext/utils/decorators.utils.js.map +1 -0
- package/build/esnext/utils/dir.utils.d.ts +121 -0
- package/build/esnext/utils/dir.utils.js +306 -0
- package/build/esnext/utils/dir.utils.js.map +1 -1
- package/build/esnext/utils/env.utils.d.ts +83 -0
- package/build/esnext/utils/env.utils.js +185 -0
- package/build/esnext/utils/env.utils.js.map +1 -1
- package/build/esnext/utils/exception.utils.d.ts +116 -0
- package/build/esnext/utils/exception.utils.js +213 -0
- package/build/esnext/utils/exception.utils.js.map +1 -1
- package/build/esnext/utils/fs.utils.d.ts +132 -0
- package/build/esnext/utils/fs.utils.js +268 -0
- package/build/esnext/utils/fs.utils.js.map +1 -1
- package/build/esnext/utils/http-status-codes.d.ts +87 -178
- package/build/esnext/utils/http-status-codes.js +92 -178
- package/build/esnext/utils/http-status-codes.js.map +1 -1
- package/build/esnext/utils/id.utils.d.ts +11 -10
- package/build/esnext/utils/id.utils.js +27 -19
- package/build/esnext/utils/id.utils.js.map +1 -1
- package/build/esnext/utils/logger.utils.d.ts +24 -0
- package/build/esnext/utils/logger.utils.js +42 -0
- package/build/esnext/utils/logger.utils.js.map +1 -1
- package/build/esnext/utils/middleware.utils.d.ts +72 -0
- package/build/esnext/utils/middleware.utils.js +157 -0
- package/build/esnext/utils/middleware.utils.js.map +1 -0
- package/build/esnext/utils/obj.utils.d.ts +65 -3
- package/build/esnext/utils/obj.utils.js +167 -3
- package/build/esnext/utils/obj.utils.js.map +1 -1
- package/build/esnext/utils/response.utils.d.ts +101 -0
- package/build/esnext/utils/response.utils.js +138 -0
- package/build/esnext/utils/response.utils.js.map +1 -1
- package/build/esnext/utils/string.utils.d.ts +61 -5
- package/build/esnext/utils/string.utils.js +110 -14
- package/build/esnext/utils/string.utils.js.map +1 -1
- package/build/esnext/utils/url.utils.d.ts +117 -0
- package/build/esnext/utils/url.utils.js +248 -0
- package/build/esnext/utils/url.utils.js.map +1 -1
- package/build/esnext/utils/validate.utils.d.ts +110 -0
- package/build/esnext/utils/validate.utils.js +184 -0
- package/build/esnext/utils/validate.utils.js.map +1 -1
- package/build/src/config.d.ts +12 -0
- package/build/src/config.js +12 -0
- package/build/src/config.js.map +1 -1
- package/build/src/index.d.ts +1 -0
- package/build/src/index.js +1 -0
- package/build/src/index.js.map +1 -1
- package/build/src/types/api-response.d.ts +82 -0
- package/build/src/types/api-response.js.map +1 -1
- package/build/src/utils/array.utils.d.ts +64 -1
- package/build/src/utils/array.utils.js +137 -4
- package/build/src/utils/array.utils.js.map +1 -1
- package/build/src/utils/async.utils.d.ts +60 -1
- package/build/src/utils/async.utils.js +124 -4
- package/build/src/utils/async.utils.js.map +1 -1
- package/build/src/utils/cache.utils.d.ts +67 -4
- package/build/src/utils/cache.utils.js +137 -9
- package/build/src/utils/cache.utils.js.map +1 -1
- package/build/src/utils/context-store.utils.d.ts +101 -0
- package/build/src/utils/context-store.utils.js +171 -1
- package/build/src/utils/context-store.utils.js.map +1 -1
- package/build/src/utils/crypto.utils.d.ts +110 -8
- package/build/src/utils/crypto.utils.js +224 -27
- package/build/src/utils/crypto.utils.js.map +1 -1
- package/build/src/utils/decorators.utils.d.ts +40 -0
- package/build/src/utils/decorators.utils.js +165 -0
- package/build/src/utils/decorators.utils.js.map +1 -0
- package/build/src/utils/dir.utils.d.ts +121 -0
- package/build/src/utils/dir.utils.js +316 -0
- package/build/src/utils/dir.utils.js.map +1 -1
- package/build/src/utils/env.utils.d.ts +83 -0
- package/build/src/utils/env.utils.js +186 -1
- package/build/src/utils/env.utils.js.map +1 -1
- package/build/src/utils/exception.utils.d.ts +116 -0
- package/build/src/utils/exception.utils.js +226 -1
- package/build/src/utils/exception.utils.js.map +1 -1
- package/build/src/utils/fs.utils.d.ts +132 -0
- package/build/src/utils/fs.utils.js +282 -0
- package/build/src/utils/fs.utils.js.map +1 -1
- package/build/src/utils/http-status-codes.d.ts +87 -178
- package/build/src/utils/http-status-codes.js +92 -178
- package/build/src/utils/http-status-codes.js.map +1 -1
- package/build/src/utils/id.utils.d.ts +11 -10
- package/build/src/utils/id.utils.js +27 -19
- package/build/src/utils/id.utils.js.map +1 -1
- package/build/src/utils/logger.utils.d.ts +24 -0
- package/build/src/utils/logger.utils.js +45 -0
- package/build/src/utils/logger.utils.js.map +1 -1
- package/build/src/utils/middleware.utils.d.ts +72 -0
- package/build/src/utils/middleware.utils.js +163 -0
- package/build/src/utils/middleware.utils.js.map +1 -0
- package/build/src/utils/obj.utils.d.ts +65 -3
- package/build/src/utils/obj.utils.js +177 -7
- package/build/src/utils/obj.utils.js.map +1 -1
- package/build/src/utils/response.utils.d.ts +101 -0
- package/build/src/utils/response.utils.js +146 -1
- package/build/src/utils/response.utils.js.map +1 -1
- package/build/src/utils/string.utils.d.ts +61 -5
- package/build/src/utils/string.utils.js +122 -20
- package/build/src/utils/string.utils.js.map +1 -1
- package/build/src/utils/url.utils.d.ts +117 -0
- package/build/src/utils/url.utils.js +257 -0
- package/build/src/utils/url.utils.js.map +1 -1
- package/build/src/utils/validate.utils.d.ts +110 -0
- package/build/src/utils/validate.utils.js +198 -0
- package/build/src/utils/validate.utils.js.map +1 -1
- package/package.json +20 -12
|
@@ -70,4 +70,291 @@ export function parseQueryString(query) {
|
|
|
70
70
|
// Object.fromEntries guarantees string values in result
|
|
71
71
|
return Object.fromEntries(new URLSearchParams(cleanQuery));
|
|
72
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Validates if a string is a valid URL.
|
|
75
|
+
*
|
|
76
|
+
* @param {string} url - The URL string to validate.
|
|
77
|
+
* @param {boolean} [requireHttps=false] - If true, requires the URL to use HTTPS.
|
|
78
|
+
* @returns {boolean} True if the URL is valid, false otherwise.
|
|
79
|
+
*/
|
|
80
|
+
export function isValidUrl(url, requireHttps) {
|
|
81
|
+
if (requireHttps === void 0) { requireHttps = false; }
|
|
82
|
+
try {
|
|
83
|
+
var parsedUrl = new URL(url);
|
|
84
|
+
if (!parsedUrl.protocol || !parsedUrl.hostname)
|
|
85
|
+
return false;
|
|
86
|
+
if (requireHttps && parsedUrl.protocol !== "https:")
|
|
87
|
+
return false;
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch (_a) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Extracts the domain name from a URL.
|
|
96
|
+
*
|
|
97
|
+
* @param {string} url - The URL to extract the domain from.
|
|
98
|
+
* @param {boolean} [removeSubdomains=false] - If true, removes subdomains (returns root domain only).
|
|
99
|
+
* @returns {string} The domain name.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* getDomain('https://api.example.com/path');
|
|
103
|
+
* // → 'api.example.com'
|
|
104
|
+
*
|
|
105
|
+
* getDomain('https://api.example.com/path', true);
|
|
106
|
+
* // → 'example.com'
|
|
107
|
+
*/
|
|
108
|
+
export function getDomain(url, removeSubdomains) {
|
|
109
|
+
if (removeSubdomains === void 0) { removeSubdomains = false; }
|
|
110
|
+
try {
|
|
111
|
+
var hostname = new URL(url).hostname;
|
|
112
|
+
if (!removeSubdomains) {
|
|
113
|
+
return hostname;
|
|
114
|
+
}
|
|
115
|
+
// Extract root domain (remove subdomains)
|
|
116
|
+
var parts = hostname.split(".");
|
|
117
|
+
if (parts.length <= 2)
|
|
118
|
+
return hostname;
|
|
119
|
+
// Handle special cases like co.in, com.au
|
|
120
|
+
var secondLevelDomains = ["co", "com", "org", "net", "gov", "edu", "ac"];
|
|
121
|
+
var sld = parts[parts.length - 2];
|
|
122
|
+
if (secondLevelDomains.includes(sld) && parts.length > 2) {
|
|
123
|
+
return parts.slice(-3).join(".");
|
|
124
|
+
}
|
|
125
|
+
return parts.slice(-2).join(".");
|
|
126
|
+
}
|
|
127
|
+
catch (_a) {
|
|
128
|
+
return "";
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Joins URL paths properly handling slashes.
|
|
133
|
+
*
|
|
134
|
+
* @param {...string[]} segments - URL path segments to join.
|
|
135
|
+
* @returns {string} Joined URL path.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* joinPaths('https://example.com/', '/api/', '/users');
|
|
139
|
+
* // → 'https://example.com/api/users'
|
|
140
|
+
*/
|
|
141
|
+
export function joinPaths() {
|
|
142
|
+
var segments = [];
|
|
143
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
144
|
+
segments[_i] = arguments[_i];
|
|
145
|
+
}
|
|
146
|
+
var result = segments
|
|
147
|
+
.filter(function (s) { return s !== undefined && s !== null; })
|
|
148
|
+
.map(function (segment, index) {
|
|
149
|
+
if (index === 0)
|
|
150
|
+
return segment.replace(/\/+$/, "");
|
|
151
|
+
return segment.replace(/^\/+|\/+$/g, "");
|
|
152
|
+
})
|
|
153
|
+
.filter(Boolean)
|
|
154
|
+
.join("/");
|
|
155
|
+
if (segments[0] === "" && !result.startsWith("/"))
|
|
156
|
+
result = "/" + result;
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Normalizes a URL by resolving relative paths, handling protocol-relative URLs, etc.
|
|
161
|
+
*
|
|
162
|
+
* @param {string} url - The URL to normalize.
|
|
163
|
+
* @param {string} [base] - Optional base URL for resolving relative URLs.
|
|
164
|
+
* @returns {string} Normalized URL.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* normalizeUrl('HTTP://Example.COM/foo/../bar');
|
|
168
|
+
* // → 'http://example.com/bar'
|
|
169
|
+
*/
|
|
170
|
+
export function normalizeUrl(url, base) {
|
|
171
|
+
try {
|
|
172
|
+
// Handle protocol-relative URLs
|
|
173
|
+
if (url.startsWith("//")) {
|
|
174
|
+
url = "https:".concat(url);
|
|
175
|
+
}
|
|
176
|
+
// Resolve relative URLs against a base
|
|
177
|
+
var parsedUrl = base ? new URL(url, base) : new URL(url);
|
|
178
|
+
// Normalize
|
|
179
|
+
parsedUrl.pathname = parsedUrl.pathname.replace(/\/+/g, "/"); // Collapse multiple slashes
|
|
180
|
+
parsedUrl.pathname = parsedUrl.pathname.replace(/\/+$/, ""); // Remove trailing slash
|
|
181
|
+
parsedUrl.hostname = parsedUrl.hostname.toLowerCase();
|
|
182
|
+
return parsedUrl.toString();
|
|
183
|
+
}
|
|
184
|
+
catch (_a) {
|
|
185
|
+
return url; // Return original if invalid
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Creates a URL builder for constructing URLs with a base URL.
|
|
190
|
+
*
|
|
191
|
+
* @param {string} baseUrl - The base URL to build upon.
|
|
192
|
+
* @returns {Object} URL builder methods.
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* const api = createUrlBuilder('https://api.example.com');
|
|
196
|
+
* api.path('/users', { active: true });
|
|
197
|
+
* // → 'https://api.example.com/users?active=true'
|
|
198
|
+
*/
|
|
199
|
+
export function createUrlBuilder(baseUrl) {
|
|
200
|
+
return {
|
|
201
|
+
/**
|
|
202
|
+
* Creates a full URL with the given path and query parameters.
|
|
203
|
+
*
|
|
204
|
+
* @param {string} path - The path to append to the base URL.
|
|
205
|
+
* @param {Record<string, any>} [params] - Query parameters to add.
|
|
206
|
+
* @returns {string} The complete URL.
|
|
207
|
+
*/
|
|
208
|
+
path: function (path, params) {
|
|
209
|
+
var url = joinPaths(baseUrl, path);
|
|
210
|
+
return params
|
|
211
|
+
? appendQueryParams(url, params)
|
|
212
|
+
: url;
|
|
213
|
+
},
|
|
214
|
+
/**
|
|
215
|
+
* Creates a full URL with query parameters but no additional path.
|
|
216
|
+
*
|
|
217
|
+
* @param {Record<string, any>} params - Query parameters to add.
|
|
218
|
+
* @returns {string} The complete URL with query parameters.
|
|
219
|
+
*/
|
|
220
|
+
query: function (params) {
|
|
221
|
+
return appendQueryParams(baseUrl, params);
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Extracts specific query parameters from a URL.
|
|
227
|
+
*
|
|
228
|
+
* @param {string} url - The URL to extract parameters from.
|
|
229
|
+
* @param {string[]} paramNames - Names of parameters to extract.
|
|
230
|
+
* @returns {Record<string, string>} Object containing the extracted parameters.
|
|
231
|
+
*/
|
|
232
|
+
export function extractQueryParams(url, paramNames) {
|
|
233
|
+
var e_2, _a;
|
|
234
|
+
try {
|
|
235
|
+
var parsedUrl = new URL(url);
|
|
236
|
+
var result = {};
|
|
237
|
+
try {
|
|
238
|
+
for (var paramNames_1 = __values(paramNames), paramNames_1_1 = paramNames_1.next(); !paramNames_1_1.done; paramNames_1_1 = paramNames_1.next()) {
|
|
239
|
+
var name_1 = paramNames_1_1.value;
|
|
240
|
+
var value = parsedUrl.searchParams.get(name_1);
|
|
241
|
+
if (value !== null) {
|
|
242
|
+
result[name_1] = value;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
247
|
+
finally {
|
|
248
|
+
try {
|
|
249
|
+
if (paramNames_1_1 && !paramNames_1_1.done && (_a = paramNames_1.return)) _a.call(paramNames_1);
|
|
250
|
+
}
|
|
251
|
+
finally { if (e_2) throw e_2.error; }
|
|
252
|
+
}
|
|
253
|
+
return result;
|
|
254
|
+
}
|
|
255
|
+
catch (_b) {
|
|
256
|
+
return {};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Removes specified query parameters from a URL.
|
|
261
|
+
*
|
|
262
|
+
* @param {string} url - The URL to modify.
|
|
263
|
+
* @param {string[]} paramsToRemove - Names of parameters to remove.
|
|
264
|
+
* @returns {string} URL with parameters removed.
|
|
265
|
+
*/
|
|
266
|
+
export function removeQueryParams(url, paramsToRemove) {
|
|
267
|
+
var e_3, _a;
|
|
268
|
+
try {
|
|
269
|
+
var parsedUrl = new URL(url);
|
|
270
|
+
try {
|
|
271
|
+
for (var paramsToRemove_1 = __values(paramsToRemove), paramsToRemove_1_1 = paramsToRemove_1.next(); !paramsToRemove_1_1.done; paramsToRemove_1_1 = paramsToRemove_1.next()) {
|
|
272
|
+
var param = paramsToRemove_1_1.value;
|
|
273
|
+
parsedUrl.searchParams.delete(param);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
277
|
+
finally {
|
|
278
|
+
try {
|
|
279
|
+
if (paramsToRemove_1_1 && !paramsToRemove_1_1.done && (_a = paramsToRemove_1.return)) _a.call(paramsToRemove_1);
|
|
280
|
+
}
|
|
281
|
+
finally { if (e_3) throw e_3.error; }
|
|
282
|
+
}
|
|
283
|
+
return parsedUrl.toString();
|
|
284
|
+
}
|
|
285
|
+
catch (_b) {
|
|
286
|
+
return url;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Gets the file extension from a URL path.
|
|
291
|
+
*
|
|
292
|
+
* @param {string} url - The URL to examine.
|
|
293
|
+
* @returns {string} The file extension (without dot) or empty string if none found.
|
|
294
|
+
*
|
|
295
|
+
* @example
|
|
296
|
+
* getExtension('https://example.com/document.pdf?v=1');
|
|
297
|
+
* // → 'pdf'
|
|
298
|
+
*/
|
|
299
|
+
export function getExtension(url) {
|
|
300
|
+
try {
|
|
301
|
+
var pathname = new URL(url).pathname;
|
|
302
|
+
var match = pathname.match(/\.([^./\\?#]+)$/);
|
|
303
|
+
return match ? match[1].toLowerCase() : "";
|
|
304
|
+
}
|
|
305
|
+
catch (_a) {
|
|
306
|
+
// If URL parsing fails, try a simpler approach
|
|
307
|
+
var match = url.match(/\.([^./\\?#]+)$/);
|
|
308
|
+
return match ? match[1].toLowerCase() : "";
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Parses URL query parameters into a strongly-typed object.
|
|
313
|
+
*
|
|
314
|
+
* @template T Expected type of the query parameters
|
|
315
|
+
* @param {string} url - The URL to parse.
|
|
316
|
+
* @param {Record<keyof T, (val: string) => any>} [converters] - Type converters for params.
|
|
317
|
+
* @returns {Partial<T>} Typed query parameters.
|
|
318
|
+
*
|
|
319
|
+
* @example
|
|
320
|
+
* parseTypedQueryParams<{page: number, q: string}>('https://example.com?page=2&q=test', {
|
|
321
|
+
* page: Number,
|
|
322
|
+
* q: String
|
|
323
|
+
* });
|
|
324
|
+
* // → { page: 2, q: 'test' }
|
|
325
|
+
*/
|
|
326
|
+
export function parseTypedQueryParams(url, converters) {
|
|
327
|
+
var e_4, _a;
|
|
328
|
+
try {
|
|
329
|
+
var searchParams = new URL(url).searchParams;
|
|
330
|
+
var result = {};
|
|
331
|
+
try {
|
|
332
|
+
for (var _b = __values(searchParams.entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
333
|
+
var _d = __read(_c.value, 2), key = _d[0], value = _d[1];
|
|
334
|
+
if (converters && key in converters) {
|
|
335
|
+
try {
|
|
336
|
+
result[key] = converters[key](value);
|
|
337
|
+
}
|
|
338
|
+
catch (_e) {
|
|
339
|
+
// Skip on conversion error
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
result[key] = value;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
348
|
+
finally {
|
|
349
|
+
try {
|
|
350
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
351
|
+
}
|
|
352
|
+
finally { if (e_4) throw e_4.error; }
|
|
353
|
+
}
|
|
354
|
+
return result;
|
|
355
|
+
}
|
|
356
|
+
catch (_f) {
|
|
357
|
+
return {};
|
|
358
|
+
}
|
|
359
|
+
}
|
|
73
360
|
//# sourceMappingURL=url.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.utils.js","sourceRoot":"","sources":["../../../src/utils/url.utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,MAAuC;;IAEvC,IAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;;QAC5B,KAA2B,IAAA,KAAA,SAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA,gBAAA,4BAAE,CAAC;YAAzC,IAAA,KAAA,mBAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YACpB,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;;;;;;;;;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,wDAAwD;IACxD,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,CAGxD,CAAC;AACJ,CAAC","sourcesContent":["import { URL, URLSearchParams } from \"url\";\n\n/**\n * Appends query parameters to a given URL.\n *\n * @param {string} url - The base URL to which query parameters will be appended.\n * @param {Record<string, string | number>} params - Key-value pairs to add as query parameters.\n * @returns {string} The new URL string with query parameters appended.\n *\n * @example\n * appendQueryParams('https://example.com', { page: 1, limit: 10 });\n * // → 'https://example.com/?page=1&limit=10'\n */\nexport function appendQueryParams(\n url: string,\n params: Record<string, string | number>,\n): string {\n const urlObj = new URL(url);\n for (const [key, value] of Object.entries(params)) {\n urlObj.searchParams.set(key, value.toString());\n }\n return urlObj.toString();\n}\n\n/**\n * Parses a query string into a key-value object.\n *\n * @param {string} query - The query string (with or without leading '?').\n * @returns {Record<string, string>} Object representing parsed query parameters.\n *\n * @example\n * parseQueryString('?page=1&limit=10');\n * // → { page: '1', limit: '10' }\n */\nexport function parseQueryString(query: string): Record<string, string> {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n // Object.fromEntries guarantees string values in result\n return Object.fromEntries(new URLSearchParams(cleanQuery)) as Record<\n string,\n string\n >;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"url.utils.js","sourceRoot":"","sources":["../../../src/utils/url.utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { URL, URLSearchParams } from \"url\";\n\n/**\n * Appends query parameters to a given URL.\n *\n * @param {string} url - The base URL to which query parameters will be appended.\n * @param {Record<string, string | number>} params - Key-value pairs to add as query parameters.\n * @returns {string} The new URL string with query parameters appended.\n *\n * @example\n * appendQueryParams('https://example.com', { page: 1, limit: 10 });\n * // → 'https://example.com/?page=1&limit=10'\n */\nexport function appendQueryParams(\n url: string,\n params: Record<string, string | number>,\n): string {\n const urlObj = new URL(url);\n for (const [key, value] of Object.entries(params)) {\n urlObj.searchParams.set(key, value.toString());\n }\n return urlObj.toString();\n}\n\n/**\n * Parses a query string into a key-value object.\n *\n * @param {string} query - The query string (with or without leading '?').\n * @returns {Record<string, string>} Object representing parsed query parameters.\n *\n * @example\n * parseQueryString('?page=1&limit=10');\n * // → { page: '1', limit: '10' }\n */\nexport function parseQueryString(query: string): Record<string, string> {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n // Object.fromEntries guarantees string values in result\n return Object.fromEntries(new URLSearchParams(cleanQuery)) as Record<\n string,\n string\n >;\n}\n\n/**\n * Validates if a string is a valid URL.\n *\n * @param {string} url - The URL string to validate.\n * @param {boolean} [requireHttps=false] - If true, requires the URL to use HTTPS.\n * @returns {boolean} True if the URL is valid, false otherwise.\n */\nexport function isValidUrl(\n url: string,\n requireHttps: boolean = false,\n): boolean {\n try {\n const parsedUrl = new URL(url);\n if (!parsedUrl.protocol || !parsedUrl.hostname) return false;\n if (requireHttps && parsedUrl.protocol !== \"https:\") return false;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Extracts the domain name from a URL.\n *\n * @param {string} url - The URL to extract the domain from.\n * @param {boolean} [removeSubdomains=false] - If true, removes subdomains (returns root domain only).\n * @returns {string} The domain name.\n *\n * @example\n * getDomain('https://api.example.com/path');\n * // → 'api.example.com'\n *\n * getDomain('https://api.example.com/path', true);\n * // → 'example.com'\n */\nexport function getDomain(\n url: string,\n removeSubdomains: boolean = false,\n): string {\n try {\n const { hostname } = new URL(url);\n\n if (!removeSubdomains) {\n return hostname;\n }\n\n // Extract root domain (remove subdomains)\n const parts = hostname.split(\".\");\n if (parts.length <= 2) return hostname;\n\n // Handle special cases like co.in, com.au\n const secondLevelDomains = [\"co\", \"com\", \"org\", \"net\", \"gov\", \"edu\", \"ac\"];\n const sld = parts[parts.length - 2];\n\n if (secondLevelDomains.includes(sld) && parts.length > 2) {\n return parts.slice(-3).join(\".\");\n }\n\n return parts.slice(-2).join(\".\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * Joins URL paths properly handling slashes.\n *\n * @param {...string[]} segments - URL path segments to join.\n * @returns {string} Joined URL path.\n *\n * @example\n * joinPaths('https://example.com/', '/api/', '/users');\n * // → 'https://example.com/api/users'\n */\nexport function joinPaths(...segments: string[]): string {\n let result = segments\n .filter((s) => s !== undefined && s !== null)\n .map((segment, index) => {\n if (index === 0) return segment.replace(/\\/+$/, \"\");\n return segment.replace(/^\\/+|\\/+$/g, \"\");\n })\n .filter(Boolean)\n .join(\"/\");\n if (segments[0] === \"\" && !result.startsWith(\"/\")) result = \"/\" + result;\n return result;\n}\n\n/**\n * Normalizes a URL by resolving relative paths, handling protocol-relative URLs, etc.\n *\n * @param {string} url - The URL to normalize.\n * @param {string} [base] - Optional base URL for resolving relative URLs.\n * @returns {string} Normalized URL.\n *\n * @example\n * normalizeUrl('HTTP://Example.COM/foo/../bar');\n * // → 'http://example.com/bar'\n */\nexport function normalizeUrl(url: string, base?: string): string {\n try {\n // Handle protocol-relative URLs\n if (url.startsWith(\"//\")) {\n url = `https:${url}`;\n }\n\n // Resolve relative URLs against a base\n const parsedUrl = base ? new URL(url, base) : new URL(url);\n\n // Normalize\n parsedUrl.pathname = parsedUrl.pathname.replace(/\\/+/g, \"/\"); // Collapse multiple slashes\n parsedUrl.pathname = parsedUrl.pathname.replace(/\\/+$/, \"\"); // Remove trailing slash\n parsedUrl.hostname = parsedUrl.hostname.toLowerCase();\n\n return parsedUrl.toString();\n } catch {\n return url; // Return original if invalid\n }\n}\n\n/**\n * Creates a URL builder for constructing URLs with a base URL.\n *\n * @param {string} baseUrl - The base URL to build upon.\n * @returns {Object} URL builder methods.\n *\n * @example\n * const api = createUrlBuilder('https://api.example.com');\n * api.path('/users', { active: true });\n * // → 'https://api.example.com/users?active=true'\n */\nexport function createUrlBuilder(baseUrl: string) {\n return {\n /**\n * Creates a full URL with the given path and query parameters.\n *\n * @param {string} path - The path to append to the base URL.\n * @param {Record<string, any>} [params] - Query parameters to add.\n * @returns {string} The complete URL.\n */\n path(path: string, params?: Record<string, any>): string {\n const url = joinPaths(baseUrl, path);\n return params\n ? appendQueryParams(url, params as Record<string, string | number>)\n : url;\n },\n\n /**\n * Creates a full URL with query parameters but no additional path.\n *\n * @param {Record<string, any>} params - Query parameters to add.\n * @returns {string} The complete URL with query parameters.\n */\n query(params: Record<string, any>): string {\n return appendQueryParams(\n baseUrl,\n params as Record<string, string | number>,\n );\n },\n };\n}\n\n/**\n * Extracts specific query parameters from a URL.\n *\n * @param {string} url - The URL to extract parameters from.\n * @param {string[]} paramNames - Names of parameters to extract.\n * @returns {Record<string, string>} Object containing the extracted parameters.\n */\nexport function extractQueryParams(\n url: string,\n paramNames: string[],\n): Record<string, string> {\n try {\n const parsedUrl = new URL(url);\n const result: Record<string, string> = {};\n\n for (const name of paramNames) {\n const value = parsedUrl.searchParams.get(name);\n if (value !== null) {\n result[name] = value;\n }\n }\n\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * Removes specified query parameters from a URL.\n *\n * @param {string} url - The URL to modify.\n * @param {string[]} paramsToRemove - Names of parameters to remove.\n * @returns {string} URL with parameters removed.\n */\nexport function removeQueryParams(\n url: string,\n paramsToRemove: string[],\n): string {\n try {\n const parsedUrl = new URL(url);\n\n for (const param of paramsToRemove) {\n parsedUrl.searchParams.delete(param);\n }\n\n return parsedUrl.toString();\n } catch {\n return url;\n }\n}\n\n/**\n * Gets the file extension from a URL path.\n *\n * @param {string} url - The URL to examine.\n * @returns {string} The file extension (without dot) or empty string if none found.\n *\n * @example\n * getExtension('https://example.com/document.pdf?v=1');\n * // → 'pdf'\n */\nexport function getExtension(url: string): string {\n try {\n const { pathname } = new URL(url);\n const match = pathname.match(/\\.([^./\\\\?#]+)$/);\n return match ? match[1].toLowerCase() : \"\";\n } catch {\n // If URL parsing fails, try a simpler approach\n const match = url.match(/\\.([^./\\\\?#]+)$/);\n return match ? match[1].toLowerCase() : \"\";\n }\n}\n\n/**\n * Parses URL query parameters into a strongly-typed object.\n *\n * @template T Expected type of the query parameters\n * @param {string} url - The URL to parse.\n * @param {Record<keyof T, (val: string) => any>} [converters] - Type converters for params.\n * @returns {Partial<T>} Typed query parameters.\n *\n * @example\n * parseTypedQueryParams<{page: number, q: string}>('https://example.com?page=2&q=test', {\n * page: Number,\n * q: String\n * });\n * // → { page: 2, q: 'test' }\n */\nexport function parseTypedQueryParams<T extends Record<string, any>>(\n url: string,\n converters?: Record<keyof T, (val: string) => any>,\n): Partial<T> {\n try {\n const { searchParams } = new URL(url);\n const result = {} as Partial<T>;\n\n for (const [key, value] of searchParams.entries()) {\n if (converters && key in converters) {\n try {\n result[key as keyof T] = converters[key as keyof T](value);\n } catch {\n // Skip on conversion error\n }\n } else {\n result[key as keyof T] = value as any;\n }\n }\n\n return result;\n } catch {\n return {};\n }\n}\n"]}
|
|
@@ -57,4 +57,114 @@ export declare function isHexColor(str: string): boolean;
|
|
|
57
57
|
* @returns {boolean}
|
|
58
58
|
*/
|
|
59
59
|
export declare function isISODate(str: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Checks if a string matches a specified length range.
|
|
62
|
+
*
|
|
63
|
+
* @param {string} str - The input string.
|
|
64
|
+
* @param {number} min - Minimum length (inclusive).
|
|
65
|
+
* @param {number} max - Maximum length (inclusive).
|
|
66
|
+
* @returns {boolean} True if string length is within range.
|
|
67
|
+
*/
|
|
68
|
+
export declare function isLengthBetween(str: string, min: number, max: number): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Validates that a number is between specified min and max values (inclusive).
|
|
71
|
+
*
|
|
72
|
+
* @param {number} value - The number to validate.
|
|
73
|
+
* @param {number} min - Minimum value.
|
|
74
|
+
* @param {number} max - Maximum value.
|
|
75
|
+
* @returns {boolean} True if number is within range.
|
|
76
|
+
*/
|
|
77
|
+
export declare function isNumberBetween(value: number, min: number, max: number): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Checks if a string contains only alphabetic characters.
|
|
80
|
+
*
|
|
81
|
+
* @param {string} str - The input string.
|
|
82
|
+
* @returns {boolean} True if alphabetic only.
|
|
83
|
+
*/
|
|
84
|
+
export declare function isAlpha(str: string): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Validates that a string contains at least one uppercase letter,
|
|
87
|
+
* one lowercase letter, one number, and one special character.
|
|
88
|
+
*
|
|
89
|
+
* @param {string} str - The input string.
|
|
90
|
+
* @returns {boolean} True if string meets password complexity requirements.
|
|
91
|
+
*/
|
|
92
|
+
export declare function isStrongPassword(str: string): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Checks if a string is a valid IPv4 address.
|
|
95
|
+
*
|
|
96
|
+
* @param {string} str - The input string.
|
|
97
|
+
* @returns {boolean} True if valid IPv4 address.
|
|
98
|
+
*/
|
|
99
|
+
export declare function isIPv4(str: string): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Checks if a string is a valid IPv6 address.
|
|
102
|
+
*
|
|
103
|
+
* @param {string} str - The input string.
|
|
104
|
+
* @returns {boolean} True if valid IPv6 address.
|
|
105
|
+
*/
|
|
106
|
+
export declare function isIPv6(str: string): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Validates a credit card number using the Luhn algorithm.
|
|
109
|
+
*
|
|
110
|
+
* @param {string} str - The credit card number string.
|
|
111
|
+
* @returns {boolean} True if valid credit card number.
|
|
112
|
+
*/
|
|
113
|
+
export declare function isCreditCard(str: string): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Checks if a string is a valid JSON.
|
|
116
|
+
*
|
|
117
|
+
* @param {string} str - The input string.
|
|
118
|
+
* @returns {boolean} True if valid JSON.
|
|
119
|
+
*/
|
|
120
|
+
export declare function isValidJSON(str: string): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Type guard that checks if a value is an array.
|
|
123
|
+
*
|
|
124
|
+
* @template T Optional expected element type
|
|
125
|
+
* @param {unknown} value - The value to check.
|
|
126
|
+
* @param {(item: unknown) => boolean} [itemGuard] - Optional function to validate each item.
|
|
127
|
+
* @returns {boolean} True if value is an array (with optional item validation).
|
|
128
|
+
*/
|
|
129
|
+
export declare function isArray<T = unknown>(value: unknown, itemGuard?: (item: unknown) => item is T): value is T[];
|
|
130
|
+
/**
|
|
131
|
+
* Checks if a string is a valid base64 encoded string.
|
|
132
|
+
*
|
|
133
|
+
* @param {string} str - The input string.
|
|
134
|
+
* @returns {boolean} True if valid base64.
|
|
135
|
+
*/
|
|
136
|
+
export declare function isBase64(str: string): boolean;
|
|
137
|
+
/**
|
|
138
|
+
* Validates that an object has all required properties.
|
|
139
|
+
*
|
|
140
|
+
* @param {object} obj - The object to validate.
|
|
141
|
+
* @param {string[]} requiredProps - Array of required property names.
|
|
142
|
+
* @returns {boolean} True if all required properties exist.
|
|
143
|
+
*/
|
|
144
|
+
export declare function hasRequiredProps(obj: Record<string, unknown>, requiredProps: string[]): boolean;
|
|
145
|
+
/**
|
|
146
|
+
* Validates a date is within a specified range.
|
|
147
|
+
*
|
|
148
|
+
* @param {Date} date - The date to validate.
|
|
149
|
+
* @param {Date} [minDate] - Optional minimum date (inclusive).
|
|
150
|
+
* @param {Date} [maxDate] - Optional maximum date (inclusive).
|
|
151
|
+
* @returns {boolean} True if date is within range.
|
|
152
|
+
*/
|
|
153
|
+
export declare function isDateInRange(date: Date, minDate?: Date, maxDate?: Date): boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Validates a string matches a specific regular expression pattern.
|
|
156
|
+
*
|
|
157
|
+
* @param {string} str - The input string.
|
|
158
|
+
* @param {RegExp} pattern - Regular expression to test against.
|
|
159
|
+
* @returns {boolean} True if string matches pattern.
|
|
160
|
+
*/
|
|
161
|
+
export declare function matchesPattern(str: string, pattern: RegExp): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Validates data against multiple constraints.
|
|
164
|
+
*
|
|
165
|
+
* @param {unknown} value - The value to validate.
|
|
166
|
+
* @param {Array<(value: unknown) => boolean>} validators - Array of validation functions.
|
|
167
|
+
* @returns {boolean} True if value passes all validations.
|
|
168
|
+
*/
|
|
169
|
+
export declare function validateAll(value: unknown, validators: Array<(value: unknown) => boolean>): boolean;
|
|
60
170
|
//# sourceMappingURL=validate.utils.d.ts.map
|
|
@@ -118,4 +118,190 @@ export function isISODate(str) {
|
|
|
118
118
|
var date = new Date(str);
|
|
119
119
|
return (!isNaN(date.getTime()) && date.toISOString().startsWith(str.slice(0, 10)));
|
|
120
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Checks if a string matches a specified length range.
|
|
123
|
+
*
|
|
124
|
+
* @param {string} str - The input string.
|
|
125
|
+
* @param {number} min - Minimum length (inclusive).
|
|
126
|
+
* @param {number} max - Maximum length (inclusive).
|
|
127
|
+
* @returns {boolean} True if string length is within range.
|
|
128
|
+
*/
|
|
129
|
+
export function isLengthBetween(str, min, max) {
|
|
130
|
+
return str.length >= min && str.length <= max;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Validates that a number is between specified min and max values (inclusive).
|
|
134
|
+
*
|
|
135
|
+
* @param {number} value - The number to validate.
|
|
136
|
+
* @param {number} min - Minimum value.
|
|
137
|
+
* @param {number} max - Maximum value.
|
|
138
|
+
* @returns {boolean} True if number is within range.
|
|
139
|
+
*/
|
|
140
|
+
export function isNumberBetween(value, min, max) {
|
|
141
|
+
return value >= min && value <= max;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Checks if a string contains only alphabetic characters.
|
|
145
|
+
*
|
|
146
|
+
* @param {string} str - The input string.
|
|
147
|
+
* @returns {boolean} True if alphabetic only.
|
|
148
|
+
*/
|
|
149
|
+
export function isAlpha(str) {
|
|
150
|
+
return /^[a-zA-Z]+$/.test(str);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Validates that a string contains at least one uppercase letter,
|
|
154
|
+
* one lowercase letter, one number, and one special character.
|
|
155
|
+
*
|
|
156
|
+
* @param {string} str - The input string.
|
|
157
|
+
* @returns {boolean} True if string meets password complexity requirements.
|
|
158
|
+
*/
|
|
159
|
+
export function isStrongPassword(str) {
|
|
160
|
+
if (str.length < 8)
|
|
161
|
+
return false;
|
|
162
|
+
var hasUpperCase = /[A-Z]/.test(str);
|
|
163
|
+
var hasLowerCase = /[a-z]/.test(str);
|
|
164
|
+
var hasNumbers = /[0-9]/.test(str);
|
|
165
|
+
var hasSpecialChar = /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>?]/.test(str);
|
|
166
|
+
return hasUpperCase && hasLowerCase && hasNumbers && hasSpecialChar;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Checks if a string is a valid IPv4 address.
|
|
170
|
+
*
|
|
171
|
+
* @param {string} str - The input string.
|
|
172
|
+
* @returns {boolean} True if valid IPv4 address.
|
|
173
|
+
*/
|
|
174
|
+
export function isIPv4(str) {
|
|
175
|
+
var parts = str.split(".");
|
|
176
|
+
if (parts.length !== 4)
|
|
177
|
+
return false;
|
|
178
|
+
return parts.every(function (part) {
|
|
179
|
+
var num = parseInt(part, 10);
|
|
180
|
+
return part === num.toString() && num >= 0 && num <= 255;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Checks if a string is a valid IPv6 address.
|
|
185
|
+
*
|
|
186
|
+
* @param {string} str - The input string.
|
|
187
|
+
* @returns {boolean} True if valid IPv6 address.
|
|
188
|
+
*/
|
|
189
|
+
export function isIPv6(str) {
|
|
190
|
+
// Simple but effective check for common IPv6 formats
|
|
191
|
+
return /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$/.test(str);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Validates a credit card number using the Luhn algorithm.
|
|
195
|
+
*
|
|
196
|
+
* @param {string} str - The credit card number string.
|
|
197
|
+
* @returns {boolean} True if valid credit card number.
|
|
198
|
+
*/
|
|
199
|
+
export function isCreditCard(str) {
|
|
200
|
+
// Remove non-digit characters
|
|
201
|
+
var cardNumber = str.replace(/\D/g, "");
|
|
202
|
+
if (cardNumber.length < 13 || cardNumber.length > 19)
|
|
203
|
+
return false;
|
|
204
|
+
// Luhn algorithm implementation
|
|
205
|
+
var sum = 0;
|
|
206
|
+
var shouldDouble = false;
|
|
207
|
+
for (var i = cardNumber.length - 1; i >= 0; i--) {
|
|
208
|
+
var digit = parseInt(cardNumber.charAt(i), 10);
|
|
209
|
+
if (shouldDouble) {
|
|
210
|
+
digit *= 2;
|
|
211
|
+
if (digit > 9)
|
|
212
|
+
digit -= 9;
|
|
213
|
+
}
|
|
214
|
+
sum += digit;
|
|
215
|
+
shouldDouble = !shouldDouble;
|
|
216
|
+
}
|
|
217
|
+
return sum % 10 === 0;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Checks if a string is a valid JSON.
|
|
221
|
+
*
|
|
222
|
+
* @param {string} str - The input string.
|
|
223
|
+
* @returns {boolean} True if valid JSON.
|
|
224
|
+
*/
|
|
225
|
+
export function isValidJSON(str) {
|
|
226
|
+
try {
|
|
227
|
+
JSON.parse(str);
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
catch (_a) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Type guard that checks if a value is an array.
|
|
236
|
+
*
|
|
237
|
+
* @template T Optional expected element type
|
|
238
|
+
* @param {unknown} value - The value to check.
|
|
239
|
+
* @param {(item: unknown) => boolean} [itemGuard] - Optional function to validate each item.
|
|
240
|
+
* @returns {boolean} True if value is an array (with optional item validation).
|
|
241
|
+
*/
|
|
242
|
+
export function isArray(value, itemGuard) {
|
|
243
|
+
if (!Array.isArray(value))
|
|
244
|
+
return false;
|
|
245
|
+
return !itemGuard || value.every(function (item) { return itemGuard(item); });
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Checks if a string is a valid base64 encoded string.
|
|
249
|
+
*
|
|
250
|
+
* @param {string} str - The input string.
|
|
251
|
+
* @returns {boolean} True if valid base64.
|
|
252
|
+
*/
|
|
253
|
+
export function isBase64(str) {
|
|
254
|
+
return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(str);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Validates that an object has all required properties.
|
|
258
|
+
*
|
|
259
|
+
* @param {object} obj - The object to validate.
|
|
260
|
+
* @param {string[]} requiredProps - Array of required property names.
|
|
261
|
+
* @returns {boolean} True if all required properties exist.
|
|
262
|
+
*/
|
|
263
|
+
export function hasRequiredProps(obj, requiredProps) {
|
|
264
|
+
return requiredProps.every(function (prop) {
|
|
265
|
+
return Object.prototype.hasOwnProperty.call(obj, prop) &&
|
|
266
|
+
obj[prop] !== undefined &&
|
|
267
|
+
obj[prop] !== null;
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Validates a date is within a specified range.
|
|
272
|
+
*
|
|
273
|
+
* @param {Date} date - The date to validate.
|
|
274
|
+
* @param {Date} [minDate] - Optional minimum date (inclusive).
|
|
275
|
+
* @param {Date} [maxDate] - Optional maximum date (inclusive).
|
|
276
|
+
* @returns {boolean} True if date is within range.
|
|
277
|
+
*/
|
|
278
|
+
export function isDateInRange(date, minDate, maxDate) {
|
|
279
|
+
if (!(date instanceof Date) || isNaN(date.getTime()))
|
|
280
|
+
return false;
|
|
281
|
+
if (minDate && date < minDate)
|
|
282
|
+
return false;
|
|
283
|
+
if (maxDate && date > maxDate)
|
|
284
|
+
return false;
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Validates a string matches a specific regular expression pattern.
|
|
289
|
+
*
|
|
290
|
+
* @param {string} str - The input string.
|
|
291
|
+
* @param {RegExp} pattern - Regular expression to test against.
|
|
292
|
+
* @returns {boolean} True if string matches pattern.
|
|
293
|
+
*/
|
|
294
|
+
export function matchesPattern(str, pattern) {
|
|
295
|
+
return pattern.test(str);
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Validates data against multiple constraints.
|
|
299
|
+
*
|
|
300
|
+
* @param {unknown} value - The value to validate.
|
|
301
|
+
* @param {Array<(value: unknown) => boolean>} validators - Array of validation functions.
|
|
302
|
+
* @returns {boolean} True if value passes all validations.
|
|
303
|
+
*/
|
|
304
|
+
export function validateAll(value, validators) {
|
|
305
|
+
return validators.every(function (validator) { return validator(value); });
|
|
306
|
+
}
|
|
121
307
|
//# sourceMappingURL=validate.utils.js.map
|