@splendidlabz/utils 1.11.3 → 1.11.5
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/dist/cjs/dom/accessibility.cjs +53 -0
- package/dist/cjs/dom/actions/index.cjs +410 -0
- package/dist/cjs/dom/actions/masonry.cjs +152 -0
- package/dist/cjs/dom/actions/prefer-horizontal-scroll.cjs +157 -0
- package/dist/cjs/dom/actions/sticky.cjs +213 -0
- package/dist/cjs/dom/bounding-box.cjs +70 -0
- package/dist/cjs/dom/clipboard.cjs +37 -0
- package/dist/cjs/dom/cookie.cjs +57 -0
- package/dist/cjs/dom/css-vars.cjs +57 -0
- package/dist/cjs/dom/events.cjs +59 -0
- package/{src/dom/focusable.js → dist/cjs/dom/focusable.cjs} +51 -73
- package/dist/cjs/dom/font-size.cjs +80 -0
- package/dist/cjs/dom/get-element.cjs +98 -0
- package/dist/cjs/dom/hash.cjs +35 -0
- package/dist/cjs/dom/index.cjs +1267 -0
- package/dist/cjs/dom/keyboard.cjs +51 -0
- package/dist/cjs/dom/local-store.cjs +79 -0
- package/dist/cjs/dom/media.cjs +59 -0
- package/dist/cjs/dom/observers/index.cjs +253 -0
- package/dist/cjs/dom/observers/intersection-observer.cjs +91 -0
- package/dist/cjs/dom/observers/mutation-observer.cjs +95 -0
- package/dist/cjs/dom/observers/observer.cjs +48 -0
- package/dist/cjs/dom/observers/resize-observer.cjs +84 -0
- package/dist/cjs/dom/observers/scroll-observer.cjs +177 -0
- package/dist/cjs/dom/pkce.cjs +53 -0
- package/dist/cjs/dom/query-params.cjs +38 -0
- package/dist/cjs/dom/random-string.cjs +38 -0
- package/dist/cjs/dom/sanitize.cjs +65 -0
- package/dist/cjs/dom/session-store.cjs +49 -0
- package/dist/cjs/dom/spam-prevention.cjs +50 -0
- package/dist/cjs/dom/trap-focus.cjs +197 -0
- package/dist/cjs/dom/ui/aria-current.cjs +43 -0
- package/dist/cjs/dom/ui/inconsistent-button-fix.cjs +35 -0
- package/dist/cjs/dom/ui/index.cjs +105 -0
- package/dist/cjs/dom/ui/scroll-container.cjs +47 -0
- package/dist/cjs/dom/ui/traverse-and-scramble.cjs +50 -0
- package/dist/cjs/lib/arrays/index.cjs +139 -0
- package/dist/cjs/lib/arrays/item-position.cjs +42 -0
- package/dist/cjs/lib/arrays/join.cjs +43 -0
- package/dist/cjs/lib/arrays/shuffle.cjs +42 -0
- package/dist/cjs/lib/arrays/sort.cjs +67 -0
- package/dist/cjs/lib/arrays/split-array.cjs +41 -0
- package/dist/cjs/lib/arrays/unique.cjs +31 -0
- package/dist/cjs/lib/auth/index.cjs +53 -0
- package/dist/cjs/lib/auth/route-manager.cjs +51 -0
- package/dist/cjs/lib/checks.cjs +63 -0
- package/dist/cjs/lib/date/days.cjs +37 -0
- package/dist/cjs/lib/date/index.cjs +208 -0
- package/dist/cjs/lib/date/months.cjs +102 -0
- package/dist/cjs/lib/date/time.cjs +117 -0
- package/dist/cjs/lib/form/form-data.cjs +83 -0
- package/dist/cjs/lib/form/index.cjs +122 -0
- package/dist/cjs/lib/form/sanitize.cjs +61 -0
- package/dist/cjs/lib/functions/callback.cjs +31 -0
- package/dist/cjs/lib/functions/debounce.cjs +43 -0
- package/dist/cjs/lib/functions/env.cjs +32 -0
- package/dist/cjs/lib/functions/functional.cjs +82 -0
- package/dist/cjs/lib/functions/index.cjs +142 -0
- package/dist/cjs/lib/functions/throttle.cjs +38 -0
- package/dist/cjs/lib/functions/timeout.cjs +41 -0
- package/dist/cjs/lib/hash.cjs +43 -0
- package/dist/cjs/lib/index.cjs +1178 -0
- package/dist/cjs/lib/numbers/index.cjs +49 -0
- package/dist/cjs/lib/numbers/math.cjs +36 -0
- package/dist/cjs/lib/objects/camelcase-keys.cjs +80 -0
- package/dist/cjs/lib/objects/empty.cjs +39 -0
- package/dist/cjs/lib/objects/equal.cjs +47 -0
- package/dist/cjs/lib/objects/extend.cjs +147 -0
- package/dist/cjs/lib/objects/flatten.cjs +48 -0
- package/dist/cjs/lib/objects/index.cjs +378 -0
- package/dist/cjs/lib/objects/json.cjs +35 -0
- package/dist/cjs/lib/objects/loop.cjs +40 -0
- package/dist/cjs/lib/objects/mix/mix.cjs +115 -0
- package/dist/cjs/lib/objects/nested-property.cjs +45 -0
- package/dist/cjs/lib/objects/normalize-object.cjs +106 -0
- package/dist/cjs/lib/objects/omit-empty.cjs +40 -0
- package/dist/cjs/lib/objects/size.cjs +63 -0
- package/dist/cjs/lib/objects/split.cjs +39 -0
- package/dist/cjs/lib/promises/index.cjs +69 -0
- package/dist/cjs/lib/promises/reject.cjs +67 -0
- package/dist/cjs/lib/sse.cjs +99 -0
- package/dist/cjs/lib/strings/convert-case/convert-case.cjs +96 -0
- package/dist/cjs/lib/strings/index.cjs +197 -0
- package/dist/cjs/lib/strings/markdown.cjs +76 -0
- package/dist/cjs/lib/strings/name.cjs +46 -0
- package/dist/cjs/lib/strings/pluralize.cjs +40 -0
- package/dist/cjs/lib/strings/query-string.cjs +43 -0
- package/dist/cjs/lib/style/index.cjs +64 -0
- package/dist/cjs/lib/symbols/index.cjs +40 -0
- package/dist/cjs/lib/symbols/symbols.cjs +38 -0
- package/dist/cjs/node/dirname.cjs +49 -0
- package/dist/cjs/node/file-cache.cjs +200 -0
- package/dist/cjs/node/file.cjs +50 -0
- package/dist/cjs/node/hash.cjs +42 -0
- package/dist/cjs/node/index.cjs +296 -0
- package/dist/cjs/node/pkce.cjs +64 -0
- package/dist/cjs/node/random-string.cjs +43 -0
- package/dist/cjs/node/sanitize.cjs +65 -0
- package/dist/cjs/node/uuid.cjs +42 -0
- package/dist/esm/dom/accessibility.js +26 -0
- package/dist/esm/dom/actions/index.js +3 -0
- package/dist/esm/dom/actions/masonry.js +38 -0
- package/dist/esm/dom/actions/prefer-horizontal-scroll.js +90 -0
- package/dist/esm/dom/actions/sticky.js +70 -0
- package/dist/esm/dom/bounding-box.js +44 -0
- package/dist/esm/dom/clipboard.js +12 -0
- package/dist/esm/dom/cookie.js +31 -0
- package/dist/esm/dom/css-vars.js +21 -0
- package/dist/esm/dom/events.js +31 -0
- package/dist/esm/dom/focusable.js +117 -0
- package/dist/esm/dom/font-size.js +40 -0
- package/dist/esm/dom/get-element.js +66 -0
- package/dist/esm/dom/hash.js +10 -0
- package/dist/esm/dom/index.js +23 -0
- package/dist/esm/dom/keyboard.js +22 -0
- package/{src → dist/esm}/dom/local-store.js +16 -28
- package/dist/esm/dom/media.js +32 -0
- package/dist/esm/dom/observers/index.js +4 -0
- package/dist/esm/dom/observers/intersection-observer.js +36 -0
- package/dist/esm/dom/observers/mutation-observer.js +40 -0
- package/dist/esm/dom/observers/observer.js +15 -0
- package/dist/esm/dom/observers/resize-observer.js +29 -0
- package/dist/esm/dom/observers/scroll-observer.js +95 -0
- package/dist/esm/dom/pkce.js +20 -0
- package/dist/esm/dom/query-params.js +13 -0
- package/dist/esm/dom/random-string.js +12 -0
- package/dist/esm/dom/sanitize.js +8 -0
- package/dist/esm/dom/session-store.js +24 -0
- package/dist/esm/dom/spam-prevention.js +25 -0
- package/dist/esm/dom/trap-focus.js +51 -0
- package/dist/esm/dom/ui/aria-current.js +17 -0
- package/dist/esm/dom/ui/inconsistent-button-fix.js +10 -0
- package/dist/esm/dom/ui/index.js +4 -0
- package/dist/esm/dom/ui/scroll-container.js +22 -0
- package/dist/esm/dom/ui/traverse-and-scramble.js +25 -0
- package/dist/esm/lib/arrays/index.js +6 -0
- package/dist/esm/lib/arrays/item-position.js +15 -0
- package/dist/esm/lib/arrays/join.js +12 -0
- package/dist/esm/lib/arrays/shuffle.js +17 -0
- package/dist/esm/lib/arrays/sort.js +36 -0
- package/dist/esm/lib/arrays/split-array.js +16 -0
- package/dist/esm/lib/arrays/unique.js +6 -0
- package/dist/esm/lib/auth/index.js +1 -0
- package/dist/esm/lib/auth/route-manager.js +25 -0
- package/dist/esm/lib/checks.js +34 -0
- package/dist/esm/lib/date/days.js +12 -0
- package/dist/esm/lib/date/index.js +3 -0
- package/dist/esm/lib/date/months.js +77 -0
- package/dist/esm/lib/date/time.js +75 -0
- package/dist/esm/lib/form/form-data.js +57 -0
- package/dist/esm/lib/form/index.js +2 -0
- package/dist/esm/lib/form/sanitize.js +34 -0
- package/dist/esm/lib/functions/callback.js +6 -0
- package/dist/esm/lib/functions/debounce.js +18 -0
- package/dist/esm/lib/functions/env.js +7 -0
- package/dist/esm/lib/functions/functional.js +52 -0
- package/dist/esm/lib/functions/index.js +5 -0
- package/dist/esm/lib/functions/throttle.js +13 -0
- package/dist/esm/lib/functions/timeout.js +14 -0
- package/dist/esm/lib/hash.js +18 -0
- package/dist/esm/lib/index.js +14 -0
- package/dist/esm/lib/numbers/index.js +11 -0
- package/dist/esm/lib/numbers/math.js +10 -0
- package/dist/esm/lib/objects/camelcase-keys.js +16 -0
- package/dist/esm/lib/objects/empty.js +13 -0
- package/dist/esm/lib/objects/equal.js +11 -0
- package/dist/esm/lib/objects/extend.js +13 -0
- package/dist/esm/lib/objects/flatten.js +17 -0
- package/dist/esm/lib/objects/index.js +13 -0
- package/dist/esm/lib/objects/json.js +10 -0
- package/dist/esm/lib/objects/loop.js +14 -0
- package/dist/esm/lib/objects/mix/mix.js +88 -0
- package/dist/esm/lib/objects/nested-property.js +18 -0
- package/dist/esm/lib/objects/normalize-object.js +9 -0
- package/dist/esm/lib/objects/omit-empty.js +15 -0
- package/dist/esm/lib/objects/size.js +38 -0
- package/dist/esm/lib/objects/split.js +14 -0
- package/dist/esm/lib/promises/index.js +1 -0
- package/dist/esm/lib/promises/reject.js +17 -0
- package/dist/esm/lib/sse.js +50 -0
- package/dist/esm/lib/strings/convert-case/convert-case.js +64 -0
- package/dist/esm/lib/strings/index.js +5 -0
- package/dist/esm/lib/strings/markdown.js +40 -0
- package/dist/esm/lib/strings/name.js +21 -0
- package/dist/esm/lib/strings/pluralize.js +5 -0
- package/dist/esm/lib/strings/query-string.js +16 -0
- package/dist/esm/lib/style/index.js +12 -0
- package/dist/esm/lib/symbols/index.js +1 -0
- package/dist/esm/lib/symbols/symbols.js +12 -0
- package/dist/esm/node/context.js +0 -0
- package/dist/esm/node/dirname.js +13 -0
- package/dist/esm/node/file-cache.js +121 -0
- package/dist/esm/node/file.js +14 -0
- package/dist/esm/node/hash.js +7 -0
- package/dist/esm/node/index.js +7 -0
- package/dist/esm/node/pkce.js +20 -0
- package/dist/esm/node/random-string.js +8 -0
- package/dist/esm/node/sanitize.js +8 -0
- package/dist/esm/node/uuid.js +7 -0
- package/dist/types/dom/accessibility.d.cts +30 -0
- package/dist/types/dom/actions/index.d.cts +3 -0
- package/dist/types/dom/actions/masonry.d.cts +5 -0
- package/dist/types/dom/actions/prefer-horizontal-scroll.d.cts +5 -0
- package/dist/types/dom/actions/sticky.d.cts +5 -0
- package/{src/dom/bounding-box.js → dist/types/dom/bounding-box.d.cts} +8 -49
- package/dist/types/dom/clipboard.d.cts +7 -0
- package/dist/types/dom/cookie.d.cts +7 -0
- package/dist/types/dom/css-vars.d.cts +6 -0
- package/{src/dom/events.js → dist/types/dom/events.d.cts} +52 -31
- package/dist/types/dom/focusable.d.cts +78 -0
- package/dist/types/dom/font-size.d.cts +8 -0
- package/{src/dom/get-element.js → dist/types/dom/get-element.d.cts} +25 -99
- package/dist/types/dom/hash.d.cts +3 -0
- package/dist/types/dom/index.d.cts +31 -0
- package/{src/dom/keyboard.js → dist/types/dom/keyboard.d.cts} +7 -19
- package/dist/types/dom/local-store.d.cts +31 -0
- package/dist/types/dom/media.d.cts +5 -0
- package/dist/types/dom/observers/index.d.cts +4 -0
- package/dist/types/dom/observers/intersection-observer.d.cts +10 -0
- package/dist/types/dom/observers/mutation-observer.d.cts +9 -0
- package/dist/types/dom/observers/observer.d.cts +3 -0
- package/{src/dom/observers/resize-observer.js → dist/types/dom/observers/resize-observer.d.cts} +6 -32
- package/dist/types/dom/observers/scroll-observer.d.cts +40 -0
- package/dist/types/dom/pkce.d.cts +8 -0
- package/dist/types/dom/query-params.d.cts +6 -0
- package/dist/types/dom/random-string.d.cts +9 -0
- package/dist/types/dom/sanitize.d.cts +10 -0
- package/dist/types/dom/session-store.d.cts +7 -0
- package/dist/types/dom/spam-prevention.d.cts +14 -0
- package/dist/types/dom/trap-focus.d.cts +32 -0
- package/dist/types/dom/ui/aria-current.d.cts +7 -0
- package/{src/dom/ui/inconsistent-button-fix.js → dist/types/dom/ui/inconsistent-button-fix.d.cts} +5 -11
- package/dist/types/dom/ui/index.d.cts +4 -0
- package/dist/types/dom/ui/scroll-container.d.cts +3 -0
- package/dist/types/dom/ui/traverse-and-scramble.d.cts +21 -0
- package/dist/types/lib/arrays/index.d.cts +6 -0
- package/{src/lib/arrays/item-position.js → dist/types/lib/arrays/item-position.d.cts} +5 -12
- package/{src/lib/arrays/join.js → dist/types/lib/arrays/join.d.cts} +4 -9
- package/dist/types/lib/arrays/shuffle.d.cts +3 -0
- package/dist/types/lib/arrays/sort.d.cts +32 -0
- package/dist/types/lib/arrays/split-array.d.cts +6 -0
- package/dist/types/lib/arrays/unique.d.cts +3 -0
- package/dist/types/lib/auth/index.d.cts +1 -0
- package/dist/types/lib/auth/route-manager.d.cts +28 -0
- package/dist/types/lib/checks.d.cts +33 -0
- package/dist/types/lib/date/days.d.cts +7 -0
- package/dist/types/lib/date/index.d.cts +3 -0
- package/dist/types/lib/date/months.d.cts +11 -0
- package/dist/types/lib/date/time.d.cts +21 -0
- package/dist/types/lib/form/form-data.d.cts +9 -0
- package/dist/types/lib/form/index.d.cts +2 -0
- package/{src/lib/form/sanitize.js → dist/types/lib/form/sanitize.d.cts} +19 -39
- package/{src/lib/functions/callback.js → dist/types/lib/functions/callback.d.cts} +3 -3
- package/dist/types/lib/functions/debounce.d.cts +3 -0
- package/dist/types/lib/functions/env.d.cts +3 -0
- package/{src/lib/functions/functional.js → dist/types/lib/functions/functional.d.cts} +8 -49
- package/dist/types/lib/functions/index.d.cts +5 -0
- package/dist/types/lib/functions/throttle.d.cts +3 -0
- package/dist/types/lib/functions/timeout.d.cts +5 -0
- package/dist/types/lib/hash.d.cts +3 -0
- package/dist/types/lib/index.d.cts +43 -0
- package/dist/types/lib/numbers/index.d.cts +5 -0
- package/dist/types/lib/numbers/math.d.cts +4 -0
- package/dist/types/lib/objects/camelcase-keys.d.cts +3 -0
- package/dist/types/lib/objects/empty.d.cts +4 -0
- package/dist/types/lib/objects/equal.d.cts +4 -0
- package/dist/types/lib/objects/extend.d.cts +6 -0
- package/dist/types/lib/objects/flatten.d.cts +6 -0
- package/dist/types/lib/objects/index.d.cts +13 -0
- package/dist/types/lib/objects/json.d.cts +3 -0
- package/dist/types/lib/objects/loop.d.cts +4 -0
- package/dist/types/lib/objects/mix/mix.d.cts +44 -0
- package/{src/lib/objects/nested-property.js → dist/types/lib/objects/nested-property.d.cts} +4 -21
- package/dist/types/lib/objects/normalize-object.d.cts +3 -0
- package/dist/types/lib/objects/omit-empty.d.cts +3 -0
- package/dist/types/lib/objects/size.d.cts +3 -0
- package/dist/types/lib/objects/split.d.cts +14 -0
- package/dist/types/lib/promises/index.d.cts +1 -0
- package/dist/types/lib/promises/reject.d.cts +5 -0
- package/dist/types/lib/sse.d.cts +18 -0
- package/dist/types/lib/strings/convert-case/convert-case.d.cts +10 -0
- package/dist/types/lib/strings/index.d.cts +5 -0
- package/dist/types/lib/strings/markdown.d.cts +25 -0
- package/dist/types/lib/strings/name.d.cts +7 -0
- package/dist/types/lib/strings/pluralize.d.cts +3 -0
- package/dist/types/lib/strings/query-string.d.cts +10 -0
- package/dist/types/lib/style/index.d.cts +3 -0
- package/dist/types/lib/symbols/index.d.cts +1 -0
- package/dist/types/lib/symbols/symbols.d.cts +4 -0
- package/dist/types/node/context.d.cts +2 -0
- package/dist/types/node/dirname.d.cts +9 -0
- package/dist/types/node/file-cache.d.cts +56 -0
- package/dist/types/node/file.d.cts +4 -0
- package/dist/types/node/hash.d.cts +3 -0
- package/dist/types/node/index.d.cts +7 -0
- package/dist/types/node/pkce.d.cts +14 -0
- package/dist/types/node/random-string.d.cts +3 -0
- package/{src/node/sanitize.js → dist/types/node/sanitize.d.cts} +3 -6
- package/dist/types/node/uuid.d.cts +3 -0
- package/package.json +18 -15
- package/CHANGELOG.md +0 -237
- package/eslint.config.js +0 -2
- package/src/dom/accessibility.js +0 -58
- package/src/dom/actions/index.js +0 -3
- package/src/dom/actions/masonry.js +0 -43
- package/src/dom/actions/prefer-horizontal-scroll.js +0 -121
- package/src/dom/actions/sticky.js +0 -85
- package/src/dom/clipboard.js +0 -14
- package/src/dom/cookie.js +0 -32
- package/src/dom/css-vars.js +0 -19
- package/src/dom/font-size.js +0 -40
- package/src/dom/hash.js +0 -9
- package/src/dom/index.js +0 -23
- package/src/dom/media.js +0 -30
- package/src/dom/observers/index.js +0 -4
- package/src/dom/observers/intersection-observer.js +0 -43
- package/src/dom/observers/mutation-observer.js +0 -51
- package/src/dom/observers/observer.js +0 -18
- package/src/dom/observers/scroll-observer.js +0 -146
- package/src/dom/pkce.js +0 -34
- package/src/dom/query-params.js +0 -14
- package/src/dom/random-string.js +0 -18
- package/src/dom/random-string.test.js +0 -13
- package/src/dom/sanitize.js +0 -16
- package/src/dom/session-store.js +0 -29
- package/src/dom/spam-prevention.js +0 -40
- package/src/dom/trap-focus.js +0 -70
- package/src/dom/ui/aria-current.js +0 -20
- package/src/dom/ui/index.js +0 -4
- package/src/dom/ui/scroll-container.js +0 -25
- package/src/dom/ui/traverse-and-scramble.js +0 -61
- package/src/lib/arrays/index.js +0 -6
- package/src/lib/arrays/shuffle.js +0 -21
- package/src/lib/arrays/sort.js +0 -88
- package/src/lib/arrays/sort.spec.js +0 -123
- package/src/lib/arrays/split-array.js +0 -15
- package/src/lib/arrays/unique.js +0 -3
- package/src/lib/auth/index.js +0 -1
- package/src/lib/auth/route-manager.js +0 -45
- package/src/lib/checks.js +0 -57
- package/src/lib/date/days.js +0 -9
- package/src/lib/date/index.js +0 -3
- package/src/lib/date/months.js +0 -74
- package/src/lib/date/time.js +0 -83
- package/src/lib/form/form-data.js +0 -73
- package/src/lib/form/index.js +0 -2
- package/src/lib/form/sanitize.spec.js +0 -126
- package/src/lib/functions/debounce.js +0 -18
- package/src/lib/functions/env.js +0 -5
- package/src/lib/functions/functional.test.js +0 -196
- package/src/lib/functions/index.js +0 -5
- package/src/lib/functions/throttle.js +0 -11
- package/src/lib/functions/timeout.js +0 -15
- package/src/lib/hash.js +0 -18
- package/src/lib/hash.spec.js +0 -163
- package/src/lib/index.js +0 -14
- package/src/lib/numbers/index.js +0 -12
- package/src/lib/numbers/math.js +0 -9
- package/src/lib/numbers/split-unit.test.js +0 -45
- package/src/lib/objects/camelcase-keys.js +0 -17
- package/src/lib/objects/camelcase-keys.test.js +0 -72
- package/src/lib/objects/empty.js +0 -10
- package/src/lib/objects/equal.js +0 -9
- package/src/lib/objects/extend.js +0 -16
- package/src/lib/objects/extend.test.js +0 -35
- package/src/lib/objects/flatten.js +0 -19
- package/src/lib/objects/index.js +0 -13
- package/src/lib/objects/json.js +0 -7
- package/src/lib/objects/loop.js +0 -11
- package/src/lib/objects/loop.test.js +0 -31
- package/src/lib/objects/mix/mix.js +0 -191
- package/src/lib/objects/mix/mix.md +0 -78
- package/src/lib/objects/mix/mix.test.js +0 -445
- package/src/lib/objects/normalize-object.js +0 -10
- package/src/lib/objects/omit-empty.js +0 -23
- package/src/lib/objects/omit-empty.test.js +0 -85
- package/src/lib/objects/size.js +0 -41
- package/src/lib/objects/split.js +0 -19
- package/src/lib/promises/index.js +0 -1
- package/src/lib/promises/reject.js +0 -17
- package/src/lib/sse.js +0 -61
- package/src/lib/strings/convert-case/convert-case.js +0 -86
- package/src/lib/strings/convert-case/convert-case.md +0 -44
- package/src/lib/strings/convert-case/convert-case.test.js +0 -50
- package/src/lib/strings/index.js +0 -5
- package/src/lib/strings/markdown.js +0 -71
- package/src/lib/strings/markdown.spec.js +0 -73
- package/src/lib/strings/name.js +0 -24
- package/src/lib/strings/name.test.js +0 -67
- package/src/lib/strings/pluralize.js +0 -2
- package/src/lib/strings/query-string.js +0 -18
- package/src/lib/style/index.js +0 -13
- package/src/lib/symbols/index.js +0 -1
- package/src/lib/symbols/symbols.js +0 -9
- package/src/node/dirname.js +0 -17
- package/src/node/file-cache.js +0 -184
- package/src/node/file.js +0 -13
- package/src/node/hash.js +0 -5
- package/src/node/index.js +0 -7
- package/src/node/pkce.js +0 -33
- package/src/node/random-string.js +0 -10
- package/src/node/random-string.test.js +0 -15
- package/src/node/sanitize.spec.js +0 -142
- package/src/node/uuid.js +0 -5
- package/tsconfig.json +0 -23
- package/tsup.config.js +0 -38
- package/tsup.config.mjs +0 -63
- /package/{src/node/context.js → dist/cjs/node/context.cjs} +0 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const astroNodes = ["ASTRO-SLOT", "ASTRO-ISLAND"];
|
|
2
|
+
function getNodeType(node) {
|
|
3
|
+
if (node instanceof Element) return "element";
|
|
4
|
+
if (node instanceof NodeList) return "nodelist";
|
|
5
|
+
if (Array.isArray(node)) return "array";
|
|
6
|
+
}
|
|
7
|
+
function getElement(selector) {
|
|
8
|
+
if (!selector) return;
|
|
9
|
+
if (selector instanceof Element) return selector;
|
|
10
|
+
return document.querySelector(selector);
|
|
11
|
+
}
|
|
12
|
+
function getChildrenElements(node) {
|
|
13
|
+
let children = node.children;
|
|
14
|
+
if (children[0]?.nodeName === "ASTRO-SLOT") children = children[0].children;
|
|
15
|
+
return Array.from(children);
|
|
16
|
+
}
|
|
17
|
+
function getParentElement(element) {
|
|
18
|
+
const parent = element.parentElement;
|
|
19
|
+
if (astroNodes.includes(parent.nodeName)) return getParentElement(parent);
|
|
20
|
+
return parent;
|
|
21
|
+
}
|
|
22
|
+
function getSiblingElements(element) {
|
|
23
|
+
return Array.from(element.parentElement.children).filter(
|
|
24
|
+
(child) => child !== element
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
function getSelfIndex(element) {
|
|
28
|
+
return Array.from(element.parentElement.children).indexOf(element);
|
|
29
|
+
}
|
|
30
|
+
function isAncestor(ancestor, element, { searchLevels = 0 } = {}) {
|
|
31
|
+
if (ancestor === element) return true;
|
|
32
|
+
let parent = element.parentElement;
|
|
33
|
+
if (searchLevels === 0) {
|
|
34
|
+
while (parent) {
|
|
35
|
+
if (ancestor === parent) return true;
|
|
36
|
+
parent = parent.parentElement;
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
for (let i = 0; i < searchLevels; i++) {
|
|
40
|
+
if (ancestor === parent) return true;
|
|
41
|
+
parent = parent.parentElement;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
function getAncestorWithSiblings(element, { limit = false } = {}) {
|
|
47
|
+
const ancestor = element.parentElement;
|
|
48
|
+
const siblings = getSiblingElements(ancestor);
|
|
49
|
+
if (siblings.length) return siblings;
|
|
50
|
+
if (!ancestor) return null;
|
|
51
|
+
if (limit === false) return getAncestorWithSiblings(ancestor);
|
|
52
|
+
if (typeof limit === "number" && limit > 0) {
|
|
53
|
+
return getAncestorWithSiblings(ancestor, { limit: limit - 1 });
|
|
54
|
+
}
|
|
55
|
+
if (limit === 0) return null;
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
getAncestorWithSiblings,
|
|
59
|
+
getChildrenElements,
|
|
60
|
+
getElement,
|
|
61
|
+
getNodeType,
|
|
62
|
+
getParentElement,
|
|
63
|
+
getSelfIndex,
|
|
64
|
+
getSiblingElements,
|
|
65
|
+
isAncestor
|
|
66
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
async function sha256Hash(string) {
|
|
2
|
+
const utf8 = new TextEncoder().encode(string);
|
|
3
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", utf8);
|
|
4
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
5
|
+
const hashHex = hashArray.map((bytes) => bytes.toString(16).padStart(2, "0")).join("");
|
|
6
|
+
return hashHex;
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
sha256Hash
|
|
10
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export * from "./accessibility.js";
|
|
2
|
+
export * from "./actions/index.js";
|
|
3
|
+
export * from "./bounding-box.js";
|
|
4
|
+
export * from "./clipboard.js";
|
|
5
|
+
export * from "./cookie.js";
|
|
6
|
+
export * from "./css-vars.js";
|
|
7
|
+
export * from "./events.js";
|
|
8
|
+
export * from "./focusable.js";
|
|
9
|
+
export * from "./font-size.js";
|
|
10
|
+
export * from "./get-element.js";
|
|
11
|
+
export * from "./hash.js";
|
|
12
|
+
export * from "./keyboard.js";
|
|
13
|
+
export * from "./local-store.js";
|
|
14
|
+
export * from "./media.js";
|
|
15
|
+
export * from "./observers/index.js";
|
|
16
|
+
export * from "./pkce.js";
|
|
17
|
+
export * from "./query-params.js";
|
|
18
|
+
export * from "./random-string.js";
|
|
19
|
+
export * from "./sanitize.js";
|
|
20
|
+
export * from "./session-store.js";
|
|
21
|
+
export * from "./spam-prevention.js";
|
|
22
|
+
export * from "./trap-focus.js";
|
|
23
|
+
export * from "./ui/index.js";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
function isTab(event) {
|
|
2
|
+
return !event.shiftKey && event.key === "Tab";
|
|
3
|
+
}
|
|
4
|
+
function isShiftTab(event) {
|
|
5
|
+
return event.shiftKey && event.key === "Tab";
|
|
6
|
+
}
|
|
7
|
+
function isTabKey(key) {
|
|
8
|
+
return key === "Tab";
|
|
9
|
+
}
|
|
10
|
+
function isArrowKey(key) {
|
|
11
|
+
return ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(key);
|
|
12
|
+
}
|
|
13
|
+
function isEscapeKey(key) {
|
|
14
|
+
return key === "Escape";
|
|
15
|
+
}
|
|
16
|
+
export {
|
|
17
|
+
isArrowKey,
|
|
18
|
+
isEscapeKey,
|
|
19
|
+
isShiftTab,
|
|
20
|
+
isTab,
|
|
21
|
+
isTabKey
|
|
22
|
+
};
|
|
@@ -1,66 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
// Local Storage
|
|
3
|
-
// ========================
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Utility object for managing localStorage operations with JSON support
|
|
7
|
-
* @namespace localStore
|
|
8
|
-
*/
|
|
9
|
-
export const localStore = {
|
|
1
|
+
const localStore = {
|
|
10
2
|
/**
|
|
11
3
|
* Retrieves a value from localStorage
|
|
12
4
|
* @param {string} key - The key to retrieve from localStorage
|
|
13
5
|
* @returns {any} The stored value. Returns parsed JSON if the value was stored as JSON. Returns the original string if not JSON, or undefined if key doesn't exist
|
|
14
6
|
*/
|
|
15
7
|
get(key) {
|
|
16
|
-
const value = localStorage.getItem(key)
|
|
17
|
-
if (!value) return
|
|
18
|
-
|
|
8
|
+
const value = localStorage.getItem(key);
|
|
9
|
+
if (!value) return;
|
|
19
10
|
try {
|
|
20
|
-
|
|
21
|
-
return JSON.parse(value)
|
|
11
|
+
return JSON.parse(value);
|
|
22
12
|
} catch (error) {
|
|
23
|
-
|
|
24
|
-
return value
|
|
13
|
+
return value;
|
|
25
14
|
}
|
|
26
15
|
},
|
|
27
|
-
|
|
28
16
|
/**
|
|
29
17
|
* Stores a value in localStorage
|
|
30
18
|
* @param {string} key - The key to store the value under
|
|
31
19
|
* @param {any} value - The value to store. Objects will be stringified to JSON
|
|
32
20
|
*/
|
|
33
21
|
set(key, value) {
|
|
34
|
-
if (typeof value ===
|
|
35
|
-
localStorage.setItem(key, value)
|
|
22
|
+
if (typeof value === "string") {
|
|
23
|
+
localStorage.setItem(key, value);
|
|
36
24
|
} else {
|
|
37
|
-
localStorage.setItem(key, JSON.stringify(value))
|
|
25
|
+
localStorage.setItem(key, JSON.stringify(value));
|
|
38
26
|
}
|
|
39
27
|
},
|
|
40
|
-
|
|
41
28
|
/**
|
|
42
29
|
* Stores multiple key-value pairs in localStorage
|
|
43
30
|
* @param {Object|Map} data - An object or Map containing key-value pairs to store
|
|
44
31
|
*/
|
|
45
32
|
setMultiple(data) {
|
|
46
33
|
for (const [key, value] of Object.entries(data)) {
|
|
47
|
-
this.set(key, value)
|
|
34
|
+
this.set(key, value);
|
|
48
35
|
}
|
|
49
36
|
},
|
|
50
|
-
|
|
51
37
|
/**
|
|
52
38
|
* Removes a value from localStorage
|
|
53
39
|
* @param {string} key - The key to remove from localStorage
|
|
54
40
|
*/
|
|
55
41
|
remove(key) {
|
|
56
|
-
localStorage.removeItem(key)
|
|
42
|
+
localStorage.removeItem(key);
|
|
57
43
|
},
|
|
58
|
-
|
|
59
44
|
/**
|
|
60
45
|
* Removes multiple keys from localStorage
|
|
61
46
|
* @param {string[]} keys - Array of keys to remove from localStorage
|
|
62
47
|
*/
|
|
63
48
|
removeMultiple(keys) {
|
|
64
|
-
keys.forEach(key => this.remove(key))
|
|
65
|
-
}
|
|
66
|
-
}
|
|
49
|
+
keys.forEach((key) => this.remove(key));
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
export {
|
|
53
|
+
localStore
|
|
54
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
async function imagesLoaded(node) {
|
|
2
|
+
const images = Array.from(node.querySelectorAll("img"));
|
|
3
|
+
const promises = images.map((img) => {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
if (img.complete) return resolve();
|
|
6
|
+
img.onload = resolve;
|
|
7
|
+
img.onerror = (e) => {
|
|
8
|
+
reject("Image failed to load");
|
|
9
|
+
};
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
return Promise.all(promises);
|
|
13
|
+
}
|
|
14
|
+
async function videosLoaded(node) {
|
|
15
|
+
const videos = Array.from(node.querySelectorAll("video"));
|
|
16
|
+
const promises = videos.map((video) => {
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
if (video.readyState === 4) return resolve();
|
|
19
|
+
video.onloadedmetadata = resolve;
|
|
20
|
+
video.onerror = reject;
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
return Promise.all(promises);
|
|
24
|
+
}
|
|
25
|
+
async function mediaLoaded(node) {
|
|
26
|
+
return Promise.all([imagesLoaded(node), videosLoaded(node)]);
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
imagesLoaded,
|
|
30
|
+
mediaLoaded,
|
|
31
|
+
videosLoaded
|
|
32
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { dispatchEvent } from "../events.js";
|
|
2
|
+
import { useObserverMethodOnTarget } from "./observer.js";
|
|
3
|
+
function intersectionObserver(target, options = {}) {
|
|
4
|
+
const { callback, ...opts } = options;
|
|
5
|
+
const observer = new IntersectionObserver(observerFn, opts);
|
|
6
|
+
useObserverMethodOnTarget(target, observer, "observe");
|
|
7
|
+
function observerFn(entries) {
|
|
8
|
+
for (const entry of entries) {
|
|
9
|
+
if (callback) callback({ entry, entries, observer });
|
|
10
|
+
else dispatchEvent(target, "intersect", { entry, entries, observer });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
observer,
|
|
15
|
+
observe(target2) {
|
|
16
|
+
useObserverMethodOnTarget(target2, observer, "observe", options);
|
|
17
|
+
},
|
|
18
|
+
unobserve(target2) {
|
|
19
|
+
useObserverMethodOnTarget(target2, observer, "unobserve");
|
|
20
|
+
},
|
|
21
|
+
takeRecords() {
|
|
22
|
+
return observer.takeRecords();
|
|
23
|
+
},
|
|
24
|
+
disconnect() {
|
|
25
|
+
const records = observer.takeRecords();
|
|
26
|
+
observer.disconnect();
|
|
27
|
+
if (records.length > 0) observerFn(records);
|
|
28
|
+
},
|
|
29
|
+
destroy() {
|
|
30
|
+
observer.disconnect();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
intersectionObserver
|
|
36
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { dispatchEvent } from "../events.js";
|
|
2
|
+
import { useObserverMethodOnTarget } from "./observer.js";
|
|
3
|
+
const defaultOptions = {
|
|
4
|
+
attributes: false,
|
|
5
|
+
childList: false,
|
|
6
|
+
subtree: false
|
|
7
|
+
};
|
|
8
|
+
function mutationObserver(target, options) {
|
|
9
|
+
options = { ...defaultOptions, ...options };
|
|
10
|
+
const { callback, ...opts } = options;
|
|
11
|
+
const observer = new MutationObserver(observerFn);
|
|
12
|
+
if (target === window) target = document.body;
|
|
13
|
+
useObserverMethodOnTarget(target, observer, "observe", opts);
|
|
14
|
+
function observerFn(entries) {
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
if (callback) callback({ entry, entries, observer });
|
|
17
|
+
else dispatchEvent(target, "mutate", { entry, entries, observer });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
observer,
|
|
22
|
+
observe(target2) {
|
|
23
|
+
useObserverMethodOnTarget(target2, observer, "observe", options);
|
|
24
|
+
},
|
|
25
|
+
takeRecords() {
|
|
26
|
+
return observer.takeRecords();
|
|
27
|
+
},
|
|
28
|
+
disconnect() {
|
|
29
|
+
const records = observer.takeRecords();
|
|
30
|
+
observer.disconnect();
|
|
31
|
+
if (records.length > 0) observerFn(records);
|
|
32
|
+
},
|
|
33
|
+
destroy() {
|
|
34
|
+
observer.disconnect();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
mutationObserver
|
|
40
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getNodeType } from "../get-element.js";
|
|
2
|
+
function useObserverMethodOnTarget(target, observer, method = "observe", options = void 0) {
|
|
3
|
+
const targetType = getNodeType(target);
|
|
4
|
+
if (targetType === "element") observer[method](target, options);
|
|
5
|
+
if (targetType === "nodelist") {
|
|
6
|
+
const elements = Array.from(target);
|
|
7
|
+
elements.forEach((element) => observer[method](element, options));
|
|
8
|
+
}
|
|
9
|
+
if (targetType === "array") {
|
|
10
|
+
target.forEach((element) => observer[method](element, options));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
useObserverMethodOnTarget
|
|
15
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { dispatchEvent } from "../events.js";
|
|
2
|
+
import { useObserverMethodOnTarget } from "./observer.js";
|
|
3
|
+
function resizeObserver(target, options) {
|
|
4
|
+
const { callback, ...opts } = options;
|
|
5
|
+
const observer = new ResizeObserver(observerFn);
|
|
6
|
+
if (target === window || target === document)
|
|
7
|
+
target = document.documentElement;
|
|
8
|
+
useObserverMethodOnTarget(target, observer, "observe", opts);
|
|
9
|
+
function observerFn(entries) {
|
|
10
|
+
for (const entry of entries) {
|
|
11
|
+
if (callback) callback({ entry, entries, observer });
|
|
12
|
+
else
|
|
13
|
+
dispatchEvent(entry.target, "resize-obs", { entry, entries, observer });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
observe(target2) {
|
|
18
|
+
useObserverMethodOnTarget(target2, observer, "observe", options);
|
|
19
|
+
},
|
|
20
|
+
unobserve(target2) {
|
|
21
|
+
useObserverMethodOnTarget(target2, observer, "unobserve");
|
|
22
|
+
},
|
|
23
|
+
disconnect: (_) => observer.disconnect(),
|
|
24
|
+
destroy: (_) => observer.disconnect()
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
resizeObserver
|
|
29
|
+
};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { resizeObserver } from "./resize-observer.js";
|
|
2
|
+
const defaultOptions = {
|
|
3
|
+
threshold: 0,
|
|
4
|
+
// Float between 0 to 1.
|
|
5
|
+
tolerance: 0.1,
|
|
6
|
+
// Float between 0 to 1. Tolerance for event firing
|
|
7
|
+
once: false
|
|
8
|
+
// Only fire threshold callback once
|
|
9
|
+
};
|
|
10
|
+
function getScrollElement(node) {
|
|
11
|
+
if (node === document || node === window || node === document.documentElement) {
|
|
12
|
+
return document.documentElement;
|
|
13
|
+
}
|
|
14
|
+
return (
|
|
15
|
+
/** @type {Element} */
|
|
16
|
+
node
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
function scrollObserver(node, options = {}) {
|
|
20
|
+
const { callback, onScrollDown, onScrollUp, onEnterThreshold, ...userOpts } = options;
|
|
21
|
+
const opts = { ...defaultOptions, ...userOpts };
|
|
22
|
+
const { threshold, tolerance, once } = opts;
|
|
23
|
+
let prevScrollDirection = null;
|
|
24
|
+
let prevScrollTop = 0;
|
|
25
|
+
let prevScrollPercent = 0;
|
|
26
|
+
let thresholdFired = false;
|
|
27
|
+
let rafId = null;
|
|
28
|
+
const isDocumentScroll = node === document || node === window || node === document.documentElement;
|
|
29
|
+
const scrollElement = getScrollElement(node);
|
|
30
|
+
const eventTarget = isDocumentScroll ? window : node;
|
|
31
|
+
let cachedScrollHeight = 0;
|
|
32
|
+
let cachedClientHeight = 0;
|
|
33
|
+
updateCache();
|
|
34
|
+
const cacheObserver = resizeObserver(scrollElement, {
|
|
35
|
+
callback: updateCache
|
|
36
|
+
});
|
|
37
|
+
eventTarget.addEventListener("scroll", throttledObserve, { passive: true });
|
|
38
|
+
function throttledObserve() {
|
|
39
|
+
rafId = requestAnimationFrame(observe);
|
|
40
|
+
}
|
|
41
|
+
function updateCache() {
|
|
42
|
+
cachedScrollHeight = scrollElement.scrollHeight;
|
|
43
|
+
cachedClientHeight = scrollElement.clientHeight;
|
|
44
|
+
}
|
|
45
|
+
function observe() {
|
|
46
|
+
const scrollTop = scrollElement.scrollTop;
|
|
47
|
+
if (Math.abs(scrollTop - prevScrollTop) < 1) return;
|
|
48
|
+
const scrollDirection = scrollTop > prevScrollTop ? "down" : "up";
|
|
49
|
+
const maxScroll = Math.max(1, cachedScrollHeight - cachedClientHeight);
|
|
50
|
+
const scrollPercent = Math.min(1, Math.max(0, scrollTop / maxScroll));
|
|
51
|
+
const thresholdMin = threshold - tolerance / 2;
|
|
52
|
+
const thresholdMax = threshold + tolerance / 2;
|
|
53
|
+
const wasInThreshold = prevScrollPercent >= thresholdMin && prevScrollPercent <= thresholdMax;
|
|
54
|
+
const isInThreshold = scrollPercent >= thresholdMin && scrollPercent <= thresholdMax;
|
|
55
|
+
const hasEnteredThreshold = !wasInThreshold && isInThreshold && (!once || !thresholdFired);
|
|
56
|
+
if (hasEnteredThreshold && once) {
|
|
57
|
+
thresholdFired = true;
|
|
58
|
+
}
|
|
59
|
+
const callbackData = {
|
|
60
|
+
scrollTop,
|
|
61
|
+
scrollDirection,
|
|
62
|
+
scrollPercent,
|
|
63
|
+
directionChanged: scrollDirection !== prevScrollDirection,
|
|
64
|
+
hasEnteredThreshold,
|
|
65
|
+
isInThreshold
|
|
66
|
+
};
|
|
67
|
+
if (typeof callback === "function") {
|
|
68
|
+
callback(callbackData);
|
|
69
|
+
}
|
|
70
|
+
if (scrollDirection !== prevScrollDirection) {
|
|
71
|
+
if (scrollDirection === "down" && typeof onScrollDown === "function") {
|
|
72
|
+
onScrollDown(callbackData);
|
|
73
|
+
}
|
|
74
|
+
if (scrollDirection === "up" && typeof onScrollUp === "function") {
|
|
75
|
+
onScrollUp(callbackData);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (hasEnteredThreshold && typeof onEnterThreshold === "function") {
|
|
79
|
+
onEnterThreshold(callbackData);
|
|
80
|
+
}
|
|
81
|
+
prevScrollTop = scrollTop;
|
|
82
|
+
prevScrollPercent = scrollPercent;
|
|
83
|
+
prevScrollDirection = scrollDirection;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
destroy() {
|
|
87
|
+
eventTarget.removeEventListener("scroll", throttledObserve);
|
|
88
|
+
if (rafId) cancelAnimationFrame(rafId);
|
|
89
|
+
cacheObserver.destroy();
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export {
|
|
94
|
+
scrollObserver
|
|
95
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { randomString } from "./random-string.js";
|
|
2
|
+
async function PKCE() {
|
|
3
|
+
const codeVerifier = await randomString();
|
|
4
|
+
const codeChallenge = await getCodeChallenge(codeVerifier);
|
|
5
|
+
return {
|
|
6
|
+
state: await randomString(),
|
|
7
|
+
code_verifier: codeVerifier,
|
|
8
|
+
code_challenge: codeChallenge,
|
|
9
|
+
code_challenge_method: "S256"
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
async function getCodeChallenge(verifier) {
|
|
13
|
+
const encoder = new TextEncoder();
|
|
14
|
+
const data = encoder.encode(verifier);
|
|
15
|
+
const hashed = await window.crypto.subtle.digest("SHA-256", data);
|
|
16
|
+
return window.btoa(String.fromCharCode.apply(null, new Uint8Array(hashed))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
PKCE
|
|
20
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const queryParams = {
|
|
2
|
+
get(key) {
|
|
3
|
+
const searchParams = new URLSearchParams(location.search);
|
|
4
|
+
return searchParams.get(key);
|
|
5
|
+
},
|
|
6
|
+
stringify(params) {
|
|
7
|
+
const searchParams = new URLSearchParams(location.search);
|
|
8
|
+
return searchParams.toString();
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
queryParams
|
|
13
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function randomString(length = 10) {
|
|
2
|
+
const firstLetter = String.fromCharCode(65 + Math.floor(Math.random() * 26));
|
|
3
|
+
const others = Math.random().toString(36).substring(2, 2 + length - 1);
|
|
4
|
+
return firstLetter + others;
|
|
5
|
+
}
|
|
6
|
+
function uuid() {
|
|
7
|
+
return crypto.randomUUID();
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
randomString,
|
|
11
|
+
uuid
|
|
12
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const sessionStore = {
|
|
2
|
+
get(key) {
|
|
3
|
+
const value = sessionStorage.getItem(key);
|
|
4
|
+
if (!value) return;
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(value);
|
|
7
|
+
} catch (error) {
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
set(key, value) {
|
|
12
|
+
if (typeof value === "string") {
|
|
13
|
+
sessionStorage.setItem(key, value);
|
|
14
|
+
} else {
|
|
15
|
+
sessionStorage.setItem(key, JSON.stringify(value));
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
remove(key) {
|
|
19
|
+
sessionStorage.removeItem(key);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
export {
|
|
23
|
+
sessionStore
|
|
24
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
function preventSpam(form, { honeypotField = "hp", honeypotDuration = 2e3 } = {}) {
|
|
2
|
+
const startTime = Date.now();
|
|
3
|
+
let hasInteraction = false;
|
|
4
|
+
function checkForInteraction() {
|
|
5
|
+
hasInteraction = true;
|
|
6
|
+
}
|
|
7
|
+
const events = ["keydown", "mousemove", "touchstart", "click"];
|
|
8
|
+
events.forEach((event) => {
|
|
9
|
+
form.addEventListener(event, checkForInteraction, { once: true });
|
|
10
|
+
});
|
|
11
|
+
form.containsSpam = function() {
|
|
12
|
+
const fillTime = Date.now() - startTime;
|
|
13
|
+
const isTooFast = fillTime < honeypotDuration;
|
|
14
|
+
const honeypotInput = form.querySelector(`[name="${honeypotField}"]`);
|
|
15
|
+
const hasHoneypotValue = honeypotInput?.value?.trim();
|
|
16
|
+
const noInteraction = !hasInteraction;
|
|
17
|
+
events.forEach(
|
|
18
|
+
(event) => form.removeEventListener(event, checkForInteraction)
|
|
19
|
+
);
|
|
20
|
+
return isTooFast || !!hasHoneypotValue || noInteraction;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
preventSpam
|
|
25
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { getFocusableElements } from "./focusable.js";
|
|
2
|
+
import { isShiftTab, isTab } from "./keyboard.js";
|
|
3
|
+
function trapFocus({ event, focusables }) {
|
|
4
|
+
if (event.key !== "Tab") return;
|
|
5
|
+
if (isTab(event) && document.activeElement === focusables.last) {
|
|
6
|
+
event.preventDefault();
|
|
7
|
+
focusables.first.focus();
|
|
8
|
+
}
|
|
9
|
+
if (isShiftTab(event) && document.activeElement === focusables.first) {
|
|
10
|
+
event.preventDefault();
|
|
11
|
+
focusables.last.focus();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function manageFocus({
|
|
15
|
+
event,
|
|
16
|
+
triggerNode,
|
|
17
|
+
contentNode,
|
|
18
|
+
focusables,
|
|
19
|
+
tabOutFocus = "next",
|
|
20
|
+
// 'trigger'
|
|
21
|
+
onLeave = function() {
|
|
22
|
+
}
|
|
23
|
+
}) {
|
|
24
|
+
const activeEl = document.activeElement;
|
|
25
|
+
if (activeEl === contentNode && isShiftTab(event)) return backFocus();
|
|
26
|
+
if (activeEl === contentNode && focusables.length === 0 && isTab(event))
|
|
27
|
+
return nextFocus();
|
|
28
|
+
if (activeEl === focusables.last && isTab(event)) return nextFocus();
|
|
29
|
+
if (activeEl === focusables.first && isShiftTab(event)) return backFocus();
|
|
30
|
+
function backFocus() {
|
|
31
|
+
event.preventDefault();
|
|
32
|
+
triggerNode.focus();
|
|
33
|
+
onLeave("back");
|
|
34
|
+
}
|
|
35
|
+
function nextFocus() {
|
|
36
|
+
if (tabOutFocus === "trigger") triggerNode.focus();
|
|
37
|
+
if (tabOutFocus === "next") {
|
|
38
|
+
event.preventDefault();
|
|
39
|
+
const DOMFocusables = getFocusableElements().keyboard;
|
|
40
|
+
const index = DOMFocusables.findIndex((e) => e === triggerNode);
|
|
41
|
+
const next = DOMFocusables[index + 1];
|
|
42
|
+
if (next) next.focus();
|
|
43
|
+
else triggerNode.focus();
|
|
44
|
+
}
|
|
45
|
+
onLeave("forward");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
manageFocus,
|
|
50
|
+
trapFocus
|
|
51
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function markActiveAnchorIn(container, anchorType = "page") {
|
|
2
|
+
if (!container) return;
|
|
3
|
+
const { pathname } = window.location;
|
|
4
|
+
const element = container.querySelector(`[href="${pathname}"]`);
|
|
5
|
+
if (!element) return;
|
|
6
|
+
element.setAttribute("aria-current", "page");
|
|
7
|
+
return element;
|
|
8
|
+
}
|
|
9
|
+
function scrollToElement(element, { scrollBehaviour = "instant", scrollMargin = "3rem" } = {}) {
|
|
10
|
+
if (!element) return;
|
|
11
|
+
element.style.scrollMarginTop = scrollMargin;
|
|
12
|
+
element.scrollIntoView({ behavior: scrollBehaviour });
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
markActiveAnchorIn,
|
|
16
|
+
scrollToElement
|
|
17
|
+
};
|