@pivanov/utils 0.0.3-rc.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +101 -306
  2. package/dist/cjs/assertion/index.js +7 -0
  3. package/dist/cjs/index.js +3 -3
  4. package/dist/cjs/object/index.js +7 -0
  5. package/dist/cjs/package.json +3 -0
  6. package/dist/cjs/promise/index.js +7 -0
  7. package/dist/cjs/string/index.js +7 -0
  8. package/dist/cjs/tools/index.js +7 -0
  9. package/dist/cjs/types/index.js +7 -0
  10. package/dist/esm/assertion/index.js +7 -0
  11. package/dist/esm/chunk-1rn730je.js +7 -0
  12. package/dist/esm/chunk-5nmphgya.js +8 -0
  13. package/dist/esm/chunk-bqewq152.js +8 -0
  14. package/dist/esm/chunk-f1nddzrj.js +6 -0
  15. package/dist/esm/chunk-hksj0qca.js +8 -0
  16. package/dist/esm/chunk-tdt3f0jc.js +8 -0
  17. package/dist/esm/index.js +3 -3
  18. package/dist/esm/object/index.js +7 -0
  19. package/dist/esm/package.json +3 -0
  20. package/dist/esm/promise/index.js +7 -0
  21. package/dist/esm/string/index.js +7 -0
  22. package/dist/esm/tools/index.js +7 -0
  23. package/dist/esm/types/index.js +7 -0
  24. package/dist/types/assertion/index.d.ts +145 -0
  25. package/dist/types/index.d.ts +6 -0
  26. package/dist/types/object/index.d.ts +118 -0
  27. package/dist/types/promise/index.d.ts +81 -0
  28. package/dist/types/string/index.d.ts +127 -0
  29. package/dist/types/tools/cache-api/index.d.ts +75 -0
  30. package/dist/types/tools/deepClone.d.ts +2 -0
  31. package/dist/types/tools/dom.d.ts +82 -0
  32. package/dist/types/tools/eventBus/eventBus.d.ts +37 -0
  33. package/dist/types/tools/eventBus/index.d.ts +3 -0
  34. package/dist/types/tools/eventBus/types.d.ts +47 -0
  35. package/dist/types/tools/eventBus/useEventBus.d.ts +3 -0
  36. package/dist/types/tools/index.d.ts +5 -0
  37. package/dist/types/tools/isEqual.d.ts +21 -0
  38. package/dist/types/types/index.d.ts +61 -0
  39. package/package.json +64 -36
  40. package/dist/index.d.ts +0 -817
package/README.md CHANGED
@@ -1,369 +1,164 @@
1
1
  # @pivanov/utils
2
2
 
3
3
  <p align="center">
4
- <i>A comprehensive collection of TypeScript utilities for modern web development</i>
5
- <br>
6
- <br>
7
- <img src="https://img.shields.io/npm/v/@pivanov/utils?logo=npm" alt="NPM Version">
8
- &nbsp;&nbsp;
9
- <img src="https://img.shields.io/bundlephobia/minzip/@pivanov/utils" alt="Bundle Size">
10
- &nbsp;&nbsp;
11
- <img src="https://github.com/pivanov/pivanov-utils/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI Status" />
12
- &nbsp;&nbsp;
13
- <img src="https://codecov.io/github/pivanov/pivanov-utils/graph/badge.svg?token=EPRKTP7D79" alt="Coverage Status">
4
+ <i>A focused collection of TypeScript utilities for modern web development.</i>
5
+ <br /><br />
6
+ <img src="https://img.shields.io/npm/v/@pivanov/utils?logo=npm" alt="NPM Version" />
7
+ &nbsp;
8
+ <img src="https://img.shields.io/npm/dw/@pivanov/utils" alt="Weekly Downloads" />
9
+ &nbsp;
10
+ <img src="https://github.com/pivanov/pivanov-utils/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI Status" />
11
+ &nbsp;
12
+ <img src="https://codecov.io/github/pivanov/pivanov-utils/graph/badge.svg?token=EPRKTP7D79" alt="Coverage Status" />
14
13
  </p>
15
14
 
16
15
  ## Features
17
16
 
18
- - 🔄 **Type-Safe** - Full TypeScript support with strict type checking
19
- - 🔄 **Immutable Operations** - Safe object and array manipulations
20
- - 🎨 **String Transformations** - Comprehensive string formatting utilities
21
- - 🛠️ **DOM Utilities** - Browser-safe DOM manipulation helpers
22
- - ⚡ **Performance Focused** - Optimized for both speed and bundle size
23
- - 📦 **Tree-Shakeable** - Import only what you need
24
- - 📝 **Well Documented** - Detailed documentation and examples
25
- - ✅ **Well Tested** - Comprehensive test coverage
17
+ - **Fully typed** - strict TypeScript across every module, literal-type preserving where it matters
18
+ - **Tree-shakeable** - ESM + CJS + per-module subpath exports, `"sideEffects": false`
19
+ - **Zero dependencies** - React is an optional peer dep only for the `useEventBus` hook
20
+ - **Well tested** - 200+ tests, real edge cases (circular refs, typed arrays, Buffers, symbols)
26
21
 
27
22
  ## Installation
28
23
 
29
24
  ```bash
30
- pnpm install @pivanov/utils
31
- # or
32
- yarn add @pivanov/utils
33
- # or
34
- npm install @pivanov/utils
25
+ bun add @pivanov/utils
35
26
  ```
36
27
 
37
- ## Documentation
38
-
39
- ### Module Overview
40
-
41
- The package is organized into several modules:
42
-
43
- - **assertion** - Type guards and runtime type checking
44
- - **object** - Object manipulation utilities
45
- - **promise** - Async utilities and promise helpers
46
- - **string** - String transformation utilities
47
- - **tools** - Various utilities including DOM, Event Bus, and more
48
-
49
- ### Assertion Module
50
-
51
- Type-safe runtime type checking utilities.
52
-
53
- ```typescript
54
- import {
55
- isString,
56
- isNumber,
57
- isBoolean,
58
- isObject,
59
- isFunction,
60
- isNull,
61
- isUndefined
62
- } from '@pivanov/utils/assertion';
63
-
64
- // Type Guards with TypeScript type narrowing
65
- isString('hello'); // type narrowed to string
66
- isNumber(123); // type narrowed to number
67
- isBoolean(true); // type narrowed to boolean
68
- isObject({}); // type narrowed to object
69
- isFunction(() => {}); // type narrowed to function
70
- isNull(null); // type narrowed to null
71
- isUndefined(void 0); // type narrowed to undefined
72
-
73
- // Use in conditional checks
74
- function processValue(value: unknown) {
75
- if (isString(value)) {
76
- return value.toUpperCase(); // TypeScript knows value is string
77
- }
78
- if (isNumber(value)) {
79
- return value.toFixed(2); // TypeScript knows value is number
80
- }
81
- }
28
+ ```bash
29
+ npm install @pivanov/utils
82
30
  ```
83
31
 
84
- ### Object Module
85
-
86
- Type-safe object manipulation utilities.
87
-
88
- ```typescript
89
- import { pick, omit, merge, deepMerge } from '@pivanov/utils/object';
90
-
91
- // Pick specific properties
92
- const user = { name: 'John', age: 30, email: 'john@example.com' };
93
- pick(user, ['name', 'email']);
94
- // { name: 'John', email: 'john@example.com' }
95
-
96
- // Omit specific properties
97
- omit(user, ['email']);
98
- // { name: 'John', age: 30 }
99
-
100
- // Shallow merge
101
- merge({ a: 1 }, { b: 2 });
102
- // { a: 1, b: 2 }
103
-
104
- // Deep merge with nested structures
105
- deepMerge(
106
- { user: { name: 'John', settings: { theme: 'dark' } } },
107
- { user: { settings: { fontSize: 14 } } }
108
- );
109
- // { user: { name: 'John', settings: { theme: 'dark', fontSize: 14 } } }
32
+ ```bash
33
+ yarn add @pivanov/utils
110
34
  ```
111
35
 
112
- ### Promise Module
113
-
114
- Async utilities for better promise handling.
115
-
116
- ```typescript
117
- import { sleep } from '@pivanov/utils/promise';
118
-
119
- // Pause execution for specified duration
120
- async function example() {
121
- console.log('Start');
122
- await sleep(1000); // Wait for 1 second
123
- console.log('End');
124
- }
36
+ ```bash
37
+ pnpm add @pivanov/utils
125
38
  ```
126
39
 
127
- ### String Module
128
-
129
- String manipulation utilities with TypeScript support.
40
+ ## Quick start
130
41
 
131
- ```typescript
132
- import {
133
- camelCase,
134
- pascalCase,
135
- kebabCase,
136
- slugify,
137
- capitalize,
138
- uncapitalize,
139
- capitalizeFirstLetter
140
- } from '@pivanov/utils/string';
141
-
142
- // Case transformations
143
- camelCase('foo-bar'); // 'fooBar'
144
- pascalCase('foo_bar'); // 'FooBar'
145
- kebabCase('fooBar'); // 'foo-bar'
146
- slugify('Hello World!'); // 'hello-world'
147
-
148
- // Capitalization with TypeScript support
149
- capitalize('hello'); // 'Hello' (with type Capitalize<'hello'>)
150
- uncapitalize('Hello'); // 'hello' (with type Uncapitalize<'Hello'>)
151
- capitalizeFirstLetter('hello world'); // 'Hello world'
42
+ ```ts
43
+ import { camelCase, snakeCase, slugify } from '@pivanov/utils/string';
44
+ import { pick, groupBy, deepMerge } from '@pivanov/utils/object';
45
+ import { isString, isNil, isDefined } from '@pivanov/utils/assertion';
46
+ import { sleep, timeout, retry, parallelLimit } from '@pivanov/utils/promise';
47
+ import { deepClone, isEqual, busDispatch, useEventBus } from '@pivanov/utils/tools';
152
48
  ```
153
49
 
154
- ### Tools Module
50
+ ## What's inside
155
51
 
156
- Various utilities for DOM manipulation, event handling, and more.
52
+ | Module | Surface |
53
+ |---|---|
54
+ | `assertion` | `isString`, `isNumber`, `isBoolean`, `isFunction`, `isObject`, `isRecord`, `isNull`, `isUndefined`, `isNil`, `isDefined`, `isArray`, `isDate`, `isRegExp`, `isError`, `isPromise`, `isMap`, `isSet`, `isPrimitive`, `isEmpty` |
55
+ | `object` | `pick`, `omit`, `pickBy`, `omitBy`, `merge`, `deepMerge`, `mapValues`, `mapKeys`, `groupBy`, `invert`, `hasOwn`, `keysOf`, `entriesOf`, `fromEntries` |
56
+ | `promise` | `sleep`, `timeout`, `retry`, `defer`, `parallelLimit` - all AbortSignal-aware where relevant |
57
+ | `string` | `camelCase`, `pascalCase`, `kebabCase`, `snakeCase`, `titleCase`, `slugify`, `capitalize`, `uncapitalize`, `capitalizeFirstLetter`, `truncate`, `escapeHtml`, `escapeRegExp`, `words`, `lines` |
58
+ | `tools/deepClone` | Rich deep clone (prototypes, getters/setters, symbols, Buffers, TypedArrays, circular refs) |
59
+ | `tools/isEqual` | Deep equality with cycle detection; compares RegExp, Error, TypedArrays, ArrayBuffer |
60
+ | `tools/dom` | `isBrowser`, `checkVisibility`, `isInViewport`, `setStyleProperties`, `calculateRenderedTextWidth` |
61
+ | `tools/cache-api` | Typed wrapper over the browser Cache API, with TTL support |
62
+ | `tools/eventBus` | `busDispatch`, `busSubscribe`, `busOnce`, `useEventBus` - typed topics, optional error handler |
63
+ | `types` | `TDict`, `TObjType`, `DeepPartial`, `DeepReadonly`, `Mutable`, `Prettify` |
157
64
 
