@01-edu/shared 1.2.16 → 2.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@01-edu/shared",
3
- "version": "1.2.16",
3
+ "version": "2.0.0",
4
4
  "type": "module",
5
5
  "description": "",
6
6
  "scripts": {
@@ -9,7 +9,6 @@
9
9
  "files": [
10
10
  "./bin/check-definitions.js",
11
11
  "./event-utils.js",
12
- "./lodash.deburr.js",
13
12
  "./onboarding.js",
14
13
  "./attrs.js",
15
14
  "./attrs-defs.js",
package/toolbox.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import { isFinished } from './event-utils.js'
2
- import { deburr } from './lodash.deburr.js'
3
2
  import { onboardingTypes } from './onboarding.js'
4
3
 
5
4
  const keyCodes = {
@@ -175,9 +174,14 @@ export const timeUnits = [
175
174
  ]
176
175
  export const formatedDuration = (
177
176
  seconds,
178
- { noSeconds, stopFirst, useFullLabel } = {},
177
+ { noSeconds, stopFirst, useFullLabel, stopLabel } = {},
179
178
  ) => {
180
179
  const parts = []
180
+ if (
181
+ stopLabel &&
182
+ seconds < timeUnits.find(u => u.fullLabel === stopLabel)?.size
183
+ )
184
+ return `less than 1${useFullLabel ? ` ${stopLabel}` : timeUnits.find(u => u.fullLabel === stopLabel).label}`
181
185
  for (const { label, size, fullLabel } of timeUnits) {
182
186
  const value = Math.floor(seconds / size)
183
187
  if (value !== 0) {
@@ -187,6 +191,9 @@ export const formatedDuration = (
187
191
  if (stopFirst) return parts
188
192
  seconds -= value * size
189
193
  }
194
+ if (fullLabel === stopLabel) {
195
+ return parts.join(' ') || (noSeconds ? '0m' : '0s')
196
+ }
190
197
  }
191
198
  if (!noSeconds && seconds !== 0) {
192
199
  parts.push(`${seconds}s`)
@@ -331,11 +338,14 @@ export const defer = () => {
331
338
 
332
339
  // slugify('A Test') => a-test
333
340
  export const slugify = str =>
334
- deburr(str)
335
- .trim()
341
+ str
342
+ .normalize('NFKD')
343
+ .replace(/\p{M}+/gu, '')
336
344
  .toLowerCase()
337
- .replace(/ /g, '-')
338
- .replace(/([^a-zA-Z0-9._-]+)/, '')
345
+ .replace(/\s+/g, ' ')
346
+ .replace(/[^a-z0-9._ ]+/g, '')
347
+ .trim()
348
+ .replaceAll(' ', '-')
339
349
 
340
350
  export const fullName = ({ firstName, lastName }) =>
341
351
  `${firstName || ''} ${lastName || ''}`
@@ -460,6 +470,9 @@ export const getUserName = user => {
460
470
  return `${firstName} ${lastName}`
461
471
  }
462
472
 
473
+ // This only works for JSON like value
474
+ // no support for Dates, Regexp, Set, Map etc...
475
+ // this is 100% fine for anything from the database
463
476
  export const eq = (a, b) => {
464
477
  if (a === b) return true
465
478
  if (typeof a !== typeof b) return false
@@ -467,7 +480,6 @@ export const eq = (a, b) => {
467
480
  if (typeof a === 'object') {
468
481
  if (!a || !b) return false
469
482
  if (a.constructor !== b.constructor) return false
470
- // todo: handle regexp
471
483
  const entries = Object.entries(a)
472
484
  if (entries.length !== Object.values(b).length) return false
473
485
  for (const [k, v] of entries) {
@@ -533,3 +545,31 @@ export const createFrequencyMap = arr =>
533
545
  map[item] = (map[item] || 0) + 1
534
546
  return map
535
547
  }, {})
548
+
549
+ export const postgresIntervalToMS = intervalStr => {
550
+ if (!intervalStr) return 0
551
+ // Regex to capture years, months, days, hours, minutes, seconds
552
+ const regex =
553
+ /(?:(\d+)\s+years?)?\s*(?:(\d+)\s+mons?)?\s*(?:(\d+)\s+days?)?\s*(?:(\d+):(\d+):([\d.]+))?/
554
+ const match = intervalStr.match(regex)
555
+
556
+ if (!match) return 0
557
+
558
+ const years = Number.parseInt(match[1] || 0, 10)
559
+ const months = Number.parseInt(match[2] || 0, 10)
560
+ const days = Number.parseInt(match[3] || 0, 10)
561
+ const hours = Number.parseInt(match[4] || 0, 10)
562
+ const minutes = Number.parseInt(match[5] || 0, 10)
563
+ const seconds = Number.parseFloat(match[6] || 0)
564
+
565
+ // Convert everything to milliseconds
566
+ const ms =
567
+ years * 365 * 24 * 60 * 60 * 1000 + // assume 1 year = 365 days
568
+ months * 30 * 24 * 60 * 60 * 1000 + // assume 1 month = 30 days
569
+ days * 24 * 60 * 60 * 1000 +
570
+ hours * 60 * 60 * 1000 +
571
+ minutes * 60 * 1000 +
572
+ seconds * 1000
573
+
574
+ return ms
575
+ }
package/lodash.deburr.js DELETED
@@ -1,255 +0,0 @@
1
- /**
2
- * lodash (Custom Build) <https://lodash.com/>
3
- * Build: `lodash modularize exports="npm" -o ./`
4
- * Copyright jQuery Foundation and other contributors <https://jquery.org/>
5
- * Released under MIT license <https://lodash.com/license>
6
- * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
7
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
8
- */
9
-
10
- /** Used as references for various `Number` constants. */
11
- var INFINITY = 1 / 0;
12
-
13
- /** `Object#toString` result references. */
14
- var symbolTag = '[object Symbol]';
15
-
16
- /** Used to match Latin Unicode letters (excluding mathematical operators). */
17
- var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
18
-
19
- /** Used to compose unicode character classes. */
20
- var rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23',
21
- rsComboSymbolsRange = '\\u20d0-\\u20f0';
22
-
23
- /** Used to compose unicode capture groups. */
24
- var rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']';
25
-
26
- /**
27
- * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
28
- * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
29
- */
30
- var reComboMark = RegExp(rsCombo, 'g');
31
-
32
- /** Used to map Latin Unicode letters to basic Latin letters. */
33
- var deburredLetters = {
34
- // Latin-1 Supplement block.
35
- '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
36
- '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
37
- '\xc7': 'C', '\xe7': 'c',
38
- '\xd0': 'D', '\xf0': 'd',
39
- '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
40
- '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
41
- '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
42
- '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i',
43
- '\xd1': 'N', '\xf1': 'n',
44
- '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
45
- '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
46
- '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
47
- '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
48
- '\xdd': 'Y', '\xfd': 'y', '\xff': 'y',
49
- '\xc6': 'Ae', '\xe6': 'ae',
50
- '\xde': 'Th', '\xfe': 'th',
51
- '\xdf': 'ss',
52
- // Latin Extended-A block.
53
- '\u0100': 'A', '\u0102': 'A', '\u0104': 'A',
54
- '\u0101': 'a', '\u0103': 'a', '\u0105': 'a',
55
- '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
56
- '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
57
- '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
58
- '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
59
- '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
60
- '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
61
- '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
62
- '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
63
- '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
64
- '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
65
- '\u0134': 'J', '\u0135': 'j',
66
- '\u0136': 'K', '\u0137': 'k', '\u0138': 'k',
67
- '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
68
- '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
69
- '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
70
- '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
71
- '\u014c': 'O', '\u014e': 'O', '\u0150': 'O',
72
- '\u014d': 'o', '\u014f': 'o', '\u0151': 'o',
73
- '\u0154': 'R', '\u0156': 'R', '\u0158': 'R',
74
- '\u0155': 'r', '\u0157': 'r', '\u0159': 'r',
75
- '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
76
- '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's',
77
- '\u0162': 'T', '\u0164': 'T', '\u0166': 'T',
78
- '\u0163': 't', '\u0165': 't', '\u0167': 't',
79
- '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
80
- '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
81
- '\u0174': 'W', '\u0175': 'w',
82
- '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y',
83
- '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z',
84
- '\u017a': 'z', '\u017c': 'z', '\u017e': 'z',
85
- '\u0132': 'IJ', '\u0133': 'ij',
86
- '\u0152': 'Oe', '\u0153': 'oe',
87
- '\u0149': "'n", '\u017f': 'ss'
88
- };
89
-
90
- /** Detect free variable `global` from Node.js. */
91
- var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
92
-
93
- /** Detect free variable `self`. */
94
- var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
95
-
96
- /** Used as a reference to the global object. */
97
- var root = freeGlobal || freeSelf || Function('return this')();
98
-
99
- /**
100
- * The base implementation of `_.propertyOf` without support for deep paths.
101
- *
102
- * @private
103
- * @param {Object} object The object to query.
104
- * @returns {Function} Returns the new accessor function.
105
- */
106
- function basePropertyOf(object) {
107
- return function(key) {
108
- return object == null ? undefined : object[key];
109
- };
110
- }
111
-
112
- /**
113
- * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
114
- * letters to basic Latin letters.
115
- *
116
- * @private
117
- * @param {string} letter The matched letter to deburr.
118
- * @returns {string} Returns the deburred letter.
119
- */
120
- var deburrLetter = basePropertyOf(deburredLetters);
121
-
122
- /** Used for built-in method references. */
123
- var objectProto = Object.prototype;
124
-
125
- /**
126
- * Used to resolve the
127
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
128
- * of values.
129
- */
130
- var objectToString = objectProto.toString;
131
-
132
- /** Built-in value references. */
133
- var Symbol = root.Symbol;
134
-
135
- /** Used to convert symbols to primitives and strings. */
136
- var symbolProto = Symbol ? Symbol.prototype : undefined,
137
- symbolToString = symbolProto ? symbolProto.toString : undefined;
138
-
139
- /**
140
- * The base implementation of `_.toString` which doesn't convert nullish
141
- * values to empty strings.
142
- *
143
- * @private
144
- * @param {*} value The value to process.
145
- * @returns {string} Returns the string.
146
- */
147
- function baseToString(value) {
148
- // Exit early for strings to avoid a performance hit in some environments.
149
- if (typeof value == 'string') {
150
- return value;
151
- }
152
- if (isSymbol(value)) {
153
- return symbolToString ? symbolToString.call(value) : '';
154
- }
155
- var result = (value + '');
156
- return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
157
- }
158
-
159
- /**
160
- * Checks if `value` is object-like. A value is object-like if it's not `null`
161
- * and has a `typeof` result of "object".
162
- *
163
- * @static
164
- * @memberOf _
165
- * @since 4.0.0
166
- * @category Lang
167
- * @param {*} value The value to check.
168
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
169
- * @example
170
- *
171
- * _.isObjectLike({});
172
- * // => true
173
- *
174
- * _.isObjectLike([1, 2, 3]);
175
- * // => true
176
- *
177
- * _.isObjectLike(_.noop);
178
- * // => false
179
- *
180
- * _.isObjectLike(null);
181
- * // => false
182
- */
183
- function isObjectLike(value) {
184
- return !!value && typeof value == 'object';
185
- }
186
-
187
- /**
188
- * Checks if `value` is classified as a `Symbol` primitive or object.
189
- *
190
- * @static
191
- * @memberOf _
192
- * @since 4.0.0
193
- * @category Lang
194
- * @param {*} value The value to check.
195
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
196
- * @example
197
- *
198
- * _.isSymbol(Symbol.iterator);
199
- * // => true
200
- *
201
- * _.isSymbol('abc');
202
- * // => false
203
- */
204
- function isSymbol(value) {
205
- return typeof value == 'symbol' ||
206
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
207
- }
208
-
209
- /**
210
- * Converts `value` to a string. An empty string is returned for `null`
211
- * and `undefined` values. The sign of `-0` is preserved.
212
- *
213
- * @static
214
- * @memberOf _
215
- * @since 4.0.0
216
- * @category Lang
217
- * @param {*} value The value to process.
218
- * @returns {string} Returns the string.
219
- * @example
220
- *
221
- * _.toString(null);
222
- * // => ''
223
- *
224
- * _.toString(-0);
225
- * // => '-0'
226
- *
227
- * _.toString([1, 2, 3]);
228
- * // => '1,2,3'
229
- */
230
- function toString(value) {
231
- return value == null ? '' : baseToString(value);
232
- }
233
-
234
- /**
235
- * Deburrs `string` by converting
236
- * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
237
- * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
238
- * letters to basic Latin letters and removing
239
- * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
240
- *
241
- * @static
242
- * @memberOf _
243
- * @since 3.0.0
244
- * @category String
245
- * @param {string} [string=''] The string to deburr.
246
- * @returns {string} Returns the deburred string.
247
- * @example
248
- *
249
- * _.deburr('déjà vu');
250
- * // => 'deja vu'
251
- */
252
- export function deburr(string) {
253
- string = toString(string);
254
- return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
255
- }