@symbo.ls/utils 3.14.2 → 3.14.4

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 (122) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/array.cjs +1 -0
  3. package/dist/cjs/assets.cjs +1 -0
  4. package/dist/cjs/browser.cjs +1 -0
  5. package/dist/cjs/cache.cjs +1 -0
  6. package/dist/cjs/cdn.cjs +3 -0
  7. package/dist/cjs/component.cjs +1 -0
  8. package/dist/cjs/cookie.cjs +1 -0
  9. package/dist/cjs/date.cjs +1 -0
  10. package/dist/cjs/detectHeight.cjs +1 -0
  11. package/dist/cjs/element.cjs +1 -0
  12. package/dist/cjs/env.cjs +2 -0
  13. package/dist/cjs/events.cjs +1 -0
  14. package/dist/cjs/extends.cjs +1 -0
  15. package/dist/cjs/fibonacci.cjs +1 -0
  16. package/dist/cjs/files.cjs +1 -0
  17. package/dist/cjs/function.cjs +1 -0
  18. package/dist/cjs/globals.cjs +1 -0
  19. package/dist/cjs/if.cjs +1 -0
  20. package/dist/cjs/index.cjs +1 -0
  21. package/dist/cjs/key.cjs +1 -0
  22. package/dist/cjs/keys.cjs +1 -0
  23. package/dist/cjs/load.cjs +1 -0
  24. package/dist/cjs/log.cjs +1 -0
  25. package/dist/cjs/metadata.cjs +2 -0
  26. package/dist/cjs/methods.cjs +10 -0
  27. package/dist/cjs/node.cjs +1 -0
  28. package/dist/cjs/object.cjs +12 -0
  29. package/dist/cjs/projectKeys.cjs +1 -0
  30. package/dist/cjs/props.cjs +1 -0
  31. package/dist/cjs/scaling.cjs +1 -0
  32. package/dist/cjs/scope.cjs +1 -0
  33. package/dist/cjs/sharedLibraries.cjs +1 -0
  34. package/dist/cjs/state.cjs +1 -0
  35. package/dist/cjs/string-extra.cjs +1 -0
  36. package/dist/cjs/string.cjs +3 -0
  37. package/dist/cjs/style.cjs +1 -0
  38. package/dist/cjs/tags.cjs +1 -0
  39. package/dist/cjs/triggerEvent.cjs +1 -0
  40. package/dist/cjs/types.cjs +1 -0
  41. package/dist/cjs/update.cjs +1 -0
  42. package/dist/esm/array.js +1 -0
  43. package/dist/esm/assets.js +1 -0
  44. package/dist/esm/browser.js +1 -0
  45. package/dist/esm/cache.js +1 -0
  46. package/dist/esm/cdn.js +3 -0
  47. package/dist/esm/component.js +1 -0
  48. package/dist/esm/cookie.js +1 -0
  49. package/dist/esm/date.js +1 -0
  50. package/dist/esm/detectHeight.js +1 -0
  51. package/dist/esm/element.js +1 -0
  52. package/dist/esm/env.js +2 -0
  53. package/dist/esm/events.js +1 -0
  54. package/dist/esm/extends.js +1 -0
  55. package/dist/esm/fibonacci.js +1 -0
  56. package/dist/esm/files.js +1 -0
  57. package/dist/esm/function.js +1 -0
  58. package/dist/esm/globals.js +1 -0
  59. package/dist/esm/if.js +1 -0
  60. package/dist/esm/index.js +1 -0
  61. package/dist/esm/key.js +1 -0
  62. package/dist/esm/keys.js +1 -0
  63. package/dist/esm/load.js +1 -0
  64. package/dist/esm/log.js +1 -0
  65. package/dist/esm/metadata.js +2 -0
  66. package/dist/esm/methods.js +10 -0
  67. package/dist/esm/node.js +1 -0
  68. package/dist/esm/object.js +12 -0
  69. package/dist/esm/projectKeys.js +1 -0
  70. package/dist/esm/props.js +1 -0
  71. package/dist/esm/scaling.js +1 -0
  72. package/dist/esm/scope.js +1 -0
  73. package/dist/esm/sharedLibraries.js +1 -0
  74. package/dist/esm/state.js +1 -0
  75. package/dist/esm/string-extra.js +1 -0
  76. package/dist/esm/string.js +3 -0
  77. package/dist/esm/style.js +1 -0
  78. package/dist/esm/tags.js +1 -0
  79. package/dist/esm/triggerEvent.js +1 -0
  80. package/dist/esm/types.js +1 -0
  81. package/dist/esm/update.js +1 -0
  82. package/package.json +35 -18
  83. package/array.js +0 -162
  84. package/assets.js +0 -117
  85. package/browser.js +0 -13
  86. package/cache.js +0 -7
  87. package/cdn.js +0 -83
  88. package/component.js +0 -25
  89. package/cookie.js +0 -78
  90. package/date.js +0 -10
  91. package/detectHeight.js +0 -42
  92. package/element.js +0 -148
  93. package/env.js +0 -15
  94. package/events.js +0 -19
  95. package/extends.js +0 -519
  96. package/fibonacci.js +0 -9
  97. package/files.js +0 -3
  98. package/function.js +0 -145
  99. package/globals.js +0 -8
  100. package/if.js +0 -30
  101. package/index.js +0 -42
  102. package/key.js +0 -20
  103. package/keys.js +0 -176
  104. package/load.js +0 -236
  105. package/log.js +0 -12
  106. package/metadata.js +0 -392
  107. package/methods.js +0 -684
  108. package/node.js +0 -37
  109. package/object.js +0 -837
  110. package/projectKeys.js +0 -30
  111. package/props.js +0 -327
  112. package/scaling.js +0 -15
  113. package/scope.js +0 -32
  114. package/sharedLibraries.js +0 -184
  115. package/state.js +0 -203
  116. package/string-extra.js +0 -69
  117. package/string.js +0 -206
  118. package/style.js +0 -23
  119. package/tags.js +0 -176
  120. package/triggerEvent.js +0 -102
  121. package/types.js +0 -55
  122. package/update.js +0 -27
