dphelper 3.5.5 → 3.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +0 -21
  2. package/docs/README.md +385 -0
  3. package/docs/SUMMARY.md +83 -0
  4. package/docs/_config.yml +1 -0
  5. package/docs/markdown/ai.md +345 -0
  6. package/docs/markdown/anchor.md +156 -0
  7. package/docs/markdown/array.md +208 -0
  8. package/docs/markdown/audio.md +113 -0
  9. package/docs/markdown/avoid.md +53 -0
  10. package/docs/markdown/biometric.md +338 -0
  11. package/docs/markdown/browser.md +203 -0
  12. package/docs/markdown/check.md +65 -0
  13. package/docs/markdown/color.md +159 -0
  14. package/docs/markdown/compress.md +310 -0
  15. package/docs/markdown/cookie.md +115 -0
  16. package/docs/markdown/coords.md +127 -0
  17. package/docs/markdown/credits.md +56 -0
  18. package/docs/markdown/date.md +260 -0
  19. package/docs/markdown/disable.md +109 -0
  20. package/docs/markdown/dispatch.md +108 -0
  21. package/docs/markdown/element.md +53 -0
  22. package/docs/markdown/event.md +85 -0
  23. package/docs/markdown/fetch.md +122 -0
  24. package/docs/markdown/form.md +302 -0
  25. package/docs/markdown/format.md +122 -0
  26. package/docs/markdown/i18n.md +292 -0
  27. package/docs/markdown/image.md +298 -0
  28. package/docs/markdown/json.md +269 -0
  29. package/docs/markdown/load.md +133 -0
  30. package/docs/markdown/logging.md +99 -0
  31. package/docs/markdown/math.md +172 -0
  32. package/docs/markdown/memory.md +85 -0
  33. package/docs/markdown/navigation.md +152 -0
  34. package/docs/markdown/net.md +60 -0
  35. package/docs/markdown/obj.md +242 -0
  36. package/docs/markdown/path.md +46 -0
  37. package/docs/markdown/promise.md +94 -0
  38. package/docs/markdown/sanitize.md +118 -0
  39. package/docs/markdown/screen.md +78 -0
  40. package/docs/markdown/scrollbar.md +82 -0
  41. package/docs/markdown/security.md +289 -0
  42. package/docs/markdown/shortcut.md +100 -0
  43. package/docs/markdown/socket.md +134 -0
  44. package/docs/markdown/sse.md +120 -0
  45. package/docs/markdown/svg.md +167 -0
  46. package/docs/markdown/sync.md +147 -0
  47. package/docs/markdown/system.md +78 -0
  48. package/docs/markdown/terminal.md +73 -0
  49. package/docs/markdown/text.md +245 -0
  50. package/docs/markdown/timer.md +98 -0
  51. package/docs/markdown/tools.md +111 -0
  52. package/docs/markdown/translators.md +65 -0
  53. package/docs/markdown/trigger.md +99 -0
  54. package/docs/markdown/triggers.md +133 -0
  55. package/docs/markdown/type.md +109 -0
  56. package/docs/markdown/types.md +102 -0
  57. package/docs/markdown/ui.md +45 -0
  58. package/docs/markdown/window.md +211 -0
  59. package/docs/markdown/worker.md +223 -0
  60. package/index.cjs +1 -1
  61. package/index.js +1 -1
  62. package/package.json +4 -6
  63. package/types/dphelper.d.ts +0 -15
