cynx-lib 1.3.35 → 1.3.37
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/gen.js +77 -77
- package/package.json +1 -1
- package/utils/index.js +18 -11
- package/utils/utils/duration.js +139 -0
- package/utils/utils/oidc.js +214 -209
- package/utils/utils/realtime.js +1040 -1040
- package/utils/utils/session.js +58 -0
- package/utils/utils/storage.js +393 -393
- package/utils/utils/tz.js +115 -0
- package/utils/utils/ui.js +111 -0
package/gen.js
CHANGED
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
import { uid, prefixedId, uuid, ALPHABETS } from './utils/index.js';
|
|
5
|
-
|
|
6
|
-
const ALPHABET_MAP = {
|
|
7
|
-
hex: ALPHABETS.hex,
|
|
8
|
-
num: ALPHABETS.numeric,
|
|
9
|
-
numeric: ALPHABETS.numeric,
|
|
10
|
-
numbers: ALPHABETS.numeric,
|
|
11
|
-
digits: ALPHABETS.numeric,
|
|
12
|
-
lc: ALPHABETS.lowercase,
|
|
13
|
-
lower: ALPHABETS.lowercase,
|
|
14
|
-
lowercase: ALPHABETS.lowercase,
|
|
15
|
-
uc: ALPHABETS.uppercase,
|
|
16
|
-
upper: ALPHABETS.uppercase,
|
|
17
|
-
uppercase: ALPHABETS.uppercase,
|
|
18
|
-
mixed: ALPHABETS.alphanumeric,
|
|
19
|
-
alpha: ALPHABETS.alphanumeric,
|
|
20
|
-
alphanumeric: ALPHABETS.alphanumeric,
|
|
21
|
-
url: ALPHABETS.urlSafe,
|
|
22
|
-
urlsafe: ALPHABETS.urlSafe,
|
|
23
|
-
'url-safe': ALPHABETS.urlSafe,
|
|
24
|
-
clean: ALPHABETS.noLookalikes,
|
|
25
|
-
nolookalikes: ALPHABETS.noLookalikes,
|
|
26
|
-
'no-lookalikes': ALPHABETS.noLookalikes,
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
async function main() {
|
|
30
|
-
const rawArgs = process.argv.slice(2);
|
|
31
|
-
let prefix = '';
|
|
32
|
-
let size = 24;
|
|
33
|
-
let count = 1;
|
|
34
|
-
let isUuid = false;
|
|
35
|
-
let alphabet = ALPHABETS.lowercase;
|
|
36
|
-
|
|
37
|
-
for (let i = 0; i < rawArgs.length; i++) {
|
|
38
|
-
const raw = rawArgs[i].trim();
|
|
39
|
-
const clean = raw.toLowerCase().replace(/^--?/, '');
|
|
40
|
-
|
|
41
|
-
if (clean === 'uuid') {
|
|
42
|
-
isUuid = true;
|
|
43
|
-
} else if (clean === 'n' || clean === 'count') {
|
|
44
|
-
count = parseInt(rawArgs[++i], 10) || 1;
|
|
45
|
-
} else if (clean === 's' || clean === 'size' || clean === 'l' || clean === 'length') {
|
|
46
|
-
size = parseInt(rawArgs[++i], 10) || 24;
|
|
47
|
-
} else if (clean === 'p' || clean === 'prefix') {
|
|
48
|
-
prefix = rawArgs[++i] || '';
|
|
49
|
-
} else if (clean === 'a' || clean === 'alphabet') {
|
|
50
|
-
const val = (rawArgs[++i] || '').toLowerCase();
|
|
51
|
-
alphabet = ALPHABET_MAP[val] || ALPHABETS[val] || val || ALPHABETS.lowercase;
|
|
52
|
-
} else if (ALPHABET_MAP[clean]) {
|
|
53
|
-
alphabet = ALPHABET_MAP[clean];
|
|
54
|
-
} else if (!isNaN(Number(raw)) && /^\d+$/.test(raw)) {
|
|
55
|
-
size = parseInt(raw, 10);
|
|
56
|
-
} else if (!prefix && !raw.startsWith('-')) {
|
|
57
|
-
prefix = raw;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
for (let i = 0; i < count; i++) {
|
|
62
|
-
let result;
|
|
63
|
-
if (isUuid) {
|
|
64
|
-
result = uuid();
|
|
65
|
-
} else if (prefix) {
|
|
66
|
-
result = prefixedId(prefix, size, alphabet);
|
|
67
|
-
} else {
|
|
68
|
-
result = uid(size, alphabet);
|
|
69
|
-
}
|
|
70
|
-
console.log(result);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
main().catch((err) => {
|
|
75
|
-
console.error('[Error]:', err.message);
|
|
76
|
-
process.exit(1);
|
|
77
|
-
});
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
import { uid, prefixedId, uuid, ALPHABETS } from './utils/index.js';
|
|
5
|
+
|
|
6
|
+
const ALPHABET_MAP = {
|
|
7
|
+
hex: ALPHABETS.hex,
|
|
8
|
+
num: ALPHABETS.numeric,
|
|
9
|
+
numeric: ALPHABETS.numeric,
|
|
10
|
+
numbers: ALPHABETS.numeric,
|
|
11
|
+
digits: ALPHABETS.numeric,
|
|
12
|
+
lc: ALPHABETS.lowercase,
|
|
13
|
+
lower: ALPHABETS.lowercase,
|
|
14
|
+
lowercase: ALPHABETS.lowercase,
|
|
15
|
+
uc: ALPHABETS.uppercase,
|
|
16
|
+
upper: ALPHABETS.uppercase,
|
|
17
|
+
uppercase: ALPHABETS.uppercase,
|
|
18
|
+
mixed: ALPHABETS.alphanumeric,
|
|
19
|
+
alpha: ALPHABETS.alphanumeric,
|
|
20
|
+
alphanumeric: ALPHABETS.alphanumeric,
|
|
21
|
+
url: ALPHABETS.urlSafe,
|
|
22
|
+
urlsafe: ALPHABETS.urlSafe,
|
|
23
|
+
'url-safe': ALPHABETS.urlSafe,
|
|
24
|
+
clean: ALPHABETS.noLookalikes,
|
|
25
|
+
nolookalikes: ALPHABETS.noLookalikes,
|
|
26
|
+
'no-lookalikes': ALPHABETS.noLookalikes,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
async function main() {
|
|
30
|
+
const rawArgs = process.argv.slice(2);
|
|
31
|
+
let prefix = '';
|
|
32
|
+
let size = 24;
|
|
33
|
+
let count = 1;
|
|
34
|
+
let isUuid = false;
|
|
35
|
+
let alphabet = ALPHABETS.lowercase;
|
|
36
|
+
|
|
37
|
+
for (let i = 0; i < rawArgs.length; i++) {
|
|
38
|
+
const raw = rawArgs[i].trim();
|
|
39
|
+
const clean = raw.toLowerCase().replace(/^--?/, '');
|
|
40
|
+
|
|
41
|
+
if (clean === 'uuid') {
|
|
42
|
+
isUuid = true;
|
|
43
|
+
} else if (clean === 'n' || clean === 'count') {
|
|
44
|
+
count = parseInt(rawArgs[++i], 10) || 1;
|
|
45
|
+
} else if (clean === 's' || clean === 'size' || clean === 'l' || clean === 'length') {
|
|
46
|
+
size = parseInt(rawArgs[++i], 10) || 24;
|
|
47
|
+
} else if (clean === 'p' || clean === 'prefix') {
|
|
48
|
+
prefix = rawArgs[++i] || '';
|
|
49
|
+
} else if (clean === 'a' || clean === 'alphabet') {
|
|
50
|
+
const val = (rawArgs[++i] || '').toLowerCase();
|
|
51
|
+
alphabet = ALPHABET_MAP[val] || ALPHABETS[val] || val || ALPHABETS.lowercase;
|
|
52
|
+
} else if (ALPHABET_MAP[clean]) {
|
|
53
|
+
alphabet = ALPHABET_MAP[clean];
|
|
54
|
+
} else if (!isNaN(Number(raw)) && /^\d+$/.test(raw)) {
|
|
55
|
+
size = parseInt(raw, 10);
|
|
56
|
+
} else if (!prefix && !raw.startsWith('-')) {
|
|
57
|
+
prefix = raw;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
for (let i = 0; i < count; i++) {
|
|
62
|
+
let result;
|
|
63
|
+
if (isUuid) {
|
|
64
|
+
result = uuid();
|
|
65
|
+
} else if (prefix) {
|
|
66
|
+
result = prefixedId(prefix, size, alphabet);
|
|
67
|
+
} else {
|
|
68
|
+
result = uid(size, alphabet);
|
|
69
|
+
}
|
|
70
|
+
console.log(result);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
main().catch((err) => {
|
|
75
|
+
console.error('[Error]:', err.message);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
});
|
package/package.json
CHANGED
package/utils/index.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
// cynx/utils — shared utility functions
|
|
2
|
-
export * from './utils/uid.js';
|
|
3
|
-
export * from './utils/realtime.js';
|
|
4
|
-
export * from './utils/tz.js';
|
|
5
|
-
export * from './utils/oidc.js';
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
// cynx/utils — shared utility functions
|
|
2
|
+
export * from './utils/uid.js';
|
|
3
|
+
export * from './utils/realtime.js';
|
|
4
|
+
export * from './utils/tz.js';
|
|
5
|
+
export * from './utils/oidc.js';
|
|
6
|
+
export * from './utils/storage.js';
|
|
7
|
+
export * from './utils/duration.js';
|
|
8
|
+
export * from './utils/session.js';
|
|
9
|
+
export * from './utils/ui.js';
|
|
10
|
+
|
|
11
|
+
export { default as uidUtil } from './utils/uid.js';
|
|
12
|
+
export { default as realtimeUtil } from './utils/realtime.js';
|
|
13
|
+
export { default as tzUtil } from './utils/tz.js';
|
|
14
|
+
export { default as oidcUtil } from './utils/oidc.js';
|
|
15
|
+
export { default as storageUtil } from './utils/storage.js';
|
|
16
|
+
export { default as durationUtil } from './utils/duration.js';
|
|
17
|
+
export { default as sessionUtil } from './utils/session.js';
|
|
18
|
+
export { default as uiUtil } from './utils/ui.js';
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cynx/utils — Duration Parser and Formatter (duration.js)
|
|
3
|
+
*
|
|
4
|
+
* Universal utility for parsing human-readable duration strings (e.g. '15m', '2h', '3d', '1w', '1mo')
|
|
5
|
+
* into seconds or milliseconds, and formatting durations into short tags or localized labels.
|
|
6
|
+
*
|
|
7
|
+
* Works across Browser and Node.js environments.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Parse a human-readable duration string or number into seconds.
|
|
12
|
+
* Supported units:
|
|
13
|
+
* - s : seconds (e.g. '30s', '45s')
|
|
14
|
+
* - m : minutes (e.g. '1m', '5m', '15m', '30m')
|
|
15
|
+
* - h : hours (e.g. '1h', '5h', '12h', '24h')
|
|
16
|
+
* - d : days (e.g. '1d', '3d', '7d')
|
|
17
|
+
* - w : weeks (e.g. '1w', '2w')
|
|
18
|
+
* - mo : months (e.g. '1mo', '3mo', treated as 30 days)
|
|
19
|
+
*
|
|
20
|
+
* @param {string|number} input
|
|
21
|
+
* @param {number} [minSeconds=60] Minimum allowed seconds
|
|
22
|
+
* @returns {number} Seconds
|
|
23
|
+
*/
|
|
24
|
+
export function parseDurationToSeconds(input, minSeconds = 60) {
|
|
25
|
+
if (input === null || input === undefined || input === '') {
|
|
26
|
+
return minSeconds;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (typeof input === 'number') {
|
|
30
|
+
if (isNaN(input) || input <= 0) return minSeconds;
|
|
31
|
+
return Math.max(minSeconds, Math.round(input));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const str = String(input).trim().toLowerCase();
|
|
35
|
+
|
|
36
|
+
// If plain digits string: '300'
|
|
37
|
+
if (/^\d+$/.test(str)) {
|
|
38
|
+
const num = parseInt(str, 10);
|
|
39
|
+
return Math.max(minSeconds, num);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Match number + unit: '15m', '2h', '1mo', '3d', '1w', '45s'
|
|
43
|
+
const match = str.match(/^(\d+(?:\.\d+)?)\s*(mo|w|d|h|m|s)?$/);
|
|
44
|
+
if (!match) {
|
|
45
|
+
return minSeconds;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const val = parseFloat(match[1]);
|
|
49
|
+
const unit = match[2] || 's';
|
|
50
|
+
|
|
51
|
+
let totalSec = 0;
|
|
52
|
+
switch (unit) {
|
|
53
|
+
case 'mo':
|
|
54
|
+
totalSec = val * 30 * 86400; // 30 days
|
|
55
|
+
break;
|
|
56
|
+
case 'w':
|
|
57
|
+
totalSec = val * 7 * 86400; // 7 days
|
|
58
|
+
break;
|
|
59
|
+
case 'd':
|
|
60
|
+
totalSec = val * 86400;
|
|
61
|
+
break;
|
|
62
|
+
case 'h':
|
|
63
|
+
totalSec = val * 3600;
|
|
64
|
+
break;
|
|
65
|
+
case 'm':
|
|
66
|
+
totalSec = val * 60;
|
|
67
|
+
break;
|
|
68
|
+
case 's':
|
|
69
|
+
default:
|
|
70
|
+
totalSec = val;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const rounded = Math.round(totalSec);
|
|
75
|
+
return Math.max(minSeconds, rounded);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Parse a human-readable duration string into milliseconds.
|
|
80
|
+
*
|
|
81
|
+
* @param {string|number} val
|
|
82
|
+
* @param {number} [defaultMs=2592000000] Default ms (30 days)
|
|
83
|
+
* @returns {number} Milliseconds
|
|
84
|
+
*/
|
|
85
|
+
export function parseDurationMs(val, defaultMs = 30 * 24 * 60 * 60 * 1000) {
|
|
86
|
+
if (!val || val === 'off' || val === '0' || val === 0) return 0;
|
|
87
|
+
if (typeof val === 'number') return val > 0 ? val : defaultMs;
|
|
88
|
+
const str = String(val).trim().toLowerCase();
|
|
89
|
+
const match = str.match(/^(\d+(?:\.\d+)?)\s*([a-z]+)?$/);
|
|
90
|
+
if (!match) return defaultMs;
|
|
91
|
+
const num = parseFloat(match[1]);
|
|
92
|
+
const unit = match[2] || 'd';
|
|
93
|
+
if (unit.startsWith('s')) return Math.round(num * 1000);
|
|
94
|
+
if (unit.startsWith('m')) return Math.round(num * 60 * 1000);
|
|
95
|
+
if (unit.startsWith('h')) return Math.round(num * 60 * 60 * 1000);
|
|
96
|
+
if (unit.startsWith('d')) return Math.round(num * 24 * 60 * 60 * 1000);
|
|
97
|
+
if (unit.startsWith('w')) return Math.round(num * 7 * 24 * 60 * 60 * 1000);
|
|
98
|
+
return defaultMs;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Format seconds into a short clean tag (e.g. '1m', '5m', '1h', '24h', '1w', '1mo').
|
|
103
|
+
* @param {number} seconds
|
|
104
|
+
* @returns {string} Short duration string
|
|
105
|
+
*/
|
|
106
|
+
export function formatDurationTag(seconds) {
|
|
107
|
+
const s = Number(seconds) || 60;
|
|
108
|
+
if (s >= 2592000 && s % 2592000 === 0) return `${s / 2592000}mo`;
|
|
109
|
+
if (s >= 604800 && s % 604800 === 0) return `${s / 604800}w`;
|
|
110
|
+
if (s >= 86400 && s % 86400 === 0) return `${s / 86400}d`;
|
|
111
|
+
if (s >= 3600 && s % 3600 === 0) return `${s / 3600}h`;
|
|
112
|
+
if (s >= 60 && s % 60 === 0) return `${s / 60}m`;
|
|
113
|
+
return `${s}s`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Format seconds into human readable label.
|
|
118
|
+
* @param {number} seconds
|
|
119
|
+
* @returns {string} Human readable label
|
|
120
|
+
*/
|
|
121
|
+
export function formatDurationLabel(seconds) {
|
|
122
|
+
const s = Number(seconds) || 60;
|
|
123
|
+
if (s === 60) return '1 мин';
|
|
124
|
+
if (s === 300) return '5 мин';
|
|
125
|
+
if (s === 600) return '10 мин';
|
|
126
|
+
if (s === 1800) return '30 мин';
|
|
127
|
+
if (s === 3600) return '1 час';
|
|
128
|
+
if (s === 18000) return '5 часов';
|
|
129
|
+
if (s === 43200) return '12 часов';
|
|
130
|
+
if (s === 86400) return '24 часа';
|
|
131
|
+
return formatDurationTag(s);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export default {
|
|
135
|
+
parseDurationToSeconds,
|
|
136
|
+
parseDurationMs,
|
|
137
|
+
formatDurationTag,
|
|
138
|
+
formatDurationLabel,
|
|
139
|
+
};
|