package/extends.js DELETED
@@ -1,519 +0,0 @@
1
- 'use strict'
2
-
3
- import { joinArrays, removeDuplicatesInArray } from './array.js'
4
- import { matchesComponentNaming } from './component.js'
5
- import { deepClone, exec } from './object.js'
6
- import { isArray, isObject, isString } from './types.js'
7
- const ENV = process.env.NODE_ENV
8
- const isSourcemapEnabled = (options) => options.sourcemap !== false && ENV !== 'production'
9
-
10
- export const createExtendsFromKeys = key => {
11
- if (key.includes('+')) {
12
- return key.split('+').filter(matchesComponentNaming)
13
- }
14
-
15
- if (key.includes('_')) {
16
- const [first] = key.split('_')
17
- return [first]
18
- }
19
-
20
- if (key.includes('.') && !matchesComponentNaming(key.split('.')[1])) {
21
- const [first] = key.split('.')
22
- return [first]
23
- }
24
-
25
- return [key]
26
- }
27
-
28
- // Initial extend creation
29
- export const createExtends = (element, parent, key) => {
30
- let __extends = []
31
- const keyExtends = createExtendsFromKeys(key)
32
- if (keyExtends) __extends = [...keyExtends]
33
- const elementExtends = element.extends
34
- if (elementExtends) {
35
- __extends = isArray(elementExtends)
36
- ? [...__extends, ...elementExtends]
37
- : [...__extends, elementExtends]
38
- }
39
- return __extends
40
- }
41
-
42
- export const addExtends = (newExtends, element) => {
43
- const { __ref: ref } = element
44
- let { __extends } = ref
45
-
46
- if (!newExtends) return __extends
47
-
48
- // Check if the first extend has a variant in components
49
- const variant = element.variant
50
- const context = element.context
51
- if (
52
- variant &&
53
- context?.components &&
54
- !Array.isArray(newExtends) &&
55
- typeof newExtends === 'string'
56
- ) {
57
- const variantKey = `${newExtends}.${variant}`
58
- if (context.components[variantKey]) {
59
- newExtends = variantKey
60
- }
61
- }
62
-
63
- if (!__extends.includes(newExtends)) {
64
- __extends = Array.isArray(newExtends)
65
- ? [...__extends, ...newExtends]
66
- : [...__extends, newExtends]
67
- ref.__extends = __extends
68
- }
69
- return __extends
70
- }
71
-
72
- export const concatAddExtends = (newExtend, element) => {
73
- if (!newExtend) return element
74
- const { extends: elementExtend } = element
75
- const originalArray = isArray(elementExtend) ? elementExtend : [elementExtend]
76
- const receivedArray = isArray(newExtend) ? newExtend : [newExtend]
77
- return {
78
- ...element,
79
- extends: joinArrays(receivedArray, originalArray)
80
- }
81
- }
82
-
83
- export const generateHash = () => Math.random().toString(36).substring(2)
84
-
85
- // hashing
86
- export const extendStackRegistry = {}
87
- export const extendCachedRegistry = {}
88
-
89
- export const getHashedExtend = extend => {
90
- return extendStackRegistry[extend.__hash]
91
- }
92
-
93
- export const setHashedExtend = (extend, stack) => {
94
- const hash = generateHash()
95
- if (!isString(extend)) {
96
- extend.__hash = hash
97
- }
98
- if (hash !== '__proto__' && hash !== 'constructor' && hash !== 'prototype') {
99
- extendStackRegistry[hash] = stack
100
- }
101
- return stack
102
- }
103
-
104
- export const getExtendsStackRegistry = (extend, stack) => {
105
- if (extend.__hash) {
106
- return stack.concat(getHashedExtend(extend))
107
- }
108
- return setHashedExtend(extend, stack) // stack .concat(hashedExtend)
109
- }
110
-
111
- // stacking
112
- export const extractArrayExtend = (
113
- extend,
114
- stack,
115
- context,
116
- processed = new Set(),
117
- nameStack,
118
- componentNameMap
119
- ) => {
120
- for (const each of extend) {
121
- if (isArray(each)) {
122
- extractArrayExtend(each, stack, context, processed, nameStack, componentNameMap)
123
- } else {
124
- flattenExtend(each, stack, context, processed, nameStack, undefined, componentNameMap)
125
- }
126
- }
127
- return stack
128
- }
129
-
130
- export const deepExtend = (extend, stack, context, processed = new Set(), nameStack, currentName, componentNameMap) => {
131
- const extendOflattenExtend = extend.extends
132
- const cleanExtend = { ...extend }
133
- delete cleanExtend.extends
134
- let hasKeys = false
135
- for (const _k in cleanExtend) { hasKeys = true; break } // eslint-disable-line
136
- if (hasKeys) {
137
- stack.push(cleanExtend)
138
- if (nameStack) nameStack.push(currentName)
139
- }
140
- if (extendOflattenExtend) {
141
- flattenExtend(extendOflattenExtend, stack, context, processed, nameStack, currentName, componentNameMap)
142
- }
143
- return stack
144
- }
145
-
146
- export const flattenExtend = (
147
- extend,
148
- stack,
149
- context,
150
- processed = new Set(),
151
- nameStack,
152
- parentName,
153
- componentNameMap
154
- ) => {
155
- if (!extend) return stack
156
- if (processed.has(extend)) return stack
157
-
158
- if (isArray(extend)) {
159
- return extractArrayExtend(extend, stack, context, processed, nameStack, componentNameMap)
160
- }
161
-
162
- let currentName = parentName
163
- if (isString(extend)) {
164
- currentName = extend
165
- extend = mapStringsWithContextComponents(extend, context)
166
- } else if (componentNameMap && isObject(extend) && componentNameMap.has(extend)) {
167
- // Resolve name from pre-built map (top-level resolved extends)
168
- currentName = componentNameMap.get(extend)
169
- }
170
-
171
- processed.add(extend)
172
-
173
- if (extend?.extends) {
174
- deepExtend(extend, stack, context, processed, nameStack, currentName, componentNameMap)
175
- } else if (extend) {
176
- stack.push(extend)
177
- if (nameStack) nameStack.push(currentName)
178
- }
179
-
180
- return stack
181
- }
182
-
183
- const MERGE_EXTENDS_SKIP = new Set([
184
- 'parent', 'node', '__ref', '__proto__', 'extends', 'childExtends', 'childExtendsRecursive'
185
- ])
186
-
187
- export const deepMergeExtends = (element, extend, sourcemap, sourceName, preBuiltSourcemap) => {
188
- // Clone extend to prevent mutations
189
- extend = deepClone(extend)
190
-
191
- for (const e in extend) {
192
- if (MERGE_EXTENDS_SKIP.has(e)) continue
193
-
194
- const elementProp = element[e]
195
- const extendProp = extend[e]
196
-
197
- // Skip if the property is undefined in the extend object
198
- if (extendProp === undefined) continue
199
-
200
- // Handle only properties that exist in the extend object
201
- if (
202
- Object.prototype.hasOwnProperty.call(extend, e) &&
203
- e !== '__proto__' && e !== 'constructor' && e !== 'prototype'
204
- ) {
205
- if (elementProp === undefined) {
206
- // For undefined properties in element, copy from extend
207
- element[e] = extendProp
208
- // Track sourcemap for this property
209
- if (sourcemap && sourceName) {
210
- if (isObject(extendProp) && !isArray(extendProp)) {
211
- sourcemap[e] = sourcemap[e] || {}
212
- trackSourcemapDeep(sourcemap[e], extendProp, sourceName)
213
- } else {
214
- sourcemap[e] = sourceName
215
- }
216
- } else if (sourcemap && preBuiltSourcemap?.[e]) {
217
- // Copy sourcemap entry from pre-built sourcemap (used in finalizeExtends)
218
- sourcemap[e] = preBuiltSourcemap[e]
219
- }
220
- } else if (isObject(elementProp) && isObject(extendProp)) {
221
- // For objects, merge based on type
222
- const nestedSourcemap = sourcemap ? (sourcemap[e] = sourcemap[e] || {}) : undefined
223
- const nestedPreBuilt = preBuiltSourcemap?.[e]
224
- if (matchesComponentNaming(e)) {
225
- // For components, override base properties with extended ones
226
- element[e] = deepMergeExtends(elementProp, extendProp, nestedSourcemap, sourceName, nestedPreBuilt)
227
- } else {
228
- // For other objects, merge normally
229
- deepMergeExtends(elementProp, extendProp, nestedSourcemap, sourceName, nestedPreBuilt)
230
- }
231
- }
232
-
233
- if (
234
- e === 'extends' ||
235
- e === 'childExtends' ||
236
- e === 'childExtendsRecursive'
237
- ) {
238
- if (isArray(elementProp) && isArray(extendProp)) {
239
- element[e] = elementProp.concat(extendProp)
240
- } else if (isArray(elementProp) && isObject(extendProp)) {
241
- const obj = deepMergeExtends({}, elementProp)
242
- element[e] = deepMergeExtends(obj, extendProp)
243
- }
244
- }
245
- // If elementProp is defined and not an object, keep it (don't override)
246
- // This preserves properties from earlier in the extend chain
247
- }
248
- }
249
-
250
- return element
251
- }
252
-
253
- const trackSourcemapDeep = (sourcemap, obj, sourceName, seen) => {
254
- if (!seen) seen = new WeakSet()
255
- if (seen.has(obj)) return
256
- seen.add(obj)
257
- for (const key in obj) {
258
- if (!Object.prototype.hasOwnProperty.call(obj, key)) continue
259
- if (key === '__proto__' || key === 'constructor' || key === 'prototype') continue
260
- const val = obj[key]
261
- if (isObject(val) && !isArray(val)) {
262
- sourcemap[key] = sourcemap[key] || {}
263
- trackSourcemapDeep(sourcemap[key], val, sourceName, seen)
264
- } else {
265
- sourcemap[key] = sourceName
266
- }
267
- }
268
- }
269
-
270
- export const cloneAndMergeArrayExtend = (stack, sourcemap, extendNames) => {
271
- return stack.reduce((acc, current, i) => {
272
- // Clone current extend to avoid mutations
273
- const cloned = deepClone(current)
274
- const sourceName = extendNames ? extendNames[i] : undefined
275
- // Merge into accumulator, giving priority to current extend
276
- return deepMergeExtends(acc, cloned, sourcemap, sourceName)
277
- }, {})
278
- }
279
-
280
- export const mapStringsWithContextComponents = (
281
- extend,
282
- context,
283
- options = {},
284
- variant
285
- ) => {
286
- const COMPONENTS = context?.components || options.components
287
- const PAGES = context?.pages || options.pages
288
- if (isString(extend)) {
289
- const componentExists =
290
- COMPONENTS &&
291
- (COMPONENTS[extend + '.' + variant] ||
292
- COMPONENTS[extend] ||
293
- COMPONENTS['smbls.' + extend])
294
- const pageExists = PAGES && extend.charCodeAt(0) === 47 && PAGES[extend]
295
- if (componentExists) return componentExists
296
- else if (pageExists) return pageExists
297
- else {
298
- if (options.verbose && (ENV === 'test' || ENV === 'development')) {
299
- console.warn('Extend is string but component was not found:', extend)
300
- }
301
- return
302
- }
303
- }
304
- return extend
305
- }
306
-
307
- // joint stacks
308
- export const jointStacks = (extendStack, childExtendsStack) => {
309
- return []
310
- .concat(extendStack.slice(0, 1))
311
- .concat(childExtendsStack.slice(0, 1))
312
- .concat(extendStack.slice(1))
313
- .concat(childExtendsStack.slice(1))
314
- }
315
-
316
- // init
317
- export const getExtendsStack = (extend, context, nameStack, componentNameMap) => {
318
- if (!extend) return []
319
- if (extend.__hash) return getHashedExtend(extend) || []
320
- const processed = new Set()
321
- const stack = flattenExtend(extend, [], context, processed, nameStack, undefined, componentNameMap)
322
- if (nameStack) return stack
323
- return getExtendsStackRegistry(extend, stack)
324
- }
325
-
326
- export const addExtend = (newExtends, elementExtends) => {
327
- if (!newExtends) return elementExtends
328
- const receivedArray = isArray(newExtends) ? newExtends : [newExtends]
329
- return joinArrays(receivedArray, elementExtends)
330
- }
331
-
332
- export const getExtendsInElement = obj => {
333
- let result = []
334
-
335
- function traverse (o) {
336
- for (const key in o) {
337
- if (Object.prototype.hasOwnProperty.call(o, key)) {
338
- // Check if the key starts with a capital letter and exclude keys like @mobileL, $router
339
- if (matchesComponentNaming(key)) {
340
- result.push(key)
341
- }
342
-
343
- // Check if the key is "extend" and it's either a string or an array
344
- if (key === 'extends') {
345
- // Add the value of the extend key to the result array
346
- if (typeof o[key] === 'string') {
347
- result.push(o[key])
348
- } else if (Array.isArray(o[key])) {
349
- result = result.concat(o[key])
350
- }
351
- }
352
-
353
- // If the property is an object, traverse it
354
- if (typeof o[key] === 'object' && o[key] !== null) {
355
- traverse(o[key])
356
- }
357
- }
358
- }
359
- }
360
-
361
- traverse(obj)
362
- return result
363
- }
364
-
365
- export const createElementExtends = (element, parent, options = {}) => {
366
- const { __ref: ref } = element
367
- const context = element.context || parent.context
368
- const variant = element.variant
369
-
370
- if (element.extends) {
371
- if (Array.isArray(element.extends) && element.extends.length > 0) {
372
- // Handle first item in array specially for variant
373
- const [firstExtend, ...restExtends] = element.extends
374
- if (typeof firstExtend === 'string' && variant && context?.components) {
375
- const variantKey = `${firstExtend}.${variant}`
376
- if (context.components[variantKey]) {
377
- addExtends([variantKey, ...restExtends], element)
378
- } else {
379
- addExtends(element.extends, element)
380
- }
381
- } else {
382
- addExtends(element.extends, element)
383
- }
384
- } else if (
385
- typeof element.extends === 'string' &&
386
- variant &&
387
- context?.components
388
- ) {
389
- const variantKey = `${element.extends}.${variant}`
390
- if (context.components[variantKey]) {
391
- addExtends(variantKey, element)
392
- } else {
393
- addExtends(element.extends, element)
394
- }
395
- } else {
396
- addExtends(element.extends, element)
397
- }
398
- }
399
-
400
- inheritChildPropsExtends(element, parent, options)
401
- inheritChildExtends(element, parent, options)
402
- inheritRecursiveChildExtends(element, parent, options)
403
-
404
- if (element.component) {
405
- addExtends(exec(element.component, element), element)
406
- }
407
-
408
- if (context.defaultExtends) {
409
- addExtends(context.defaultExtends, element)
410
- }
411
-
412
- return removeDuplicatesInArray(ref.__extends)
413
- }
414
-
415
- export const inheritChildPropsExtends = (element, parent, options = {}) => {
416
- const { __ref: ref } = element
417
- const ignoreChildExtends =
418
- options.ignoreChildExtends || element.ignoreChildExtends
419
- if (!ignoreChildExtends) {
420
- if (parent.childProps?.extends) {
421
- addExtends(parent.childProps.extends, element)
422
- }
423
- }
424
- return ref.__extends
425
- }
426
-
427
- export const inheritChildExtends = (element, parent, options = {}) => {
428
- const { __ref: ref } = element
429
- const ignoreChildExtends =
430
- options.ignoreChildExtends || element.ignoreChildExtends
431
-
432
- const childExtends = parent.childExtends
433
- if (!ignoreChildExtends && childExtends) {
434
- addExtends(childExtends, element)
435
- }
436
- return ref.__extends
437
- }
438
-
439
- export const inheritRecursiveChildExtends = (element, parent, options = {}) => {
440
- const { __ref: ref } = element
441
- const childExtendsRecursive = parent.childExtendsRecursive
442
- const ignoreChildExtendsRecursive =
443
- options.ignoreChildExtendsRecursive || element.ignoreChildExtendsRecursive
444
- const isText = element.key === '__text'
445
- if (childExtendsRecursive && !isText && !ignoreChildExtendsRecursive) {
446
- addExtends(childExtendsRecursive, element)
447
- }
448
- return ref.__extends
449
- }
450
-
451
- export const createExtendsStack = (element, parent, options = {}) => {
452
- const { __ref: ref } = element
453
- const context = element.context || parent.context
454
-
455
- const variant = element.variant
456
-
457
- // Keep original string names before resolution for sourcemap tracking
458
- const sourcemap = isSourcemapEnabled(options)
459
- const originalExtendNames = sourcemap ? [...ref.__extends] : null
460
-
461
- const __extends = removeDuplicatesInArray(
462
- ref.__extends.map((val, i) => {
463
- return mapStringsWithContextComponents(
464
- val,
465
- context,
466
- options,
467
- i === 0 && variant
468
- )
469
- })
470
- )
471
-
472
- if (sourcemap) {
473
- // Build a map from resolved component objects to their original string names
474
- const componentNameMap = new WeakMap()
475
- for (let i = 0; i < __extends.length; i++) {
476
- const resolved = __extends[i]
477
- const originalName = originalExtendNames[i]
478
- if (resolved && isObject(resolved) && isString(originalName)) {
479
- componentNameMap.set(resolved, originalName)
480
- }
481
- }
482
- const nameStack = []
483
- const stack = getExtendsStack(__extends, context, nameStack, componentNameMap)
484
- ref.__extendsStack = stack
485
- ref.__extendsNames = nameStack
486
- } else {
487
- const stack = getExtendsStack(__extends, context)
488
- ref.__extendsStack = stack
489
- }
490
-
491
- return ref.__extendsStack
492
- }
493
-
494
- export const finalizeExtends = (element, parent, options = {}) => {
495
- const { __ref: ref } = element
496
- const { __extendsStack } = ref
497
-
498
- if (isSourcemapEnabled(options)) {
499
- const sourcemapAcc = {}
500
- const extendNames = ref.__extendsNames || []
501
- const flattenExtends = cloneAndMergeArrayExtend(__extendsStack, sourcemapAcc, extendNames)
502
- // Only keep sourcemap entries for properties actually merged into element
503
- const appliedSourcemap = {}
504
- deepMergeExtends(element, flattenExtends, appliedSourcemap, undefined, sourcemapAcc)
505
- ref.__sourcemap = appliedSourcemap
506
- } else {
507
- const flattenExtends = cloneAndMergeArrayExtend(__extendsStack)
508
- deepMergeExtends(element, flattenExtends)
509
- }
510
-
511
- return element
512
- }
513
-
514
- export const applyExtends = (element, parent, options = {}) => {
515
- createElementExtends(element, parent, options)
516
- createExtendsStack(element, parent, options)
517
- finalizeExtends(element, parent, options)
518
- return element
519
- }
package/fibonacci.js DELETED
@@ -1,9 +0,0 @@
1
- 'use strict'
2
-
3
- export const fibonacciNumberByIndex = function fibonacciNumberByIndex (n) {
4
- const fib = [0, 1]
5
- for (let i = 2; i <= n; i++) {
6
- fib[i] = fib[i - 1] + fib[i - 2]
7
- }
8
- return fib[n]
9
- }
package/files.js DELETED
@@ -1,3 +0,0 @@
1
- 'use strict'
2
-
3
- export const isPhoto = format => ['jpeg', 'gif', 'jpg', 'png', 'tiff', 'woff'].includes(format)
package/function.js DELETED
@@ -1,145 +0,0 @@
1
- 'use strict'
2
-
3
- /**
4
- * Debounces a function, ensuring that it is only executed after a specified timeout
5
- * period has elapsed since the last invocation.
6
- *
7
- * @param {function} func - The function to be debounced.
8
- * @param {number} [timeout=300] - The time (in milliseconds) to wait after the last call to
9
- * `debounce` before executing the `func`.
10
- * @returns {function} - A debounced version of the input function `func`.
11
- * @example
12
- * // Usage example:
13
- * const debouncedFunction = debounce(this, myFunction, 500);
14
- * window.addEventListener('resize', debouncedFunction);
15
- */
16
- export function debounce (func, wait, immediate) {
17
- let timeout
18
- return function () {
19
- const context = this
20
- const args = arguments
21
- const later = function () {
22
- timeout = null
23
- if (!immediate) func.apply(context, args)
24
- }
25
- const callNow = immediate && !timeout
26
- clearTimeout(timeout)
27
- timeout = setTimeout(later, wait)
28
- if (callNow) func.apply(context, args)
29
- }
30
- }
31
-
32
- /**
33
- * Debounces a function, ensuring that it is only executed after a specified timeout
34
- * period has elapsed since the last invocation.
35
- *
36
- * @param {Object} element - The context (this) to which the debounced function will be applied.
37
- * @param {function} func - The function to be debounced.
38
- * @param {number} [timeout=300] - The time (in milliseconds) to wait after the last call to
39
- * `debounce` before executing the `func`.
40
- * @returns {function} - A debounced version of the input function `func`.
41
- * @example
42
- * // Usage example:
43
- * const debouncedFunction = debounce(this, myFunction, 500);
44
- * window.addEventListener('resize', debouncedFunction);
45
- */
46
- export const debounceOnContext = (element, func, timeout = 300) => {
47
- let timer
48
- return (...args) => {
49
- clearTimeout(timer)
50
- timer = setTimeout(() => {
51
- func.apply(element, args)
52
- }, timeout)
53
- }
54
- }
55
-
56
- export const memoize = fn => {
57
- const cache = {}
58
- return (...args) => {
59
- const n = args[0]
60
- if (n in cache) {
61
- return cache[n]
62
- } else {
63
- const result = fn(n)
64
- cache[n] = result
65
- return result
66
- }
67
- }
68
- }
69
-
70
- const RE_STRING_FUNCTION = /^((function\s*\([^)]*\)\s*\{[^}]*\})|(\([^)]*\)\s*=>))/
71
-
72
- export const isStringFunction = inputString => {
73
- return RE_STRING_FUNCTION.test(inputString)
74
- }
75
-
76
- /**
77
- * Resolve an event handler through context plugins.
78
- *
79
- * If `handler` is already a function it is returned as-is.
80
- * Otherwise, iterates `context.plugins` looking for a plugin
81
- * with a `resolveHandler` method that can compile the handler
82
- * (e.g. a funcql schema) into a callable function.
83
- *
84
- * @param {*} handler - event handler (function, object, array, string)
85
- * @param {object} element - domql element
86
- * @returns {function|*} resolved handler
87
- */
88
- /**
89
- * Check if context has any plugin that can resolve non-function handlers.
90
- */
91
- export const hasHandlerPlugin = (ctx) => {
92
- const plugins = ctx?.plugins
93
- if (!plugins || !plugins.length) return false
94
- for (const plugin of plugins) {
95
- if (plugin.resolveHandler) return true
96
- }
97
- return false
98
- }
99
-
100
- export const resolveHandler = (handler, element) => {
101
- if (typeof handler === 'function') return handler
102
- const plugins = element?.context?.plugins
103
- if (!plugins) return handler
104
- for (const plugin of plugins) {
105
- if (plugin.resolveHandler) {
106
- const resolved = plugin.resolveHandler(handler, element)
107
- if (typeof resolved === 'function') return resolved
108
- }
109
- }
110
- return handler
111
- }
112
-
113
- /**
114
- * Run a named hook across all context plugins.
115
- *
116
- * @param {string} hookName - lifecycle hook name
117
- * @param {object} element - domql element
118
- * @param {*[]} args - additional arguments forwarded to each plugin hook
119
- */
120
- export const runPluginHook = (hookName, element, ...args) => {
121
- const plugins = element?.context?.plugins
122
- if (!plugins) return false
123
- let handled = false
124
- for (const plugin of plugins) {
125
- if (typeof plugin[hookName] === 'function') {
126
- plugin[hookName](element, ...args)
127
- handled = true
128
- }
129
- }
130
- return handled
131
- }
132
-
133
- export function cloneFunction (fn, win = window) {
134
- const temp = function () {
135
- return fn.apply(win, arguments)
136
- }
137
-
138
- // Copy properties from original function
139
- for (const key in fn) {
140
- if (Object.prototype.hasOwnProperty.call(fn, key)) {
141
- temp[key] = fn[key]
142
- }
143
- }
144
- return temp
145
- }
package/globals.js DELETED
@@ -1,8 +0,0 @@
1
- 'use strict'
2
-
3
- const global = globalThis
4
- const self = globalThis
5
- const window = globalThis
6
- const document = (this || window).document // eslint-disable-line
7
-
8
- export { global, self, window, document }