158
- #### DOM Utilities
65
+ See the full **[API documentation](https://pivanov.github.io/pivanov-utils/)**.
159
66
 
160
- ```typescript
161
- import { checkVisibility, setStyleProperties } from '@pivanov/utils/tools';
67
+ ## Tree shaking
162
68
 
163
- // Check element visibility
164
- const isVisible = checkVisibility(element);
69
+ Subpath imports give the smallest bundles:
165
70
 
166
- // Set CSS custom properties
167
- setStyleProperties(element, {
168
- '--background-color': '#fff',
169
- '--text-color': '#000'
170
- });
71
+ ```ts
72
+ import { camelCase } from '@pivanov/utils/string';
73
+ import { deepClone } from '@pivanov/utils/tools';
171
74
  ```
172
75
 
173
- #### Event Bus
76
+ Top-level imports tree-shake fine in modern bundlers:
174
77
 
175
- Type-safe event bus with React hooks support.
176
-
177
- ```typescript
178
- import { busDispatch, busSubscribe, useEventBus } from '@pivanov/utils/tools/eventBus';
179
-
180
- // Define your events interface
181
- interface Events {
182
- 'user-logged-in': { id: number; name: string };
183
- 'data-updated': { timestamp: number };
184
- }
185
-
186
- // React hook usage
187
- function Component() {
188
- useEventBus('user-logged-in', (data) => {
189
- console.log('User logged in:', data.name);
190
- });
191
- }
192
-
193
- // Direct subscription
194
- const unsubscribe = busSubscribe('data-updated', (data) => {
195
- console.log('Data updated at:', data.timestamp);
196
- });
197
-
198
- // Dispatch events
199
- busDispatch('user-logged-in', { id: 1, name: 'John' });
78
+ ```ts
79
+ import { camelCase, deepClone } from '@pivanov/utils';
200
80
  ```
201
81
 
202
- #### Deep Clone & Equality
82
+ ## A few highlights
203
83
 
204
- ```typescript
205
- import { deepClone, isEqual } from '@pivanov/utils/tools';
84
+ ### Async that cancels
206
85
 
207
- // Deep clone with circular reference handling
208
- const original = {
209
- nested: { array: [1, 2, { value: 3 }] },
210
- date: new Date(),
211
- circular: {} as any
212
- };
213
- original.circular = original;
214
- const cloned = deepClone(original);
86
+ ```ts
87
+ import { sleep, timeout, retry } from '@pivanov/utils/promise';
215
88
 
216
- // Deep equality comparison
217
- isEqual({ a: [1, 2, 3] }, { a: [1, 2, 3] }); // true
218
- isEqual(new Date('2024-01-01'), new Date('2024-01-01')); // true
219
- isEqual([1, 2, [3, 4]], [1, 2, [3, 4]]); // true
89
+ const ctrl = new AbortController();
90
+ await sleep(1000, ctrl.signal); // cancellable
91
+ await timeout(fetch('/slow'), 3000); // race with timer
92
+ await retry(() => fetch('/api'), { attempts: 5, backoff: (n) => 100 * 2 ** n });
220
93
  ```
221
94
 
222
- #### Cache API
95
+ ### Typed event bus
223
96
 
224
- Browser-safe cache utilities with TypeScript support.
97
+ ```ts
98
+ import { busDispatch, useEventBus, type IEventBus } from '@pivanov/utils/tools';
225
99
 
226
- ```typescript
227
- import { CacheAPI } from '@pivanov/utils/tools/cache-api';
228
-
229
- // Initialize cache
230
- const cache = new CacheAPI('my-cache');
231
-
232
- // Store data with expiration
233
- await cache.set('user-data', { name: 'John' }, {
234
- expireIn: '1h' // Supports: 's' (seconds), 'm' (minutes), 'h' (hours), 'd' (days)
235
- });
236
-
237
- // Retrieve data
238
- const userData = await cache.get('user-data');
239
-
240
- // Check if data exists and is not expired
241
- const exists = await cache.has('user-data');
242
-
243
- // Remove data
244
- await cache.delete('user-data');
100
+ interface UserLoggedIn extends IEventBus<{ id: number; name: string }> {
101
+ topic: 'user:logged-in';
102
+ }
245
103
 
246
- // Clear all cache
247
- await cache.clear();
104
+ useEventBus<UserLoggedIn>('user:logged-in', (user) => console.log(user.name));
105
+ busDispatch<UserLoggedIn>('user:logged-in', { id: 1, name: 'Ada' });
248
106
  ```
249
107
 
250
- #### React to Web Components (r2wc)
251
-
252
- A utility to convert React components into standalone Web Components that can be used in any application.
108
+ See the [Typed Events guide](https://pivanov.github.io/pivanov-utils/guides/typed-events) for an event-map pattern at scale.
253
109
 
254
- ##### Creating a Widget
110
+ ### Cache with TTL
255
111
 
256
- Create a single file for your widget (e.g., `sparkline-widget.ts`):
257
- ```typescript
258
- import { registerWidget } from '@pivanov/utils';
112
+ ```ts
113
+ import {
114
+ storageSetItemWithTTL,
115
+ storageGetItemWithTTL,
116
+ } from '@pivanov/utils/tools';
259
117
 
260
- // Your React component
261
- const SparklineChart = ({ values, color }) => (
262
- <div className="sparkline">
263
- {/* Your chart implementation */}
264
- </div>
265
- );
118
+ await storageSetItemWithTTL('app', 'token', 'abc123', 10 * 60 * 1000);
266
119
 
267
- // Register the widget with optional configuration
268
- registerWidget({
269
- name: 'sparkline',
270
- component: SparklineChart,
271
- styles: [
272
- 'https://cdn.example.com/styles/sparkline.css', // Optional: CSS files to load
273
- ],
274
- svgSpritePath: 'https://cdn.example.com/icons/sprite.svg', // Optional: SVG sprite path
275
- });
120
+ const token = await storageGetItemWithTTL<string>('app', 'token');
121
+ // null if missing or expired; expired entries are deleted on read
276
122
  ```
277
123
 
278
- ##### Using in React Applications
279
-
280
- ```typescript
281
- import { importWidgets } from '@pivanov/utils';
282
- import { createRoot } from 'react-dom/client';
283
- import { App } from './app';
124
+ ### Deep clone that actually preserves shape
284
125
 
285
- // Load widgets ... we need to do this once
286
- void importWidgets([
287
- 'https://cdn.example.com/widgets/sparkline.js'
288
- ]);
126
+ ```ts
127
+ import { deepClone } from '@pivanov/utils/tools';
289
128
 
290
- const container = document.getElementById('root');
291
- if (container) {
292
- createRoot(container).render(<App />);
129
+ class User {
130
+ constructor(public name: string) {}
131
+ greet() { return `hi ${this.name}`; }
293
132
  }
294
133
 
295
- ...
296
-
297
- // Then use the widgets as React components
298
- <WidgetComponent
299
- name="sparkline"
300
- widgetProps={{ color: 'green', values: [1, 2, 3, 4, 5] }}
301
- />
302
- ```
303
-
304
- ##### Using in Plain HTML
305
-
306
- ```html
307
- <!DOCTYPE html>
308
- <html>
309
- <head>
310
- <script type="module">
311
- import { importWidgets, renderWidget } from 'https://esm.sh/@pivanov/utils';
312
-
313
- void importWidgets([
314
- 'https://cdn.example.com/widgets/sparkline.js'
315
- ]);
316
-
317
- renderWidget({
318
- name: 'sparkline',
319
- mountTo: document.getElementById('sparkline'),
320
- widgetProps: {
321
- color: 'green',
322
- values: [1, 2, 3, 4, 5]
323
- }
324
- });
325
- </script>
326
- </head>
327
- <body>
328
- <div id="sparkline"></div>
329
- </body>
330
- </html>
331
- ```
332
-
333
- Key Features:
334
- - Single-file widget definition
335
- - Automatic CSS and SVG sprite loading
336
- - ESM support for browser and bundler usage
337
- - TypeScript support with proper type inference
338
- - Works in both React and plain HTML environments
339
-
340
- ### Tree Shaking
341
-
342
- Import specific utilities to minimize bundle size:
343
-
344
- ```typescript
345
- // Import only what you need
346
- import { camelCase } from '@pivanov/utils/string';
347
- import { deepClone } from '@pivanov/utils/tools';
348
- import { isString } from '@pivanov/utils/assertion';
134
+ const clone = deepClone(new User('Ada'));
135
+ clone instanceof User; // true
136
+ clone.greet(); // 'hi Ada'
349
137
  ```
350
138
 
351
- ### TypeScript Integration
139
+ ## Compatibility
352
140
 
353
- All utilities are written in TypeScript and provide excellent type inference:
141
+ - Modern browsers (ES2022)
142
+ - Bun, Node 18+ (ESM or CJS)
143
+ - Cache API requires browser support (Chrome 40+, Firefox 41+, Safari 11.1+)
144
+ - React hook requires React 18+
354
145
 
355
- ```typescript
356
- import { pick } from '@pivanov/utils/object';
146
+ ## Development
357
147
 
358
- // TypeScript will infer correct types
359
- const user = { name: 'John', age: 30 } as const;
360
- const picked = pick(user, ['name']); // Type: { name: "John" }
148
+ ```bash
149
+ bun install
150
+ bun test # run tests
151
+ bun run test:coverage # with coverage (lcov)
152
+ bun run typecheck
153
+ bun run lint
154
+ bun run build # ESM + CJS + .d.ts
155
+ bun run docs:dev # run VitePress docs site locally
361
156
  ```
362
157
 
363
- ## Contributing
158
+ ## Sponsors
364
159
 
365
- Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) for details.
160
+ Supported by [LogicStar AI](https://logicstar.ai/)
366
161
 
367
162
  ## License
368
163
 
369
- MIT © Pavel Ivanov
164
+ MIT © [Pavel Ivanov](https://github.com/pivanov)
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * @pivanov/utils v1.0.0
3
+ * (c) 2024-present Pavel Ivanov
4
+ * Released under the MIT License.
5
+ * https://github.com/pivanov/utils
6
+ */
7
+ var{defineProperty:G,getOwnPropertyNames:I,getOwnPropertyDescriptor:J}=Object,K=Object.prototype.hasOwnProperty;var H=new WeakMap,L=(q)=>{var B=H.get(q),D;if(B)return B;if(B=G({},"__esModule",{value:!0}),q&&typeof q==="object"||typeof q==="function")I(q).map((F)=>!K.call(B,F)&&G(B,F,{get:()=>q[F],enumerable:!(D=J(q,F))||D.enumerable}));return H.set(q,B),B};var N=(q,B)=>{for(var D in B)G(q,D,{get:B[D],enumerable:!0,configurable:!0,set:(F)=>B[D]=()=>F})};var d={};N(d,{isUndefined:()=>W,isString:()=>R,isSet:()=>C,isRegExp:()=>j,isRecord:()=>V,isPromise:()=>z,isPrimitive:()=>P,isObject:()=>U,isNumber:()=>Q,isNull:()=>X,isNil:()=>Y,isMap:()=>A,isFunction:()=>T,isError:()=>x,isEmpty:()=>b,isDefined:()=>Z,isDate:()=>$,isBoolean:()=>O,isArray:()=>_});module.exports=L(d);var O=(q)=>{return typeof q==="boolean"},Q=(q)=>{return typeof q==="number"},R=(q)=>{return typeof q==="string"},T=(q)=>{return typeof q==="function"},U=(q)=>{if(q===null||typeof q!=="object")return!1;let B=Object.getPrototypeOf(q);return B===Object.prototype||B===null},V=(q)=>{return typeof q==="object"&&q!==null},W=(q)=>{return q===void 0},X=(q)=>{return q===null},Y=(q)=>{return q===null||q===void 0},Z=(q)=>{return q!==void 0},_=(q)=>{return Array.isArray(q)},$=(q)=>{return q instanceof Date},j=(q)=>{return q instanceof RegExp},x=(q)=>{return q instanceof Error},z=(q)=>{return q!==null&&(typeof q==="object"||typeof q==="function")&&typeof q.then==="function"},A=(q)=>{return q instanceof Map},C=(q)=>{return q instanceof Set},P=(q)=>{if(q===null||q===void 0)return!0;let B=typeof q;return B==="string"||B==="number"||B==="boolean"||B==="bigint"||B==="symbol"},b=(q)=>{if(q===null||q===void 0)return!0;if(typeof q==="string"||Array.isArray(q))return q.length===0;if(q instanceof Map||q instanceof Set)return q.size===0;if(typeof q==="object")return Object.keys(q).length===0;return!1};
package/dist/cjs/index.js CHANGED
@@ -1,7 +1,7 @@
1
- "use client";
2
1
  /*!
3
- * @pivanov/utils v0.0.3-rc.1
2
+ * @pivanov/utils v1.0.0
4
3
  * (c) 2024-present Pavel Ivanov
5
4
  * Released under the MIT License.
6
5
  * https://github.com/pivanov/utils
7
- */"use strict";var e=require("react"),t=require("react/jsx-runtime"),r=require("react-dom/client");const isObject=e=>{if(null===e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t},deepMerge=(e,...t)=>{if(!t.length)return e;const r=t.shift();if(void 0===r)return e;if(isObject(e)&&isObject(r))for(const t of Object.keys(r)){const n=r[t];if(isObject(n)){e[t]||Object.assign(e,{[t]:{}});const r=e[t];isObject(r)&&deepMerge(r,n)}else Object.assign(e,{[t]:n})}return deepMerge(e,...t)},stringifyBigIntValues=(e,t)=>"bigint"==typeof t?t.toString():t,generateSaltedTopic=e=>`${((e,t="🚀")=>{let r=0;const n=e+t;for(let e=0;e<n.length;e++)r=(r<<5)-r+n.charCodeAt(e),r|=0;return(r>>>0).toString(16)})(e)}::${e}`,busDispatch=(e,t)=>{if(!e)return;const r=generateSaltedTopic(e);window.dispatchEvent(new CustomEvent(r,{detail:t,bubbles:!0,cancelable:!1}))},busSubscribe=(e,t)=>{if(!e||"function"!=typeof t)return()=>{};const r=(e=>t=>{if(t instanceof CustomEvent)try{e(t.detail)}catch(e){console.error("Event listener error:",e)}})(t),n=generateSaltedTopic(e);return window.addEventListener(n,r),()=>window.removeEventListener(n,r)},r2wc=(e,n,o={},s)=>{const i=class extends HTMLElement{constructor(){super();let e=Array.from(document.styleSheets).find((e=>e instanceof CSSStyleSheet&&!e.disabled));if(!e){const t=document.createElement("style");document.head.appendChild(t),e=t.sheet}Array.from(e.cssRules).find((e=>e.selectorText===`${this.tagName.toLowerCase()}`))||e.insertRule(`${this.tagName.toLowerCase()} { display: inline-flex; }`,e.cssRules.length);const t=o.shadow||(s?.length?"open":"closed");if(!o.shadow&&s?.length&&console.info("@@@ Styles are provided but shadowDOM is not enabled"),this.container=t?this.attachShadow({mode:t}):this,s&&t){const e=document.createElement("style");e.textContent=s.join("\n"),this.container.appendChild(e)}}connectedCallback(){this.root||(this.root=r.createRoot(this.container),this.subscribeToEvents())}disconnectedCallback(){this.root&&this.root.unmount()}subscribeToEvents(){busSubscribe("@@-widget-create",(e=>{const{widgetProps:t,cacheKey:r}=e;this.cacheKey||r!==`${this.tagName.toLowerCase().replace("widget-","")}-${this.uuid}`||(this.cacheKey=r,this.mountComponent(t))})),busSubscribe("@@-widget-update",(e=>{const{widgetProps:t,cacheKey:r}=e;this.cacheKey===r&&r===`${this.tagName.toLowerCase().replace("widget-","")}-${this.uuid}`&&busDispatch("@@-widget-update-props",{widgetProps:t,uuid:this.uuid})}))}mountComponent(e){this.root&&e&&this.root.render(t.jsx(n,{...e,container:this.container,root:this}))}};return customElements.get(e)||customElements.define(e,i),i},n=e.memo((r=>{const{name:n,uuid:o}=r,s=e.useRef(),i=`widget-${n}`;return e.useEffect((()=>{s.current&&(s.current.uuid=o)}),[o]),"string"==typeof o&&o.length?t.jsx(i,{ref:s}):null}),(()=>!0)),WidgetComponent=r=>{const{name:o,uuid:s,widgetProps:i}=r,a=e.useRef(!1),c=s?.trim()||crypto.randomUUID().replace(/-/g,"").slice(0,6),l=o.trim().toLowerCase(),f=`${l}-${c}`,u=!!l.length&&!!c.length;return e.useEffect((()=>{u&&a.current&&busDispatch("@@-widget-update",{widgetName:l,widgetProps:i,cacheKey:f})}),[i,c,l,u,f]),busSubscribe("@@-widgets-loaded",(()=>{a.current=!0,busDispatch("@@-widget-create",{widgetName:l,widgetProps:i,cacheKey:f})})),u?t.jsx(n,{name:l,uuid:c}):(console.warn("Invalid widget!",l),null)},R2WCProvider=t=>{const{root:r,container:n,svgSpritePath:o,children:s}=t,[i,a]=e.useState(!1),[c,l]=e.useState();return e.useEffect((()=>{o?(async e=>{try{const t=await fetch(`${e}`);if(!t.ok)throw new Error(`Failed to fetch SVG: ${t.statusText}`);const r=await t.text(),n=(new DOMParser).parseFromString(r,"image/svg+xml");if(n.querySelector("parsererror"))throw new Error("SVG parsing failed");const o=n.documentElement;return o.setAttribute("xmlns","http://www.w3.org/2000/svg"),o.removeAttribute("id"),o}catch(e){return console.error("Error generating SVG sprite:",e),null}})(o).then((async e=>{n&&e&&n.appendChild(e),a(!0)})):a(!0)}),[]),busSubscribe("@@-widget-update-props",(e=>{const{widgetProps:t,uuid:n}=e;r.uuid===n&&l(t)})),i?e.cloneElement(s,{...c,key:performance.now()}):null},internalDeepClone=(e,t)=>{if(null===e||"object"!=typeof e)return e;const r=t.get(e);if(r)return r;if(Array.isArray(e)){const r=e.length;if(r<32){const n=new Array(r);t.set(e,n);for(let o=0;o<r;o++)o in e&&(n[o]=internalDeepClone(e[o],t));return n}const n=new Array(r);if(t.set(e,n),Object.keys(e).length===r){let o=0;const s=r-r%8;for(;o<s;)n[o]=internalDeepClone(e[o],t),n[o+1]=internalDeepClone(e[o+1],t),n[o+2]=internalDeepClone(e[o+2],t),n[o+3]=internalDeepClone(e[o+3],t),n[o+4]=internalDeepClone(e[o+4],t),n[o+5]=internalDeepClone(e[o+5],t),n[o+6]=internalDeepClone(e[o+6],t),n[o+7]=internalDeepClone(e[o+7],t),o+=8;for(;o<r;)n[o]=internalDeepClone(e[o],t),o++}else for(let o=0;o<r;o++)o in e&&(n[o]=internalDeepClone(e[o],t));return n}if(e instanceof Date||e instanceof RegExp){return new(0,e.constructor)(e)}if("undefined"!=typeof Buffer)try{if(Buffer.isBuffer(e))return Buffer.from(e)}catch(e){if(e instanceof Error)throw e}if(ArrayBuffer.isView(e)){const t=e.constructor;if("buffer"in e){const r=e;return new t(r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength))}return new t(new ArrayBuffer(e.byteLength))}if(e instanceof ArrayBuffer)return e.slice(0);if(e&&"object"==typeof e&&"buffer"in e&&"byteLength"in e){const t=e;if("undefined"==typeof Buffer){const e=new Uint8Array(t.buffer,t.byteOffset||0,t.byteLength),r=new Uint8Array(e.length);return r.set(e),r}return{buffer:t.buffer instanceof ArrayBuffer?t.buffer.slice(0):new ArrayBuffer(t.byteLength),byteLength:t.byteLength,byteOffset:t.byteOffset||0,length:t.length||t.byteLength,BYTES_PER_ELEMENT:t.BYTES_PER_ELEMENT||1}}if(e instanceof Set){const r=new Set;t.set(e,r);const n=Array.from(e),o=n.length;for(let e=0;e<o;e++)r.add(internalDeepClone(n[e],t));return r}if(e instanceof Map){const r=new Map;t.set(e,r);const n=Array.from(e),o=n.length;for(let e=0;e<o;e++){const[o,s]=n[e];r.set(o,internalDeepClone(s,t))}return r}if(Object.getPrototypeOf(e)===Object.prototype){const r={};t.set(e,r);const n=Object.getOwnPropertySymbols(e),o=n.length;if(o>0)for(let t=0;t<o;t++){const o=n[t],s=Object.getOwnPropertyDescriptor(e,o);s?.enumerable&&Object.defineProperty(r,o,s)}const s=Object.getOwnPropertyDescriptors(e),i=Object.keys(e),a=i.length;let c=!1;for(let e=0;e<a;e++){const t=s[i[e]];if(t.get||t.set){c=!0;break}}if(c)for(let e=0;e<a;e++){const n=i[e],o=s[n];if(o.enumerable)if(o.get||o.set)Object.defineProperty(r,n,o);else{const e=internalDeepClone(o.value,t);Object.defineProperty(r,n,{...o,value:e})}}else{let n=0;const o=a-a%8;for(;n<o;){const o=i[n],s=i[n+1],a=i[n+2],c=i[n+3],l=i[n+4],f=i[n+5],u=i[n+6],p=i[n+7],d=e;r[o]=internalDeepClone(d[o],t),r[s]=internalDeepClone(d[s],t),r[a]=internalDeepClone(d[a],t),r[c]=internalDeepClone(d[c],t),r[l]=internalDeepClone(d[l],t),r[f]=internalDeepClone(d[f],t),r[u]=internalDeepClone(d[u],t),r[p]=internalDeepClone(d[p],t),n+=8}for(;n<a;){const o=i[n++];r[o]=internalDeepClone(e[o],t)}}return r}const n=Object.getPrototypeOf(e),o=Object.create(n);t.set(e,o);const s=Object.getOwnPropertyDescriptors(e),i=Object.keys(s),a=i.length;for(let e=0;e<a;e++){const r=i[e],n=s[r];if(n.enumerable)if(n.get||n.set)Object.defineProperty(o,r,n);else{const e=internalDeepClone(n.value,t);Object.defineProperty(o,r,{...n,value:e})}}const c=Object.getOwnPropertySymbols(e),l=c.length;for(let t=0;t<l;t++){const r=c[t],n=Object.getOwnPropertyDescriptor(e,r);n?.enumerable&&Object.defineProperty(o,r,n)}return o},isEqual=(e,t)=>{if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!isEqual(e[r],t[r]))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const r of e)if(!t.has(r))return!1;return!0}if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[r,n]of e)if(!t.has(r)||!isEqual(n,t.get(r)))return!1;return!0}if(null!==e&&"object"==typeof e&&!Array.isArray(e)&&null!==t&&"object"==typeof t&&!Array.isArray(t)){const r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(const n of r)if(!isEqual(e[n],t[n]))return!1;return!0}return e===t};exports.WidgetComponent=WidgetComponent,exports.busDispatch=busDispatch,exports.busSubscribe=busSubscribe,exports.calculateRenderedTextWidth=(e,t,r=!1,n='Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"')=>{const o=r?e.toUpperCase():e,s=document.createElement("canvas").getContext("2d");return s.font=`${t}px ${n}`,s.measureText(o).width},exports.camelCase=e=>e.trim().toLowerCase().replace(/^[-_\s]+/,"").replace(/[-_\s]+(.)?/g,((e,t)=>t?t.toUpperCase():"")),exports.capitalize=e=>e.charAt(0).toUpperCase()+e.slice(1),exports.capitalizeFirstLetter=e=>e.charAt(0).toUpperCase()+e.slice(1),exports.checkVisibility=e=>{const t=e.getBoundingClientRect(),r=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(t.bottom<0||t.top-r>=0)},exports.deepClone=e=>internalDeepClone(e,new WeakMap),exports.deepMerge=deepMerge,exports.importWidgets=async e=>{const t=e.filter((e=>e?.length&&!document.querySelector(`script[src="${e}"]`)));(await Promise.allSettled(t.map((e=>(async e=>new Promise(((t,r)=>{const n=document.createElement("script");n.onload=()=>{t(!0)},n.onerror=()=>{const t=new Error(`Failed to load script: ${e}`);r(t)},n.type="module",n.src=e,document.head.appendChild(n)})))(e))))).forEach(((e,r)=>{"rejected"===e.status&&console.error(`Failed to load widget script ${t[r]}:`,e.reason)})),busDispatch("@@-widgets-loaded",!0)},exports.isBoolean=e=>"boolean"==typeof e,exports.isBrowser=()=>"undefined"!=typeof window,exports.isEqual=isEqual,exports.isFunction=e=>"function"==typeof e,exports.isNull=e=>null===e,exports.isNumber=e=>"number"==typeof e,exports.isObject=isObject,exports.isString=e=>"string"==typeof e,exports.isUndefined=e=>void 0===e,exports.kebabCase=e=>null==e?e:e.normalize("NFKD").replace(/\p{Diacritic}/gu,"").replace(/[^\w\s-]/g," ").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z])([A-Z][a-z])/g,"$1-$2").replace(/[-_\s]+/g,"-").toLowerCase().replace(/^-+|-+$/g,"").trim(),exports.merge=(e,...t)=>Object.assign(e,...t),exports.omit=(e,t)=>t.reduce(((e,t)=>(delete e[t],e)),{...e}),exports.pascalCase=e=>e.split(/(?=[0-9])|(?<=[0-9])|[^a-zA-Z0-9]+/g).filter(Boolean).map((e=>e.toLowerCase())).map((e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`)).join(""),exports.pick=(e,t)=>{const r={};for(const n of t)n in e&&(r[n]=e[n]);return r},exports.r2wc=r2wc,exports.registerWidget=e=>{const{name:r,styles:n,component:o,svgSpritePath:s}=e;return r2wc(`widget-${r}`,(e=>{const{root:n,container:i,...a}=e;return t.jsx(R2WCProvider,{container:i,root:n,svgSpritePath:s,children:t.jsx(o,{...a,name:r})})}),{shadow:"open"},n)},exports.renderWidget=e=>{const{name:n,uuid:o,mountTo:s,widgetProps:i}=e,a=o?.trim()||crypto.randomUUID().replace(/-/g,"").slice(0,6),c=n.trim().toLowerCase();!!c.length&&!!a.length&&s&&s instanceof HTMLElement&&r.createRoot(s).render(t.jsx(WidgetComponent,{name:c,uuid:a,widgetProps:i}))},exports.setStyleProperties=(e,t)=>{if(e)for(const[r,n]of Object.entries(t))e.style.setProperty(r,n)},exports.sleep=e=>new Promise((t=>{setTimeout(t,e)})),exports.slugify=e=>e.normalize("NFKD").toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[-\s_]+/g,"-").replace(/^-+|-+$/g,""),exports.storageCalculateSize=async(e,t)=>{const r=await caches.open(e);if(t){const e=await r.match(t);if(e){const t=e.clone();return(await t.arrayBuffer()).byteLength}return 0}const n=await r.keys();let o=0;for(const e of n){const t=await r.match(e);if(t){const e=t.clone();o+=(await e.arrayBuffer()).byteLength}}return o},exports.storageClear=async e=>{const t=await caches.open(e),r=await t.keys();for(const e of r)await t.delete(e)},exports.storageClearByPrefixOrSuffix=async(e,t,r=!0)=>{const n=await caches.open(e),o=await n.keys();for(const e of o){const o=e.url.split("/"),s=o[o.length-1]||"";(r&&s.startsWith(t)||!r&&s.endsWith(t))&&await n.delete(e)}},exports.storageExists=async(e,t)=>{const r=await caches.open(e);return void 0!==await r.match(t)},exports.storageGetAllKeys=async e=>{const t=await caches.open(e);return(await t.keys()).map((e=>{const t=e.url.split("/");return t[t.length-1]||""}))},exports.storageGetItem=async(e,t)=>{const r=await caches.open(e),n=await r.match(t);if(!n)return null;const o=await n.text();return JSON.parse(o)},exports.storageRemoveItem=async(e,t)=>{const r=await caches.open(e);return await r.delete(t)},exports.storageSetItem=async(e,t,r)=>{const n=await caches.open(e),o=JSON.stringify(r,stringifyBigIntValues),s=new Response(o,{headers:{"Content-Type":"application/json"}});await n.put(t,s)},exports.stringifyBigIntValues=stringifyBigIntValues,exports.uncapitalize=e=>e.charAt(0).toLowerCase()+e.slice(1),exports.useEventBus=(t,r,n=[])=>{e.useEffect((()=>{if(t&&"function"==typeof r)return busSubscribe(t,r)}),[t,r,...n])};
6
+ */
7
+ var{defineProperty:x,getOwnPropertyNames:WQ,getOwnPropertyDescriptor:BQ}=Object,HQ=Object.prototype.hasOwnProperty;var n=new WeakMap,K=(J)=>{var Q=n.get(J),X;if(Q)return Q;if(Q=x({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")WQ(J).map((Y)=>!HQ.call(Q,Y)&&x(Q,Y,{get:()=>J[Y],enumerable:!(X=BQ(J,Y))||X.enumerable}));return n.set(J,Q),Q};var P=(J,Q)=>{for(var X in Q)x(J,X,{get:Q[X],enumerable:!0,configurable:!0,set:(Y)=>Q[X]=()=>Y})};var OQ={};P(OQ,{isUndefined:()=>e,isString:()=>s,isSet:()=>FJ,isRegExp:()=>$J,isRecord:()=>t,isPromise:()=>UJ,isPrimitive:()=>WJ,isObject:()=>V,isNumber:()=>r,isNull:()=>JJ,isNil:()=>QJ,isMap:()=>_J,isFunction:()=>a,isError:()=>GJ,isEmpty:()=>BJ,isDefined:()=>XJ,isDate:()=>ZJ,isBoolean:()=>i,isArray:()=>YJ});module.exports=K(OQ);var i=(J)=>{return typeof J==="boolean"},r=(J)=>{return typeof J==="number"},s=(J)=>{return typeof J==="string"},a=(J)=>{return typeof J==="function"},V=(J)=>{if(J===null||typeof J!=="object")return!1;let Q=Object.getPrototypeOf(J);return Q===Object.prototype||Q===null},t=(J)=>{return typeof J==="object"&&J!==null},e=(J)=>{return J===void 0},JJ=(J)=>{return J===null},QJ=(J)=>{return J===null||J===void 0},XJ=(J)=>{return J!==void 0},YJ=(J)=>{return Array.isArray(J)},ZJ=(J)=>{return J instanceof Date},$J=(J)=>{return J instanceof RegExp},GJ=(J)=>{return J instanceof Error},UJ=(J)=>{return J!==null&&(typeof J==="object"||typeof J==="function")&&typeof J.then==="function"},_J=(J)=>{return J instanceof Map},FJ=(J)=>{return J instanceof Set},WJ=(J)=>{if(J===null||J===void 0)return!0;let Q=typeof J;return Q==="string"||Q==="number"||Q==="boolean"||Q==="bigint"||Q==="symbol"},BJ=(J)=>{if(J===null||J===void 0)return!0;if(typeof J==="string"||Array.isArray(J))return J.length===0;if(J instanceof Map||J instanceof Set)return J.size===0;if(typeof J==="object")return Object.keys(J).length===0;return!1};var RQ={};P(RQ,{pickBy:()=>f,pick:()=>OJ,omitBy:()=>RJ,omit:()=>HJ,merge:()=>PJ,mapValues:()=>IJ,mapKeys:()=>TJ,keysOf:()=>AJ,invert:()=>zJ,hasOwn:()=>MJ,groupBy:()=>qJ,fromEntries:()=>SJ,entriesOf:()=>KJ,deepMerge:()=>C});module.exports=K(RQ);var HJ=(J,Q)=>{let X={...J};for(let Y of Q)delete X[Y];return X},OJ=(J,Q)=>{let X={};for(let Y of Q)if(Y in J)X[Y]=J[Y];return X},f=(J,Q)=>{let X={};for(let Y of Object.keys(J))if(Q(J[Y],Y))X[Y]=J[Y];return X},RJ=(J,Q)=>{return f(J,(X,Y)=>!Q(X,Y))},IJ=(J,Q)=>{let X={};for(let Y of Object.keys(J))X[Y]=Q(J[Y],Y);return X},TJ=(J,Q)=>{let X={};for(let Y of Object.keys(J))X[Q(J[Y],Y)]=J[Y];return X},qJ=(J,Q)=>{let X={};return J.forEach((Y,Z)=>{let U=Q(Y,Z);if(X[U])X[U].push(Y);else X[U]=[Y]}),X},zJ=(J)=>{let Q={};for(let X of Object.keys(J))Q[J[X]]=X;return Q},MJ=(J,Q)=>{return Object.hasOwn(J,Q)},AJ=(J)=>{return Object.keys(J)},KJ=(J)=>{return Object.entries(J)},SJ=(J)=>{return Object.fromEntries(J)},PJ=(J,...Q)=>{return Object.assign({},J,...Q)},C=(J,...Q)=>{let X={...J};for(let Y of Q){if(Y===void 0)continue;for(let Z of Object.keys(Y)){let U=Y[Z],_=X[Z];if(V(U))X[Z]=C(V(_)?_:{},U);else X[Z]=U}}return X};var IQ={};P(IQ,{timeout:()=>EJ,sleep:()=>g,retry:()=>VJ,parallelLimit:()=>NJ,defer:()=>LJ});module.exports=K(IQ);var g=(J,Q)=>{return new Promise((X,Y)=>{if(Q?.aborted){Y(Q.reason);return}let Z=setTimeout(()=>{Q?.removeEventListener("abort",U),X()},J),U=()=>{clearTimeout(Z),Y(Q?.reason)};Q?.addEventListener("abort",U,{once:!0})})},EJ=(J,Q,X)=>{return new Promise((Y,Z)=>{let U=setTimeout(()=>{Z(X??Error(`Operation timed out after ${Q}ms`))},Q);J.then((_)=>{clearTimeout(U),Y(_)},(_)=>{clearTimeout(U),Z(_)})})},VJ=async(J,Q={})=>{let{attempts:X=3,backoff:Y=0,signal:Z,shouldRetry:U}=Q,_;for(let H=1;H<=X;H++){if(Z?.aborted)throw Z.reason;try{return await J(H)}catch(z){if(_=z,H>=X)break;if(U&&!U(z,H))break;let S=typeof Y==="function"?Y(H):Y;if(S>0)await g(S,Z)}}throw _},LJ=()=>{let J,Q;return{promise:new Promise((Y,Z)=>{J=Y,Q=Z}),resolve:J,reject:Q}},NJ=async(J,Q,X)=>{if(Q<1)throw Error("parallelLimit: concurrency must be >= 1");let Y=Array(J.length),Z=0,U=async()=>{while(!0){let H=Z++;if(H>=J.length)return;Y[H]=await X(J[H],H)}},_=Array.from({length:Math.min(Q,J.length)},U);return await Promise.all(_),Y};var qQ={};P(qQ,{words:()=>yJ,uncapitalize:()=>mJ,truncate:()=>hJ,titleCase:()=>gJ,snakeCase:()=>CJ,slugify:()=>dJ,pascalCase:()=>wJ,lines:()=>jJ,kebabCase:()=>fJ,escapeRegExp:()=>pJ,escapeHtml:()=>kJ,capitalizeFirstLetter:()=>xJ,capitalize:()=>vJ,camelCase:()=>DJ});module.exports=K(qQ);var DJ=(J)=>{return J.trim().toLowerCase().replace(/^[-_\s]+/,"").replace(/[-_\s]+(.)?/g,(Q,X)=>X?X.toUpperCase():"")},wJ=(J)=>{return J.split(/(?=[0-9])|(?<=[0-9])|[^a-zA-Z0-9]+/g).filter(Boolean).map((Q)=>Q.toLowerCase()).map((Q)=>`${Q.charAt(0).toUpperCase()}${Q.slice(1)}`).join("")},xJ=(J)=>J.charAt(0).toUpperCase()+J.slice(1),fJ=(J)=>{if(J==null)return J;return J.normalize("NFKD").replace(/\p{Diacritic}/gu,"").replace(/[^\w\s-]/g," ").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z])([A-Z][a-z])/g,"$1-$2").replace(/[-_\s]+/g,"-").toLowerCase().replace(/^-+|-+$/g,"").trim()},CJ=(J)=>{if(J==null)return J;return J.normalize("NFKD").replace(/\p{Diacritic}/gu,"").replace(/[^\w\s-]/g," ").replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").replace(/[-_\s]+/g,"_").toLowerCase().replace(/^_+|_+$/g,"").trim()},gJ=(J)=>{return J.normalize("NFKD").replace(/[^\w\s-]/g," ").split(/[-_\s]+/).filter(Boolean).map((Q)=>Q.charAt(0).toUpperCase()+Q.slice(1).toLowerCase()).join(" ")},dJ=(J)=>{return J.normalize("NFKD").toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[-\s_]+/g,"-").replace(/^-+|-+$/g,"")},vJ=(J)=>{return J.charAt(0).toUpperCase()+J.slice(1)},mJ=(J)=>{return J.charAt(0).toLowerCase()+J.slice(1)},hJ=(J,Q,X="…")=>{if(J.length<=Q)return J;if(Q<=X.length)return X.slice(0,Q);return J.slice(0,Q-X.length)+X},TQ={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},kJ=(J)=>{return J.replace(/[&<>"']/g,(Q)=>TQ[Q])},pJ=(J)=>{return J.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},yJ=(J)=>{return J.split(/[-_\s]+/).filter(Boolean)},jJ=(J)=>{return J.split(/\r\n|\r|\n/)};var SQ={};P(SQ,{useEventBus:()=>UQ,stringifyBigIntValues:()=>d,storageSetItemWithTTL:()=>uJ,storageSetItem:()=>v,storageRemoveItem:()=>h,storageGetItemWithTTL:()=>bJ,storageGetItem:()=>m,storageGetAllKeys:()=>iJ,storageExists:()=>nJ,storageClearBySuffix:()=>oJ,storageClearByPrefixOrSuffix:()=>w,storageClearByPrefix:()=>lJ,storageClear:()=>cJ,storageCalculateSize:()=>rJ,setStyleProperties:()=>tJ,isInViewport:()=>QQ,isEqual:()=>FQ,isBrowser:()=>aJ,deepClone:()=>sJ,checkVisibility:()=>eJ,calculateRenderedTextWidth:()=>XQ,busSubscribe:()=>N,busOnce:()=>$Q,busDispatch:()=>ZQ,__resetTextMeasurementCache:()=>JQ});module.exports=K(SQ);var d=(J,Q)=>{return typeof Q==="bigint"?Q.toString():Q},L=(J)=>{if(J.startsWith("http://")||J.startsWith("https://"))return J;return`https://cache.internal/${J}`},v=async(J,Q,X)=>{let Y=await caches.open(J),Z=JSON.stringify(X,d),U=new Response(Z,{headers:{"Content-Type":"application/json"}}),_=L(Q);await Y.put(new Request(_),U)},m=async(J,Q)=>{let X=await caches.open(J),Y=L(Q),Z=await X.match(new Request(Y));if(!Z)return null;let U=await Z.text();return JSON.parse(U)},zQ=(J)=>{return typeof J==="object"&&J!==null&&J.__ttl===!0&&typeof J.exp==="number"},uJ=async(J,Q,X,Y)=>{let Z={__ttl:!0,v:X,exp:Date.now()+Y};await v(J,Q,Z)},bJ=async(J,Q)=>{let X=await m(J,Q);if(!zQ(X))return null;if(Date.now()>=X.exp)return await h(J,Q),null;return X.v},h=async(J,Q)=>{let X=await caches.open(J),Y=L(Q);return X.delete(new Request(Y))},cJ=async(J)=>{let Q=await caches.open(J),X=await Q.keys();for(let Y of X)await Q.delete(Y)},w=async(J,Q,X=!0)=>{let Y=await caches.open(J),Z=await Y.keys();for(let U of Z){let _=U.url.split("/"),H=_[_.length-1]||"";if(X&&H.startsWith(Q)||!X&&H.endsWith(Q))await Y.delete(U)}},lJ=async(J,Q)=>{await w(J,Q,!0)},oJ=async(J,Q)=>{await w(J,Q,!1)},nJ=async(J,Q)=>{let X=await caches.open(J),Y=L(Q);return await X.match(new Request(Y))!==void 0},iJ=async(J)=>{return(await(await caches.open(J)).keys()).map((Y)=>{let Z=Y.url.split("/");return Z[Z.length-1]||""})},rJ=async(J,Q)=>{let X=await caches.open(J);if(Q){let U=L(Q),_=await X.match(new Request(U));if(_)return(await _.clone().arrayBuffer()).byteLength;return 0}let Y=await X.keys(),Z=0;for(let U of Y){let _=await X.match(U);if(_){let H=await _.clone().arrayBuffer();Z+=H.byteLength}}return Z};var sJ=(J)=>{return B(J,new WeakMap)},B=(J,Q)=>{if(J===null||typeof J!=="object")return J;let X=Q.get(J);if(X)return X;if(Array.isArray(J)){let $=J.length;if($<32){let G=Array($);Q.set(J,G);for(let W=0;W<$;W++)if(W in J)G[W]=B(J[W],Q);return G}let F=Array($);if(Q.set(J,F),Object.keys(J).length===$){let G=0,W=$%8,R=$-W;while(G<R)F[G]=B(J[G],Q),F[G+1]=B(J[G+1],Q),F[G+2]=B(J[G+2],Q),F[G+3]=B(J[G+3],Q),F[G+4]=B(J[G+4],Q),F[G+5]=B(J[G+5],Q),F[G+6]=B(J[G+6],Q),F[G+7]=B(J[G+7],Q),G+=8;while(G<$)F[G]=B(J[G],Q),G++}else for(let G=0;G<$;G++)if(G in J)F[G]=B(J[G],Q);return F}if(J instanceof Date||J instanceof RegExp)return new J.constructor(J);if(typeof Buffer<"u")try{if(Buffer.isBuffer(J))return Buffer.from(J)}catch($){if($ instanceof Error)throw $}if(ArrayBuffer.isView(J)){let $=J.constructor;if("buffer"in J){let G=J,W=G.buffer.slice(G.byteOffset,G.byteOffset+G.byteLength);return new $(W)}return new $(new ArrayBuffer(J.byteLength))}if(J instanceof ArrayBuffer)return J.slice(0);if(J&&typeof J==="object"&&"buffer"in J&&"byteLength"in J){let $=J;if(typeof Buffer>"u"){let G=new Uint8Array($.buffer,$.byteOffset||0,$.byteLength),W=new Uint8Array(G.length);return W.set(G),W}return{buffer:$.buffer instanceof ArrayBuffer?$.buffer.slice(0):new ArrayBuffer($.byteLength),byteLength:$.byteLength,byteOffset:$.byteOffset||0,length:$.length||$.byteLength,BYTES_PER_ELEMENT:$.BYTES_PER_ELEMENT||1}}if(J instanceof Set){let $=new Set;Q.set(J,$);let F=Array.from(J),G=F.length;for(let W=0;W<G;W++)$.add(B(F[W],Q));return $}if(J instanceof Map){let $=new Map;Q.set(J,$);let F=Array.from(J),G=F.length;for(let W=0;W<G;W++){let[R,M]=F[W];$.set(R,B(M,Q))}return $}if(Object.getPrototypeOf(J)===Object.prototype){let $={};Q.set(J,$);let F=Object.getOwnPropertySymbols(J),G=F.length;if(G>0)for(let O=0;O<G;O++){let I=F[O],T=Object.getOwnPropertyDescriptor(J,I);if(T?.enumerable)Object.defineProperty($,I,T)}let W=Object.getOwnPropertyDescriptors(J),R=Object.keys(J),M=R.length,p=!1;for(let O=0;O<M;O++){let I=W[R[O]];if(I.get||I.set){p=!0;break}}if(p)for(let O=0;O<M;O++){let I=R[O],T=W[I];if(T.enumerable)if(T.get||T.set)Object.defineProperty($,I,T);else{let A=B(T.value,Q);Object.defineProperty($,I,{...T,value:A})}}else{let O=0,I=M%8,T=M-I;while(O<T){let A=R[O],y=R[O+1],j=R[O+2],u=R[O+3],b=R[O+4],c=R[O+5],l=R[O+6],o=R[O+7],q=J;$[A]=B(q[A],Q),$[y]=B(q[y],Q),$[j]=B(q[j],Q),$[u]=B(q[u],Q),$[b]=B(q[b],Q),$[c]=B(q[c],Q),$[l]=B(q[l],Q),$[o]=B(q[o],Q),O+=8}while(O<M){let A=R[O++];$[A]=B(J[A],Q)}}return $}let Y=Object.getPrototypeOf(J),Z=Object.create(Y);Q.set(J,Z);let U=Object.getOwnPropertyDescriptors(J),_=Object.keys(U),H=_.length;for(let $=0;$<H;$++){let F=_[$],G=U[F];if(!G.enumerable)continue;if(G.get||G.set)Object.defineProperty(Z,F,G);else{let W=B(G.value,Q);Object.defineProperty(Z,F,{...G,value:W})}}let z=Object.getOwnPropertySymbols(J),S=z.length;for(let $=0;$<S;$++){let F=z[$],G=Object.getOwnPropertyDescriptor(J,F);if(!G?.enumerable)continue;Object.defineProperty(Z,F,G)}return Z};var aJ=()=>{return typeof window<"u"&&typeof document<"u"},tJ=(J,Q)=>{if(!J)return;for(let[X,Y]of Object.entries(Q))J.style.setProperty(X,Y)},eJ=(J,Q={})=>{let{checkViewport:X=!0,checkDisplay:Y=!0,checkVisibility:Z=!0,checkOpacity:U=!0}=Q;if(!J.isConnected)return!1;if(Y||Z||U){let _=window.getComputedStyle(J);if(Y&&_.display==="none")return!1;if(Z&&_.visibility!==""&&_.visibility!=="visible")return!1;if(U&&_.opacity!==""){let H=Number.parseFloat(_.opacity);if(!Number.isNaN(H)&&H===0)return!1}}if(X){let _=J.getBoundingClientRect();if(_.width!==0||_.height!==0){let H=window.innerHeight||document.documentElement.clientHeight,z=window.innerWidth||document.documentElement.clientWidth,S=_.bottom<=0||_.top>=H,$=_.right<=0||_.left>=z;if(S||$)return!1}}return!0};var k,E,MQ=()=>{if(E!==void 0)return E;if(typeof document>"u")return E=null,null;return k=document.createElement("canvas"),E=k.getContext("2d"),E},JQ=()=>{k=void 0,E=void 0},QQ=(J,Q={})=>{let{vertical:X=!0,horizontal:Y=!0}=Q,Z=J.getBoundingClientRect();if(Z.width===0&&Z.height===0)return!0;let U=window.innerHeight||document.documentElement.clientHeight,_=window.innerWidth||document.documentElement.clientWidth;if(X&&(Z.bottom<=0||Z.top>=U))return!1;if(Y&&(Z.right<=0||Z.left>=_))return!1;return!0},XQ=(J,Q,X=!1,Y='Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"')=>{let Z=MQ();if(!Z)return 0;let U=X?J.toUpperCase():J;return Z.font=`${Q}px ${Y}`,Z.measureText(U).width};var AQ=(J,Q="\uD83D\uDE80")=>{let X=0,Y=J+Q;for(let Z=0;Z<Y.length;Z++){let U=Y.charCodeAt(Z);X=(X<<5)-X+U,X|=0}return(X>>>0).toString(16)},YQ=(J)=>{return`${AQ(J)}::${J}`},KQ=(J,Q)=>{return(X)=>{if(!(X instanceof CustomEvent))return;try{J(X.detail)}catch(Y){if(Q)Q(Y);else console.error("Event listener error:",Y)}}},ZQ=(J,Q)=>{if(!J)return;let X=YQ(J);window.dispatchEvent(new CustomEvent(X,{detail:Q,bubbles:!0,cancelable:!1}))},N=(J,Q,X={})=>{if(!J||typeof Q!=="function")return()=>{};let Y=KQ(Q,X.onError),Z=YQ(J);return window.addEventListener(Z,Y),()=>window.removeEventListener(Z,Y)},$Q=(J,Q,X={})=>{if(!J||typeof Q!=="function")return()=>{};let Y=N(J,(Z)=>{Y(),Q(Z)},X);return Y};var GQ=require("react");var UQ=(J,Q,X=[])=>{GQ.useEffect(()=>{if(!J||typeof Q!=="function")return;return N(J,Q)},[J,Q,...X])};var FQ=(J,Q)=>{return D(J,Q,new WeakMap)},D=(J,Q,X)=>{if(Object.is(J,Q))return!0;if(J instanceof Date&&Q instanceof Date)return J.getTime()===Q.getTime();if(J instanceof RegExp&&Q instanceof RegExp)return J.source===Q.source&&J.flags===Q.flags;if(J instanceof Error&&Q instanceof Error)return J.name===Q.name&&J.message===Q.message;if(J instanceof ArrayBuffer&&Q instanceof ArrayBuffer){if(J.byteLength!==Q.byteLength)return!1;return _Q(new Uint8Array(J),new Uint8Array(Q))}if(ArrayBuffer.isView(J)&&ArrayBuffer.isView(Q)){if(J.constructor!==Q.constructor)return!1;if(J.byteLength!==Q.byteLength)return!1;let Y=new Uint8Array(J.buffer,J.byteOffset,J.byteLength),Z=new Uint8Array(Q.buffer,Q.byteOffset,Q.byteLength);return _Q(Y,Z)}if(typeof J==="object"&&J!==null&&typeof Q==="object"&&Q!==null){let Y=X.get(J);if(Y?.has(Q))return!0;if(Y)Y.add(Q);else X.set(J,new WeakSet([Q]))}if(Array.isArray(J)&&Array.isArray(Q)){if(J.length!==Q.length)return!1;for(let Y=0;Y<J.length;Y++)if(!D(J[Y],Q[Y],X))return!1;return!0}if(J instanceof Set&&Q instanceof Set){if(J.size!==Q.size)return!1;let Y=Array.from(Q);for(let Z of J){let U=Y.findIndex((_)=>D(Z,_,X));if(U===-1)return!1;Y.splice(U,1)}return!0}if(J instanceof Map&&Q instanceof Map){if(J.size!==Q.size)return!1;for(let[Y,Z]of J)if(!Q.has(Y)||!D(Z,Q.get(Y),X))return!1;return!0}if(J!==null&&typeof J==="object"&&Q!==null&&typeof Q==="object"){let Y=J,Z=Q,U=Object.keys(Y);if(U.length!==Object.keys(Z).length)return!1;for(let _ of U)if(!D(Y[_],Z[_],X))return!1;return!0}return!1},_Q=(J,Q)=>{for(let X=0;X<J.length;X++)if(J[X]!==Q[X])return!1;return!0};var PQ={};module.exports=K(PQ);var EQ={};P(EQ,{words:()=>yJ,useEventBus:()=>UQ,uncapitalize:()=>mJ,truncate:()=>hJ,titleCase:()=>gJ,timeout:()=>EJ,stringifyBigIntValues:()=>d,storageSetItemWithTTL:()=>uJ,storageSetItem:()=>v,storageRemoveItem:()=>h,storageGetItemWithTTL:()=>bJ,storageGetItem:()=>m,storageGetAllKeys:()=>iJ,storageExists:()=>nJ,storageClearBySuffix:()=>oJ,storageClearByPrefixOrSuffix:()=>w,storageClearByPrefix:()=>lJ,storageClear:()=>cJ,storageCalculateSize:()=>rJ,snakeCase:()=>CJ,slugify:()=>dJ,sleep:()=>g,setStyleProperties:()=>tJ,retry:()=>VJ,pickBy:()=>f,pick:()=>OJ,pascalCase:()=>wJ,parallelLimit:()=>NJ,omitBy:()=>RJ,omit:()=>HJ,merge:()=>PJ,mapValues:()=>IJ,mapKeys:()=>TJ,lines:()=>jJ,keysOf:()=>AJ,kebabCase:()=>fJ,isUndefined:()=>e,isString:()=>s,isSet:()=>FJ,isRegExp:()=>$J,isRecord:()=>t,isPromise:()=>UJ,isPrimitive:()=>WJ,isObject:()=>V,isNumber:()=>r,isNull:()=>JJ,isNil:()=>QJ,isMap:()=>_J,isInViewport:()=>QQ,isFunction:()=>a,isError:()=>GJ,isEqual:()=>FQ,isEmpty:()=>BJ,isDefined:()=>XJ,isDate:()=>ZJ,isBrowser:()=>aJ,isBoolean:()=>i,isArray:()=>YJ,invert:()=>zJ,hasOwn:()=>MJ,groupBy:()=>qJ,fromEntries:()=>SJ,escapeRegExp:()=>pJ,escapeHtml:()=>kJ,entriesOf:()=>KJ,defer:()=>LJ,deepMerge:()=>C,deepClone:()=>sJ,checkVisibility:()=>eJ,capitalizeFirstLetter:()=>xJ,capitalize:()=>vJ,camelCase:()=>DJ,calculateRenderedTextWidth:()=>XQ,busSubscribe:()=>N,busOnce:()=>$Q,busDispatch:()=>ZQ,__resetTextMeasurementCache:()=>JQ});module.exports=K(EQ);
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * @pivanov/utils v1.0.0
3
+ * (c) 2024-present Pavel Ivanov
4
+ * Released under the MIT License.
5
+ * https://github.com/pivanov/utils
6
+ */
7
+ var{defineProperty:L,getOwnPropertyNames:Z,getOwnPropertyDescriptor:_}=Object,$=Object.prototype.hasOwnProperty;var T=new WeakMap,U=(q)=>{var F=T.get(q),G;if(F)return F;if(F=L({},"__esModule",{value:!0}),q&&typeof q==="object"||typeof q==="function")Z(q).map((H)=>!$.call(F,H)&&L(F,H,{get:()=>q[H],enumerable:!(G=_(q,H))||G.enumerable}));return T.set(q,F),F};var W=(q,F)=>{for(var G in F)L(q,G,{get:F[G],enumerable:!0,configurable:!0,set:(H)=>F[G]=()=>H})};var g={};W(g,{isUndefined:()=>N,isString:()=>B,isSet:()=>V,isRegExp:()=>w,isRecord:()=>D,isPromise:()=>M,isPrimitive:()=>h,isObject:()=>K,isNumber:()=>A,isNull:()=>P,isNil:()=>R,isMap:()=>E,isFunction:()=>C,isError:()=>x,isEmpty:()=>d,isDefined:()=>f,isDate:()=>S,isBoolean:()=>z,isArray:()=>O});module.exports=U(g);var z=(q)=>{return typeof q==="boolean"},A=(q)=>{return typeof q==="number"},B=(q)=>{return typeof q==="string"},C=(q)=>{return typeof q==="function"},K=(q)=>{if(q===null||typeof q!=="object")return!1;let F=Object.getPrototypeOf(q);return F===Object.prototype||F===null},D=(q)=>{return typeof q==="object"&&q!==null},N=(q)=>{return q===void 0},P=(q)=>{return q===null},R=(q)=>{return q===null||q===void 0},f=(q)=>{return q!==void 0},O=(q)=>{return Array.isArray(q)},S=(q)=>{return q instanceof Date},w=(q)=>{return q instanceof RegExp},x=(q)=>{return q instanceof Error},M=(q)=>{return q!==null&&(typeof q==="object"||typeof q==="function")&&typeof q.then==="function"},E=(q)=>{return q instanceof Map},V=(q)=>{return q instanceof Set},h=(q)=>{if(q===null||q===void 0)return!0;let F=typeof q;return F==="string"||F==="number"||F==="boolean"||F==="bigint"||F==="symbol"},d=(q)=>{if(q===null||q===void 0)return!0;if(typeof q==="string"||Array.isArray(q))return q.length===0;if(q instanceof Map||q instanceof Set)return q.size===0;if(typeof q==="object")return Object.keys(q).length===0;return!1};var v={};W(v,{pickBy:()=>X,pick:()=>n,omitBy:()=>p,omit:()=>m,merge:()=>r,mapValues:()=>k,mapKeys:()=>i,keysOf:()=>c,invert:()=>y,hasOwn:()=>b,groupBy:()=>j,fromEntries:()=>s,entriesOf:()=>o,deepMerge:()=>Y});module.exports=U(v);var m=(q,F)=>{let G={...q};for(let H of F)delete G[H];return G},n=(q,F)=>{let G={};for(let H of F)if(H in q)G[H]=q[H];return G},X=(q,F)=>{let G={};for(let H of Object.keys(q))if(F(q[H],H))G[H]=q[H];return G},p=(q,F)=>{return X(q,(G,H)=>!F(G,H))},k=(q,F)=>{let G={};for(let H of Object.keys(q))G[H]=F(q[H],H);return G},i=(q,F)=>{let G={};for(let H of Object.keys(q))G[F(q[H],H)]=q[H];return G},j=(q,F)=>{let G={};return q.forEach((H,J)=>{let I=F(H,J);if(G[I])G[I].push(H);else G[I]=[H]}),G},y=(q)=>{let F={};for(let G of Object.keys(q))F[q[G]]=G;return F},b=(q,F)=>{return Object.hasOwn(q,F)},c=(q)=>{return Object.keys(q)},o=(q)=>{return Object.entries(q)},s=(q)=>{return Object.fromEntries(q)},r=(q,...F)=>{return Object.assign({},q,...F)},Y=(q,...F)=>{let G={...q};for(let H of F){if(H===void 0)continue;for(let J of Object.keys(H)){let I=H[J],Q=G[J];if(K(I))G[J]=Y(K(Q)?Q:{},I);else G[J]=I}}return G};
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * @pivanov/utils v1.0.0
3
+ * (c) 2024-present Pavel Ivanov
4
+ * Released under the MIT License.
5
+ * https://github.com/pivanov/utils
6
+ */
7
+ var{defineProperty:J,getOwnPropertyNames:Q,getOwnPropertyDescriptor:S}=Object,T=Object.prototype.hasOwnProperty;var O=new WeakMap,U=(z)=>{var q=O.get(z),C;if(q)return q;if(q=J({},"__esModule",{value:!0}),z&&typeof z==="object"||typeof z==="function")Q(z).map((B)=>!T.call(q,B)&&J(q,B,{get:()=>z[B],enumerable:!(C=S(z,B))||C.enumerable}));return O.set(z,q),q};var V=(z,q)=>{for(var C in q)J(z,C,{get:q[C],enumerable:!0,configurable:!0,set:(B)=>q[C]=()=>B})};var _={};V(_,{timeout:()=>W,sleep:()=>P,retry:()=>X,parallelLimit:()=>Z,defer:()=>Y});module.exports=U(_);var P=(z,q)=>{return new Promise((C,B)=>{if(q?.aborted){B(q.reason);return}let D=setTimeout(()=>{q?.removeEventListener("abort",G),C()},z),G=()=>{clearTimeout(D),B(q?.reason)};q?.addEventListener("abort",G,{once:!0})})},W=(z,q,C)=>{return new Promise((B,D)=>{let G=setTimeout(()=>{D(C??Error(`Operation timed out after ${q}ms`))},q);z.then((H)=>{clearTimeout(G),B(H)},(H)=>{clearTimeout(G),D(H)})})},X=async(z,q={})=>{let{attempts:C=3,backoff:B=0,signal:D,shouldRetry:G}=q,H;for(let F=1;F<=C;F++){if(D?.aborted)throw D.reason;try{return await z(F)}catch(K){if(H=K,F>=C)break;if(G&&!G(K,F))break;let N=typeof B==="function"?B(F):B;if(N>0)await P(N,D)}}throw H},Y=()=>{let z,q;return{promise:new Promise((B,D)=>{z=B,q=D}),resolve:z,reject:q}},Z=async(z,q,C)=>{if(q<1)throw Error("parallelLimit: concurrency must be >= 1");let B=Array(z.length),D=0,G=async()=>{while(!0){let F=D++;if(F>=z.length)return;B[F]=await C(z[F],F)}},H=Array.from({length:Math.min(q,z.length)},G);return await Promise.all(H),B};
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * @pivanov/utils v1.0.0
3
+ * (c) 2024-present Pavel Ivanov
4
+ * Released under the MIT License.
5
+ * https://github.com/pivanov/utils
6
+ */
7
+ var{defineProperty:u,getOwnPropertyNames:z,getOwnPropertyDescriptor:B}=Object,D=Object.prototype.hasOwnProperty;var v=new WeakMap,F=(d)=>{var f=v.get(d),j;if(f)return f;if(f=u({},"__esModule",{value:!0}),d&&typeof d==="object"||typeof d==="function")z(d).map((q)=>!D.call(f,q)&&u(f,q,{get:()=>d[q],enumerable:!(j=B(d,q))||j.enumerable}));return v.set(d,f),f};var G=(d,f)=>{for(var j in f)u(d,j,{get:f[j],enumerable:!0,configurable:!0,set:(q)=>f[j]=()=>q})};var o={};G(o,{words:()=>$,uncapitalize:()=>V,truncate:()=>W,titleCase:()=>Q,snakeCase:()=>O,slugify:()=>R,pascalCase:()=>J,lines:()=>k,kebabCase:()=>N,escapeRegExp:()=>Z,escapeHtml:()=>Y,capitalizeFirstLetter:()=>K,capitalize:()=>U,camelCase:()=>I});module.exports=F(o);var I=(d)=>{return d.trim().toLowerCase().replace(/^[-_\s]+/,"").replace(/[-_\s]+(.)?/g,(f,j)=>j?j.toUpperCase():"")},J=(d)=>{return d.split(/(?=[0-9])|(?<=[0-9])|[^a-zA-Z0-9]+/g).filter(Boolean).map((f)=>f.toLowerCase()).map((f)=>`${f.charAt(0).toUpperCase()}${f.slice(1)}`).join("")},K=(d)=>d.charAt(0).toUpperCase()+d.slice(1),N=(d)=>{if(d==null)return d;return d.normalize("NFKD").replace(/\p{Diacritic}/gu,"").replace(/[^\w\s-]/g," ").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z])([A-Z][a-z])/g,"$1-$2").replace(/[-_\s]+/g,"-").toLowerCase().replace(/^-+|-+$/g,"").trim()},O=(d)=>{if(d==null)return d;return d.normalize("NFKD").replace(/\p{Diacritic}/gu,"").replace(/[^\w\s-]/g," ").replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").replace(/[-_\s]+/g,"_").toLowerCase().replace(/^_+|_+$/g,"").trim()},Q=(d)=>{return d.normalize("NFKD").replace(/[^\w\s-]/g," ").split(/[-_\s]+/).filter(Boolean).map((f)=>f.charAt(0).toUpperCase()+f.slice(1).toLowerCase()).join(" ")},R=(d)=>{return d.normalize("NFKD").toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[-\s_]+/g,"-").replace(/^-+|-+$/g,"")},U=(d)=>{return d.charAt(0).toUpperCase()+d.slice(1)},V=(d)=>{return d.charAt(0).toLowerCase()+d.slice(1)},W=(d,f,j="…")=>{if(d.length<=f)return d;if(f<=j.length)return j.slice(0,f);return d.slice(0,f-j.length)+j},X={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Y=(d)=>{return d.replace(/[&<>"']/g,(f)=>X[f])},Z=(d)=>{return d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},$=(d)=>{return d.split(/[-_\s]+/).filter(Boolean)},k=(d)=>{return d.split(/\r\n|\r|\n/)};
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * @pivanov/utils v1.0.0
3
+ * (c) 2024-present Pavel Ivanov
4
+ * Released under the MIT License.
5
+ * https://github.com/pivanov/utils
6
+ */
7
+ var{defineProperty:V,getOwnPropertyNames:c,getOwnPropertyDescriptor:r}=Object,n=Object.prototype.hasOwnProperty;var u=new WeakMap,o=(J)=>{var Q=u.get(J),X;if(Q)return Q;if(Q=V({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function")c(J).map((Y)=>!n.call(Q,Y)&&V(Q,Y,{get:()=>J[Y],enumerable:!(X=r(J,Y))||X.enumerable}));return u.set(J,Q),Q};var i=(J,Q)=>{for(var X in Q)V(J,X,{get:Q[X],enumerable:!0,configurable:!0,set:(Y)=>Q[X]=()=>Y})};var TJ={};i(TJ,{useEventBus:()=>EJ,stringifyBigIntValues:()=>k,storageSetItemWithTTL:()=>s,storageSetItem:()=>p,storageRemoveItem:()=>y,storageGetItemWithTTL:()=>a,storageGetItem:()=>h,storageGetAllKeys:()=>YJ,storageExists:()=>XJ,storageClearBySuffix:()=>QJ,storageClearByPrefixOrSuffix:()=>w,storageClearByPrefix:()=>JJ,storageClear:()=>e,storageCalculateSize:()=>ZJ,setStyleProperties:()=>GJ,isInViewport:()=>MJ,isEqual:()=>IJ,isBrowser:()=>$J,deepClone:()=>_J,checkVisibility:()=>FJ,calculateRenderedTextWidth:()=>RJ,busSubscribe:()=>K,busOnce:()=>HJ,busDispatch:()=>AJ,__resetTextMeasurementCache:()=>BJ});module.exports=o(TJ);var k=(J,Q)=>{return typeof Q==="bigint"?Q.toString():Q},P=(J)=>{if(J.startsWith("http://")||J.startsWith("https://"))return J;return`https://cache.internal/${J}`},p=async(J,Q,X)=>{let Y=await caches.open(J),$=JSON.stringify(X,k),U=new Response($,{headers:{"Content-Type":"application/json"}}),G=P(Q);await Y.put(new Request(G),U)},h=async(J,Q)=>{let X=await caches.open(J),Y=P(Q),$=await X.match(new Request(Y));if(!$)return null;let U=await $.text();return JSON.parse(U)},t=(J)=>{return typeof J==="object"&&J!==null&&J.__ttl===!0&&typeof J.exp==="number"},s=async(J,Q,X,Y)=>{let $={__ttl:!0,v:X,exp:Date.now()+Y};await p(J,Q,$)},a=async(J,Q)=>{let X=await h(J,Q);if(!t(X))return null;if(Date.now()>=X.exp)return await y(J,Q),null;return X.v},y=async(J,Q)=>{let X=await caches.open(J),Y=P(Q);return X.delete(new Request(Y))},e=async(J)=>{let Q=await caches.open(J),X=await Q.keys();for(let Y of X)await Q.delete(Y)},w=async(J,Q,X=!0)=>{let Y=await caches.open(J),$=await Y.keys();for(let U of $){let G=U.url.split("/"),W=G[G.length-1]||"";if(X&&W.startsWith(Q)||!X&&W.endsWith(Q))await Y.delete(U)}},JJ=async(J,Q)=>{await w(J,Q,!0)},QJ=async(J,Q)=>{await w(J,Q,!1)},XJ=async(J,Q)=>{let X=await caches.open(J),Y=P(Q);return await X.match(new Request(Y))!==void 0},YJ=async(J)=>{return(await(await caches.open(J)).keys()).map((Y)=>{let $=Y.url.split("/");return $[$.length-1]||""})},ZJ=async(J,Q)=>{let X=await caches.open(J);if(Q){let U=P(Q),G=await X.match(new Request(U));if(G)return(await G.clone().arrayBuffer()).byteLength;return 0}let Y=await X.keys(),$=0;for(let U of Y){let G=await X.match(U);if(G){let W=await G.clone().arrayBuffer();$+=W.byteLength}}return $};var _J=(J)=>{return M(J,new WeakMap)},M=(J,Q)=>{if(J===null||typeof J!=="object")return J;let X=Q.get(J);if(X)return X;if(Array.isArray(J)){let Z=J.length;if(Z<32){let _=Array(Z);Q.set(J,_);for(let B=0;B<Z;B++)if(B in J)_[B]=M(J[B],Q);return _}let F=Array(Z);if(Q.set(J,F),Object.keys(J).length===Z){let _=0,B=Z%8,O=Z-B;while(_<O)F[_]=M(J[_],Q),F[_+1]=M(J[_+1],Q),F[_+2]=M(J[_+2],Q),F[_+3]=M(J[_+3],Q),F[_+4]=M(J[_+4],Q),F[_+5]=M(J[_+5],Q),F[_+6]=M(J[_+6],Q),F[_+7]=M(J[_+7],Q),_+=8;while(_<Z)F[_]=M(J[_],Q),_++}else for(let _=0;_<Z;_++)if(_ in J)F[_]=M(J[_],Q);return F}if(J instanceof Date||J instanceof RegExp)return new J.constructor(J);if(typeof Buffer<"u")try{if(Buffer.isBuffer(J))return Buffer.from(J)}catch(Z){if(Z instanceof Error)throw Z}if(ArrayBuffer.isView(J)){let Z=J.constructor;if("buffer"in J){let _=J,B=_.buffer.slice(_.byteOffset,_.byteOffset+_.byteLength);return new Z(B)}return new Z(new ArrayBuffer(J.byteLength))}if(J instanceof ArrayBuffer)return J.slice(0);if(J&&typeof J==="object"&&"buffer"in J&&"byteLength"in J){let Z=J;if(typeof Buffer>"u"){let _=new Uint8Array(Z.buffer,Z.byteOffset||0,Z.byteLength),B=new Uint8Array(_.length);return B.set(_),B}return{buffer:Z.buffer instanceof ArrayBuffer?Z.buffer.slice(0):new ArrayBuffer(Z.byteLength),byteLength:Z.byteLength,byteOffset:Z.byteOffset||0,length:Z.length||Z.byteLength,BYTES_PER_ELEMENT:Z.BYTES_PER_ELEMENT||1}}if(J instanceof Set){let Z=new Set;Q.set(J,Z);let F=Array.from(J),_=F.length;for(let B=0;B<_;B++)Z.add(M(F[B],Q));return Z}if(J instanceof Map){let Z=new Map;Q.set(J,Z);let F=Array.from(J),_=F.length;for(let B=0;B<_;B++){let[O,I]=F[B];Z.set(O,M(I,Q))}return Z}if(Object.getPrototypeOf(J)===Object.prototype){let Z={};Q.set(J,Z);let F=Object.getOwnPropertySymbols(J),_=F.length;if(_>0)for(let R=0;R<_;R++){let A=F[R],H=Object.getOwnPropertyDescriptor(J,A);if(H?.enumerable)Object.defineProperty(Z,A,H)}let B=Object.getOwnPropertyDescriptors(J),O=Object.keys(J),I=O.length,N=!1;for(let R=0;R<I;R++){let A=B[O[R]];if(A.get||A.set){N=!0;break}}if(N)for(let R=0;R<I;R++){let A=O[R],H=B[A];if(H.enumerable)if(H.get||H.set)Object.defineProperty(Z,A,H);else{let T=M(H.value,Q);Object.defineProperty(Z,A,{...H,value:T})}}else{let R=0,A=I%8,H=I-A;while(R<H){let T=O[R],x=O[R+1],f=O[R+2],v=O[R+3],g=O[R+4],C=O[R+5],m=O[R+6],d=O[R+7],E=J;Z[T]=M(E[T],Q),Z[x]=M(E[x],Q),Z[f]=M(E[f],Q),Z[v]=M(E[v],Q),Z[g]=M(E[g],Q),Z[C]=M(E[C],Q),Z[m]=M(E[m],Q),Z[d]=M(E[d],Q),R+=8}while(R<I){let T=O[R++];Z[T]=M(J[T],Q)}}return Z}let Y=Object.getPrototypeOf(J),$=Object.create(Y);Q.set(J,$);let U=Object.getOwnPropertyDescriptors(J),G=Object.keys(U),W=G.length;for(let Z=0;Z<W;Z++){let F=G[Z],_=U[F];if(!_.enumerable)continue;if(_.get||_.set)Object.defineProperty($,F,_);else{let B=M(_.value,Q);Object.defineProperty($,F,{..._,value:B})}}let q=Object.getOwnPropertySymbols(J),L=q.length;for(let Z=0;Z<L;Z++){let F=q[Z],_=Object.getOwnPropertyDescriptor(J,F);if(!_?.enumerable)continue;Object.defineProperty($,F,_)}return $};var $J=()=>{return typeof window<"u"&&typeof document<"u"},GJ=(J,Q)=>{if(!J)return;for(let[X,Y]of Object.entries(Q))J.style.setProperty(X,Y)},FJ=(J,Q={})=>{let{checkViewport:X=!0,checkDisplay:Y=!0,checkVisibility:$=!0,checkOpacity:U=!0}=Q;if(!J.isConnected)return!1;if(Y||$||U){let G=window.getComputedStyle(J);if(Y&&G.display==="none")return!1;if($&&G.visibility!==""&&G.visibility!=="visible")return!1;if(U&&G.opacity!==""){let W=Number.parseFloat(G.opacity);if(!Number.isNaN(W)&&W===0)return!1}}if(X){let G=J.getBoundingClientRect();if(G.width!==0||G.height!==0){let W=window.innerHeight||document.documentElement.clientHeight,q=window.innerWidth||document.documentElement.clientWidth,L=G.bottom<=0||G.top>=W,Z=G.right<=0||G.left>=q;if(L||Z)return!1}}return!0};var D,z,UJ=()=>{if(z!==void 0)return z;if(typeof document>"u")return z=null,null;return D=document.createElement("canvas"),z=D.getContext("2d"),z},BJ=()=>{D=void 0,z=void 0},MJ=(J,Q={})=>{let{vertical:X=!0,horizontal:Y=!0}=Q,$=J.getBoundingClientRect();if($.width===0&&$.height===0)return!0;let U=window.innerHeight||document.documentElement.clientHeight,G=window.innerWidth||document.documentElement.clientWidth;if(X&&($.bottom<=0||$.top>=U))return!1;if(Y&&($.right<=0||$.left>=G))return!1;return!0},RJ=(J,Q,X=!1,Y='Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"')=>{let $=UJ();if(!$)return 0;let U=X?J.toUpperCase():J;return $.font=`${Q}px ${Y}`,$.measureText(U).width};var OJ=(J,Q="\uD83D\uDE80")=>{let X=0,Y=J+Q;for(let $=0;$<Y.length;$++){let U=Y.charCodeAt($);X=(X<<5)-X+U,X|=0}return(X>>>0).toString(16)},j=(J)=>{return`${OJ(J)}::${J}`},WJ=(J,Q)=>{return(X)=>{if(!(X instanceof CustomEvent))return;try{J(X.detail)}catch(Y){if(Q)Q(Y);else console.error("Event listener error:",Y)}}},AJ=(J,Q)=>{if(!J)return;let X=j(J);window.dispatchEvent(new CustomEvent(X,{detail:Q,bubbles:!0,cancelable:!1}))},K=(J,Q,X={})=>{if(!J||typeof Q!=="function")return()=>{};let Y=WJ(Q,X.onError),$=j(J);return window.addEventListener($,Y),()=>window.removeEventListener($,Y)},HJ=(J,Q,X={})=>{if(!J||typeof Q!=="function")return()=>{};let Y=K(J,($)=>{Y(),Q($)},X);return Y};var l=require("react");var EJ=(J,Q,X=[])=>{l.useEffect(()=>{if(!J||typeof Q!=="function")return;return K(J,Q)},[J,Q,...X])};var IJ=(J,Q)=>{return S(J,Q,new WeakMap)},S=(J,Q,X)=>{if(Object.is(J,Q))return!0;if(J instanceof Date&&Q instanceof Date)return J.getTime()===Q.getTime();if(J instanceof RegExp&&Q instanceof RegExp)return J.source===Q.source&&J.flags===Q.flags;if(J instanceof Error&&Q instanceof Error)return J.name===Q.name&&J.message===Q.message;if(J instanceof ArrayBuffer&&Q instanceof ArrayBuffer){if(J.byteLength!==Q.byteLength)return!1;return b(new Uint8Array(J),new Uint8Array(Q))}if(ArrayBuffer.isView(J)&&ArrayBuffer.isView(Q)){if(J.constructor!==Q.constructor)return!1;if(J.byteLength!==Q.byteLength)return!1;let Y=new Uint8Array(J.buffer,J.byteOffset,J.byteLength),$=new Uint8Array(Q.buffer,Q.byteOffset,Q.byteLength);return b(Y,$)}if(typeof J==="object"&&J!==null&&typeof Q==="object"&&Q!==null){let Y=X.get(J);if(Y?.has(Q))return!0;if(Y)Y.add(Q);else X.set(J,new WeakSet([Q]))}if(Array.isArray(J)&&Array.isArray(Q)){if(J.length!==Q.length)return!1;for(let Y=0;Y<J.length;Y++)if(!S(J[Y],Q[Y],X))return!1;return!0}if(J instanceof Set&&Q instanceof Set){if(J.size!==Q.size)return!1;let Y=Array.from(Q);for(let $ of J){let U=Y.findIndex((G)=>S($,G,X));if(U===-1)return!1;Y.splice(U,1)}return!0}if(J instanceof Map&&Q instanceof Map){if(J.size!==Q.size)return!1;for(let[Y,$]of J)if(!Q.has(Y)||!S($,Q.get(Y),X))return!1;return!0}if(J!==null&&typeof J==="object"&&Q!==null&&typeof Q==="object"){let Y=J,$=Q,U=Object.keys(Y);if(U.length!==Object.keys($).length)return!1;for(let G of U)if(!S(Y[G],$[G],X))return!1;return!0}return!1},b=(J,Q)=>{for(let X=0;X<J.length;X++)if(J[X]!==Q[X])return!1;return!0};