@@ -0,0 +1,85 @@
1
+ # memory
2
+
3
+ Memory and state management.
4
+
5
+ ## Functions
6
+
7
+ | Function | Description | Example |
8
+ |----------|-------------|---------|
9
+ | `lock` | Lock a state property | `dphelper.memory.lock('state[key]')` |
10
+ | `unlock` | Unlock a state property | `dphelper.memory.unlock('state[key]')` |
11
+
12
+ ## Description
13
+
14
+ State property protection:
15
+ - **Lock** - Make property non-writable and non-configurable
16
+ - **Unlock** - Restore writability and configurability
17
+ - **Global State** - Work with window-level state objects
18
+
19
+ ## Usage Examples
20
+
21
+ ### Lock State Property
22
+
23
+ ```javascript
24
+ // Define global state
25
+ window.myApp = {
26
+ config: { theme: 'dark' },
27
+ user: { name: 'John' }
28
+ };
29
+
30
+ // Lock the config
31
+ dphelper.memory.lock('myApp.config');
32
+
33
+ // Try to modify (will fail silently or throw in strict mode)
34
+ myApp.config = {}; // Won't work - locked
35
+
36
+ // Can still modify properties if not locked
37
+ myApp.config.theme = 'light'; // May work depending on implementation
38
+ ```
39
+
40
+ ### Unlock State Property
41
+
42
+ ```javascript
43
+ // Unlock previously locked property
44
+ dphelper.memory.unlock('myApp.config');
45
+
46
+ // Now can modify
47
+ myApp.config = { theme: 'light' };
48
+ ```
49
+
50
+ ### Protect Application State
51
+
52
+ ```javascript
53
+ // Create protected app state
54
+ const appState = {
55
+ version: '1.0.0',
56
+ initialized: false,
57
+ data: {}
58
+ };
59
+
60
+ // Add to window
61
+ window.appState = appState;
62
+
63
+ // Lock critical properties
64
+ dphelper.memory.lock('appState.version'); // Prevent version changes
65
+ dphelper.memory.lock('appState.initialized'); // Prevent re-initialization
66
+
67
+ // Unlock when needed (e.g., updates)
68
+ function updateVersion(newVersion) {
69
+ dphelper.memory.unlock('appState.version');
70
+ appState.version = newVersion;
71
+ dphelper.memory.lock('appState.version');
72
+ }
73
+ ```
74
+
75
+ ## Details
76
+
77
+ - **Author:** Dario Passariello
78
+ - **Version:** 0.0.2
79
+ - **Creation Date:** 20230101
80
+ - **Last Modified:** 20230111
81
+ - **Environment:** client (browser)
82
+
83
+ ---
84
+
85
+ *Automatically generated document*
@@ -0,0 +1,152 @@
1
+ # navigation
2
+
3
+ AJAX-based Single Page Application (SPA) navigation engine for seamless page transitions.
4
+
5
+ ## Functions
6
+
7
+ | Function | Description | Example |
8
+ |----------|-------------|---------|
9
+ | `ajax` | Initialize SPA navigation engine | `dphelper.navigation.ajax()` |
10
+ | `load` | Load page via AJAX | `dphelper.navigation.load('/about')` |
11
+
12
+ ## Description
13
+
14
+ Complete SPA navigation solution:
15
+ - **AJAX Loading** - Load pages without refresh
16
+ - **History Management** - Browser back/forward support
17
+ - **Hash Support** - Scroll to hash elements
18
+ - **XSS Protection** - HTML sanitization
19
+
20
+ ## Usage Examples
21
+
22
+ ### Initialize SPA Navigation
23
+
24
+ ```javascript
25
+ // Initialize on page load
26
+ document.addEventListener('DOMContentLoaded', () => {
27
+ dphelper.navigation.ajax();
28
+ });
29
+
30
+ // Now all anchor links will use AJAX navigation
31
+ // <a href="/about">About</a> will load without refresh
32
+ ```
33
+
34
+ ### Manual Page Load
35
+
36
+ ```javascript
37
+ // Load a page programmatically
38
+ dphelper.navigation.load('/dashboard');
39
+
40
+ // Loads /dashboard content into current page
41
+ // Updates browser history
42
+ // Scrolls to top
43
+
44
+ // With slug normalization
45
+ dphelper.navigation.load('about'); // Loads 'about/'
46
+ dphelper.navigation.load('/contact'); // Loads 'contact/'
47
+ dphelper.navigation.load('home'); // Loads 'home/'
48
+ ```
49
+
50
+ ### How It Works
51
+
52
+ 1. **Initialization** - `ajax()` binds all anchor tags
53
+ 2. **Click Interception** - Links are converted to AJAX handlers
54
+ 3. **Content Loading** - Page content fetched via fetch API
55
+ 4. **Content Injection** - Body content replaced (sanitized)
56
+ 5. **History Update** - Browser history updated with pushState
57
+
58
+ ### HTML Structure
59
+
60
+ ```html
61
+ <!-- Standard links - automatically handled -->
62
+ <nav>
63
+ <a href="/">Home</a>
64
+ <a href="/about">About</a>
65
+ <a href="/contact">Contact</a>
66
+ </nav>
67
+
68
+ <!-- Main content area -->
69
+ <main id="app">
70
+ <!-- Content loaded here -->
71
+ </main>
72
+ ```
73
+
74
+ ### Hash Navigation
75
+
76
+ ```html
77
+ <!-- Scroll to element on page -->
78
+ <a href="#section1">Section 1</a>
79
+
80
+ <!-- Smooth scroll to section -->
81
+ <div id="section1">Content</div>
82
+ ```
83
+
84
+ ### Security Features
85
+
86
+ - **XSS Prevention** - HTML content is sanitized
87
+ - **Same-origin** - Only same-origin URLs allowed
88
+ - **Open Redirect Prevention** - Validates URL origins
89
+
90
+ ## Advanced Usage
91
+
92
+ ### Conditional Navigation
93
+
94
+ ```javascript
95
+ class SPANavigator {
96
+ constructor() {
97
+ this.init();
98
+ }
99
+
100
+ init() {
101
+ dphelper.navigation.ajax();
102
+ }
103
+
104
+ navigate(path) {
105
+ dphelper.navigation.load(path);
106
+ }
107
+
108
+ // Programmatic navigation
109
+ goHome() {
110
+ this.navigate('/');
111
+ }
112
+
113
+ goTo(path) {
114
+ this.navigate(path);
115
+ }
116
+ }
117
+
118
+ const navigator = new SPANavigator();
119
+ ```
120
+
121
+ ### Loading State
122
+
123
+ ```javascript
124
+ // The loader is automatically added
125
+ // Customize with CSS:
126
+ /*
127
+ .loader {
128
+ position: fixed;
129
+ top: 0;
130
+ left: 0;
131
+ width: 100%;
132
+ height: 100%;
133
+ background: rgba(255,255,255,0.9);
134
+ z-index: 9999;
135
+ display: flex;
136
+ justify-content: center;
137
+ align-items: center;
138
+ }
139
+ */
140
+ ```
141
+
142
+ ## Details
143
+
144
+ - **Author:** Dario Passariello
145
+ - **Version:** 0.0.2
146
+ - **Creation Date:** 20260223
147
+ - **Last Modified:** 20260223
148
+ - **Environment:** Client-side only (browser)
149
+
150
+ ---
151
+
152
+ *Automatically generated document*
@@ -0,0 +1,60 @@
1
+ # net
2
+
3
+ Resilient networking and fetch utilities.
4
+
5
+ ## Functions
6
+
7
+ | Function | Description | Example |
8
+ |----------|-------------|---------|
9
+ | `smartFetch` | Fetch with automatic retry | `dphelper.net.smartFetch(url, options)` |
10
+
11
+ ## Description
12
+
13
+ Network communication utilities:
14
+ - **Smart Fetch** - Automatic retry with exponential backoff
15
+ - **Resilience** - Handle transient network errors
16
+ - **Retry Strategy** - Configurable retry attempts and delays
17
+
18
+ ## Usage Examples
19
+
20
+ ### Smart Fetch with Retry
21
+
22
+ ```javascript
23
+ // Basic smart fetch
24
+ const response = await dphelper.net.smartFetch('/api/data');
25
+ const data = await response.json();
26
+
27
+ // Fetch with options
28
+ const result = await dphelper.net.smartFetch('https://api.example.com', {
29
+ method: 'POST',
30
+ headers: { 'Content-Type': 'application/json' },
31
+ body: JSON.stringify({ key: 'value' })
32
+ });
33
+ ```
34
+
35
+ ### API Error Handling
36
+
37
+ ```javascript
38
+ // Robust API calls
39
+ async function fetchUserData(userId) {
40
+ try {
41
+ const response = await dphelper.net.smartFetch(`/api/users/${userId}`);
42
+ return await response.json();
43
+ } catch (error) {
44
+ console.error('Failed to fetch user:', error);
45
+ return null;
46
+ }
47
+ }
48
+ ```
49
+
50
+ ## Details
51
+
52
+ - **Author:** Dario Passariello & Jo
53
+ - **Version:** 0.0.1
54
+ - **Creation Date:** 20260220
55
+ - **Last Modified:** 20260220
56
+ - **Environment:** both (browser + Node.js)
57
+
58
+ ---
59
+
60
+ *Automatically generated document*
@@ -0,0 +1,242 @@
1
+ # obj (objects)
2
+
3
+ Utilities for JavaScript object manipulation.
4
+
5
+ ## Functions
6
+
7
+ | Function | Description | Example |
8
+ |----------|-------------|---------|
9
+ | `replaceNullObjects` | Replace null values with empty strings | `dphelper.obj.replaceNullObjects(obj)` |
10
+ | `serialize` | Serialize objects preserving functions | `dphelper.obj.serialize(obj)` |
11
+ | `deSerialize` | Deserialize objects by processing values | `dphelper.obj.deSerialize(obj)` |
12
+ | `sort` | Sort object by keys | `dphelper.obj.sort(obj)` |
13
+ | `toXML` | Convert object to XML string | `dphelper.obj.toXML(obj)` |
14
+ | `updateByKey` | Update value if key exists | `dphelper.obj.updateByKey(obj, 'key', 'value')` |
15
+ | `parse` | Safe JSON.parse avoiding crashes | `dphelper.obj.parse(str)` |
16
+ | `isObject` | Check if value is non-null object | `dphelper.obj.isObject(val)` |
17
+ | `diff` | Show differences between two objects | `dphelper.obj.diff(obj1, obj2)` |
18
+ | `path` | Create path string from properties | `dphelper.obj.path('prop', ['a','b'])` |
19
+ | `setProps` | Recursively set property descriptors | `dphelper.obj.setProps(obj, {writable: false})` |
20
+
21
+ ## Description
22
+
23
+ Advanced JavaScript object manipulation:
24
+ - **Serialization** - Convert objects to JSON/XML, handle functions
25
+ - **Parsing** - Safe JSON parsing with error handling
26
+ - **Comparison** - Find differences between objects
27
+ - **Transformation** - Sort keys, update by key
28
+ - **Property Control** - Set enumerable/writable/configurable
29
+
30
+ ## Usage Examples
31
+
32
+ ### Replace Null Values
33
+
34
+ ```javascript
35
+ // Replace null values with empty strings
36
+ const data = {
37
+ name: 'John',
38
+ email: null,
39
+ phone: null,
40
+ age: 30
41
+ };
42
+
43
+ dphelper.obj.replaceNullObjects(data);
44
+ // Now: { name: 'John', email: '', phone: '', age: 30 }
45
+ ```
46
+
47
+ ### Object Serialization
48
+
49
+ ```javascript
50
+ // Serialize object (including functions as strings)
51
+ const obj = {
52
+ name: 'test',
53
+ method: function() { return 'hello'; },
54
+ value: 42
55
+ };
56
+
57
+ const serialized = dphelper.obj.serialize(obj);
58
+ // Functions are converted to toString()
59
+
60
+ // Deserialize back
61
+ const deserialized = dphelper.obj.deSerialize(serialized);
62
+ ```
63
+
64
+ ### Object to XML
65
+
66
+ ```javascript
67
+ // Convert JSON to XML
68
+ const data = {
69
+ user: {
70
+ name: 'John',
71
+ email: 'john@example.com',
72
+ address: {
73
+ city: 'NYC',
74
+ zip: '10001'
75
+ }
76
+ }
77
+ };
78
+
79
+ const xml = dphelper.obj.toXML(data);
80
+ /*
81
+ <user>
82
+ <name>John</name>
83
+ <email>john@example.com</email>
84
+ <address>
85
+ <city>NYC</city>
86
+ <zip>10001</zip>
87
+ </address>
88
+ </user>
89
+ */
90
+ ```
91
+
92
+ ### Safe JSON Parse
93
+
94
+ ```javascript
95
+ // Safe parse - won't crash on invalid JSON
96
+ const validJson = '{"name": "John", "age": 30}';
97
+ const obj = dphelper.obj.parse(validJson);
98
+ // { name: "John", age: 30 }
99
+
100
+ const invalidJson = 'not valid json';
101
+ const result = dphelper.obj.parse(invalidJson);
102
+ // Returns original string, logs error
103
+
104
+ // Use for API responses
105
+ function handleApiResponse(response) {
106
+ return dphelper.obj.parse(response);
107
+ }
108
+ ```
109
+
110
+ ### Object Difference
111
+
112
+ ```javascript
113
+ // Find differences between two objects
114
+ const obj1 = {
115
+ name: 'John',
116
+ age: 30,
117
+ city: 'NYC'
118
+ };
119
+
120
+ const obj2 = {
121
+ name: 'Jane',
122
+ age: 30,
123
+ city: 'LA'
124
+ };
125
+
126
+ const differences = dphelper.obj.diff(obj1, obj2);
127
+ /*
128
+ {
129
+ name: { obj1: 'John', obj2: 'Jane' },
130
+ city: { obj1: 'NYC', obj2: 'LA' }
131
+ }
132
+ */
133
+
134
+ // Use in testing
135
+ function assertObjectsEqual(a, b) {
136
+ const diff = dphelper.obj.diff(a, b);
137
+ if (Object.keys(diff).length > 0) {
138
+ console.error('Differences found:', diff);
139
+ return false;
140
+ }
141
+ return true;
142
+ }
143
+ ```
144
+
145
+ ### Sort Object Keys
146
+
147
+ ```javascript
148
+ // Sort object alphabetically by keys
149
+ const unsorted = {
150
+ z: 1,
151
+ a: 2,
152
+ m: 5,
153
+ b: 3
154
+ };
155
+
156
+ const sorted = dphelper.obj.sort(unsorted);
157
+ // { a: 2, b: 3, m: 5, z: 1 }
158
+
159
+ // Useful for consistent JSON stringify
160
+ JSON.stringify(dphelper.obj.sort(unsorted));
161
+ ```
162
+
163
+ ### Update By Key
164
+
165
+ ```javascript
166
+ // Update value if key exists
167
+ const user = {
168
+ name: 'John',
169
+ email: 'john@example.com'
170
+ };
171
+
172
+ dphelper.obj.updateByKey(user, 'email', 'newemail@example.com');
173
+ // { name: 'John', email: 'newemail@example.com' }
174
+
175
+ dphelper.obj.updateByKey(user, 'phone', '555-1234');
176
+ // Key doesn't exist, no change
177
+ // { name: 'John', email: 'newemail@example.com' }
178
+ ```
179
+
180
+ ### Object Path
181
+
182
+ ```javascript
183
+ // Create dot-notation path
184
+ const path = dphelper.obj.path('name', ['user', 'profile']);
185
+ // "user.profile.name"
186
+ ```
187
+
188
+ ### Set Properties
189
+
190
+ ```javascript
191
+ // Make object immutable
192
+ const config = {
193
+ apiUrl: 'https://api.example.com',
194
+ timeout: 5000
195
+ };
196
+
197
+ dphelper.obj.setProps(config, {
198
+ writable: false,
199
+ configurable: false
200
+ });
201
+
202
+ // Now config.apiUrl = 'changed'; // Error in strict mode
203
+
204
+ // Make all properties non-enumerable
205
+ const data = { a: 1, b: 2, c: 3 };
206
+ dphelper.obj.setProps(data, { enumerable: false });
207
+
208
+ // for...in won't show these properties
209
+ ```
210
+
211
+ ### Is Object Check
212
+
213
+ ```javascript
214
+ // Check if value is a plain object
215
+ console.log(dphelper.obj.isObject({})); // true
216
+ console.log(dphelper.obj.isObject({ a: 1 })); // true
217
+ console.log(dphelper.obj.isObject(null)); // false
218
+ console.log(dphelper.obj.isObject([])); // true (arrays are objects!)
219
+ console.log(dphelper.obj.isObject('string')); // false
220
+ console.log(dphelper.obj.isObject(123)); // false
221
+
222
+ // Use in type checking
223
+ function processValue(val) {
224
+ if (dphelper.obj.isObject(val)) {
225
+ console.log('Processing object:', val);
226
+ } else {
227
+ console.log('Not an object:', typeof val);
228
+ }
229
+ }
230
+ ```
231
+
232
+ ## Details
233
+
234
+ - **Author:** Dario Passariello
235
+ - **Version:** 0.0.2
236
+ - **Creation Date:** 20210101
237
+ - **Last Modified:** 20260220
238
+ - **Environment:** both (browser + Node.js)
239
+
240
+ ---
241
+
242
+ *Automatically generated document*
@@ -0,0 +1,46 @@
1
+ # path
2
+
3
+ Management of URL paths.
4
+
5
+ ## Functions
6
+
7
+ | Function | Description | Example |
8
+ |----------|-------------|---------|
9
+ | `rail` | Extracts path segments from the URL | `dphelper.path.rail()` |
10
+ | `hash` | Extracts hash from the URL | `dphelper.path.hash([hashUrl])` |
11
+ | `query` | Extracts query parameters from the URL | `dphelper.path.query([queryString])` |
12
+
13
+ ## Description
14
+
15
+ Tool for extracting segments, hashes, and query parameters from URLs.
16
+
17
+ ## Usage Examples
18
+
19
+ ### Extract URL segments
20
+
21
+ If the URL is `https://example.com/blog/article-1`, `rail()` will return `['blog', 'article-1']`.
22
+
23
+ ```javascript
24
+ const segments = dphelper.path.rail();
25
+ console.log(segments[0]); // 'blog'
26
+ ```
27
+
28
+ ### Extract Query parameters
29
+
30
+ If the URL is `?id=123&user=dario`, `query()` will return `{"id": "123", "user": "dario"}`.
31
+
32
+ ```javascript
33
+ const params = dphelper.path.query();
34
+ console.log(params.id); // '123'
35
+ ```
36
+
37
+ ## Details
38
+
39
+ - **Author:** Dario Passariello
40
+ - **Version:** 0.0.1
41
+ - **Creation Date:** 20210101
42
+ - **Last Modified:** 20250513
43
+
44
+ ---
45
+
46
+ *Automatically generated document*
@@ -0,0 +1,94 @@
1
+ # promise
2
+
3
+ Utilities for Promise management.
4
+
5
+ ## Functions
6
+
7
+ | Function | Description | Example |
8
+ |----------|-------------|---------|
9
+ | `check` | Check if value is a Promise | `dphelper.promise.check(value)` |
10
+
11
+ ## Description
12
+
13
+ Promise utility functions:
14
+ - **Type Check** - Detect if value is a Promise
15
+ - **Cross-Environment** - Works in browser and Node.js
16
+ - **Extended Support** - Checks for Promise-like objects (thenables)
17
+
18
+ ## Usage Examples
19
+
20
+ ### Check if Value is Promise
21
+
22
+ ```javascript
23
+ // Standard Promise
24
+ const promise = fetch('https://api.example.com/data');
25
+ console.log(dphelper.promise.check(promise));
26
+ // true
27
+
28
+ // Promise created with Promise.resolve
29
+ const resolved = Promise.resolve('data');
30
+ console.log(dphelper.promise.check(resolved));
31
+ // true
32
+
33
+ // Thenable (Promise-like object)
34
+ const thenable = { then: (resolve) => resolve('data') };
35
+ console.log(dphelper.promise.check(thenable));
36
+ // true
37
+
38
+ // Regular value
39
+ console.log(dphelper.promise.check('hello'));
40
+ // false
41
+
42
+ console.log(dphelper.promise.check(123));
43
+ // false
44
+
45
+ console.log(dphelper.promise.check({}));
46
+ // false
47
+ ```
48
+
49
+ ### Safe Promise Handling
50
+
51
+ ```javascript
52
+ // Handle both Promise and non-Promise values
53
+ async function processValue(value) {
54
+ if (dphelper.promise.check(value)) {
55
+ return await value;
56
+ }
57
+ return value;
58
+ }
59
+
60
+ // Use in generic functions
61
+ function handleResult(result) {
62
+ if (dphelper.promise.check(result)) {
63
+ result.then(data => console.log('Async:', data));
64
+ } else {
65
+ console.log('Sync:', result);
66
+ }
67
+ }
68
+ ```
69
+
70
+ ### Type Guard for TypeScript
71
+
72
+ ```javascript
73
+ // Type guard usage
74
+ function logValue(val: any) {
75
+ if (dphelper.promise.check(val)) {
76
+ // TypeScript knows val is Promise here
77
+ val.then(data => console.log('Resolved:', data));
78
+ } else {
79
+ console.log('Value:', val);
80
+ }
81
+ }
82
+ ```
83
+
84
+ ## Details
85
+
86
+ - **Author:** Dario Passariello
87
+ - **Version:** 0.0.2
88
+ - **Creation Date:** 20210101
89
+ - **Last Modified:** 20260220
90
+ - **Environment:** both (browser + Node.js)
91
+
92
+ ---
93
+
94
+ *Automatically generated document*