@isikk/core 0.1.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/dist/index.cjs ADDED
@@ -0,0 +1,555 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ LONG_DATE_FORMAT: () => LONG_DATE_FORMAT,
24
+ SHORT_DATETIME_FORMAT: () => SHORT_DATETIME_FORMAT,
25
+ SHORT_DATE_FORMAT: () => SHORT_DATE_FORMAT,
26
+ allCombinations: () => allCombinations,
27
+ checkRequiredKeys: () => checkRequiredKeys,
28
+ cloned: () => cloned,
29
+ createConsoleDebugSwitch: () => createConsoleDebugSwitch,
30
+ downloadAndFormatImage: () => downloadAndFormatImage,
31
+ enabledIf: () => enabledIf,
32
+ escapeName: () => escapeName,
33
+ fileToBase64: () => fileToBase64,
34
+ fileToBase64Native: () => fileToBase64Native,
35
+ forcedType: () => forcedType,
36
+ formattedDate: () => formattedDate,
37
+ generateNamedTailwindColorScale: () => generateNamedTailwindColorScale,
38
+ generateTailwindColorScale: () => generateTailwindColorScale,
39
+ getCookie: () => getCookie,
40
+ getKeys: () => getKeys,
41
+ getLazyValue: () => getLazyValue,
42
+ getLazyValueAsync: () => getLazyValueAsync,
43
+ guessImageMimeType: () => guessImageMimeType,
44
+ hexToHslTriplet: () => hexToHslTriplet,
45
+ isImageMimeType: () => isImageMimeType,
46
+ isPathMatched: () => isPathMatched,
47
+ longFormattedDate: () => longFormattedDate,
48
+ makeCallable: () => makeCallable,
49
+ notNone: () => notNone,
50
+ optionalDate: () => optionalDate,
51
+ preventDefault: () => preventDefault,
52
+ raises: () => raises,
53
+ requireExclusiveKeys: () => requireExclusiveKeys,
54
+ safeFileName: () => safeFileName,
55
+ setKeyValueToObjectIfValue: () => setKeyValueToObjectIfValue,
56
+ shortFormattedDate: () => shortFormattedDate,
57
+ shortFormattedDateTime: () => shortFormattedDateTime,
58
+ slugify: () => slugify,
59
+ suppress: () => suppress,
60
+ transformExceptions: () => transformExceptions,
61
+ withAttributes: () => withAttributes
62
+ });
63
+ module.exports = __toCommonJS(src_exports);
64
+
65
+ // src/types/index.ts
66
+ var getKeys = Object.keys;
67
+ function forcedType(obj) {
68
+ return obj;
69
+ }
70
+
71
+ // src/arrays/index.ts
72
+ function notNone(value) {
73
+ return value !== null && value !== void 0;
74
+ }
75
+ function combinationsOfSize(items, size) {
76
+ if (size === 0) {
77
+ return [[]];
78
+ }
79
+ if (size > items.length) {
80
+ return [];
81
+ }
82
+ const [first, ...rest] = items;
83
+ const withFirst = combinationsOfSize(rest, size - 1).map((combination) => [first, ...combination]);
84
+ const withoutFirst = combinationsOfSize(rest, size);
85
+ return [...withFirst, ...withoutFirst];
86
+ }
87
+ function allCombinations(options) {
88
+ const result = [];
89
+ for (let size = 1; size <= options.length; size++) {
90
+ result.push(...combinationsOfSize(options, size));
91
+ }
92
+ return result;
93
+ }
94
+
95
+ // src/functions/index.ts
96
+ function withAttributes(fn, attributes) {
97
+ for (const key of Object.keys(attributes)) {
98
+ Object.defineProperty(fn, key, {
99
+ value: attributes[key],
100
+ writable: true,
101
+ configurable: true,
102
+ enumerable: true
103
+ });
104
+ }
105
+ return fn;
106
+ }
107
+ function makeCallable(originalCallable) {
108
+ return (data) => () => originalCallable(data);
109
+ }
110
+ function getLazyValue(input) {
111
+ if (typeof input === "function") {
112
+ return input();
113
+ }
114
+ return input;
115
+ }
116
+ async function getLazyValueAsync(input) {
117
+ if (typeof input === "function") {
118
+ const result = input();
119
+ if (result instanceof Promise) {
120
+ return await result;
121
+ }
122
+ return result;
123
+ }
124
+ return input;
125
+ }
126
+ function suppress(exceptions, fn, onError) {
127
+ try {
128
+ return fn();
129
+ } catch (error) {
130
+ if (exceptions.some((exception) => error instanceof exception)) {
131
+ return onError ? onError(error) : void 0;
132
+ }
133
+ throw error;
134
+ }
135
+ }
136
+ function preventDefault(callable) {
137
+ return async function(event) {
138
+ event.preventDefault();
139
+ return await callable(event);
140
+ };
141
+ }
142
+ function isPathMatched(pathname, pattern, exemptPatterns = []) {
143
+ if (exemptPatterns.some((exempt) => exempt.test(pathname))) {
144
+ return false;
145
+ }
146
+ return pattern.test(pathname);
147
+ }
148
+ function raises(error) {
149
+ return () => {
150
+ throw error;
151
+ };
152
+ }
153
+ function cloned(fn) {
154
+ return ((...args) => fn(...args));
155
+ }
156
+ function enabledIf(condition, options) {
157
+ const enabled = typeof condition === "function" ? condition() : condition;
158
+ return function(fn) {
159
+ if (!enabled) {
160
+ return cloned((() => options.ifNotEnabledReturnValue));
161
+ }
162
+ return cloned(fn);
163
+ };
164
+ }
165
+ function transformExceptions(exceptionTypes, transform, options = {}) {
166
+ const { keepOriginal = true } = options;
167
+ return function(fn) {
168
+ return ((...args) => {
169
+ try {
170
+ return fn(...args);
171
+ } catch (error) {
172
+ if (!exceptionTypes.some((ExceptionType) => error instanceof ExceptionType)) {
173
+ throw error;
174
+ }
175
+ const newError = transform(error);
176
+ if (keepOriginal) {
177
+ newError.cause = error;
178
+ }
179
+ throw newError;
180
+ }
181
+ });
182
+ };
183
+ }
184
+
185
+ // src/objects/index.ts
186
+ function checkRequiredKeys(obj, conditions) {
187
+ const matchingConditions = Object.entries(conditions).filter(
188
+ ([, keys]) => keys.every((key) => obj[key] !== void 0) && Object.keys(obj).every((key) => keys.includes(key) || obj[key] === void 0)
189
+ );
190
+ if (matchingConditions.length !== 1) {
191
+ throw new Error(`Object keys do not match exactly one required condition. ${JSON.stringify(conditions)}`);
192
+ }
193
+ return matchingConditions[0][0];
194
+ }
195
+ function requireExclusiveKeys(conditions, options = {}) {
196
+ const conditionEntries = Object.entries(conditions);
197
+ if (conditionEntries.length === 0) {
198
+ throw new Error("At least one condition must be provided.");
199
+ }
200
+ const { allowEmpty = false } = options;
201
+ const governedKeys = new Set(conditionEntries.flatMap(([, keys]) => keys));
202
+ return function(fn) {
203
+ return ((arg) => {
204
+ const provided = new Set(
205
+ Object.keys(arg).filter((key) => governedKeys.has(key) && arg[key] !== void 0)
206
+ );
207
+ if (allowEmpty && provided.size === 0) {
208
+ return fn(arg);
209
+ }
210
+ const matches = conditionEntries.filter(
211
+ ([, keys]) => keys.length === provided.size && keys.every((key) => provided.has(key))
212
+ );
213
+ if (matches.length !== 1) {
214
+ throw new Error(`Object keys do not match exactly one required condition. ${JSON.stringify(conditions)}`);
215
+ }
216
+ return fn(arg);
217
+ });
218
+ };
219
+ }
220
+ function setKeyValueToObjectIfValue(key, value, object) {
221
+ if (value) {
222
+ Object.defineProperty(object, key, { value, writable: true, configurable: true, enumerable: true });
223
+ }
224
+ }
225
+
226
+ // src/strings/index.ts
227
+ function slugify(value, allowUnicode = false) {
228
+ if (allowUnicode) {
229
+ value = value.normalize("NFKC").replace(/[^\p{L}\p{N}_\s-]/gu, "");
230
+ } else {
231
+ value = value.normalize("NFKD").replace(/[^\x00-\x7F]/g, "").replace(/[\r\n]+/g, " ").trim().replace(/[^\w\s-]/g, "");
232
+ }
233
+ value = value.toLowerCase();
234
+ return value.replace(/[-\s]+/g, "-").replace(/^[-_]+|[-_]+$/g, "");
235
+ }
236
+
237
+ // src/dates/_format.ts
238
+ var import_date_fns = require("date-fns");
239
+ function formatDate(date, pattern) {
240
+ return (0, import_date_fns.format)(date, pattern);
241
+ }
242
+
243
+ // src/dates/index.ts
244
+ var LONG_DATE_FORMAT = "EEEE, MMMM dd, yyyy 'at' hh:mm a";
245
+ var SHORT_DATE_FORMAT = "dd.MM.yyyy";
246
+ var SHORT_DATETIME_FORMAT = "dd.MM.yyyy HH:mm a";
247
+ function formattedDate(pattern, date = /* @__PURE__ */ new Date()) {
248
+ return formatDate(date, pattern);
249
+ }
250
+ function longFormattedDate(date = /* @__PURE__ */ new Date()) {
251
+ return formattedDate(LONG_DATE_FORMAT, date);
252
+ }
253
+ function shortFormattedDate(date = /* @__PURE__ */ new Date()) {
254
+ return formattedDate(SHORT_DATE_FORMAT, date);
255
+ }
256
+ function shortFormattedDateTime(date = /* @__PURE__ */ new Date()) {
257
+ return formattedDate(SHORT_DATETIME_FORMAT, date);
258
+ }
259
+ function optionalDate(date) {
260
+ return date ? new Date(date) : void 0;
261
+ }
262
+
263
+ // src/files/index.ts
264
+ function guessImageMimeType(filename) {
265
+ const withoutQueryOrHash = filename.split(/[?#]/)[0];
266
+ const extension = withoutQueryOrHash.split(".").pop()?.toLowerCase();
267
+ switch (extension) {
268
+ case "png":
269
+ return "image/png";
270
+ case "jfif":
271
+ case "jpg":
272
+ case "jpeg":
273
+ return "image/jpeg";
274
+ case "webp":
275
+ return "image/webp";
276
+ default:
277
+ return "image/png";
278
+ }
279
+ }
280
+ function isImageMimeType(mimeType) {
281
+ return mimeType === "image/png" || mimeType === "image/jpeg" || mimeType === "image/webp";
282
+ }
283
+ function escapeName(name) {
284
+ return name.replace(/[^a-zA-Z0-9-_.]/g, "_");
285
+ }
286
+ function safeFileName(filename, maxLength = 255) {
287
+ if (filename.length <= maxLength) return filename;
288
+ const dotIndex = filename.lastIndexOf(".");
289
+ const hasExtension = dotIndex > 0;
290
+ const extension = escapeName(hasExtension ? filename.slice(dotIndex) : "");
291
+ const name = escapeName(hasExtension ? filename.slice(0, dotIndex) : filename);
292
+ return name.slice(0, Math.max(0, maxLength - extension.length)) + extension;
293
+ }
294
+ async function downloadAndFormatImage(src, name = "image.png", mimeType = guessImageMimeType(name), quality = 1) {
295
+ name = safeFileName(name);
296
+ try {
297
+ const img = new Image();
298
+ img.crossOrigin = "anonymous";
299
+ await new Promise((resolve, reject) => {
300
+ img.onload = resolve;
301
+ img.onerror = reject;
302
+ img.src = src;
303
+ });
304
+ const canvas = document.createElement("canvas");
305
+ canvas.width = img.width;
306
+ canvas.height = img.height;
307
+ const ctx = canvas.getContext("2d");
308
+ if (!ctx) {
309
+ throw new Error("Could not get canvas context");
310
+ }
311
+ ctx.drawImage(img, 0, 0);
312
+ const blob = await new Promise((resolve) => {
313
+ canvas.toBlob(resolve, mimeType, quality);
314
+ });
315
+ if (!blob) {
316
+ throw new Error("Could not generate blob");
317
+ }
318
+ const link = document.createElement("a");
319
+ const downloadUrl = URL.createObjectURL(blob);
320
+ try {
321
+ link.href = downloadUrl;
322
+ link.download = name;
323
+ document.body.appendChild(link);
324
+ link.click();
325
+ } finally {
326
+ document.body.removeChild(link);
327
+ URL.revokeObjectURL(downloadUrl);
328
+ }
329
+ } catch (error) {
330
+ console.error("Failed to download image:", error);
331
+ }
332
+ }
333
+ async function fileToBase64Native(file) {
334
+ const result = await new Promise((resolve, reject) => {
335
+ const reader = new FileReader();
336
+ reader.readAsDataURL(file);
337
+ reader.onload = () => resolve(reader.result);
338
+ reader.onerror = (error) => reject(error);
339
+ });
340
+ if (typeof result === "string") {
341
+ return result;
342
+ } else {
343
+ throw new Error("Failed to read file as Data URL");
344
+ }
345
+ }
346
+ async function fileToBase64(file, quality = 1) {
347
+ if (isImageMimeType(file.type)) {
348
+ const img = new Image();
349
+ const url = URL.createObjectURL(file);
350
+ try {
351
+ await new Promise((resolve, reject) => {
352
+ img.onload = () => resolve();
353
+ img.onerror = () => reject(new Error("Failed to load image for metadata removal"));
354
+ img.src = url;
355
+ });
356
+ const canvas = document.createElement("canvas");
357
+ canvas.width = img.width;
358
+ canvas.height = img.height;
359
+ const ctx = canvas.getContext("2d");
360
+ if (!ctx) {
361
+ throw new Error("Failed to get canvas context");
362
+ }
363
+ ctx.drawImage(img, 0, 0);
364
+ const cleanDataUrl = canvas.toDataURL(file.type, quality);
365
+ if (cleanDataUrl === "data:,") {
366
+ return await fileToBase64Native(file);
367
+ }
368
+ return cleanDataUrl;
369
+ } finally {
370
+ URL.revokeObjectURL(url);
371
+ }
372
+ } else {
373
+ return await fileToBase64Native(file);
374
+ }
375
+ }
376
+
377
+ // src/cookies/index.ts
378
+ function getCookie(name) {
379
+ for (const pair of document.cookie.split("; ")) {
380
+ const separatorIndex = pair.indexOf("=");
381
+ if (separatorIndex === -1) {
382
+ continue;
383
+ }
384
+ if (pair.slice(0, separatorIndex) === name) {
385
+ return pair.slice(separatorIndex + 1);
386
+ }
387
+ }
388
+ return void 0;
389
+ }
390
+
391
+ // src/console/index.ts
392
+ var patchedWindows = /* @__PURE__ */ new WeakMap();
393
+ function createConsoleDebugSwitch(targetWindow, options) {
394
+ if (!targetWindow) {
395
+ return;
396
+ }
397
+ const { namespace } = options;
398
+ let enabledNamespaces = patchedWindows.get(targetWindow);
399
+ if (!enabledNamespaces) {
400
+ enabledNamespaces = /* @__PURE__ */ new Set();
401
+ patchedWindows.set(targetWindow, enabledNamespaces);
402
+ const original = {
403
+ log: targetWindow.console.log.bind(targetWindow.console),
404
+ info: targetWindow.console.info.bind(targetWindow.console),
405
+ warn: targetWindow.console.warn.bind(targetWindow.console),
406
+ error: targetWindow.console.error.bind(targetWindow.console)
407
+ };
408
+ const conditional = (method) => (...args) => {
409
+ if (enabledNamespaces.size > 0) {
410
+ method(...args);
411
+ }
412
+ };
413
+ targetWindow.console.log = conditional(original.log);
414
+ targetWindow.console.info = conditional(original.info);
415
+ targetWindow.console.warn = conditional(original.warn);
416
+ targetWindow.console.error = conditional(original.error);
417
+ }
418
+ const globals = targetWindow;
419
+ const existing = Object.prototype.hasOwnProperty.call(globals, namespace) ? Object.getOwnPropertyDescriptor(globals, namespace)?.value : void 0;
420
+ const target = existing ?? {};
421
+ target.debug = (flag) => {
422
+ if (flag) {
423
+ enabledNamespaces.add(namespace);
424
+ } else {
425
+ enabledNamespaces.delete(namespace);
426
+ }
427
+ };
428
+ Object.defineProperty(globals, namespace, { value: target, writable: true, configurable: true, enumerable: true });
429
+ }
430
+
431
+ // src/colors/index.ts
432
+ var HEX_PATTERN = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;
433
+ function hexToRgb(hex) {
434
+ const match = HEX_PATTERN.exec(hex.trim());
435
+ if (!match) {
436
+ throw new Error(`Invalid hex color: "${hex}"`);
437
+ }
438
+ const digits = match[1];
439
+ const normalized = digits.length === 3 ? digits.split("").map((char) => char + char).join("") : digits;
440
+ return {
441
+ r: parseInt(normalized.slice(0, 2), 16),
442
+ g: parseInt(normalized.slice(2, 4), 16),
443
+ b: parseInt(normalized.slice(4, 6), 16)
444
+ };
445
+ }
446
+ function rgbToHex({ r, g, b }) {
447
+ return `#${[r, g, b].map((channel) => Math.round(channel).toString(16).padStart(2, "0")).join("")}`;
448
+ }
449
+ function mixRgb(base, target, weight) {
450
+ return {
451
+ r: base.r + (target.r - base.r) * weight,
452
+ g: base.g + (target.g - base.g) * weight,
453
+ b: base.b + (target.b - base.b) * weight
454
+ };
455
+ }
456
+ var WHITE = { r: 255, g: 255, b: 255 };
457
+ var BLACK = { r: 0, g: 0, b: 0 };
458
+ var TINT_WEIGHTS = { 50: 0.95, 100: 0.9, 200: 0.75, 300: 0.6, 400: 0.3 };
459
+ var SHADE_WEIGHTS = {
460
+ 600: 0.15,
461
+ 700: 0.3,
462
+ 800: 0.45,
463
+ 900: 0.6,
464
+ 950: 0.8
465
+ };
466
+ function generateTailwindColorScale(baseColor) {
467
+ const base = hexToRgb(baseColor);
468
+ return {
469
+ 50: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[50])),
470
+ 100: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[100])),
471
+ 200: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[200])),
472
+ 300: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[300])),
473
+ 400: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[400])),
474
+ 500: rgbToHex(base),
475
+ 600: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[600])),
476
+ 700: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[700])),
477
+ 800: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[800])),
478
+ 900: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[900])),
479
+ 950: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[950]))
480
+ };
481
+ }
482
+ function generateNamedTailwindColorScale(baseColor, name) {
483
+ const scale = generateTailwindColorScale(baseColor);
484
+ return Object.fromEntries(Object.entries(scale).map(([shade, hex]) => [`${name}${shade}`, hex]));
485
+ }
486
+ function rgbToHsl({ r, g, b }) {
487
+ const rN = r / 255;
488
+ const gN = g / 255;
489
+ const bN = b / 255;
490
+ const max = Math.max(rN, gN, bN);
491
+ const min = Math.min(rN, gN, bN);
492
+ const l = (max + min) / 2;
493
+ if (max === min) {
494
+ return { h: 0, s: 0, l: l * 100 };
495
+ }
496
+ const delta = max - min;
497
+ const s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min);
498
+ let h;
499
+ if (max === rN) {
500
+ h = ((gN - bN) / delta + (gN < bN ? 6 : 0)) * 60;
501
+ } else if (max === gN) {
502
+ h = ((bN - rN) / delta + 2) * 60;
503
+ } else {
504
+ h = ((rN - gN) / delta + 4) * 60;
505
+ }
506
+ return { h, s: s * 100, l: l * 100 };
507
+ }
508
+ function hexToHslTriplet(hex, precision = 1) {
509
+ const { h, s, l } = rgbToHsl(hexToRgb(hex));
510
+ const round = (value) => Number(value.toFixed(precision));
511
+ return `${round(h)} ${round(s)}% ${round(l)}%`;
512
+ }
513
+ // Annotate the CommonJS export names for ESM import in node:
514
+ 0 && (module.exports = {
515
+ LONG_DATE_FORMAT,
516
+ SHORT_DATETIME_FORMAT,
517
+ SHORT_DATE_FORMAT,
518
+ allCombinations,
519
+ checkRequiredKeys,
520
+ cloned,
521
+ createConsoleDebugSwitch,
522
+ downloadAndFormatImage,
523
+ enabledIf,
524
+ escapeName,
525
+ fileToBase64,
526
+ fileToBase64Native,
527
+ forcedType,
528
+ formattedDate,
529
+ generateNamedTailwindColorScale,
530
+ generateTailwindColorScale,
531
+ getCookie,
532
+ getKeys,
533
+ getLazyValue,
534
+ getLazyValueAsync,
535
+ guessImageMimeType,
536
+ hexToHslTriplet,
537
+ isImageMimeType,
538
+ isPathMatched,
539
+ longFormattedDate,
540
+ makeCallable,
541
+ notNone,
542
+ optionalDate,
543
+ preventDefault,
544
+ raises,
545
+ requireExclusiveKeys,
546
+ safeFileName,
547
+ setKeyValueToObjectIfValue,
548
+ shortFormattedDate,
549
+ shortFormattedDateTime,
550
+ slugify,
551
+ suppress,
552
+ transformExceptions,
553
+ withAttributes
554
+ });
555
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/types/index.ts","../src/arrays/index.ts","../src/functions/index.ts","../src/objects/index.ts","../src/strings/index.ts","../src/dates/_format.ts","../src/dates/index.ts","../src/files/index.ts","../src/cookies/index.ts","../src/console/index.ts","../src/colors/index.ts"],"sourcesContent":["export * from './types'\nexport * from './arrays'\nexport * from './functions'\nexport * from './objects'\nexport * from './strings'\nexport * from './dates'\nexport * from './files'\nexport * from './cookies'\nexport * from './console'\nexport * from './colors'\n","export const getKeys = Object.keys as <T extends object>(obj: T) => Array<keyof T>\n\nexport type RecursivePartial<T> = { [P in keyof T]?: RecursivePartial<T[P]> }\n\nexport type RecursiveRecord = {\n [key: string]: string | number | boolean | RecursiveRecord | Array<RecursiveRecord>\n}\n\nexport function forcedType<T>(obj: unknown): T {\n return obj as unknown as T\n}\n","export function notNone<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined\n}\n\nfunction combinationsOfSize<T>(items: T[], size: number): T[][] {\n if (size === 0) {\n return [[]]\n }\n if (size > items.length) {\n return []\n }\n const [first, ...rest] = items\n const withFirst = combinationsOfSize(rest, size - 1).map((combination) => [first, ...combination])\n const withoutFirst = combinationsOfSize(rest, size)\n return [...withFirst, ...withoutFirst]\n}\n\nexport function allCombinations<T>(options: T[]): T[][] {\n const result: T[][] = []\n for (let size = 1; size <= options.length; size++) {\n result.push(...combinationsOfSize(options, size))\n }\n return result\n}\n","export function withAttributes<Fn extends (...args: never[]) => unknown, Attrs extends Record<string, unknown>>(\n fn: Fn,\n attributes: Attrs\n): Fn & Attrs {\n for (const key of Object.keys(attributes)) {\n // Object.defineProperty (unlike a plain `fn[key] = value` assignment) always creates/\n // overwrites an own property, even when key is \"__proto__\" - a plain assignment would instead\n // be intercepted by Object.prototype's special __proto__ accessor and reassign fn's own\n // prototype instead of setting a property on it.\n Object.defineProperty(fn, key, {\n value: attributes[key],\n writable: true,\n configurable: true,\n enumerable: true,\n })\n }\n return fn as Fn & Attrs\n}\n\nexport function makeCallable<T, R>(originalCallable: (arg: T) => R) {\n return (data: T) => () => originalCallable(data)\n}\n\nexport function getLazyValue<T>(input: T | (() => T)): T {\n if (typeof input === 'function') {\n return (input as () => T)()\n }\n return input\n}\n\nexport async function getLazyValueAsync<T>(input: T | (() => Promise<T>) | (() => T)): Promise<T> {\n if (typeof input === 'function') {\n const result = (input as () => Promise<T>)()\n if (result instanceof Promise) {\n return await result\n }\n return result as unknown as T\n }\n return input\n}\n\nexport function suppress<T, ERT>(\n exceptions: Array<new (message?: string) => Error>,\n fn: () => T,\n onError?: (error: unknown) => ERT\n): T | ERT | undefined {\n try {\n return fn()\n } catch (error) {\n if (exceptions.some((exception) => error instanceof exception)) {\n return onError ? onError(error) : undefined\n }\n throw error\n }\n}\n\nexport function preventDefault<E extends Event, R>(callable: (event: E) => R): (event: E) => Promise<Awaited<R>> {\n return async function (event: E): Promise<Awaited<R>> {\n event.preventDefault()\n return await callable(event)\n }\n}\n\nexport function isPathMatched(pathname: string, pattern: RegExp, exemptPatterns: RegExp[] = []): boolean {\n if (exemptPatterns.some((exempt) => exempt.test(pathname))) {\n return false\n }\n return pattern.test(pathname)\n}\n\nexport function raises(error: Error): (...args: unknown[]) => never {\n return () => {\n throw error\n }\n}\n\nexport function cloned<Fn extends (...args: never[]) => unknown>(fn: Fn): Fn {\n return ((...args: Parameters<Fn>) => fn(...args)) as Fn\n}\n\nexport function enabledIf<R>(condition: boolean | (() => boolean), options: { ifNotEnabledReturnValue: R }) {\n const enabled = typeof condition === 'function' ? condition() : condition\n\n return function <Fn extends (...args: never[]) => R>(fn: Fn): Fn {\n if (!enabled) {\n return cloned((() => options.ifNotEnabledReturnValue) as Fn)\n }\n return cloned(fn)\n }\n}\n\nexport function transformExceptions<E extends Error>(\n exceptionTypes: Array<new (...args: never[]) => E>,\n transform: (error: E) => Error,\n options: { keepOriginal?: boolean } = {}\n) {\n const { keepOriginal = true } = options\n\n return function <Fn extends (...args: never[]) => unknown>(fn: Fn): Fn {\n return ((...args: Parameters<Fn>) => {\n try {\n return fn(...args)\n } catch (error) {\n if (!exceptionTypes.some((ExceptionType) => error instanceof ExceptionType)) {\n throw error\n }\n const newError = transform(error as E)\n if (keepOriginal) {\n newError.cause = error\n }\n throw newError\n }\n }) as Fn\n }\n}\n","export function checkRequiredKeys<T extends Record<string, unknown>, C extends Record<string, Array<keyof T>>>(\n obj: T,\n conditions: C\n): keyof C {\n const matchingConditions = Object.entries(conditions).filter(\n ([, keys]) =>\n keys.every((key) => obj[key] !== undefined) &&\n Object.keys(obj).every((key) => keys.includes(key as keyof T) || obj[key] === undefined)\n )\n\n if (matchingConditions.length !== 1) {\n throw new Error(`Object keys do not match exactly one required condition. ${JSON.stringify(conditions)}`)\n }\n\n return matchingConditions[0][0] as keyof C\n}\n\nexport function requireExclusiveKeys<T extends Record<string, unknown>, C extends Record<string, Array<keyof T>>>(\n conditions: C,\n options: { allowEmpty?: boolean } = {}\n) {\n const conditionEntries = Object.entries(conditions) as Array<[string, Array<keyof T>]>\n if (conditionEntries.length === 0) {\n throw new Error('At least one condition must be provided.')\n }\n const { allowEmpty = false } = options\n const governedKeys = new Set(conditionEntries.flatMap(([, keys]) => keys))\n\n return function <Fn extends (arg: T) => unknown>(fn: Fn): Fn {\n return ((arg: T) => {\n // Only keys that are actually governed by a condition are considered - unlike\n // checkRequiredKeys, any other key on `arg` is fully unconstrained and ignored here\n // regardless of its value, since this is meant to validate one options object that may\n // legitimately carry other, unrelated fields alongside the mutually-exclusive ones.\n const provided = new Set(\n Object.keys(arg).filter((key) => governedKeys.has(key as keyof T) && arg[key] !== undefined)\n )\n\n if (allowEmpty && provided.size === 0) {\n return fn(arg)\n }\n\n const matches = conditionEntries.filter(\n ([, keys]) => keys.length === provided.size && keys.every((key) => provided.has(key as string))\n )\n if (matches.length !== 1) {\n throw new Error(`Object keys do not match exactly one required condition. ${JSON.stringify(conditions)}`)\n }\n return fn(arg)\n }) as Fn\n }\n}\n\nexport function setKeyValueToObjectIfValue(key: string, value: unknown, object: Record<string, unknown>) {\n if (value) {\n // Object.defineProperty (unlike a plain `object[key] = value` assignment) always creates/\n // overwrites an own property, even when key is \"__proto__\" - a plain assignment would instead\n // be intercepted by Object.prototype's special __proto__ accessor and reassign this object's\n // prototype instead of setting a property on it.\n Object.defineProperty(object, key, { value, writable: true, configurable: true, enumerable: true })\n }\n}\n","export function slugify(value: string, allowUnicode: boolean = false): string {\n if (allowUnicode) {\n value = value.normalize('NFKC').replace(/[^\\p{L}\\p{N}_\\s-]/gu, '')\n } else {\n value = value\n .normalize('NFKD')\n // eslint-disable-next-line no-control-regex\n .replace(/[^\\x00-\\x7F]/g, '')\n .replace(/[\\r\\n]+/g, ' ')\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n }\n\n value = value.toLowerCase()\n\n return value.replace(/[-\\s]+/g, '-').replace(/^[-_]+|[-_]+$/g, '')\n}\n","import { format } from 'date-fns'\n\nexport function formatDate(date: Date, pattern: string): string {\n return format(date, pattern)\n}\n","import { formatDate } from './_format'\n\nexport const LONG_DATE_FORMAT = \"EEEE, MMMM dd, yyyy 'at' hh:mm a\"\nexport const SHORT_DATE_FORMAT = 'dd.MM.yyyy'\nexport const SHORT_DATETIME_FORMAT = 'dd.MM.yyyy HH:mm a'\n\nexport function formattedDate(pattern: string, date: Date = new Date()): string {\n return formatDate(date, pattern)\n}\n\nexport function longFormattedDate(date: Date = new Date()): string {\n return formattedDate(LONG_DATE_FORMAT, date)\n}\n\nexport function shortFormattedDate(date: Date = new Date()): string {\n return formattedDate(SHORT_DATE_FORMAT, date)\n}\n\nexport function shortFormattedDateTime(date: Date = new Date()): string {\n return formattedDate(SHORT_DATETIME_FORMAT, date)\n}\n\nexport function optionalDate(date?: string): Date | undefined {\n return date ? new Date(date) : undefined\n}\n","type MimeType = 'image/png' | 'image/jpeg' | 'image/webp'\n\nexport function guessImageMimeType(filename: string): MimeType {\n const withoutQueryOrHash = filename.split(/[?#]/)[0]\n const extension = withoutQueryOrHash.split('.').pop()?.toLowerCase()\n switch (extension) {\n case 'png':\n return 'image/png'\n case 'jfif':\n case 'jpg':\n case 'jpeg':\n return 'image/jpeg'\n case 'webp':\n return 'image/webp'\n default:\n return 'image/png'\n }\n}\n\nexport function isImageMimeType(mimeType: string): mimeType is MimeType {\n return mimeType === 'image/png' || mimeType === 'image/jpeg' || mimeType === 'image/webp'\n}\n\nexport function escapeName(name: string): string {\n return name.replace(/[^a-zA-Z0-9-_.]/g, '_')\n}\n\nexport function safeFileName(filename: string, maxLength: number = 255): string {\n if (filename.length <= maxLength) return filename\n\n const dotIndex = filename.lastIndexOf('.')\n const hasExtension = dotIndex > 0\n const extension = escapeName(hasExtension ? filename.slice(dotIndex) : '')\n const name = escapeName(hasExtension ? filename.slice(0, dotIndex) : filename)\n\n return name.slice(0, Math.max(0, maxLength - extension.length)) + extension\n}\n\nexport async function downloadAndFormatImage(\n src: string,\n name: string = 'image.png',\n mimeType: MimeType = guessImageMimeType(name),\n quality: number = 1\n): Promise<void> {\n name = safeFileName(name)\n try {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n\n await new Promise((resolve, reject) => {\n img.onload = resolve\n img.onerror = reject\n img.src = src\n })\n\n const canvas = document.createElement('canvas')\n canvas.width = img.width\n canvas.height = img.height\n const ctx = canvas.getContext('2d')\n\n if (!ctx) {\n throw new Error('Could not get canvas context')\n }\n\n ctx.drawImage(img, 0, 0)\n\n const blob = await new Promise<Blob | null>((resolve) => {\n canvas.toBlob(resolve, mimeType, quality)\n })\n\n if (!blob) {\n throw new Error('Could not generate blob')\n }\n\n const link = document.createElement('a')\n const downloadUrl = URL.createObjectURL(blob)\n try {\n link.href = downloadUrl\n link.download = name\n document.body.appendChild(link)\n link.click()\n } finally {\n document.body.removeChild(link)\n URL.revokeObjectURL(downloadUrl)\n }\n } catch (error) {\n console.error('Failed to download image:', error)\n }\n}\n\nexport async function fileToBase64Native(file: File): Promise<string> {\n const result = await new Promise<string | ArrayBuffer | null>((resolve, reject) => {\n const reader = new FileReader()\n reader.readAsDataURL(file)\n reader.onload = () => resolve(reader.result)\n reader.onerror = (error) => reject(error)\n })\n\n if (typeof result === 'string') {\n return result\n } else {\n throw new Error('Failed to read file as Data URL')\n }\n}\n\nexport async function fileToBase64(file: File, quality: number = 1): Promise<string> {\n if (isImageMimeType(file.type)) {\n const img = new Image()\n const url = URL.createObjectURL(file)\n try {\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve()\n img.onerror = () => reject(new Error('Failed to load image for metadata removal'))\n img.src = url\n })\n\n const canvas = document.createElement('canvas')\n canvas.width = img.width\n canvas.height = img.height\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n throw new Error('Failed to get canvas context')\n }\n ctx.drawImage(img, 0, 0)\n\n const cleanDataUrl = canvas.toDataURL(file.type, quality)\n if (cleanDataUrl === 'data:,') {\n return await fileToBase64Native(file)\n }\n\n return cleanDataUrl\n } finally {\n URL.revokeObjectURL(url)\n }\n } else {\n return await fileToBase64Native(file)\n }\n}\n","export function getCookie(name: string): string | undefined {\n for (const pair of document.cookie.split('; ')) {\n const separatorIndex = pair.indexOf('=')\n if (separatorIndex === -1) {\n continue\n }\n if (pair.slice(0, separatorIndex) === name) {\n return pair.slice(separatorIndex + 1)\n }\n }\n return undefined\n}\n","type ConsoleMethod = (...args: unknown[]) => void\ntype WindowLike = Window & typeof globalThis\n\nconst patchedWindows = new WeakMap<WindowLike, Set<string>>()\n\nexport function createConsoleDebugSwitch(targetWindow: WindowLike, options: { namespace: string }): void {\n if (!targetWindow) {\n return\n }\n\n const { namespace } = options\n\n let enabledNamespaces = patchedWindows.get(targetWindow)\n if (!enabledNamespaces) {\n enabledNamespaces = new Set<string>()\n patchedWindows.set(targetWindow, enabledNamespaces)\n\n const original = {\n log: targetWindow.console.log.bind(targetWindow.console),\n info: targetWindow.console.info.bind(targetWindow.console),\n warn: targetWindow.console.warn.bind(targetWindow.console),\n error: targetWindow.console.error.bind(targetWindow.console),\n }\n\n const conditional =\n (method: ConsoleMethod): ConsoleMethod =>\n (...args) => {\n if (enabledNamespaces!.size > 0) {\n method(...args)\n }\n }\n\n targetWindow.console.log = conditional(original.log)\n targetWindow.console.info = conditional(original.info)\n targetWindow.console.warn = conditional(original.warn)\n targetWindow.console.error = conditional(original.error)\n }\n\n type Namespace = { debug: (enabled: boolean) => void }\n const globals = targetWindow as unknown as Record<string, Namespace | undefined>\n const existing = Object.prototype.hasOwnProperty.call(globals, namespace)\n ? (Object.getOwnPropertyDescriptor(globals, namespace)?.value as Namespace | undefined)\n : undefined\n const target = existing ?? ({} as Namespace)\n target.debug = (flag: boolean) => {\n if (flag) {\n enabledNamespaces!.add(namespace)\n } else {\n enabledNamespaces!.delete(namespace)\n }\n }\n // Object.defineProperty (unlike a plain `globals[namespace] = target` assignment) always\n // creates/overwrites an own property, even when namespace is a name like \"__proto__\" that\n // would otherwise be intercepted by Object.prototype's special __proto__ accessor and\n // pollute the shared prototype instead of setting a property on this specific object.\n Object.defineProperty(globals, namespace, { value: target, writable: true, configurable: true, enumerable: true })\n}\n","export type TailwindShade = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | 950\n\nexport type TailwindColorScale = Record<TailwindShade, string>\n\ninterface Rgb {\n r: number\n g: number\n b: number\n}\n\nconst HEX_PATTERN = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i\n\nfunction hexToRgb(hex: string): Rgb {\n const match = HEX_PATTERN.exec(hex.trim())\n if (!match) {\n throw new Error(`Invalid hex color: \"${hex}\"`)\n }\n\n const digits = match[1]\n const normalized =\n digits.length === 3\n ? digits\n .split('')\n .map((char) => char + char)\n .join('')\n : digits\n\n return {\n r: parseInt(normalized.slice(0, 2), 16),\n g: parseInt(normalized.slice(2, 4), 16),\n b: parseInt(normalized.slice(4, 6), 16),\n }\n}\n\nfunction rgbToHex({ r, g, b }: Rgb): string {\n return `#${[r, g, b].map((channel) => Math.round(channel).toString(16).padStart(2, '0')).join('')}`\n}\n\nfunction mixRgb(base: Rgb, target: Rgb, weight: number): Rgb {\n return {\n r: base.r + (target.r - base.r) * weight,\n g: base.g + (target.g - base.g) * weight,\n b: base.b + (target.b - base.b) * weight,\n }\n}\n\nconst WHITE: Rgb = { r: 255, g: 255, b: 255 }\nconst BLACK: Rgb = { r: 0, g: 0, b: 0 }\n\n// Weight of white/black mixed into the base color at each shade, tuned so 500 is the input\n// color unchanged and the rest approximate the spread of Tailwind's own default palettes.\nconst TINT_WEIGHTS: Record<50 | 100 | 200 | 300 | 400, number> = { 50: 0.95, 100: 0.9, 200: 0.75, 300: 0.6, 400: 0.3 }\nconst SHADE_WEIGHTS: Record<600 | 700 | 800 | 900 | 950, number> = {\n 600: 0.15,\n 700: 0.3,\n 800: 0.45,\n 900: 0.6,\n 950: 0.8,\n}\n\n/**\n * Generates a Tailwind-style 50-950 color scale from a single base hex color, treated as the 500 shade.\n */\nexport function generateTailwindColorScale(baseColor: string): TailwindColorScale {\n const base = hexToRgb(baseColor)\n\n return {\n 50: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[50])),\n 100: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[100])),\n 200: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[200])),\n 300: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[300])),\n 400: rgbToHex(mixRgb(base, WHITE, TINT_WEIGHTS[400])),\n 500: rgbToHex(base),\n 600: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[600])),\n 700: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[700])),\n 800: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[800])),\n 900: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[900])),\n 950: rgbToHex(mixRgb(base, BLACK, SHADE_WEIGHTS[950])),\n }\n}\n\n/**\n * Like {@link generateTailwindColorScale}, but prefixes each shade with `name` (e.g. `primary500`)\n * so multiple scales can be spread into one flat palette object.\n */\nexport function generateNamedTailwindColorScale<T extends string>(\n baseColor: string,\n name: T\n): Record<`${T}${TailwindShade}`, string> {\n const scale = generateTailwindColorScale(baseColor)\n\n return Object.fromEntries(Object.entries(scale).map(([shade, hex]) => [`${name}${shade}`, hex])) as Record<\n `${T}${TailwindShade}`,\n string\n >\n}\n\nfunction rgbToHsl({ r, g, b }: Rgb): { h: number; s: number; l: number } {\n const rN = r / 255\n const gN = g / 255\n const bN = b / 255\n\n const max = Math.max(rN, gN, bN)\n const min = Math.min(rN, gN, bN)\n const l = (max + min) / 2\n\n if (max === min) {\n return { h: 0, s: 0, l: l * 100 }\n }\n\n const delta = max - min\n const s = l > 0.5 ? delta / (2 - max - min) : delta / (max + min)\n\n let h: number\n if (max === rN) {\n h = ((gN - bN) / delta + (gN < bN ? 6 : 0)) * 60\n } else if (max === gN) {\n h = ((bN - rN) / delta + 2) * 60\n } else {\n h = ((rN - gN) / delta + 4) * 60\n }\n\n return { h, s: s * 100, l: l * 100 }\n}\n\n/**\n * Formats a hex color as the \"H S% L%\" triplet shadcn/Tailwind CSS variable themes expect,\n * e.g. for `--primary: 240 5.9% 10%;` consumed as `hsl(var(--primary))`.\n */\nexport function hexToHslTriplet(hex: string, precision: number = 1): string {\n const { h, s, l } = rgbToHsl(hexToRgb(hex))\n const round = (value: number) => Number(value.toFixed(precision))\n\n return `${round(h)} ${round(s)}% ${round(l)}%`\n}\n"],"mappings":"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","names":[]}